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
hi soweit ich das sehe koennte der branch tread interresant sein so vowegen rjmp und brench ...... laueft gerade hier im forum juergen
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...
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
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
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
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
.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
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.
Ach ja Hannes hab es gesehen. (Wußte ich garnicht) :-) Mach es immer anders nutze diese Labels nicht Sorry
@Andi: Ich nutze sie bisher auch (noch) nicht, habe mir aber vorgenommen, das zu ändern, zumindest langfristig gesehen... 8-D
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
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)
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
Ü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...
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.