Hallo Mikrocontroller.net,
an meiner Schule haben wir grade das Thema Mikrocontroller und unsere
Aufgabe ist es ein Lauflicht mit Interrupt zu erstellen. Also, ist
Taster 1 gedrückt läuft LED : Rot Gelb Grün und bei Taster 2 Grün Gelb
Rot.
Wir sollen mit Tabellenvearbeitung und Interrupt arbeiten. Hier zu
meinem Programm: 1 ;Reset and Interrupt vector ;VNr. Beschreibung
2 rjmp main ;1 POWER ON RESET
3 rjmp links ;2 Int0-Interrupt
4 rjmp rechts ;3 Int1-Interrupt
5 reti ;4 TC2 Compare Match
6 reti ;5 TC2 Overflow
7 reti ;6 TC1 Capture
8 reti ;7 TC1 Compare Match A
9 reti ;8 TC1 Compare Match B
10 reti ;9 TC1 Overflow
11 reti ;10 TC0 Overflow
12 reti ;11 SPI, STC Serial Transfer Complete
13 reti ;12 UART Rx Complete
14 reti ;13 UART Data Register Empty
15 reti ;14 UART Tx Complete
16 reti ;15 ADC Conversion Complete
17 reti ;16 EEPROM Ready
18 reti ;17 Analog Comparator
19 reti ;18 TWI (I²C) Serial Interface
20 reti ;19 Store Program Memory Ready
21 ;------------------------------------------------------------------------
22 ;Start, Power ON, Reset
23 main: ldi r16,lo8(RAMEND)
24 out ioSPL,r16
25 ldi r16,hi8(RAMEND)
26 out ioSPH,r16
27
28 cbi DDRD,2 ;setzte Eingang
29 sbi PORTD,2 ;setzte Pull up
30
31 cbi DDRD,3
32 sbi PORTD,3
33
34 sbi DDRB,0 ;setzte Ausgang
35 sbi DDRB,1
36 sbi DDRB,2
37
38 ldi r16,0b11000000 ;lade 1100000 in r16
39 out GICR,r16 ;lade r16 in GICR
40
41 ldi r16,00001010
42 out MCUCR,r16
43 rjmp mainloop
44
45 ;------------------------------------------------------------------------
46
47 TABAR: .byte 01,02,04,00 ;Lade Tabelle
48
49 TABAL: .byte 04,02,01,00
50 ;-----------------------------------------------------------------------
51 mainloop: sei ;aktiviere Interrupts
52 ldi r17,0 ;lade 0 in r17
53 out PORTB,r17 ;gebe r17 aus
54 rjmp mainloop
55 ;------------------------------------------------------------------------
56
57 rechts: cli ;sperre andere Interrupts
58 ldi r30,lo8(TABAR) ;lade Tabelle
59 ldi r31,hi8(TABAR)
60 neuR: lpm
61 mov r16,r0 ;lade Tabellenwert in r16
62 SBRC r16,0 ;überspringe den nächsten befehl, wenn r16 nicht 0 ist
63 reti ;kehre zurück zum hauptprogramm
64 out PORTB,r16 ;gebe aus
65 rcall Zeit ;rufe zeit auf
66 inc r30 ;erhöhe tabellenwert um 1
67
68
69
70 ;--------------------------------------------------------------------------
71
72 links: cli
73 ldi r30,lo8(TABAL)
74 ldi r31,hi8(TABAL)
75 neuL: lpm
76 mov r16,r0
77 SBRC r16,0
78 reti
79 out PORTB,r16
80 rcall Zeit
81 inc r30
82
83
84 ;--------------------------------------------------------------------------
85
86 Zeit: ldi r20,0x0A ;Lade 0A in r20
87 l3: ldi r21,0xFF ;Lade 0FF in r21
88 l2: ldi r22,0xFF ;Lade 0FF in r22
89 l1: dec r22 ;Subtrahiere 1 von r22
90 brne l1 ;wenn 0 springe zu l1
91 dec r21 ;Subtrahiere 1 von r21
92 brne l2 ;Wenn 0 springe zu l2
93 dec r20 ;Subtrahiere 1 von r20
94 brne l3 ;Wenn 0 springe zu l3
95 ret ;Return-> zurück zum Hauptprogramm
Ich habe leider keine Möglichkeit das Programm zu testen da mein Board
nicht vom Computer erkannt wird :/
14.10.2015 22:22 :
Bearbeitet durch User
Jochen S. schrieb:
> Ich habe leider keine Möglichkeit das Programm zu testen da mein Board
> nicht vom Computer erkannt wird :/
Das macht nichts. Es gibt ja auch noch den Simulator vom Atmel Studio.
Lade es dort rein und simuliere es. Aber verkürze erst mal die
Wartezeit, indem du bei 'Zeit' gleich wieder einen RET machst. Sonst
simulierst du dich zu Tode.
In deinem Programm ist so einiges falsch. Aber erst mal solltest du
Gelegenheit haben, die wichtigsten Dinge selbst zu korrigieren.
Danke für die schnelle Antwort. Mit dem Programm ist mir echt
ausgeholfen!
Habe das Programm jetzt um einiges verändert, da nur meine Rote LED
funktionierte. Es scheint jetzt soweit zu Funktionieren. 1 ;Reset and Interrupt vector ;VNr. Beschreibung
2 rjmp main ;1 POWER ON RESET
3 rjmp int0_handler ;2 Int0-Interrupt
4 rjmp int1_handler ;3 Int1-Interrupt
5 reti ;4 TC2 Compare Match
6 reti ;5 TC2 Overflow
7 reti ;6 TC1 Capture
8 reti ;7 TC1 Compare Match A
9 reti ;8 TC1 Compare Match B
10 reti ;9 TC1 Overflow
11 reti ;10 TC0 Overflow
12 reti ;11 SPI, STC Serial Transfer Complete
13 reti ;12 UART Rx Complete
14 reti ;13 UART Data Register Empty
15 reti ;14 UART Tx Complete
16 reti ;15 ADC Conversion Complete
17 reti ;16 EEPROM Ready
18 reti ;17 Analog Comparator
19 reti ;18 TWI (I²C) Serial Interface
20 reti ;19 Store Program Memory Ready
21 ;------------------------------------------------------------------------
22 ;Start, Power ON, Reset
23 main: ldi r16,lo8(RAMEND)
24 out ioSPL,r16
25 ldi r16,hi8(RAMEND)
26 out ioSPH,r16
27
28 sbi DDRD,2 ;setzte Eingang
29 sbi PORTD,2 ;setzte Pull up
30
31 sbi DDRD,3 ;setzt Eingang
32 sbi PORTD,3 ;- Pull up
33
34 sbi DDRB,0 ;setzt Ausgang
35 sbi DDRB,1 ;setzt Ausgang
36 sbi DDRB,2 ;setzt Ausgang
37
38 ldi r16,0b11000000 ;lade 1100000 in r16
39 out GICR,r16 ;lade r16 in GICR
40
41 ldi r16,0b00001010
42 out MCUCR,r16
43
44 ldi r18, lo8(TABAL) ;lade Standartwert ins Register (Start mit Lichtlauf an)
45 ldi r19, hi8(TABAL) ;lade Standartwert ins Register
46
47 sei
48
49
50 ;-----------------------------------------------------------------------
51
52 mainloop:
53 mov r30, r18
54 mov r31, r19
55 nextwert: lpm r16, Z
56 cpi r16, 0
57 breq mainloop ;Springe zu mainloop, wenn r16 nicht 0 ist
58 out PORTB,r16 ;gebe aus
59 inc r30 ;erhöhe tabellenwert um 1
60 rcall Zeit ;rufe zeit auf
61 rjmp nextwert
62
63 int0_handler:
64 cli
65 ldi r18, lo8(TABAR)
66 ldi r19, hi8(TABAR)
67 sei
68 reti
69
70 int1_handler:
71 cli
72 ldi r18, lo8(TABAL)
73 ldi r19, hi8(TABAL)
74 sei
75 reti
76 ;--------------------------------------------------------------------------
77
78 Zeit: ldi r20,0x0A ;Lade 0A in r20
79 l3: ldi r21,0xFF ;Lade 0FF in r21
80 l2: ldi r22,0xFF ;Lade 0FF in r22
81 l1: dec r22 ;Subtrahiere 1 von r22
82 brne l1 ;wenn 0 springe zu l1
83 dec r21 ;Subtrahiere 1 von r21
84 brne l2 ;Wenn 0 springe zu l2
85 dec r20 ;Subtrahiere 1 von r20
86 brne l3 ;Wenn 0 springe zu l3
87 ret ;Return-> zurück zum Hauptprogramm
88
89
90 ;------------------------------------------------------------------------
91
92 TABAR: .byte 0x01,0x02,0x4, 0x0 ;Lade Tabelle
93
94 TABAL: .byte 0x04, 0x02,0x1,0x0
95
96 ;------------------------------------------------------------------------
15.10.2015 10:50 :
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.