Forum: Mikrocontroller und Digitale Elektronik Interrupt RxD


von Roman P. (user08)


Angehängte Dateien:

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ß

von crazy horse (Gast)


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

von H.Baydoun (Gast)


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

von Roman P. (user08)


Lesenswert?

juhu :)
Es klappt!!!
vielen Dank

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.