- Labornetzteil AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 30

Thema: Zeitschleife Mikrocontroller

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    14.08.2015
    Beiträge
    16
    Es tut mir leid für die nervige Fragen.. also ein letztes mal . Ja ich will 80000 Takte. Wie meinst du mit ich muss die inneren loops vier mal durchlaufen bzw 4 als Startwert nehmen?



    vielen vielen Dank

    - - - Aktualisiert - - -

    also warum ich eine dritte schleife noch mit einfügen möchte, weil die mir empfohlen wurde. Ich habe zusätzlich diesen Beitrag aus einem Forum gelesen und dachte es wäre notwendig.

    Beitag aus Forum:

    Also, gesetzt den Fall, ein djnz-Befehl bräuchte nur 1 Taktzyklus. Nehmen wir mal an, die CPU würde mit 4,772727 MHz betrieben (ich weiß gar nicht, wie ich jetzt auf so'n komischen Wert komme...) Dann bedeutet das, sie hat 4772727 Takte pro Sekunde und um 2 Sekunden zu überbrücken, muß man 2 x 4772727 = 9545454 Takte durchlaufen lassen - oder anders ausgedrückt: So oft muß die innere Schleife durchlaufen werden, wenn der Befehl nur 1 Takt verbraucht. Verbraucht er mehr Takte, muß man den Wert durch die Anzahl Takte teilen, wenn er z.B. 3 Takte verbraucht, wäre der "Ticker-Wert" = 3191919 (eben 9545454 / 3).

    Von diesem Wert wird ja rückwärts nach 0 gezählt. Register sind ja immer binär, daher also z.B. 8 oder 16 oder 32 bit breit (ja, es gibt auch 4- oder 12-bit Register...), das heißt, der Wert ist im Falle von 8-Bit-Registern immer nach genau 8 bit zu teilen.
    Wäre er also 9545454, wäre das binär (als 24-bit-Wert) :
    100100011010011011101110, der ist also immer nach 8bit zu teilen:

    10010001 10100110 11101110, oder 145, 166 und 238 - und genau das sind die Werte, die nach R2, R1 und R0 müssen (nach R0, weil das die innerste Schleife ist, muß der unterste Wert, also hier 238, nach R1 müßte 166 und nach R2 dann 145).

    Einfachere Möglichkeit ist, einfach immer durch 256 zu teilen:
    9545454 / 256 = 37286, Rest 238
    32786 / 256 = 145, Rest 166
    (145 / 256 = 0, Rest 145 - aber das braucht man ja nicht mehr zu "berechnen"...)
    Diese Teilungsreste sind dann (sozusagen im Zahlensystem der 256) die einzutragenden Werte.
    (Ja, oder man wandelt die Zahl einfach ins Hexadezimalsystem und nimmt immer 2 Ziffern... Leider gibts heutzutage Assembler-Programmierer, die noch nie was vom Hexadezimalsystem gehört haben, deswegen weiß ich da manchmal nicht, ob ich das wie früher einfach voraussetzen kann...)

    .............

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    903
    Die Verwendung des dritten Registers ist eine Ressourcenverschwendung. Zu Anfang denkt man sich: "Ich hab doch 32 davon (R0..31)". Dann stellt man fest, man kann nur mit den oberen 16 alle Assemblerbefehle nutzen und eigentlich gehen davon auch noch die obersten 6 Register noch einmal ab, weil nur damit die 16-Bit-Adressierungen über X, Y und Z möglich sind.
    Was bleibt, sind magere 10 Registerchen zur vollen Verwendung.

    Zum Abschluss und zum Gedanken anregen:
    Wenn es Dir gelingt, eine 1Mikrosekunde-Warteschleife zu verfassen
    Wait1u:
    //Einsprung 3 Takte über rcall
    nop //10*1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    ret //Rücksprung 3 Takte
    //16 Takte


    Dann kannst Du doch auch eine Routine über 100 Mikrosekunden verfassen, in der Du die Wait1u-Routine wiederverwendest:
    Wait100u:
    //3 Takte Einsprung über rcall
    push r16 //1
    ldi r16, 84 //1
    Wait100u_Loop:
    rcall Wait1u //16 Takte
    dec r16 //1
    brne Wait100u_Loop //2
    Wait100u_End:
    pop r16 //1
    ret //3
    //19*84 + 9 = 1605


    Dann kannst Du auch nach der gleichen Form eine Wait1m schreiben
    Wait1m:
    //3 Takte Einsprung über rcall
    push r16 //1
    ldi r16, 10 //1
    Wait1m_Loop:
    rcall Wait100u //1605 Takte
    dec r16 //1
    brne Wait1m_Loop //2
    Wait1m_End:
    pop r16 //1
    ret //3
    //1608*10 + 9 = 16089 Takte


    Und ganz zum Schluss
    Wait5m:
    //3 Takte Einsprung über rcall
    push r16 //1
    ldi r16, 5 //1
    Wait5m_Loop:
    rcall Wait1m //16089 Takte
    dec r16 //1
    brne Wait5m_Loop //2
    Wait5m_End:
    pop r16 //1
    ret //3
    //16089*5 + 9 = 80454 Takte

    Diese Routinen (ich hab's jetzt hier im Editor geschrieben, mag noch irgendwo ein Fehlerchen drin sein) sind erweiterbar (Du kannst Dich damit bis in den Stundenbereich hochkaskadieren), anpassbar (Du musst nur die unterste Funktion an die Frequenz anpassen) und einfach wartbar (die Wartefunktionen haben immer die gleiche Form).
    Aber das Wichtigste: das einzige verwendete Register r16 ist in jedem Fall save, weil es in jeder Aufrufebene gepusht und gepoppt wird. Du kannst es also vor dem Aufruf einer der o.g. Wartefunktionen mit einem Wert beschreiben und nach dem Aufruf immer noch sicher sein, dass in r16 noch das steht, was Du dort hineingeschrieben hast.
    Geändert von Holomino (15.08.2015 um 00:08 Uhr)

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Dir ist aber schon klar das in der Wartezeit das komplette Programm steht. Es sind weder Eingaben noch Ausgaben möglich.
    Für diese Aufgaben sind die Timer vorgesehen.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    903
    Zitat Zitat von Hubert.G Beitrag anzeigen
    Dir ist aber schon klar das in der Wartezeit das komplette Programm steht. Es sind weder Eingaben noch Ausgaben möglich.
    Für diese Aufgaben sind die Timer vorgesehen.
    Klares "Jein" dazu.
    Das kommt auf den Anwendungsfall an. Ich persönlich finde es grausam, ein Konstrukt über einen Timer zu entwerfen, dass mir z.B. das Blinken einer einfachen Betriebs-LED im Sekundentakt erlaubt (am Blinken über die Wait-Routine siehst Du sogar, wie Deine IRQ-Auslastung ist).
    Alles in IRQs auzulagern, während das Hauptprogramm sich bei
    Main: jmp Main
    in der Nase bohrt, ist auch Kappes.

    Timer verwendest Du, wenn Du ein Timing (nach oben und nach unten, z.B. UART-Emulation) einhalten willst. Die Verwendung von einfachen Warteschleifen zur Einhaltung von Mindestzeiten (z.B. Tastenentprellen, I2C-Emulation,...) ist meiner Ansicht nach legal.

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Das ist wohl etwas Ansichtssache. Ich verwende wait-Routinen ausschließlich nur vor dem main um zu warten bis externe Geräte oder Bauteile Ready sind oder um auf dem Display Programmname und Versionsnummer anzuzeigen.
    Innerhalb der main gibt es nur Timer, wenn es ein ernst gemeintes Programm ist. Ein "blinky" zählt nicht dazu.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    903
    Kein Gerücht, siehe Hubert G.:
    Noch 2014 hat Hubert G. bei einem LED-Problem geholfen, siehe https://www.roboternetz.de/community...ight=Hubert+G.
    Damals hielt er die Verwendung der _delay_ms-Funktion in der Main für legitim,
    Heute schließt er dies quasi aus.
    Der hat sich weiterentwickelt.


    Übrigens: Lass mich bitte nicht dumm sterben: Wo steht diese Norm? Ist das schon ISO-zertifiziert? Ich lerne gern.

  7. #7
    Robobionic
    Gast
    Zitat Zitat von Holomino Beitrag anzeigen
    Kein Gerücht, siehe Hubert G.:
    Noch 2014 hat Hubert G. bei einem LED-Problem geholfen, siehe https://www.roboternetz.de/community...ight=Hubert+G.
    Damals hielt er die Verwendung der _delay_ms-Funktion in der Main für legitim,
    Heute schließt er dies quasi aus.
    Der hat sich weiterentwickelt.
    Ich wüsste nicht weshalb solche Beispiele der Maßstab für Anfänger sein sollten.

    Zitat Zitat von Holomino
    Übrigens: Lass mich bitte nicht dumm sterben: Wo steht diese Norm? Ist das schon ISO-zertifiziert? Ich lerne gern.
    Ich bezweifle das Du gerne lernst, Du hast sie selbst erwähnt.

    Zitat Zitat von Holomino
    Eher die Erfahrung aus der Praxis, die zeigt, dass auch von Anfängern zusammengefummelte Lösungen neben der Norm exzellent laufen können

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Zitat Zitat von Holomino Beitrag anzeigen
    Kein Gerücht, siehe Hubert G.:
    Noch 2014 hat Hubert G. bei einem LED-Problem geholfen, siehe https://www.roboternetz.de/community...ight=Hubert+G.
    Damals hielt er die Verwendung der _delay_ms-Funktion in der Main für legitim,
    Heute schließt er dies quasi aus.
    Der hat sich weiterentwickelt.
    Ich habe allerdings auch geschrieben:
    Innerhalb der main gibt es nur Timer, wenn es ein ernst gemeintes Programm ist. Ein "blinky" zählt nicht dazu.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    Zitat Zitat von Holomino Beitrag anzeigen
    .. Klares "Jein" .. während das Hauptprogramm sich bei ... Main: jmp Main ... in der Nase bohrt, ist auch Kappes ...
    Ein klares, hartes, umfassendes Urteil! Nur, obs stimmt? Ich weiß nicht ob das nur Ansichtssache oder (auch) Programmierstil ist, aber ich kann Hubert.G nur uneingeschränkt beipflichten.
    Ciao sagt der JoeamBerg

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    903
    Zitat Zitat von oberallgeier Beitrag anzeigen
    Ein klares, hartes, umfassendes Urteil! Nur, obs stimmt? Ich weiß nicht ob das nur Ansichtssache oder (auch) Programmierstil ist, aber ich kann Hubert.G nur uneingeschränkt beipflichten.

    Das ist weder ein klares noch ein hartes Urteil. Eher die Erfahrung aus der Praxis, die zeigt, dass auch von Anfängern zusammengefummelte Lösungen neben der Norm exzellent laufen können, dass man Anfängern ihre Lernkurve und die verbundenen Fehler zugestehen muss. Die Ansprüche steigen mit der Zeit automatisch, damit die Wissbegierde und der Kenntnisstand. Dazwischen aber müssen erst einmal spielerische Erfolgserlebnisse her.

    Schau mal im AVR-Tutorial bei Mikrocontroller.net (oder in Dein altes AVR-Assembler-Buch im Regal), in welchem Kapitel Timer angesprochen werden. Über den didaktischen Sinn, diese Infos in die zweite Hälfte des Lehrinhaltes zu schieben, mag ich mich mit Dir nicht streiten (und Du sicherlich auch nicht mit den Autoren).

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Zeitschleife Mikrocontroller
    Von sisi im Forum Bauanleitungen, Schaltungen & Software nach RoboterNetz-Standard
    Antworten: 4
    Letzter Beitrag: 08.10.2015, 20:44
  2. [ERLEDIGT] Zeitschleife zu kurz....ATTiny2313
    Von oderlachs im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 10.03.2013, 15:10
  3. Taster mit Zeitschleife
    Von bnitram im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 15
    Letzter Beitrag: 28.05.2010, 18:01
  4. Zeitschleife
    Von Exodus im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 07.06.2006, 17:32
  5. Zeitschleife
    Von Exodus im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 01.06.2006, 14:34

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests