Interrupt RxD

OP #584677
Lesenswert?
• ▲
▼
Hallo,
bin noch neu in der Thematik Mikrocontroller.
Habe ein Programm für den ATmega8 geschrieben der sihc auf einem STk500 
befindet.Das Programm soll in bestimmten Zeitzyklen eine ADWandlung 
durchführen.Durch ein Timer-Überlauf Interrupt wird der Zeitpunkt 
definiert und durch eine zweite SIR (USART_RXC) möchte ich gern einen 
der drei Analogeingänge durch ein gesendetes Zeichen  auswählen. Ich 
kann zwar über das senden der Zeichens "A" den ADC0 ansprechen+LED an 
PortD2, durch senden des Zeichens "b" den ADC2+LED an PortD4 aber es 
gelingt mir nicht immer (selten) mit Zeichen "C" den ADC1 anzusprechen. 
Woran kann das liegen? Würde mich über Lösungsvorschläge sehr freune, 
kann auch sein das ich in der Programm initialisierung einen Fehler 
gemacht habe, wie gesagt habe noch nicht die große Erfahrung.
DAnke und Gruß
Angehängte Dateien:
Gast #584684
Lesenswert?
• ▲
▼
USART_RXC:
  cli
//überflüssig

  push r16      ; Register temp auf Stapelspeicher sichern
uber1:          ; überprüft ob ein a gesendet wurde
  in r16,udr      ; Register UDR einlesen
  cpi r16,'A'      ; überprüfen ob ein a empfangen wurde
  brne uber2      ; wenn kein a empfangen wurde springe zu uber2
  ldi r16, 0b00100000     ; Siehe Datasheet S.202/203
  out ADMUX, r16
  cbi portd,3
  cbi portd,4
  sbi portd,2      ; Anzeige Kanal
  rjmp weiter      ; springe zu raus2
uber2:
  in r16,udr      ; Register UDR einlesen
//hier der Hauptfehler, du hast UDR schon gelesen
//nimm ein zweites Register
  cpi r16,'C'      ; überprüfen ob ein C empfangen wurde
  brne uber3      ; wenn kein a empfangen wurde springe zu uber2
  ldi r16, 0b00100001     ; Siehe Datasheet S.202/203
  out ADMUX, r16
  cbi portd,2
  cbi portd,4
  sbi portd,3      ; Anzeige Kanal
  rjmp weiter      ; springe zu raus2
uber3:
  in r16,udr      ; Register UDR einlesen
  cpi r16,'b'      ; überprüfen ob ein b empfangen wurde
  brne uber3      ; wenn kein a empfangen wurde springe zu uber2
  ldi r16, 0b00100010     ; Siehe Datasheet S.202/203
  out ADMUX, r16
  cbi portd,2
  cbi portd,3
  sbi portd,4      ; Anzeige Kanal
weiter:
  ldi zh,0      ; z-pointer auf unteren speicherbereich legen 0x60
  ldi zl,adresse
  pop r16        ; temp wieder vom Stapelspeicher holen
reti          ; Interruptroutine verlassen

//Ansonsten solltest du auf jeden Fall das SREG sichern
Gast #584689
Lesenswert?
• ▲
▼
Hi,

ich würde UDR nur einmal lesen, d.h. "in r16,udr" direkt hinter push r16 
plazieren.

Bei "uber3" stimmt was nicht du schreibst wenn kein a empfangen wurde zu 
"uber2" verzweigt werden soll aber du verzweigt zu "uber3".

Gruss,
 HBY

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.