mikrocontroller.net

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


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)
.include "m8def.inc"
 
.def temp = r16
.def beepinc = r17
.def beepcounter = r18
 
.org 0x000
         rjmp main            
.org INT0addr
         rjmp int0_handler    
.org INT1addr
         rjmp int1_handler    
 
 
main:                        
 
         ldi temp, LOW(RAMEND)
         out SPL, temp
         ldi temp, HIGH(RAMEND)
         out SPH, temp
 
         ldi temp, 0b11100000
         out DDRD, temp
 
         ldi temp, (1<<ISC01) | (1<<ISC11) | (1<<ISC00) | (1<<ISC10) ; INT0 und INT1 auf fallende Flanke konfigurieren
         out MCUCR, temp
 
         ldi temp, (1<<INT0) | (1<<INT1) ; INT0 und INT1 aktivieren
         out GICR, temp

     ldi beepinc, 0b00000001
 
         sei                   
 
loop:    
    add beepcounter, beepinc
    cpi beepcounter, 0x80
    brsh piep1
    brlo piep2

    rjmp loop
 
int0_handler:
     sbr beepinc, 3
     sbi PORTD, 5
         reti
 
int1_handler:
         cbr beepinc, 3
     cbi PORTD, 5
         reti

piep1:
  sbi PORTD, 7
  sbi PORTD, 6  
  ret

piep2:
  cbi PORTD, 7
  cbi PORTD, 6
  ret

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Christian (Gast)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian (Gast)
Datum:

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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
in temp, PORTD ;Eingänge auslesen
andi temp, 0b00000100 ;Alle bits außer bit 2 auf null setzen (bit 2 = taster)
cpi temp, 0b00000100 ;Vergleich
breq aufruf ;hier sollte das Programm zu der genannten Stelle springen, wenn der Taster gedrückt ist

Dies funktioniert aber nicht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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-Tutori...

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.