AtMega8 - ret geht manchmal nicht

Gast #130419
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
Angehängte Dateien:
Gast #130421
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...
Gast #130422
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
Gast #130425
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
Gast #130426
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
Gast #130427
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
Gast #130428
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.
Gast #130432
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
Angehängte Dateien:
Gast #130433
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)
Gast #130434
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
Gast #130435
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...
Gast #130436
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren