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


von Weihnachtsmann (Gast)


Angehängte Dateien:

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

von Jens (Gast)


Lesenswert?

Stack Pointer initalisieren ;)

Gruss Jens

von Weihnachtsmann (Gast)


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

von Jens (Gast)


Lesenswert?

ooops
uebersehen
sry ja

von Rahul (Gast)


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

von Weihnachtsmann (Gast)


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.

von Weihnachtsmann (Gast)


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

von Rahul (Gast)


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.

von Weihnachtsmann (Gast)


Lesenswert?

Geht leider nicht oder in der Simulation noch im Betrieb.

von Hartmut (Gast)


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

von andi (Gast)


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

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.