-         

Ergebnis 1 bis 10 von 10

Thema: DCF Empfänger in großem Programm auswerten?

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2008
    Ort
    Esslingen
    Alter
    29
    Beiträge
    235

    DCF Empfänger in großem Programm auswerten?

    Anzeige

    Guten morgen zusammen,

    Habe mir den DCF Empfänger von Conrad besorgt. Für die Auswertung der Bits muss ich ja mit einem Timer immer die Signallängen erfassen. Dies hatte ich mit einem Timer vor der alle 10ms einen Interrupt einleitet. Das Problem ist dass ich auch noch ein großes Hauptprogramm habe was mitläuft (Touchdisplay auswerten, Menuausgabe auf LCD etc.). Wenn ich den Timer jetzt alle 10ms einen Interrupt auslösen lasse kann ich nix mehr über das Touchdisplay eingeben weil der µc nicht reagiert. Liegt das an dem Timer? Wenn ich den Timer alle 100ms unterbrechen lasse läuft das Programm. Aber mit 100ms kann ich schlecht die Signallängen des DCF auswerten. Gibt es da eine andere Möglichkeit? Zwei Timer oder so etwas?

    Mfg Mel


    EDIT: Verwende einen ATMEGA644. Der Speicher ist mit dem jetzigen Programm so 61% voll (weis nicht ob das hilfreich ist)
    Elektronische Bauteile funktionieren mit Rauch. Lässt man den Rauch raus, sind sie kaputt.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hallo Mel,
    ich gehe davon aus, dass du auch nicht die eingebaute DCF-Routine benutzt, ansonsten müsstest du ja keine Auswertung der Zeiten machen. Außerdem nehme ich an, dass du die ganze Zeit am Pollen bist (den Pin abfragen). Benutzt du einen interrupt zur Erkennung des DCF-Signals?
    Wie bei allem Anderen was Interrupt gesteuert ist, setze ich auch hier nur ein Flag in der Interrupt Routine, bzw zähle eine Variable hoch. Die Auswertung geschieht dann im Hauptprogramm und dort in Konkurrenz z.B. mit der Routine, die die Eingaben abfragt oder das Display ansteuert.
    Das funktioniert bei mir ohne Blockade anderer Funktionen.
    Wenn dir das noch nicht genug hilft, zeig doch mal die Timer-Routine.

    Gruß

    Rolf

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2008
    Ort
    Esslingen
    Alter
    29
    Beiträge
    235
    Danke für die schnelle Antwort

    Nein, ich benutze nicht die DCF-Routine. Hatte vor mir die Abfrage selber zu schreiben und zwar so, wie du gesagt hast...mit Pin abfragen etc. Gibt es da einen besseren Weg? Code muss ich dir nachher posten bin grad noch auf der Arbeit.
    Elektronische Bauteile funktionieren mit Rauch. Lässt man den Rauch raus, sind sie kaputt.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2008
    Ort
    Esslingen
    Alter
    29
    Beiträge
    235
    So der Code:

    $regfile = "m644def.dat"
    $hwstack = 64
    $swstack = 128
    $framesize = 64
    $baud = 9600
    $crystal = 8000000
    $lib "glcdKS108.lib"


    Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Portd , Ce = 2 , Ce2 = 3 , Cd = 4 , Rd = 5 , Reset = 7 , Enable = 6


    Config Adc = Single , Prescaler = 128 , Reference = Internal_2.56

    Config Timer1 = Timer , Prescale = 256
    Timer1 = 62410
    Disable Timer1
    On Timer1 Cntfull
    Config Portb.0 = Output
    Portb.0 = 1

    Dim Stehlampes As Byte , Beltimeist As Integer , Beltimesoll As Word , Menutimeist As Integer , Menutimesoll As Word , Stehlampetimesoll As Byte , Einstellungentimesoll As Byte , Tvtimesoll As Byte , Tvtimeist As Byte , Internettimesoll As Byte , Internettimeist As Byte , Wlantimesoll As Byte , Wlantimeist As Byte , Neontimeist As Byte , Neontimesoll As Byte , Lichterkettetimesoll As Byte , Lichterkettetimeist As Byte , Musikanlagetimesoll As Byte , Musikanalgetimeist As Byte
    Dim Temp As Byte , X As Word , Y As Word
    Dim Menu As Integer
    Dim Nacht As Bit , Tv As Bit , Internet As Bit , Wlan As Bit , Neon As Bit , Lichterkette As Bit , Musikanlage As Bit , Leuchtkugel As Bit
    Start Adc

    Print "Alles wird übertragen"
    Menu = 0
    Beltimesoll = 150
    Beltimeist = 150
    Menutimesoll = 150
    Menutimeist = 150

    Do
    Disable Interrupts
    If X > 25 And Y > 25 Then : Beltimeist = Beltimesoll : Menutimeist = Menutimesoll : End If
    If Beltimeist <= 0 Then : Portb.0 = 0 : Else : Portb.0 = 1 : End If
    If Menutimeist <= 0 Then : Menu = 0 : Showpic 0 , 0 , Mainmenu : End If
    If Menu = 0 And Beltimeist <= 0 Then : Disable Timer1 : Else : Enable Timer1 : End If

    Select Case Menu
    Case 0 : Gosub Menu0 'Mainmenu
    Case 1 : Gosub Menu1 'Musik
    Case 2 : Gosub Menu2 'Steuerung
    Case 3 : Gosub Menu3 'Pccontroll
    Case 4 : Gosub Menu4 'Einstellungen
    Case 5 : Gosub Menu5 'Einstellungen_beltime
    Case 6 : Gosub Menu6 'Einstellungen_kontrast
    Case 7 : Gosub Menu7 'Einstellungen_menutime
    Case 8 : Gosub Menu8 'Einstellungen_nachts_aus
    Case 9 : Gosub Menu9 'Einstellungen_nachts_ein
    Case 10 : Gosub Menu10 'Einstellungen_nachts_eingabe_bis
    Case 11 : Gosub Menu11 'Einstellungen_nachts_eingabe_von
    Case 12 : Gosub Menu12 'Einstellungen_steuerung_time
    Case 13 : Gosub Menu13 'Internet
    Case 14 : Gosub Menu14 'TV
    Case 15 : Gosub Menu15 'Wlan
    Case 16 : Gosub Menu16 'Neon
    Case 17 : Gosub Menu17 'Lichterkette
    Case 18 : Gosub Menu18 'Musikanlage
    Case 19 : Gosub Menu19 'Stehlampe
    Case 20 : Gosub Menu20 'Leuchtkugel
    End Select
    Enable Interrupts
    Waitms 200
    Loop
    End
    .
    .
    .
    .
    .
    Readtouch:
    Config Pina.0 = Output ' Makes port F.0 output
    Config Pina.2 = Output ' Makes port F.0 output
    Set Porta.0 ' Sets port F.0 High
    Reset Porta.2 ' Sets port F.2 Low
    Ddra.1 = 0 ' Sets port F.1 as input
    Ddra.3 = 0 ' Sets port F.1 as input because we need it now as ad input
    Waitms 20 ' Wait until the port is stable
    Y = Getadc(3) ' Read the ad value for the y
    Y = 1024 - Y ' Invert the reading
    'Print "VALUE Y : " ; Y ' for debugging
    Config Pina.1 = Output ' Makes port F.1 output
    Config Pina.3 = Output ' Makes port F.3 output
    Reset Porta.1 ' Sets port F.1 Low
    Set Porta.3 ' Sets port F.3 High
    Ddra.0 = 0 ' Sets port F.0 as input
    Ddra.2 = 0 ' Sets port F.2 as input because we need it now as ad input
    Waitms 20 ' Wait until the port is stable
    X = Getadc(2) ' Read the ad value for the x
    X = 1024 - X ' Invert the reading
    'Print "VALUE X : " ; X
    If X > 25 And Y > 25 And Beltimeist <= 0 Then : Beltimeist = Beltimesoll : Menutimeist = Menutimesoll : Portb.0 = 1 : X = 0 : Y = 0 : Wait 1 : End If
    Return


    Cntfull:
    Timer1 = 62410
    Beltimeist = Beltimeist - 1
    Menutimeist = Menutimeist - 1
    Print "BELTIME" ; Beltimeist
    Return
    Elektronische Bauteile funktionieren mit Rauch. Lässt man den Rauch raus, sind sie kaputt.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Hallo MelMan,

    wo ist denn der Code, der DCF auswertet?

    In einer ISR (=Cntfull) sollte man nie etwas ausgeben (Print). Da sollten nur die allerwichtigsten Berechnungen stattfinden und sonst nichts.

    Gruß Dirk

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2008
    Ort
    Esslingen
    Alter
    29
    Beiträge
    235
    Ich hab ja noch gar keinen Code da ich wissen wollte ob das überhaupt geht von der Verarbeiteung. Ja den Printbefehl hatte ich nur zum testen weil ich den Timer eingestellt hab und der nicht richtig funktioniert hatte. Hab ich aber wieder rausgenommen
    Elektronische Bauteile funktionieren mit Rauch. Lässt man den Rauch raus, sind sie kaputt.

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Hallo MelMan,
    ... den Printbefehl hatte ich nur zum testen weil ich den Timer eingestellt hab und der nicht richtig funktioniert hatte.
    Die ISR kann auch deshalb nicht "funktionieren", weil der Print-Befehl da drin ist/war. Ohne Print müßte zumindest die ISR so klappen.

    Gruß Dirk

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2008
    Ort
    Esslingen
    Alter
    29
    Beiträge
    235
    Nein also soweit klappt das ja alles. Ich weis nur nicht ob ich den DCF Empfänger mit einem 100ms Interrupt auslesen kann (ob ich dann die Signale ausreichend erfassen kann) denn in einem Beispielprogramm wurde der Zustand des Pins immer im 10ms Interrupt erfasst. Oder ist es sinnvoller die Abfrage einfach mit der vorhandenen DCF-Lib von Bascom zu machen?
    Elektronische Bauteile funktionieren mit Rauch. Lässt man den Rauch raus, sind sie kaputt.

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Hallo MelMan,
    Ich weis nur nicht ob ich den DCF Empfänger mit einem 100ms Interrupt auslesen kann
    Nein, das ist zu langsam, denn die Impulslängen unterscheiden sich bei DCF77 um 100ms. Damit brauchst du für's Pollen eines Pins einen Interrupt mindestens alle 20ms (Bei 8 MHz: z.B. Timer1, Prescale 8, Startwert 45543).

    ist es sinnvoller die Abfrage einfach mit der vorhandenen DCF-Lib von Bascom zu machen?
    Ja, sehr sinnvoll. Da ist alles optimal angepaßt.

    Gruß Dirk

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2008
    Ort
    Esslingen
    Alter
    29
    Beiträge
    235
    Ok danke dann werd ich das alles nochmal ausprobieren=)
    Elektronische Bauteile funktionieren mit Rauch. Lässt man den Rauch raus, sind sie kaputt.

Berechtigungen

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