Forum: Mikrocontroller und Digitale Elektronik UART funzt nich - ASM (Assembler) - ATMEGA16


von Alex B (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

warum funktioniert der Quellcode nicht?
Er schickt zwar die Punkte, aber er empfängt einfach nie was..

Kann mir vllt jemand helfen?

Mit freundlichen Grüßen
Alex

von Michael F. (startrekmichi)


Lesenswert?

Bist du dir sicher, dass er beim Empfang wirklich den Interrupt nach
"INT_RXC" macht? Weil folgendes sagt mir grad nix:
".org URXCaddr
        rjmp INT_RXC"

logischerweise musst du "rjmp INT_RXC" an die Stelle schreiben, wo er
beim USART Receive Complete Interrupt hinspringt und das wäre bei
"         reti;rjmp USART_RXC         ; USART RX Complete Handler"

von Alex B (Gast)


Angehängte Dateien:

Lesenswert?

geht auch nicht..

von Hartmut Gröger (Gast)


Lesenswert?

Hi

Versuch mal die rjmp durch jmp und reti durch reti und nop zu
ersetzen.

Mfg HG

von Alex B (Gast)


Lesenswert?

geht auch nich :(

von Hartmut Gröger (Gast)


Lesenswert?

Hi

Ich weiss zwar nicht wie dein Code jetzt aussieht, aber versuch mal
einfach dir Struktur der Interrupttabelle aus den Datenblatt zu
übernehmen. Ansonsten schau dir die Codebeispiele noch mal genau an.

Mfg HG

von Alex B (Gast)


Lesenswert?

die interrupttabelle ist ja 1 zu 1 von anderen programmen kopiert..
sollte also eigentlich gehen.. aber irgendwie wills ned.. kein plan
warum.. ich probier einfach mal weiter rum..

von Axel R. (Gast)


Lesenswert?

; Interruptroutine: wird ausgeführt sobald ein Byte über das UART
empfangen wurde
INT_RXC:
1.  push temp        ; temp im stack sichern
2.  in temp, UDR     ; Empfangenes Byte in R16(temp) laden
3.  ldi temp, 0x02
4.  out PORTA, temp   ; R16 über PortA (LEDs) ausgeben
5.  pop temp   ; temp wiederherstellen
6.  reti     ; Interrupt beenden

Hi,
Was ist mit 3.? Egal was du empfängst, Du gibts immer 0x02 aus...

Muss man in einer Interruptroutine generell das SREG sichern, Du seztz
mit Sicherheit das Z-Flag, wenn du "NULL" empfängst.
Sonst: Es könnte sein, das deine Interrupttabelle aus einem Programm
mit einem anderen Chip stammt. da sieht die Tabelle dann anders aus.
Habe ich jetzt aber nicht überprüft.
Gruß
Axel

von Axel R. (Gast)


Lesenswert?

Du seztz, er seztz, sie seztzen, sieht zugegeben komisch aus

"Du setzt" ist wohl richtig, sorry.

von Dave W. (Gast)


Lesenswert?

Schicke bitte nochmal den Quelltext..

c&p ist nicht immer gut:
"die interrupttabelle ist ja 1 zu 1 von anderen programmen
kopiert.."

Ab 16kB Flash sind die IntVektoren immer mit 2 Words bestückt (für
JMP).

Deswegen nochmal den Quelltext.

von Axel R. (Gast)


Lesenswert?

nun ich denke eins geht nur:
etweder die Interrupttabelle mit allen Ints untereinander aufführen.
Dann aber mit JMP statt RJMP( siehe Dave, siehe Datenblatt Mega16 Seite
44), oder nur mit den vordefinierten Adressen aus der mega16.inc
(.xxxadr) arbeiten. diese sollten auf alle Fälle stimmen.

Du kannst das Programm doch mal in's AVR Studio laden und das URXC
Flag von Hand setzen, dann siehst du, welcher IntVector angesprungen
wird.

von Axel R. (Gast)


Angehängte Dateien:

Lesenswert?

nur mit Reti in der Tabelle springt das Prog sonstwo hin

von Axel R. (Gast)


Angehängte Dateien:

Lesenswert?

mit reti+nop passt es,

beim ersten posting hat es auch gepasst:

".org URXCaddr
        rjmp INT_RXC"

war schon richtig..

Andere (gemeine) Frage:
Warum hast Du das nicht selbst schonmal im AVR Studio probiert?
Machst wohl noch nicht so lange, oder?

Gruß auch an alle
AxelR.

von Alex B (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist nochmal der Quellcode, ich hab die Teile, die nichts damit zu
tun haben, herausgeschnitten.
In der INT_RXC schaltet er nur zum Testen die LEDs in einen
festgelegten Status um, damit ich sehen kann, ob er überhaupt was
empfängt.
und ja, ich schreib das ganze in avr-studio und bin selbstverständlich
blutiger anfänger.. bis jetzt habe ich assembler ausschließlich für den
pc verwendet, das hier ist mein erster controller.
allerdings hatte ich doch auch schon ein programm geschrieben, in dem
der chip empfangen konnte und die leds danach geformt hat.

mfg

von Alex B (Gast)


Angehängte Dateien:

Lesenswert?

hier nochmal der alte quellcode, der funktioniert hat.

von Alex B (Gast)


Angehängte Dateien:

Lesenswert?

jetzt habe ich die interrupt-tabelle mal dem bild, dass hier gepostet
wurde angeglicher...läuft genausowenig..
ich schätze mal, dass es nur eine kleinigkeit ist, die hier überhaupt
nicht passt, aber welche?

von A.K. (Gast)


Lesenswert?

Ist es zuviel verlangt, mal in das Datasheet vom Controller
reinzuschauen? Da steht auf Seite 44 schon drin wie die IRQ-Tabelle
auszusehen hat. Deine Version braucht 4 Worte pro Eintrag, vorgesehen
sind 2 (Mega16 aufwärts).

Der Tip oben mit den NOPs ist nicht ganz passend. NOP nach RETI
braucht's nur dann, wenn für den jeweiligen Vektor kein JMP drin
steht. Also entweder JMP, oder RETI/NOP.

von Alex B (Gast)


Lesenswert?

warum funktioniert das ganze in dem einen programm, und im anderen
nicht??

von Erkan (Gast)


Lesenswert?

Sag mal, hast Du Brett vorm Kopf, oder was?
Benutzt Du IRQ-Tabelle mußt Du jeden Eintrag mit 2 Words füllen, OK?

Also, IRQ-Tabelle ohne ISR (Interrupt Service Routine) =

 RETI  ;  1 Word
 NOP   ;+ 1 Word = 2 Words

Mit ISR =

 JMP int_rxc  ;  2 Word

ODER

 RJMP int_rxc ;  1 Word
 NOP          ;+ 1 Word = 2 Words

Machst Du es so wie

.org URXCaddr
        rjmp int_rxc

braucht man das nicht zu machen weil durch .org URXCaddr die Adresse
für den INT-Vektor für URXC an die rivhtige Stelle gepflantzt wird.
Solltest Du aber noch einen Interrupt hinzufügen mußt Du das je nach
Adresse ob niedriger oder höher davor oder dahinter setzen.

von Alex B (Gast)


Lesenswert?

sag mal.. entweder blick ich hier überhaupt nix mehr, oder sonst was..
guck dir meinen vorletzten beitrag mal an.. interrupt.asm ...da hab ich
es doch genauso gemacht, wie du es eben beschrieben hast. und ganz am
anfang vom beitrag hatte ich es ja auch noch so:
.org URXCaddr
        rjmp int_rxc
und es funktionierte nicht... und in dem alt.asm was ich hier gepostet
habe, ist auch eine interrupttabelle mit NUR rjmp und reti und die
funktionierte ja komischerweise auch..

ich check langsam echt nix mehr :/

von Axel R. (Gast)


Lesenswert?

>und ganz am
anfang vom beitrag hatte ich es ja auch noch so:
.org URXCaddr
        rjmp int_rxc
und es funktionierte nicht...

doch, das hat funktioniert!
Nur hast Du die empfangenen Daten mit 0x02 überschrieben. Eigentlich
wolltest Du nur zusätzlich die LED schalten, hast aber mit "ldi
temp,0x02" den Wert den Du vorher mit "in temp, UDR" immer wieder
überschrieben. Wenn Du die Ausgabe "formen" willst, (was immer das
heissen mag) musst Du , wenn überhaupt "andi temp,0x02" machen und
das dann ausgeben.

von Alex B (Gast)


Lesenswert?

das hab ich nur als beispiel gemacht, um zu sehen, ob das unterprogramm
überhaupt aufgerufen wird. wäre es aufgerufen worden, wäre es völlig
egal gewesen, WAS empfangen worden wäre. somit hätten sich alle leds
bis auf das 2. ausschalten müssen (oder das 2. an).
--> tut es aber nicht

von Axel R. (Gast)


Lesenswert?

achso...

gehts denn nun?

von Alex B (Gast)


Lesenswert?

nein, sonst hät ichs selbstverständlich gleich gesagt ^^
ich hab schon alles mögliche ausprobiert.. ich verzweifel langsam..
warum geht das nicht?

von Alex B (Gast)


Lesenswert?

hier sind doch lauter ehrfahrene leute, die wahrscheinlich schon
ettliche controller programmiert haben. ich selbst habe nur erfahrung
mit pic-controllern, aber ich wollte halt mal nen ATMEL-Controller
ausprobieren. Bloß der will nicht so wie ich.
Wenn jemand mal kurz ein programm schreiben könnte, welches einfach die
empfangenen bytes über port A (LED-Leuchten) wieder ausgibt.. das lad
ich dann mal drauf und teste es, falls derjenige keinen baugleichen
controller hat.

mfg

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.