Forum: Mikrocontroller und Digitale Elektronik AVRStudio 4.10.356 Tiny15 SIM Problem


von Volker (Gast)


Lesenswert?

Hallo,
bin Newbie und
habe ein kleines Assembler Programm fuer einen Tiny15 geschrieben,
(ext. Int, timer1) das wollte ich jetzt mit AVRStudio 4.10.356 im
Simulator testen.
Da geht aber so einiges schief, timer1 overflow endlos interrupts, TIFR
flags loeschen geht nicht, BREQ werden nicht ausgefuehrt trotz equal.
Sind die Probleme bekannt, was waere eine stabile Version, die fuer
Tiny15 geht. Die vorherige Version hatte auch schon Probleme mit
Tiny15.

mfg Volker

von Volker (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist der Source code dazu.
Die Zeitkonstanten sind noch nicht entgueltig, habe ich fuer Testzwecke
heruntergedreht, will ja keine 50 Min. Realtime am Simulator abwarten.
Bedanke mich schon mal.

mfg Volker

von Werner (Gast)


Lesenswert?

Du musst auch nach dem unused Interrupt ein reti einfügen, sonst wird
das nichts...

Werner

von Volker (Gast)


Lesenswert?

Hallo Werner,
ich dachte, dann laeuft er in die reset routine und alles faengt von
vorne an. Ist das nicht zu empfehlen.
mfg Volker

von Werner (Gast)


Lesenswert?

Probier es doch aus. Was genau passiert kann ich Dir auch nicht sagen.
Es ist generell empfehlenswert Interruptroutinen mit Reti zu verlassen,
da sonst das Interruptflag nicht gelöscht wird. Vielleicht ist das ja
dein Problem

von Volker (Gast)


Lesenswert?

Hallo Werner, jetzt muss ich aber mal dumm fragen.
Mein RESET ist doch auch eine Interrupt Routine muss ich die auch mit
RETI abschliessen und wie komme ich dann in mein Hauptprogramm ?
mfg Volker

von ...HanneS... (Gast)


Lesenswert?

Hi Volker...

Reset ist keine Interrupt-Routine. Der Reset-Vektor steht an Adresse 0
und wird nur beim Power-On-Reset, beim Reset per Reset-Pin, bei
Watchdog-Reset aufgerufen.

Nach der Reset-Routine "fällt" die Abarbeitung ins Hauptprogramm, das
ja als Endlos-Schleife aufgebaut ist (zwischen Main: und tjmp Main).

Deine ISR (Interrupt-Service-Routinen) werden von den stattfindenden
Hardware-Ereignissen (Timer-Überlauf, Pegelwechsel am Input) ausgelöst
und müssen durch 'reti' abgeschlossen werden (so wie du es in deinem
Programm gemacht hast).

Trotzdem haben deine ISR einen gravierenden Fehler: Du sicherst das
Statusregister (SREG) nicht! Daher kann der Programmablauf total
durcheinander kommen. Falls du noch ein unteres Register übrig hast,
dann deklariere es exclusiv als SREG-Kopie (heißt bei mir immer
'srsk') und füge zu Beginn jeder ISR den Befehl 'in srsk,sreg' ein
und vor jedem 'reti' 'out sreg,srsk'. Damit sicherst du das SREG
für dein Hauptprogramm, deine ISR kann also deinem Hauptprogramm nicht
mehr die Flags 'verbiegen'.

Bei größeren AVRs mit SRAM und wenn Registermangel herrscht, ist es
üblich, das SREG auf dem Stack zu sichern.

Dein ganzes Programm habe ich nicht analysiert, die Kommentare sind zu
verwirrend, sieht aus, wie wild zusammenkopiert... - Sorry...

Bit- & Bytebruch...
...HanneS...

von ...HanneS... (Gast)


Lesenswert?

Sorry, Tippfehler, 'tjmp main' soll natürlich 'rjmp main' heißen,
die Tasten 't' und 'r' sind aber auch verdammt dicht zusammen...

...HanneS...

von Volker (Gast)


Lesenswert?

Danke, war natuerlich der Anfaengerfehler mit SREG retten.
Mein Prgr laeuft jetzt sogar auf dem Tiny15.
mfg Volker

von ...HanneS... (Gast)


Lesenswert?

Hi Volker...

Nix draus machen, da bist du nicht der erste (ist bei mir noch garnicht
lange her), aber noch lange nicht der letzte, dem das passiert...

...HanneS...

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.