mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schleife auf Zeit


Autor: AndiS. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
komm einfach nicht drauf, vielleicht hat jemand einen Tip für mich...

Möchte z.B. 10 sek. lang eine Port-Abfrage-Schleife durchlaufen lassen 
und dann - wenn sich an den Ports nix getan hat -  zum Ende wechseln. 
Sollte in den 10 sek. der Portabfrage ein Bit gesetzt (Taster) sein, 
dann wird kurz was ausgeführt und wieder an den Anfang der 
10-sek.-Port-Abfrage-Schleife gesprungen, welche dann erneut 10 sek. 
lang läuft.

Funktioniert irgendwie nicht, wenn ich ein Register mit einem sehr hohen 
Wert lade um diesen jeden Schleifendurchlauf zu decrementieren und 
vergleiche bis ich null habe und zum Ende springen kann.
Springt irgendwie immer gleich zum Ende.

Bei 4Mhz dauert 1 Schleifendurchlauf ca. 1,75 µsek. (stimmts??)
Macht dann für 10 sekunden ca.  5714286 Durchläufe.
Kann ich so einen hohen Wert überhaupt in ein Register laden?


Anfang:
ldi             temp,(sehr hoher Wert)     ;bei 4Mhz Wert für 10s. lang 
Schleife
ldi             temp1,0                              ;eine Null zum 
Vergleichen

10-sek-Port-Abfrage-Schleife:
sbis       PINB,2                                         ;wenn Bit is 
set,
rjmp      kurzwasanderesausführen1       ;dann hierhin u. dann zum 
Anfang
sbis       PINB,3
rjmp       kurzwasanderesausführen2
sbis        PINB,4
rjmp       kurzwasanderesausführen3
dec         temp                                        ;(sehr hohen 
Wert) decrementieren
cpse       temp, temp1                            ;vergl. u. springe zu 
Ende wenn 0
rjmp       10-sek-Port-Abfrage-Schleife   ;wenn nicht 0 dann wieder von 
vorn
rjmp       Ende





Merci,
Andi.

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Kann ich so einen hohen Wert überhaupt in ein Register laden?

nein, dazu musst du 3 register nehmen...

für sonne lange zeit würde ich aber dein timer nehmen... mit nem hohen 
prescaler sollte das gut gehen.

Autor: AndiS. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine konkreten Beispiele?
Komm allein nicht klar...
:-(

Autor: Axel Barkow (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

schau mal bei der Codesammlung, da ist ein Beispiel für einen Timer der 
alle 50ms ein Register dekrementiert. Wenn du den Code ein wenig 
anpasst, sollte sich dein Problem damit lösen lassen.

Gruß,

Axel

Autor: AndiS. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs jetzt doch mit drei Registern, die hochgezählt werden gelöst,
mit dem Timer hab ichs net hingekriegt!
Andi.

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.