- Akku Tests und Balkonkraftwerk Speicher         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 35

Thema: Zeit mit DCF-Modul auslesen (brauche noch Hilfe!!!!!!!!!!!!)

  1. #21
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Anzeige

    Powerstation Test
    OK, hier ist mal die überarbeitete Version der Datei.

    Ich habe jetzt doch ein kleines Programm geschrieben, das eine LED einschällt, wenn das Signal kommt. Dieses Programm funktioniert auch. Die LED blinkt ziemlich gleichmäßig.

    Ich habe das Gefühl, dass der Timer1 ein bisschen zu schnell zählt, da der Overflow-Interrupt ziemlich schnell hinter einander erfolgt. Mein Verdacht liegt immer noch in dieser Zeile (obwohl ich es mit dem Taschenrechner nachgerechnet habe und der Timer erst alle 14,4 Sekunden überlaufen dürfte):
    Code:
    wert = (ICR1 * (TAKT / (256UL * 65535UL) / 1000UL)); //gezählter Wert in ms umrechnen (Takt=3,6864MHz)
    mfg
    Angehängte Dateien Angehängte Dateien

  2. #22
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    der Timer erst alle 14,4 Sekunden überlaufen dürfte
    Poste mal, wie du das ausrechnest.
    Bei 3,6864 MHz und einem Teiler von 256 komme ich auf einen Overflow alle 4,55 Sekunden.

    wert = (ICR1 * (TAKT / (256UL * 65535UL) / 1000UL)); //gezählter Wert in ms umrechnen
    Was hat das 65536 darin zu suchen? Wenn du eine bestimmte Anzahl Zählertakte in die äquivalente Zeit umrechnen willst, welche Rolle spielt dann, nach wie viel Takten der Zähler überläuft? Ein Takt ist immer gleich lang, egal ob der Zähler nun bei 65535 überläuft, oder niemals. Und auch die Tatsache, dass TAKT im Zähler steht, zeigt, dass die Formel falsch sein muss, denn t = 1 / f
    MfG
    Stefan

  3. #23
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Code:
    SIGNAL(SIG_INPUT_CAPTURE1)
    {//wird bei steigender Flanke des Signals ausgelöst um die Dauer der Pause zu berechnen
    
    ...
    
    TCCR1B |= (1 << ICNC1) | (1 << CS12); //Störunterdrückung ein; fallende Flanke; Taktteiler: 256
    Was denn nun, steigende Flanke oder fallende?

    Ich habe zwar den Code noch nicht so detailliert analysiert, um dir sagen zu können, was du da genau per Input Capture misst, aber die "Pause" ist es sicher nicht.

    Code:
    		if((wert>875) && (wert<925))
    		{
    		...
    		}
    		if((wert>775) && (wert<825))
    		{
    		...
    		}
    		else
    		{//keine Übereinstimmung der Pausendauer -> An aktueller Position Fehlermarke (-1) setzen
    Das passt auch nicht, denn wenn wert zwischen 875 und 925 liegt, landest du nicht nur im ersten if, sondern zusätzlich auch im else-Zweig.
    MfG
    Stefan

  4. #24
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Poste mal, wie du das ausrechnest.
    Bei 3,6864 MHz und einem Teiler von 256 komme ich auf einen Overflow alle 4,55 Sekunden.
    Stimmt, das habe ich vorher auch bemekt. Aber die Funktion SetTime() liefert bei mir schon nach ca. 6 Sekunden false zurück. Das heist ja, dass der Timer viel zu schnell zählt?!

    Wie ich genau auf diese Formel gekommen bin, weiß ich auch nicht mehr. In meinem µC-Buch ist die Berechnung solcher Dinge auch nicht gut erklärt (das Buch ist sicher nicht das beste). Wie würde die Formel richtig lauten?

    mfg

  5. #25
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Code:
    wert=ICR1/14;
    Wenn man die Zeile so umändert, müsste es doch funktionieren, da der Wert 65535 in ICR1 4,55sec entspricht. Dann entspricht der Wert 14 1ms.

    Aber es funktioniert immer noch nicht...

    mfg

    Edit: Ich habe gar nicht bemekt, dass der Thread schon 2 Seiten hat, deswegen habe ich die letzten Beiträge nicht gefunden.

    Aber das mit der Messung der Pausen müsste schon stimmen, da der Interrupt am Ende der Messung, eben bei einer steigenden Flanke ausgelöst wird. Das Bit ICES1 in TCCR1B ist deshalb nicht gesetzt, damit die Messung bei einer fallenden Flanke gestartet wird.

  6. #26
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo _R2D2,
    ... das mit der Messung der Pausen müsste schon stimmen, da der
    Interrupt am Ende der Messung, eben bei einer steigenden Flanke ausgelöst wird.
    Im Prinzip ist es egal, auf welche Flanke man reagiert. In einem meiner DCF-Decoder habe ich auf jede Flanke reagiert und die Zeit zwischen den Flanken gemessen. Wenn das 100 oder 200 ms waren, dann hatte ich die Impulse selbst, bei Werten von 800/900/1800/1900 ms waren es die Pausen. Die braucht man dann für die Decodierung.

    Gruß Dirk

  7. #27
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Dann entspricht der Wert 14 1ms.
    Kommt ungefähr hin.


    Aber es funktioniert immer noch nicht...
    Unter anderem deswegen, weil in ICR1 einfach nicht das drin steht, was du vermutest. (*1)

    Aber das mit der Messung der Pausen müsste schon stimmen, da der Interrupt am Ende der Messung, eben bei einer steigenden Flanke ausgelöst wird. Das Bit ICES1 in TCCR1B ist deshalb nicht gesetzt, damit die Messung bei einer fallenden Flanke gestartet wird.
    Wenn du ICES1 auf "fallende Flanke" konfigurierst, wieso glaubst du dann, der Interrupt würde bei der steigende Flanke ausgelöst? (*2)


    *1+2: Da ist wohl noch mal ein genaues Studium des Input-Capture-Kapitels im Datenblatt nötig.
    MfG
    Stefan

  8. #28
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Ich habe das Programm jetzt noch einmal überarbeitet. Das mit den Flanken stimmt jetzt. Das Programm schällt jetzt noch eine LED an und aus, wenn das Signal kommt, bzw. nicht kommt. Die LED blinkt auch regelmäßig. Aber die einzelnen Bits kann ich immer noch nicht auslesen...

    Ich finde trotz gründlichem Überprüfen einfach keinen Fehler mehr.

    mfg
    Angehängte Dateien Angehängte Dateien

  9. #29
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Setz dir einmal eine Led dort in dein Programm wo du den Start erkennst.
    Wo schaltest du zwischen fallender und steigender Flanke um?
    Es fehlt mir die main() und warum schreibst du das in die dcf77.h und nicht in dcf77.c
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  10. #30
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Wo schaltest du zwischen fallender und steigender Flanke um?
    Was meinst du damit? Wo soll denn ich umschalten?

    In main() wird was das dcf-Modul betrifft nur als erstes dcf_init() und dann SetTime() aufgerufen.

    mfg

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress