Forum: Mikrocontroller und Digitale Elektronik Atxmega128a1 - Drehgeber auslesen


von Bryan O. (Firma: XX) (oconnor13127)


Angehängte Dateien:

Lesenswert?

Hey Leute..Zuerst muss ich sagen dass ich relativ neu bin im Umgang mit 
µCs..Hab nen bischen mit Arduino gebastelt und bin jetzt auf die Atxmega 
umgestiegen. Benutze den Atxmega 128a1 mit der IDE Atmel Studio v7 
müsste das sein. Das Programm dient grundsätzlich dazu einen Drehgeber 
auszulesen. Dazu soll er mir erstmal die zurückgelegten Inkremente 
ausgeben.

Stand: Alles initialisiert. UART funktioniert. Interrupt wird ausgelöst.

Probleme: Einerseits gibt er in HTerm teilweise vierecke zwischendurch 
aus. Woran liegt das?

Das größte Problem ist jedoch folgendes: Nachdem er in die ISR springt 
und dort ein Inkrement in die jeweilige Richtung hochzählt, gibt er 
keinen weiteren Wert aus. Er stoppt sozusagen, nachdem er das Interrupt 
durchlaufen hat anstatt an die vorherige Stelle in der Main 
zurückzuspringen. Fehlt mir dazu noch ein Befehl im Code um 
zurückzuspringen? Er stoppt selbst die serielle Ausgabe. Als ob er in 
die main nicht mehr rein springt.. Zudem gibt er mir am Ende auch nicht 
den hochgezählten Wert aus.

Beim debuggen ist zu erkennen, dass er das Interrupt richtig abarbeitet. 
Jedoch nachdem er aus dem Interrupt geht, springt er in den 
"Disassembly" in die Stellen 127 bis 129 und verbleibt dort im "no 
source file" (fängt nach 129 wieder bei 127 an)..

Packe den Code in einer TXT datei, einen Screenshot von HTerm  sowie des 
Disassembly in den Anhang.

Kann mir da jemand helfen?

Grüße Bryan

von Peter II (Gast)


Lesenswert?

[c]
  while (1)
    {
    Send_UART(Buffer);


    }
[c]

du sendest doch immer das gleiche?

Kennst du das hier?

http://www.mikrocontroller.net/articles/Drehgeber

von Frickelfritze (Gast)


Lesenswert?

Bryan O. schrieb:
> Packe den Code in einer TXT datei,

Packe den Code lieber in eine C-Datei und lass mal die
riiiesigen Tabs weg (in der Selbstbeschränkung liegt
der Meister). ä, ö, ü sind in C-Code auch eine ungute Idee.

von Bryan O. (Firma: XX) (oconnor13127)


Lesenswert?

Hey danke für die schnelle antwort.

Das Prinzip ist mir ja schon bekannt, da ich damit mal etwas beim 
Arduino gemacht habe. Genau ich sende immer das gleiche bzw. die gleiche 
Variable (der Wert verändert sich ja). Das will ich ja auch erstmal zum 
testen. und da entsteht schon das Problem, dass kein hochzählen möglich 
ist. Er gibt mir die ganze Zeit den Wert 0 der Variable aus, bis das 
Interrupt ausgelöst wird. Anschließend macht er nichts mehr. Keine 
Ausgabe kein nichts.

Eigentlich muss es so funktionieren, dass ich die Welle drehe und 
dadurch das Interrupt ausgelöst wird welches bei jeder Flanke die 
Inkremente hochzählt. Und ich will mir jetzt erstmal die zurückgelegten 
Inkremente in eine Richtung ausgeben lassen. Das klappt bisher nicht, da 
beim ersten Interrupt, wie erwähnt, der Controller nicht wieder in die 
while springt..weiß nicht ob ichs verständlich erkläre^^

von Bryan O. (Firma: XX) (oconnor13127)


Lesenswert?

@frickelfritze alles klar mach ich gleich mal :D

von Bryan O. (Firma: XX) (oconnor13127)


Angehängte Dateien:

Lesenswert?

Hier nochmal die .c ...umlaute und kommentare sind trotzdem noch drin :D

von Frickelfritze (Gast)


Lesenswert?

Bryan O. schrieb:
> kommentare sind trotzdem noch drin

Vieeel besser ..... und Kommentare sind willkommen.

von Rasputin (Gast)


Lesenswert?

Müsste das:
> itoa (increments_backward, Buffer, 10);              //Umwandlung der Zahl in 
String!!
nicht mit in die while schleife? Dort wo es jetzt steht ergibt es auf 
jeden Fall wenig Sinn.

von Bryan O. (Firma: XX) (oconnor13127)


Lesenswert?

stimmt..er stoppt trotzdem noch sobald das interrupt ausgelöst wird..bzw 
hängt im disassembly in einer dauerschleife zwischen nummer 127 bis 129

von Peter II (Gast)


Lesenswert?

Bryan O. schrieb:
> stimmt..er stoppt trotzdem noch sobald das interrupt ausgelöst wird..bzw
> hängt im disassembly in einer dauerschleife zwischen nummer 127 bis 129

du sendest auch ständig was, er wird einfach nicht fertig mit senden.

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.