Forum: Mikrocontroller und Digitale Elektronik UART-Terminal


von Max (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich habe folgendes Problem, ich möchte über das UART befehle an den MC
(ATMega8) schicken. Die kommunikation über das UART fungtioniert
soweit, also kein Hardwarefehler. Wenn ich im Studio4 mein Programm
simuliere leuft am anfang wie gewolt. Wenn aber die bestätigung
gesendet wurde springt er nicht zurück ins Programm sondern startet
wieder am anfang. Habs dann trotzdem mal versucht das ganze auf dem
STK500 laufen zu lassen, bekomm aber nur seltsme Zeichen zurück.
Könnte sich vieleicht mal jehmand das Programm anschaun, oder mal im
Studio simuliern?
Das programm ist im Anhang.

mfg Max

von Florian Pfanner (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

dein Problem ist in der int_uart_recive: routine. Der Befehl BREQ führt
einen absoluten Sprung aus. Danach kann nicht mit RET zurückgesprungen
werden. In der recive_... willst du aber genau das machen. Der
Controller list dann aus dem Stack den nächsten wert (hier ist das
gespeicherte Register temp) und gibt diesen in den Programm Counter. Da
dieser wert 0 ist, fängt der Controller von vorne an. Hab das Programm
jetzt ein bischen umgeschrieben. Müsste nun gehen.

PS: Wenn du mit den Megas Arbeitest: Hast du den internen Takt
ausgeschaltet??? FUSES!
denn die Megas Arbeiten Herstellermäßig mit dem Internen RC-Oszillator.
Wenn du aber einen anderen Takt benötigst, so musst du eine FUSE
umprogrammieren und erst dann kannst du den Externen Takt verwenden.

73, DB1PF, Florian Pfanner

von Max (Gast)


Lesenswert?

Hallo Florian,

Danke für deine Hilfe. werde es gleich probieren.
am besten wird sin, wen ich das register einfach nicht sichere und ein
explizit für jede aufgabe benutze.
Den internen Takt hab ich ausgeschaltet, hab die Fuses so wie im
Tutorial beschrieben gesetzt. Hat bis jetzt immer fungtioniert.

mfg
Max

von Florian Pfanner (Gast)


Lesenswert?

Das allein mit dem Register sichern ist nicht entscheident. Entscheident
ist, dass der Stack beim verlassen der Funktion (welche durch ret oder
reti verlassen wird) so ist, wie beim eintritt. Also wenn du ein wert
auf den Stack legst und den dann nicht mehr holst, so stürzt dein
Programm beim verlassen der Routine ab.

Gruß, Florian

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.