Forum: Mikrocontroller und Digitale Elektronik Lichtlauf mit Interrupt (myAVR)


von Jochen S. (homelessterminator)


Lesenswert?

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 :/

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

von Jochen S. (homelessterminator)


Lesenswert?

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
;------------------------------------------------------------------------

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.