Forum: Mikrocontroller und Digitale Elektronik Probleme mit AVR-Experimentalboard (Pollin) und Interrupts


von Sebastian (Gast)


Lesenswert?

Guten Morgen,

ich bin in Sachen Mikrocontroller Neueinsteiger und versuche zur Zeit, 
meine ersten Erfahrungen zu machen.

Ich habe mir dazu von Pollin das Atmel-Evaluationsboard besorgt 
(http://www.pollin.de/shop/dt/MTY5OTgxOTk-/Bausaetze_Module/Bausaetze/ATMEL_Evaluations_Board_Version_2_0_1_Bausatz.html) 
und mit einem ATMega32 bestückt (den hatte ich noch da).

Das Board hat drei Taster, die auf PD2-PD4 liegen (T1 auf PD2 = INT0, T2 
auf PD3 = INT1) und mit Pulldown und Parallelkondensator angeschlossen 
sind, zwei LEDs auf PD5 und PD6 und einen Summer auf PD7. Die weiteren 
Anschlussmöglichkeiten wollte ich erst nutzen, wenn ich mich soweit fit 
fühle.

Die ersten Programme (grob am AVR-Tutorial orientiert) habe ich mit 
AVR-Studio erfolgreich testen können, Blinken, auf Tasten reagieren, 
Zählen, über Taster gleichzeitig "binär" eingegebene Zahlen durch 
entsprechend häufiges Blinken "auszählen" und so was. Einsteigerkost 
eben :)

Jetzt versuche ich, mich mit den Interrupts anzufreunden, weil ich die 
später brauchen werde, und laufe ein bisschen vor eine Wand.

Das Programm (bereinigt um Kommentare) soll als Funktionskontrolle mit 
LED1 blinken (geht) und je nach Interrupt (INT0 = ein, INT1 = aus) die 
zweite LED mitblinken lassen.

Aber:

Bei den Tasten 1 und 2 funktioniert gar nix, und Taste 3 (nicht benutzt) 
toggelt die Funktion. Hä? Ich steh auf dem Schlauch. Hat jemand von Euch 
eine Idee, woran das liegt, oder schon Erfahrungen mit dem Board?


Gruß
Sebastian

Code:
1
//.include "m8def.inc"
2
3
   .def temp  = r20 ; Arbeitsregister
4
   .def leds  = r21 ; welche LEDs sollen leuchten
5
   
6
   .CSEG                    
7
   .org 0 
8
9
   ; Interupt Vektoren 
10
   rjmp    init           ; Reset Handler 
11
   rjmp    doint0         ; IRQ0 Handler 
12
   rjmp    doint1         ; IRQ1 Handler 
13
   reti                   ; Timer2 Compare Handler 
14
   reti                   ; Timer2 Overflow Handler 
15
   reti                   ; Timer1 Capture Handler 
16
   reti                   ; Timer1 CompareA Handler 
17
   reti                   ; Timer1 CompareB Handler 
18
   reti                   ; Timer1 Overflow Handler 
19
   reti                   ; Timer0 Overflow Handler 
20
   reti                   ; SPI Transfer Complete Handler 
21
   reti                   ; USART RX Complete Handler 
22
   reti                   ; UDR Empty Handler 
23
   reti                   ; USART TX Complete Handler 
24
   reti                   ; ADC Conversion Complete Handler 
25
   reti                   ; EEPROM Ready Handler 
26
   reti                   ; Analog Comparator Handler 
27
   reti                   ; Two-wire Serial Interface Handler 
28
   reti                   ; Store Program Memory Ready Handler
29
30
 init: 
31
32
 ;Stackpointer 
33
   ldi temp, LOW(RAMEND) 
34
   out SPL, temp 
35
   ldi temp, HIGH(RAMEND) 
36
   out SPH, temp 
37
38
 ;Aus/Eingänge 
39
40
   ldi leds, (1 << 5)
41
42
   ldi temp, (1 << 5) | (1 << 6)
43
   out DDRD, temp                ; Port D Bits 5 + 6 als Ausgang
44
45
   ldi temp, (1<<ISC00)|(1<<ISC01)|(1<<ISC10)|(1<<ISC11) 
46
                                 ; INT0+1 auf steigender Flanke triggern (Ex-Board: Pulldown integriert!)
47
   
48
   out MCUCR, temp
49
 
50
   ldi temp, (1<<INT0)|(1<<INT1)  
51
                                 ; INT0+1 aktivieren
52
   out GICR, temp
53
 
54
   sei
55
56
 Main:
57
58
         mov    temp, leds       ; LEDs setzen
59
         out    PORTD, temp      ; Daten zurückschreiben 
60
61
         rcall waitones
62
63
         ldi    temp, 0x0        ; LEDs aus
64
         out    PORTD, temp      ; Daten zurückschreiben 
65
66
         rcall waitones
67
68
         rjmp Main
69
70
doint0:
71
        ori     leds, (1 << 6)
72
        reti
73
74
doint1:
75
        andi    leds, ~(1 << 6)
76
        reti
77
78
 wait:  
79
            ldi  R17, 0x02
80
 WGLOOP0:   ldi  R18, 0xFF
81
 WGLOOP1:   ldi  R19, 0xFF
82
 WGLOOP2:   dec  R19
83
            brne WGLOOP2
84
            dec  R18
85
            brne WGLOOP1
86
            dec  R17
87
            brne WGLOOP0
88
            nop
89
            ret
90
91
waitones: 
92
           ldi  R17, 0x10
93
 WGiLOOP0: ldi  R18, 0xFF
94
 WGiLOOP1: ldi  R19, 0xFF
95
 WGiLOOP2: dec  R19
96
           brne WGiLOOP2
97
           dec  R18
98
           brne WGiLOOP1
99
           dec  R17
100
           brne WGiLOOP0
101
           nop
102
           ret

von Sebastian (Gast)


Lesenswert?

Achso, das habe ich vergessen:

gewünschtes Verhalten wäre natürlich:

Taste drücken (steigende Flanke) - Schaltvorgang, also zweite LED 
mitblinken oder aus, je nach Taster

Ich muss aber wie ein Wilder mehrfach auf den Tastern rumknüppeln, damit 
ich überhaupt ein Ergebnis habe.

Mit einem anderen Programm (keine Interrupts, Input per 3x lsl von PD2-4 
auf PD5-7 geschoben und ausgegeben) geht es völlig problemlos...

Muss ich in der Schaltung nach einem Fehler suchen? Habe ich Interrupts 
nicht verstanden? Habe ich Probleme mit prellenden Tastern?

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.