Register ändert sich nicht durch Interrupt (Tasterdruck)

Gast #1766660
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
Gast #1766709
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
Gast #1766780
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.
#1766782
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
Gast #1766869
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 ;)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren