[ADD] interrupt setting enums

This commit is contained in:
Sem van der Hoeven
2021-03-18 19:32:51 +01:00
parent 25da06b589
commit 7a3180019e
3 changed files with 173 additions and 53 deletions

View File

@@ -3,29 +3,29 @@ ultrasonicSensor.elf: file format elf32-avr
Sections: Sections:
Idx Name Size VMA LMA File off Algn Idx Name Size VMA LMA File off Algn
0 .data 00000000 00800100 00800100 00000166 2**0 0 .data 00000002 00800100 0000017c 000001f0 2**0
CONTENTS, ALLOC, LOAD, DATA CONTENTS, ALLOC, LOAD, DATA
1 .text 00000112 00000000 00000000 00000054 2**1 1 .text 0000017c 00000000 00000000 00000074 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .comment 00000030 00000000 00000000 00000166 2**0 2 .comment 00000030 00000000 00000000 000001f2 2**0
CONTENTS, READONLY CONTENTS, READONLY
3 .note.gnu.avr.deviceinfo 0000003c 00000000 00000000 00000198 2**2 3 .note.gnu.avr.deviceinfo 0000003c 00000000 00000000 00000224 2**2
CONTENTS, READONLY CONTENTS, READONLY
4 .debug_aranges 00000030 00000000 00000000 000001d4 2**0 4 .debug_aranges 00000040 00000000 00000000 00000260 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
5 .debug_info 000009ad 00000000 00000000 00000204 2**0 5 .debug_info 00000a15 00000000 00000000 000002a0 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
6 .debug_abbrev 0000084e 00000000 00000000 00000bb1 2**0 6 .debug_abbrev 000008a7 00000000 00000000 00000cb5 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
7 .debug_line 0000030d 00000000 00000000 000013ff 2**0 7 .debug_line 00000384 00000000 00000000 0000155c 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
8 .debug_frame 00000044 00000000 00000000 0000170c 2**2 8 .debug_frame 00000080 00000000 00000000 000018e0 2**2
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
9 .debug_str 0000043a 00000000 00000000 00001750 2**0 9 .debug_str 00000498 00000000 00000000 00001960 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
10 .debug_loc 000000d2 00000000 00000000 00001b8a 2**0 10 .debug_loc 0000013d 00000000 00000000 00001df8 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
11 .debug_ranges 00000020 00000000 00000000 00001c5c 2**0 11 .debug_ranges 00000030 00000000 00000000 00001f35 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
Disassembly of section .text: Disassembly of section .text:
@@ -33,7 +33,7 @@ Disassembly of section .text:
00000000 <__vectors>: 00000000 <__vectors>:
0: 45 c0 rjmp .+138 ; 0x8c <__ctors_end> 0: 45 c0 rjmp .+138 ; 0x8c <__ctors_end>
2: 00 00 nop 2: 00 00 nop
4: 58 c0 rjmp .+176 ; 0xb6 <__bad_interrupt> 4: 82 c0 rjmp .+260 ; 0x10a <__vector_1>
6: 00 00 nop 6: 00 00 nop
8: 56 c0 rjmp .+172 ; 0xb6 <__bad_interrupt> 8: 56 c0 rjmp .+172 ; 0xb6 <__bad_interrupt>
a: 00 00 nop a: 00 00 nop
@@ -114,25 +114,25 @@ Disassembly of section .text:
98: 11 e0 ldi r17, 0x01 ; 1 98: 11 e0 ldi r17, 0x01 ; 1
9a: a0 e0 ldi r26, 0x00 ; 0 9a: a0 e0 ldi r26, 0x00 ; 0
9c: b1 e0 ldi r27, 0x01 ; 1 9c: b1 e0 ldi r27, 0x01 ; 1
9e: e2 e1 ldi r30, 0x12 ; 18 9e: ec e7 ldi r30, 0x7C ; 124
a0: f1 e0 ldi r31, 0x01 ; 1 a0: f1 e0 ldi r31, 0x01 ; 1
a2: 00 e0 ldi r16, 0x00 ; 0 a2: 00 e0 ldi r16, 0x00 ; 0
a4: 0b bf out 0x3b, r16 ; 59 a4: 0b bf out 0x3b, r16 ; 59
a6: 02 c0 rjmp .+4 ; 0xac <__do_copy_data+0x14> a6: 02 c0 rjmp .+4 ; 0xac <__do_copy_data+0x14>
a8: 07 90 elpm r0, Z+ a8: 07 90 elpm r0, Z+
aa: 0d 92 st X+, r0 aa: 0d 92 st X+, r0
ac: a0 30 cpi r26, 0x00 ; 0 ac: a2 30 cpi r26, 0x02 ; 2
ae: b1 07 cpc r27, r17 ae: b1 07 cpc r27, r17
b0: d9 f7 brne .-10 ; 0xa8 <__do_copy_data+0x10> b0: d9 f7 brne .-10 ; 0xa8 <__do_copy_data+0x10>
b2: 1e d0 rcall .+60 ; 0xf0 <main> b2: 47 d0 rcall .+142 ; 0x142 <main>
b4: 2c c0 rjmp .+88 ; 0x10e <_exit> b4: 61 c0 rjmp .+194 ; 0x178 <_exit>
000000b6 <__bad_interrupt>: 000000b6 <__bad_interrupt>:
b6: a4 cf rjmp .-184 ; 0x0 <__vectors> b6: a4 cf rjmp .-184 ; 0x0 <__vectors>
000000b8 <wait_us>: 000000b8 <wait_us>:
#include "lcd_control.h" static enum interrupt_status int_stat = INTERRUPT_RISING;
void wait_us(unsigned int us) void wait_us(unsigned int us)
{ {
@@ -193,39 +193,133 @@ void wait_ms(unsigned int ms)
} }
ee: 08 95 ret ee: 08 95 ret
000000f0 <main>: 000000f0 <ultrasonic_send_pulse>:
void ultrasonic_send_pulse()
{
f0: cf 93 push r28
f2: df 93 push r29
PORTG = 0x00; // 10 us low pulse
f4: c5 e6 ldi r28, 0x65 ; 101
f6: d0 e0 ldi r29, 0x00 ; 0
f8: 18 82 st Y, r1
wait_us(10);
fa: 8a e0 ldi r24, 0x0A ; 10
fc: 90 e0 ldi r25, 0x00 ; 0
fe: dc df rcall .-72 ; 0xb8 <wait_us>
PORTG = 0x01;
100: 81 e0 ldi r24, 0x01 ; 1
102: 88 83 st Y, r24
}
104: df 91 pop r29
106: cf 91 pop r28
108: 08 95 ret
0000010a <__vector_1>:
ISR(INT0_vect)
{
10a: 1f 92 push r1
10c: 0f 92 push r0
10e: 0f b6 in r0, 0x3f ; 63
110: 0f 92 push r0
112: 11 24 eor r1, r1
114: 8f 93 push r24
// if the interrupt was generated on a rising edge (start sending echo)
if (int_stat == INTERRUPT_RISING)
116: 80 91 00 01 lds r24, 0x0100 ; 0x800100 <__DATA_REGION_ORIGIN__>
11a: 81 30 cpi r24, 0x01 ; 1
11c: 31 f4 brne .+12 ; 0x12a <__vector_1+0x20>
{
// set interrupt pin 0 on PORTD to falling edge
EICRA = 0x02;
11e: 82 e0 ldi r24, 0x02 ; 2
120: 80 93 6a 00 sts 0x006A, r24 ; 0x80006a <__TEXT_REGION_LENGTH__+0x7e006a>
// set interrupt status
int_stat = INTERRUPT_FALLING;
124: 10 92 00 01 sts 0x0100, r1 ; 0x800100 <__DATA_REGION_ORIGIN__>
128: 06 c0 rjmp .+12 ; 0x136 <__vector_1+0x2c>
} else
// else if it was generated on a falling edge (end sending echo)
{
// set interrupt pin 0 on PORTD to rising edge
EICRA = 0x03;
12a: 83 e0 ldi r24, 0x03 ; 3
12c: 80 93 6a 00 sts 0x006A, r24 ; 0x80006a <__TEXT_REGION_LENGTH__+0x7e006a>
// set interrupt status
int_stat = INTERRUPT_RISING;
130: 81 e0 ldi r24, 0x01 ; 1
132: 80 93 00 01 sts 0x0100, r24 ; 0x800100 <__DATA_REGION_ORIGIN__>
}
}
136: 8f 91 pop r24
138: 0f 90 pop r0
13a: 0f be out 0x3f, r0 ; 63
13c: 0f 90 pop r0
13e: 1f 90 pop r1
140: 18 95 reti
00000142 <main>:
int main(void) int main(void)
{ {
DDRG = 0x01; // port g pin 0 on output, 1 on input. 0 is trig, 1 is echo DDRG = 0xFF; // port g all output. pin 0 is trig, the rest is for debug
f0: 81 e0 ldi r24, 0x01 ; 1 142: 8f ef ldi r24, 0xFF ; 255
f2: 80 93 64 00 sts 0x0064, r24 ; 0x800064 <__TEXT_REGION_LENGTH__+0x7e0064> 144: 80 93 64 00 sts 0x0064, r24 ; 0x800064 <__TEXT_REGION_LENGTH__+0x7e0064>
DDRD = 0x00; // port D pin 0 on input. 0 is echo and also interrupt
148: 11 ba out 0x11, r1 ; 17
DDRA = 0xFF;
14a: 8a bb out 0x1a, r24 ; 26
EICRA |= 0x03; // interrupt PORTD on pin 0, rising edge
14c: ea e6 ldi r30, 0x6A ; 106
14e: f0 e0 ldi r31, 0x00 ; 0
150: 80 81 ld r24, Z
152: 83 60 ori r24, 0x03 ; 3
154: 80 83 st Z, r24
EIMSK |= 0x01; // enable interrupt on pin 0 (INT0)
156: 89 b7 in r24, 0x39 ; 57
158: 81 60 ori r24, 0x01 ; 1
15a: 89 bf out 0x39, r24 ; 57
sei(); // turn on interrupt system
15c: 78 94 sei
/* Replace with your application code */ /* Replace with your application code */
while (1) while (1)
{ {
PORTG = 0x00; // 10 us low pulse ultrasonic_send_pulse();
f6: c5 e6 ldi r28, 0x65 ; 101 15e: c8 df rcall .-112 ; 0xf0 <ultrasonic_send_pulse>
f8: d0 e0 ldi r29, 0x00 ; 0 if (int_stat == INTERRUPT_FALLING)
fa: 18 82 st Y, r1 160: 80 91 00 01 lds r24, 0x0100 ; 0x800100 <__DATA_REGION_ORIGIN__>
wait_us(10); 164: 81 11 cpse r24, r1
fc: 8a e0 ldi r24, 0x0A ; 10 166: 03 c0 rjmp .+6 ; 0x16e <main+0x2c>
fe: 90 e0 ldi r25, 0x00 ; 0 {
100: db df rcall .-74 ; 0xb8 <wait_us> PORTA = 0xFF;
PORTG = 0x01; 168: 8f ef ldi r24, 0xFF ; 255
102: 81 e0 ldi r24, 0x01 ; 1 16a: 8b bb out 0x1b, r24 ; 27
104: 88 83 st Y, r24 16c: 01 c0 rjmp .+2 ; 0x170 <main+0x2e>
} else {
PORTA = 0x00;
16e: 1b ba out 0x1b, r1 ; 27
}
wait_ms(100); wait_ms(1000);
106: 84 e6 ldi r24, 0x64 ; 100 170: 88 ee ldi r24, 0xE8 ; 232
108: 90 e0 ldi r25, 0x00 ; 0 172: 93 e0 ldi r25, 0x03 ; 3
10a: e3 df rcall .-58 ; 0xd2 <wait_ms> 174: ae df rcall .-164 ; 0xd2 <wait_ms>
10c: f4 cf rjmp .-24 ; 0xf6 <main+0x6> }
176: f3 cf rjmp .-26 ; 0x15e <main+0x1c>
0000010e <_exit>: 00000178 <_exit>:
10e: f8 94 cli 178: f8 94 cli
00000110 <__stop_program>: 0000017a <__stop_program>:
110: ff cf rjmp .-2 ; 0x110 <__stop_program> 17a: ff cf rjmp .-2 ; 0x17a <__stop_program>

View File

@@ -1,5 +1,5 @@
S0180000756C747261736F6E696353656E736F722E737265634E S0180000756C747261736F6E696353656E736F722E737265634E
S113000045C0000058C0000056C0000054C00000A5 S113000045C0000082C0000056C0000054C000007B
S113001052C0000050C000004EC000004CC00000A0 S113001052C0000050C000004EC000004CC00000A0
S11300204AC0000048C0000046C0000044C00000B0 S11300204AC0000048C0000046C0000044C00000B0
S113003042C0000040C000003EC000003CC00000C0 S113003042C0000040C000003EC000003CC00000C0
@@ -8,13 +8,20 @@ S113005032C0000030C000002EC000002CC00000E0
S11300602AC0000028C0000026C0000024C00000F0 S11300602AC0000028C0000026C0000024C00000F0
S113007022C0000020C000001EC000001CC0000000 S113007022C0000020C000001EC000001CC0000000
S11300801AC0000018C0000016C0000011241FBED2 S11300801AC0000018C0000016C0000011241FBED2
S1130090CFEFD0E1DEBFCDBF11E0A0E0B1E0E2E1FF S1130090CFEFD0E1DEBFCDBF11E0A0E0B1E0ECE7EF
S11300A0F1E000E00BBF02C007900D92A030B10751 S11300A0F1E000E00BBF02C007900D92A230B1074F
S11300B0D9F71ED02CC0A4CF20E030E006C046E023 S11300B0D9F747D061C0A4CF20E030E006C046E0C5
S11300C04A95F1F700C02F5F3F4F28173907B8F35F S11300C04A95F1F700C02F5F3F4F28173907B8F35F
S11300D0089520E030E008C0E7E8F3E13197F1F754 S11300D0089520E030E008C0E7E8F3E13197F1F754
S11300E000C000002F5F3F4F28173907A8F3089579 S11300E000C000002F5F3F4F28173907A8F3089579
S11300F081E080936400C5E6D0E018828AE090E055 S11300F0CF93DF93C5E6D0E018828AE090E0DCDF9E
S1130100DBDF81E0888384E690E0E3DFF4CFF894DA S113010081E08883DF91CF9108951F920F920FB6FB
S1050110FFCF1B S11301100F9211248F9380910001813031F482E099
S113012080936A001092000106C083E080936A0005
S113013081E0809300018F910F900FBE0F901F906C
S113014018958FEF8093640011BA8ABBEAE6F0E059
S113015080818360808389B7816089BF7894C8DF98
S113016080910001811103C08FEF8BBB01C01BBACA
S10F017088EE93E0AEDFF3CFF894FFCFED
S105017C01007C
S9030000FC S9030000FC

View File

@@ -20,6 +20,7 @@
#include <avr/io.h> #include <avr/io.h>
#include <util/delay.h> #include <util/delay.h>
#include <avr/interrupt.h>
#include "lcd_control.h" #include "lcd_control.h"
@@ -53,13 +54,22 @@ void ultrasonic_send_pulse()
ISR(INT0_vect) ISR(INT0_vect)
{ {
// set interrupt pin 0 on PORTD to falling edge
// if the interrupt was generated on a rising edge (start sending echo)
if (int_stat == INTERRUPT_RISING) if (int_stat == INTERRUPT_RISING)
{ {
// set interrupt pin 0 on PORTD to falling edge
EICRA = 0x02;
// set interrupt status
int_stat = INTERRUPT_FALLING; int_stat = INTERRUPT_FALLING;
} else { } else
// else if it was generated on a falling edge (end sending echo)
{
// set interrupt pin 0 on PORTD to rising edge
EICRA = 0x03;
// set interrupt status
int_stat = INTERRUPT_RISING; int_stat = INTERRUPT_RISING;
} }
@@ -68,7 +78,10 @@ ISR(INT0_vect)
int main(void) int main(void)
{ {
DDRG = 0x01; // port g pin 0 on output, 1 on input. 0 is trig, 1 is echo DDRG = 0xFF; // port g all output. pin 0 is trig, the rest is for debug
DDRD = 0x00; // port D pin 0 on input. 0 is echo and also interrupt
DDRA = 0xFF;
EICRA |= 0x03; // interrupt PORTD on pin 0, rising edge EICRA |= 0x03; // interrupt PORTD on pin 0, rising edge
@@ -80,6 +93,12 @@ int main(void)
while (1) while (1)
{ {
ultrasonic_send_pulse(); ultrasonic_send_pulse();
if (int_stat == INTERRUPT_FALLING)
{
PORTA = 0xFF;
} else {
PORTA = 0x00;
}
wait_ms(100); wait_ms(100);
} }