www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt RxD


Autor: Roman P. (user08)
Datum:
Angehängte Dateien:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: H.Baydoun (Gast)
Datum:

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

Autor: Roman P. (user08)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
juhu :)
Es klappt!!!
vielen Dank

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.