mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kann über Uart nichts empfangen


Autor: Weihnachtsmann (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo


Ich habe ein Programm geschrieben mit dem ich übers Terminal ein
Zeichen sende das auf den PortB ausgeben und ans Terminal zurücksende.

Leider geht nichts beim simulieren (wenn ichs richtig mache) springt er
beim sobald sich im Uart 7RXC  ändert in die Reset Routine.

Seit dem ich nicht mer mit 8515 sondern mit Mega16 arbeite habe ich
problem mit dem Empfangsinterrupt.

Wer sieht das Problem ?


Gruss

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stack Pointer initalisieren ;)

Gruss Jens

Autor: Weihnachtsmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jens

Der Stackpoint ist doch so initialisiert oder sehe ich das Falsch?

ldi Temp, LOW(RAMEND)
out SPL, Temp         ;Setzt Stackpointer LowByte
ldi Temp, HIGH(RAMEND)
out SPH, Temp         ;Setzt Stackpointer HighByte

Das habe  ich imme so gemacht.


Gruss

Weihnachtsmann

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ooops
uebersehen
sry ja

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es sein, dass du UBRR nicht richtig initialisierst?
Normalerweise ist es ein 16Bit-Register, das aus UBRRH und UBRRL
besteht.
Und man muss erst UBRRH (meist 0) und dann UBRRL übergeben.
Steht irgendwo im Datenblatt beschrieben...


Gruß Rahul

Autor: Weihnachtsmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht auch nicht

Also ich habe

ldi  Temp,UBRRVAL    ;Baudrate einstellen
out  UBRR,Temp


ersetzt durch:

ldi Temp, HIGH(UBRRVAL)  ;Baudrate einstellen
out UBRRH, Temp
ldi Temp, Low(UBRRVAL)
out UBRRL, Temp

Viele beispiele die ich sehe ist aber Low zuerst.

Autor: Weihnachtsmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann sein dass mit dem Interruptvector was nicht stimmt.
Denn wenn beim Simulieren wenn ich einen Interrupt auslöse
Springt er zu

reti      ;Analog Comparator Handle

und dann zu:

jmp Reset     ;Reset Handler

Und dann arbeitet er wieder "Reset" ab.

Ich sehe nicht mehr durch

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lass doch mal das "rcall SerOut" weg. Es ist immer ungünstig aus einer
Interrupt-Prozedur noch wieder eine andere aufzurufen (zumindest in
C...).
Interrupt-Routinen sollten immer möglichst kurz gehalten werden.

Autor: Weihnachtsmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht leider nicht oder in der Simulation noch im Betrieb.

Autor: Hartmut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Interrupttabelle am Anfang des Programms funktioniert nur bei AVR
mit kleinem Speicher. RETI ist ein 2Byte-Befehl, JMP XXX ein 3-Byte
Befehl.Im Datenblatt ist die richtige Struktur angegeben.

mfg Hartmut

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe früher auch ein bischen Assembler programmiert und hätte
folgende Vorschläge (die nich unbedingt stimmen müssen - kannst
probieren):
1.) schreib in den nicht erwendeten ISRs nicht direkt reti! mach zum
beispiel ein "unterprogramm" das unused_isr oder so heißt, schreib
dort ein reti rein und gib das bei den nicht verwendeten interrupts
an!

2.) deine interrupttabelle ist falsch! schau dir im datenblatt die
interruptvektortabelle GENAU an! unter program adress steht, das reset
auf 000 liegt, der nächste auf 002, der nächste auf 004! bei dir liegen
die interruptroutinen auf 000,001,002,003....
also mach entweder in der tabelle überall ein nop dazwischen oder
schreib vor jeden ISRaufruf jeweils 0x002 oder 0x004 hin - damit die
auf der richtigen adresse liegen! kannst aber beruhigt sein, den fehler
machen viele beim mega16!!

also besser die interruptvektortabelle aus und es sollte gehn!


mfg andi

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.