Kann über Uart nichts empfangen

Gast #163804
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
Angehängte Dateien:
Gast #163806
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
Gast #163808
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
Gast #163809
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.
Gast #163810
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
Gast #163811
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.
Gast #163813
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
Gast #163814
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren