Forum: Mikrocontroller und Digitale Elektronik Register ändert sich nicht durch Interrupt (Tasterdruck)


von Christian (Gast)


Lesenswert?

Hallo,

ich bin Anfänger im Mikrocontroller-Bereich und habe bis jetzt folgende 
Hardware:

-Pollin Evaluationsboard
-USB AVR Lab im usbasp Modus
-ATmega8 als Controller

An PORTD hängen an den Pins 5 und 6 je eine LED, an Pin 7 ein 
Pieper.(Bedingt durch das Evaluationsboard) An Pin 0 und 1 sind die UART 
Anschlüsse dran, an Pin 2,3,4 sind jeweils Taster dran.

Nun steuere ich zum Test den Buzzer an, welcher immer ein- und 
augeschaltet wird, und zwar je nach Ergebnis des Vergleichs zwischen 
einer Zählvariablen und einer festen Variablen. Wenn ich nun über einen 
Interrupt(also Tastendruck) die Inkrementiervariable erhöhe, sodass die 
Zählvariable pro Durchlauf mehr erhöht wird, passiert nichts, die 
Tonhöhe des Piepers bleibt gleich. Ändere ich die Inkrementiervariable 
aber per Hand im Init-Teil des Programmes, also vor der Schleife, 
funktioniert dies fehlerfrei. (Nebenbei werden noch LEDs ein und 
ausgeschaltet, dies ist aber nicht von Interesse und funktioniert wie 
gewollt)

Hier mein Code: (Wichtig ist m.M.n. nur der Teil ab loop)
1
.include "m8def.inc"
2
 
3
.def temp = r16
4
.def beepinc = r17
5
.def beepcounter = r18
6
 
7
.org 0x000
8
         rjmp main            
9
.org INT0addr
10
         rjmp int0_handler    
11
.org INT1addr
12
         rjmp int1_handler    
13
 
14
 
15
main:                        
16
 
17
         ldi temp, LOW(RAMEND)
18
         out SPL, temp
19
         ldi temp, HIGH(RAMEND)
20
         out SPH, temp
21
 
22
         ldi temp, 0b11100000
23
         out DDRD, temp
24
 
25
         ldi temp, (1<<ISC01) | (1<<ISC11) | (1<<ISC00) | (1<<ISC10) ; INT0 und INT1 auf fallende Flanke konfigurieren
26
         out MCUCR, temp
27
 
28
         ldi temp, (1<<INT0) | (1<<INT1) ; INT0 und INT1 aktivieren
29
         out GICR, temp
30
31
     ldi beepinc, 0b00000001
32
 
33
         sei                   
34
 
35
loop:    
36
    add beepcounter, beepinc
37
    cpi beepcounter, 0x80
38
    brsh piep1
39
    brlo piep2
40
41
    rjmp loop
42
 
43
int0_handler:
44
     sbr beepinc, 3
45
     sbi PORTD, 5
46
         reti
47
 
48
int1_handler:
49
         cbr beepinc, 3
50
     cbi PORTD, 5
51
         reti
52
53
piep1:
54
  sbi PORTD, 7
55
  sbi PORTD, 6  
56
  ret
57
58
piep2:
59
  cbi PORTD, 7
60
  cbi PORTD, 6
61
  ret

von Karl H. (kbuchegg)


Lesenswert?

Kurze Rückfrage:
Du schaltes ja auch innerhalb der ISR die LED an Pin 5 um. Siehst du 
diesen Wechsel, wenn du eine Taste drückst?

von Christian (Gast)


Lesenswert?

Ja, den sehe ich. Wie gesagt funktionieren die LEDs wie gewollt, also 
eine Taste zum einschalten, die andere zum ausschalten.

von spess53 (Gast)


Lesenswert?

Hi

>    brsh piep1
>    brlo piep2

>piep1:
>  sbi PORTD, 7
>  sbi PORTD, 6
>  ret

>piep2:
>  cbi PORTD, 7
>  cbi PORTD, 6
>  ret

Du kannst nicht irgendwo hin springen, und dann versuchen mit 'ret' 
wieder zurückzukommen. 'piep1' und 'piep2' kannst du nur mit 'rcall' 
aufrufen.

MfG spess

von Christian (Gast)


Lesenswert?

Ah ok danke. Hab einfach ret durch rjmp loop ersetzt, das Programm 
funktioniert jetzt wie gewollt!

von Christian (Gast)


Lesenswert?

Wo das Thema gerade noch aktuell ist habe ich noch eine Frage:

PORTD ist ja teilweise Ein-, teilweise Ausgang.
Was passiert wenn ich nun per in temp, PORTD die Eingänge abfrage?
Ich habe was ausprobiert, was aber nicht funktioniert, nach dem Prinzip
1
in temp, PORTD ;Eingänge auslesen
2
andi temp, 0b00000100 ;Alle bits außer bit 2 auf null setzen (bit 2 = taster)
3
cpi temp, 0b00000100 ;Vergleich
4
breq aufruf ;hier sollte das Programm zu der genannten Stelle springen, wenn der Taster gedrückt ist

Dies funktioniert aber nicht.

von Karl H. (kbuchegg)


Lesenswert?

Christian schrieb:
> Wo das Thema gerade noch aktuell ist habe ich noch eine Frage:
>
> PORTD ist ja teilweise Ein-, teilweise Ausgang.
> Was passiert wenn ich nun per in temp, PORTD die Eingänge abfrage?

Eingänge werden abgefragt, in dem man das PIND Register ausliest.

Ist ein Pin auf Eingang geschaltet, dann sagt dir das PORT Register für 
diesen Pin, ob dort der Pullup Widerstand eingeschaltet ist.

Nochmal genauer studieren:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen

von Christian (Gast)


Lesenswert?

Ups das ist mir glatt wieder entfallen (Hab mir das Tutorial 
durchgelesen, bevor ich alles zum programmieren zusammen hatte. Das mit 
den Pullups wusste ich aber noch!)

Ok danke, ich quäl euch dann mal nicht länger ;)

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.