mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Delayroutine simuliert sich nicht!


Autor: Andreas (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht lesenswert
Sorry, jetzt aber...im Anhang!

Autor: Tobias (Gast)
Datum:

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

Autor: Andreas (Gast)
Datum:

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

Autor: Tobias (Gast)
Datum:

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

Autor: Andreas (Gast)
Datum:

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

Autor: Andi K. (Gast)
Datum:

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

MfG
Andi

Autor: Tobias (Gast)
Datum:

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

Autor: Andreas (Gast)
Datum:

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

Autor: Andreas (Gast)
Datum:

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

Autor: Andreas (Gast)
Datum:

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

Autor: Tobias (Gast)
Datum:

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

Autor: Jürgen Broß (Gast)
Datum:

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

Autor: Andreas (Gast)
Datum:

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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem gefunden:

Prescaler war zu hoch.
Habe mein Programm nur geringfügig modifiziert, es läuft.

Trotzdem "Danke" an alle!

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.