Hallo! Die im Anhang abgedruckte Routine läßt sich nicht simulieren. Alles funzt so weit, bis zu dieser Routine. In das Vergleichsregister OCR1C wird ein Wert eingelesen (vorher). In der "while (!(TIFR & (1<<OCF1A)))"-Schleife lbeibt er hängen. Das Bit OCF1A muß ich von Hand setzen! Im Register TCNT tut sich nichts, dort sollte er doch zählen... Irgendwo liegt das Problem. Mit Sicherheit was absolut "Dummes"! Die Routine soll nur den im Register OCR1C stehenden Wert vergleichen, dann bei Compare Match wieder von vorne anfangen. Das ganze Spiel 30mal. Ist 'ne simple Verzögerung. Gruß, Andreas
sorry für welchen Compiler, Simulator und für welchen Controller soll das sein, vielleicht könntest du mal ein bisschen mehr Zeit in deine Fehlerbeschreibung stecken, dann wird sich sicher eine Lösung deines Problems finden lassen. G. Tobias
Sorry, lieber Tobias, man darf ja mal was vergessen! Außerdem neigt man in Deutschland offensichtlich eher zum "Meckern" als zum konstruktiven Denken.... Nun gut,... Also: Nutze WinAVR (Prog. Notepad), simuliere im AVR Studio4, Proz: Attiny 26 Noch Fragen, Hauser? Gruß, Andreas
OK das ist doch ein Anfang. Probier mal im Makefile editor ein anderes debug Format aus. Da müssten 4 Optionsmöglichkeiten stehen {Ich habe bei mir (ElF/DWARF-2)} eingestellt. Zusätzlich den Optimization Level auf '0' stellen. Im Prog. Notepad "Make Clean" ausführen, und dann neu compilieren. Das müsste es gewesen sein. G. Tobias
Danke! Hab's probiert! Klappt aber nicht! Scheint nicht die Ursache zu sein. Ich glaube es,liegt am Code! Teiler soll auf 16384 stehen, dann bekomme ich bei vollem OCR1C (alle 8bit besetzt) eine Sekunde bis zum Compare Match. hier irgendwo ist der Haken. Vielleicht habe ich irgendwelche zusätzlichen Bits vergessen...
Dir ist schon klar, das 1 Sekunde lang in der Simulation eine halbe Ewigkeit dauert? MfG Andi
> TCCR1B = 0x8F;/ Timer starten mit Vorteiler von 16384, ohne > OC1-Aktionen, Bedeutet diese Zeile das der Timer ständig wieder neu gestartet wird ? Vielleicht mal mit leerer {do} anweisung probieren und mit leerem while Block . beim Schrittweisen debuggen ändert sich der timer inhalt doch richtig, oder ?
Iss' mir klar! Aber ist es normal, daß im TCNT (TimerCounterRegister9 überhaupt nichts passiert? Da sollte doch wohl hochgezählt werden. Oder? Irgendwie startet der Timer überhaupt nicht. Fehlt mir vielleicht eine Headerdatei? timer.h? Gruß, Andreas
@ Tobias. War zu langsam. Antwort bezog sich auf Kassnersch Andreas...:-) Nöö, es passiert garnichts! Ja, der Timer wird immer neu gestartet, nach jedem Durchgang. Also, meine Idee (die vielleicht falsch ist): Timer zählt bis Compare Match mit Wert im Vergleichsregister. Dann soll ja ein Bit im TIFR-Register gesetzt werden (lt.Datenblatt), macht er "automatisch", eben das besagte OFC1A-Bit. Wird das gesetzt, dann ist der Durchlauf beendet, der Timer wird gestoppt und startet von vorne. Insgesamt 30mal.
Habe jetzt mal den zu vergleichenden Wert in OCR1A einlesen lassen (softwaremäßig). und.... er wird immer noch in OCR1C eingelesen! Da ist doch was faul!
hmm, habe noch nicht mit dem attiny26 gearbeitet. Kann dir da nicht weiterhelfen.
Hallo Andreas, ich habe bisher nur den AVR AtTiny13 verwendet bin aber der selben Meinung wie Tobias, dein Timer wird immer nur neu gestartet kommt aber gar nicht zum Laufen. Das Start-Kommando gehört meiner Meinung nach vor die While-Schleife. Des Weiteren fragst du zweimal auf Compare-Match ab, allerdings recht unterschiedlich, nämlich einmal mit (!(TIFR & (1<<OCF1A))) und einmal mit (TIFR == 0x40). Warum? Sind diese Abfragen beim AtTiny26 funktionsgleich? Ich meine, Compare-Match ist Compare-Match, da muß nicht zweimal abgefragt werden. Oder übersehe ich jetzt etwas? Wäre es nicht einfacher den Timer zu starten, dann per While-Schleife auf den Compare-Match zu warten und danach die restlichen Befehle aus dem IF-Block ausführen? Allerdings blockierst du dir mit dieser Warterei per While-Schleife den Prozessor. Um dies zu vermeiden könntest du den Timer Output Compare Match Interrupt verwenden. Grüße Jürgen
Also,... ich habe den Code jetzt etwas geändert. Das Problem ist aber generell, daß der Timer immer nach der Aktivierung hängen bleibt. Es wird nichts gezählt etc. Im Simulator springt der Pfeil praktisch immer zwischen TCCR1B = 0x8F; (Timer starten mit Vorteiler auf 16384) und dem darauf nachfolgenden if (TIFR & (1<<TOV1)) { TCCR1B = 0x00; (Timer stoppen und rücksetzen) } hin und her. Dieses Konstrukt habe ich in die for-Schleife eingebettet, sie soll 30mal durchlaufen werden.
Problem gefunden: Prescaler war zu hoch. Habe mein Programm nur geringfügig modifiziert, es läuft. Trotzdem "Danke" an alle!
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.