Hallo! Vielleicht werden sich noch ein paar von hier daran erinnern. Ich wollte vor kurzem Mal einen einfachen Logicanalyser basteln, der alle paar us die Eingänge an einem Port einliest und in einen SRAM schreibt. Anschließend können die Daten über den UART an den PC geschickt werden. Im Anhang ist das von mir geschriebene dazugehörige Assemblerprogramm. Als uC habe ich einen 8515 eingesetzt. Ich hab mir das foldendermaßen gedacht: vom PC an uC: 'D' (DATA) Daten einlesen. Dann vom PC ein 'R' (READ) startet er den Auslesemodus. Jetzt kann per 'N' immer ein Byte ausgelesen werden. Jetzt zu meinem Problem: Eigentlich funktioniert das alles sehr gut. Das einlesen geht perfekt - nur beim Auslesen kommt es ab und zu vor, dass ein Byte falsch rüber kommt, oder dass es nur ca. 40 statt der 255 Daten ausgibt. Vielleicht kann sich mal jemand mein asm file anschauen. Warum verlässt der uC manchmal die Ausleseroutine sram_loop? Und das bevor counter 255 ist ... DANKE! andy
habs nur überflogen, aber du musst in der interrupt routine auch das statusregister retten (ausser der 8515'er macht das automatisch ?). mit temp machst du's ja. lg
Hi Daniel, danke für deine Antwort! Sorry, bin noch Anfänger. Was meinst du mit Statusregister ?? Welches ist das! THX andy
OK, ich hab jetzt das Register USR folgendermaßen gesichert: push temp ; Temp sichern in temp, USR ; USR sichern push temp ; -"- ; TIMER TEIL pop temp ; USR auslesen out USR, temp ; USR wieder einstellen pop temp ; Temp auslesen reti ; return from Interrupt Routine Kann man das USR einfach schreiben ?? Funktionieren tuts leider immer noch nicht! andy
hmm also beim 4433'er heisst das Statusregister SREG versuchs mal damit. (müsstest eh im Datenblatt finden) Der Vorgang so wie du's machst ist aber richtig. Das Statusregister ist jenes wo alle Flags (Zero, Carry etc.) drinsind, deshalb ist es auch so wichtig es zu retten: stell dir mal folgendes vor: tst r15 breq xyz tst wird ausgeführt und das Z Flag entsprechend beeinflusst, bevor jedoch der breq ausgeführt wird kommt der interrupt, der verändert das Z Flag, nach dem interrupt wird beim breq fortgesetzt und ganz anders verzweigt als vorgesehen, weil ja das Z Flag nicht mehr das ergebnis des tst darstellt.... LG
Also dass hat das ganze Problem behoben! Vielen Dank, daran hab ich nicht gedacht ... Allerdings kommen manchmal immer noch Bytes falsch rüber (0x00). Das kann vielleicht auch an meiner Computer software liegen - ich muss das mal noch überprüfen. Falls es dann immernoch nicht geht, werd ich mich melden. Danke nochmals! Andy
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.