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 :/
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 | ;------------------------------------------------------------------------
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|