www.mikrocontroller.net

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


Autor: Jemand (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: juergen klauck (Gast)
Datum:

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

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was meinst du mit das spring nicht um??

Autor: andi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jens123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: andi (Gast)
Datum:

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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Andi:

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

8-D

Autor: andi (Gast)
Datum:

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

Autor: Jemand (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.