Forum: Mikrocontroller und Digitale Elektronik Delayroutine simuliert sich nicht!


von Andreas (Gast)


Lesenswert?

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

von Andreas (Gast)


Angehängte Dateien:

Lesenswert?

Sorry, jetzt aber...im Anhang!

von Tobias (Gast)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

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

von Tobias (Gast)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

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...

von Andi K. (Gast)


Lesenswert?

Dir ist schon klar, das 1 Sekunde lang in der Simulation eine halbe
Ewigkeit dauert?

MfG
Andi

von Tobias (Gast)


Lesenswert?

> 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 ?

von Andreas (Gast)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

@ 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.

von Andreas (Gast)


Lesenswert?

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!

von Tobias (Gast)


Lesenswert?

hmm, habe noch nicht mit dem attiny26 gearbeitet. Kann dir da nicht
weiterhelfen.

von Jürgen Broß (Gast)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

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.

von Andreas (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.