Forum: Mikrocontroller und Digitale Elektronik AtMega8 - ret geht manchmal nicht


von Jemand (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
Ich hab da ein Prog das mehr oder weniger eine Uhr ist.
Es gibt auf einem 7-Segment display die swatchzeit aus.
das ganze geht mit einem 16bit-timer der dann jeweils einen Digit wert
erhöht usw
bloß dass da nichts erhöht wird weil der stack bzw ret nicht zu
funktionieren scheint
bei der delay subroutine gehtz bloß bei dem umf(umformen) und bei der
timerroutine das reti geht nicht
das hab ich halt mit rjmp umgestellt aber er zählt jetzt trozdem nicht
hoch
mfg Jemand

von juergen klauck (Gast)


Lesenswert?

hi
soweit ich das sehe koennte der branch tread interresant sein
so vowegen rjmp und brench ......
laueft gerade hier im forum
juergen

von thkais (Gast)


Lesenswert?

1. Ein Interrupt wird IMMER mit RETI abgeschlossen.
2. Ein Interrupt wird IMMER mit RETI abgeschlossen.
3. Wird der Timer-Interrupt erst ausgelöst, wenn man auch das Flag
TOIE1 im Register TIMSK setzt, ein Register TOIE1 gibts net.

Den Rest des Progs habe ich mir nicht angeschaut.... probiers mal mit
Timer-Interrupt.

Tipp: Es gibt einen Simulator für den AVR, (AVR Studio), damit findet
man so machen bösen Fehler, der einem schlaflose Nächte beschert...

von Jemand (Gast)


Lesenswert?

also ich hab jetzt das mit dem ret behoben aber mit dem timer stimmt da
immernoch was nicht
das springt nicht um
hier hab ich das ausgebesserte prog mal hochgeladen:
http://www.jemand.dreamworld.cd/main-c.asm
und hier noch ein teset für die Ledd anzeige das ging nicht weil die
umform sub vor der idleschleife stand und deshalb durch ret wieder zum
programmanfang gesprungen wurde:
http://www.jemand.dreamworld.cd/test.asm

also wie gesagt das prob ist irgendwo beim timer denk ich weil es nicht
umspringt
Danke schonmal im vorraus
Jemand

von andi (Gast)


Lesenswert?

was meinst du mit das spring nicht um??

von andi (Gast)


Angehängte Dateien:

Lesenswert?

Hier hast mal ein vernünftiges Basis System für den ATMEGA8
wo du deinen Code sinnvoll übertragen kannst
Vielleicht hilft es dir.
Keine Ahnung

Grüße Andi

von Jens123 (Gast)


Lesenswert?

Hi...
tia die boesen timer =)

versuch mal das gesamte tutorial durchzuarbeiten, villeicht verstehst
du dann die funktion eines µCs besser..

die branch anweisung sollte auch immer nur innerhalb der funktion
wirken sprich keinen sprung in ein anderes unterprogramm (bei einem
int) und nicht vergessen, die interuptschleife klein halten.. in deinem
fall ist das nciht so wichtig, aber ich wuerde es schinmal machen

timer0_ovf:
      ldi   neue_sekunde, 0x01
      reti

main:
     ldi   temp, neue_sekunde
     cpi   neue_sekunde, 1..

     jmp   main

so bekommst du das agnze etwas modularer aufgebaut

Mit freundlichen Grüßen Jens

von Jemand (Gast)


Lesenswert?

mit springt nicht um meinte ich wenn die timerzeit durch
ist(86,4Sekunden) sollte laut der timeraverflowsub auf dem display 157
ausgegeben werden statt wie bisher 000
das tut hab ich schon ganz durchgelesen gehabt
die branch hab ich auch nur innerhalb der jeweiligen funkt angewendet
ganz nebenbei
Jemand

von andi (Gast)


Lesenswert?

.org OVF1addr
  rjmp tovf
OVF1addr was ist das für ein Label??
Springt der überhaupt in die Interruptroutine?
Probier das erstmal aus.
Legst einfach ein Ausgang auf ne Led und schaltest die im Interrupt
ein.
Dann weißt du ob dein Interrupt überhaupt ausgelöst wird.
Was ich nicht glaube.

Grüße

von ...HanneS... (Gast)


Lesenswert?

Schau dir mal die Include-Datei an, da wird das definiert.

Es ist die Adresse, wo der entsprechende Int-Vektor zu stehen hat.

Diese Schreibweise ermöglicht es, das Programm ohne Änderung der
Int-Vektortabelle für andere AVR-Typen zu assemblieren.

von andi (Gast)


Lesenswert?

Ach ja Hannes hab es gesehen. (Wußte ich garnicht) :-)
Mach es immer anders nutze diese Labels nicht
Sorry

von ...HanneS... (Gast)


Lesenswert?

@Andi:

Ich nutze sie bisher auch (noch) nicht, habe mir aber vorgenommen, das
zu ändern, zumindest langfristig gesehen...

8-D

von andi (Gast)


Lesenswert?

Ich  nutze Assembler nicht mehr.
Schreibe mit C :-)

von Jemand (Gast)


Angehängte Dateien:

Lesenswert?

ja das hab ich schon überprüft
ein interrupt wird nicht ausgelöst oder wenn doch erst nach mehr als
3stunden...
ich hab mal das prog umgeschrieben damit man im AVR studio beim
simulieren mal schaun kann
hab ich vliell was falsch konfiguriert??
hat jemand ein prog für timer das funktioniert?? wenn ja könnte
derjenige das mal hochladen??
danke schonmal
Jemand

von andi (Gast)


Lesenswert?

TCCR1A=0x00;    // Normal Mode
TCCR1B=0x05;    // Prescaler 1024
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x50;            // Alle 20ms ein Interrupt
OCR1BH=0x00;
OCR1BL=0x00;

Hier kannst du es sehen es wird alle 20ms ein Interrupt ausgelöst
kannst du dir ja ausrechnen
4Mhz = 4000 Takte für eine millisekunde
4000Mhz / 1024 = ~ 4 (für eine millisekunde)
4 * 20 = 80 (0x50)
das heißt er zählt jetzt bis 0x50 bis ein Interrupt ausgelöst wird.
TIMSK- Register muß richtig gesetzt sein
und Globaler Interrupt muß freigegeben sein (sei)

von Jemand (Gast)


Lesenswert?

Ja ich hab das wo ich als letztes hochlud nochmal umgeschrieben da ist
mir aufgefallen dass der interupt schon ausgelöst wird bloß dass das im
Avr studio nicht angezeigt wird wenn der in die interruptroutine geht
werden die interruptroutinenbefehle eigentlich gleichzeitig mit den
normalen ausgeführt oder wird die normale ausführung unterbrochen
wenn sie unterbrochen wird find ichs sinnlos dass im Studio da nichts
angezeigt wird von wegen umspringen in die interrupt sub
naja ich denk es liegt nur am umstellen der zahlen
Jemand

von ...HanneS... (Gast)


Lesenswert?

Übersetze doch mal das Wort "Interrupt"...

Dein Controller hat nur eine CPU. Also kann nur ein Programm
abgearbeitet werden. Wird ein Interrupt (Unterbrechung) ausgelöst,
merkt sich die CPU (im Stack) die im Hauptprogramm folgende Adresse und
springt in das Int-Unterprogramm (ISR). Beim Reti wird die alte Adresse
vom Stack geholt und das Hauptprogramm weiter ausgeführt.

Damit es keine Probleme mit den Flags im Statusregister (SREG) gibt,
sollte man das SREG zu Beginn der ISR sichern und am Ende wieder auf
den alten Stand bringen.

Fazit: Es läuft zu jedem Zeitpunkt immer nur ein Programm...

von Jemand (Gast)


Lesenswert?

Ja das dachte ich mir aber ich finds halt komisch dass im studio nicht
gezeigt wird wennz in die interrupt sub geht
der timer war jedenfallz inordnung ich hab auchmal n blinklicht
realisiert...
also wirds wohl nur am laden der ziffern liegen
muss ich nochma anschauen
danke euch allen

von ...HanneS... (Gast)


Lesenswert?

Dann machste was falsch...

Den Astudio zeigt dir sehr wohl, wenn eine ISR aufgerufen wird. Da kann
man jeden Schritt nachvollziehen...

Versuchs mal mit Breakpoints

von Jemand (Gast)


Lesenswert?

mach ich wenn ich nächstes mal wieder ein prob mit den interrupts hab
es geht jetzt mit den Ziffern
freu
allen nochmal vielen dank für die hilfe

Jemand

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.