-
        

Ergebnis 1 bis 9 von 9

Thema: Brauche Rat: RTC Status oder Interrupt

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190

    Brauche Rat: RTC Status oder Interrupt

    Anzeige

    Hallo!

    Ich habe ein Frage bezüglich folgendem:

    Ich habe so langsam mein Menü für meine Wetterstation fertig. Nun will ich jedes Mal wenn ein Taster gedrückt wird, dass die Hintergrundbeleuchtung auf volle Leistung gesetzt wird und nach, sagen wir, 15 Sekunden wieder auf einen eingestellten Wert zurück fällt.
    Nun habe ich für die Hintergrundbeleuchtung schon Timer2 mit PWM beauftragt und zum Synchronisieren der RTC soll auch DCF zum Einsatz kommen. Dazu wird ja Timer1 benötigt.
    Soll ich nun jedes Mal diese 15 Sekunden als Alarm in den RTC programmieren und dann den Pin abfragen, oder das ganze mit dem Timer0 realisieren.
    Damit rumgespielt habe ich schon, aber um die 15 Sekunden einzustellen muss man schon etwas mehr Aufwand betreiben.
    Ausserdem möchte ich während der Programmausführung eigentlich so wenig interrupts wie möglich haben.
    Ich habe schon das Problem bei der DCF Routine von Bascom, dass sich der Mega32 aufhängt. Weiss da jemand zufälligerweise auch einen Rat?
    Währenddessen wird eigentlich nichts anderes ausgeführt, nur befindet sich der uC in einer Do...Loop Schleife mit einem Select Case Konstrukt.
    Ich habe den Verdacht, dass wenn ein Interrupt zufälligerweise auf ein "Return" trifft, dass es Probleme gibt.
    Für den Interrupt der Beleuchtung denke ich gilt dann das Gleiche und ich denke mit dem Alarmpin des RTC bin ich flexibler (werde übrigens den DS1337C verwenden).

    Was meint Ihr, und kann mir jemand einen Tipp bezüglich DCF-Problem geben?

    Vielen Dank!

    Marten83

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hallo Marten83,
    ich kann mir nicht vorstellen, dass es bei der Verarbeitung der Interrupts Probleme gibt. Mein ganzes Programm bearbeitet in einem fort Interrupts.
    Die kommen zum Teil über externe Pins mit Frequenzen zwischen 1Hz und 1KHz zum Teil durch einen Timer, der für alle möglichen Aufgaben da ist.
    Die Bearbeitung der Interrupts ist bei mir strikt von Auswertung getrennt. In der ISR wird meistens nur ein Flag gesetzt oder eine Variable hochgezählt.
    In der Main-Loop werden diese dann ausgewertet.
    Anfangs hatte ich auch befürchtet, dass es mit der sauberen Bearbeitung nichts würde. Aber mittlerweile werden neben dem Empfang des DCF-Signals durch eine eigene Routine noch in jeder Sekunde einmal 7 DS1820 Sensoren ausgewertet, eine eigene IR-Fernbedienung empfangen, Impulse eines Durchflusszählers für Heizöl gezählt und unmittelbar auf kritische Signale von außen reagiert.
    Und ich kann dir sagen, es geht ohne Probleme.
    Du musst dich auch von der Vorstellung trennen, dass du für jede zeitabhängige Aufgabe (15 Sek. Alarm) einen eigenen Timer brauchst. Wenn du z.B. die Soft-Clock mit der ISR Sectic benutzt, kann diese dies gut nebenbei machen.
    Beim Auftreten der Alarmbedingung setzt du eine Variable auf 15.
    In Sectic lässt du sie jede Sekunde runterzählen, bis sie bei 0 angekommen ist.
    Und in der Routine zur Helligkeitsberechnung fragst du nur, ob die Variable größer 0 ist. Wenn ja dann volle Helligkeit, ansonsten den eingestellten Wert.
    Ohne es jetzt ausprobiert zu haben, denke ich, dass du damit hinkommst.
    Ansonsten poste mal , vielleicht findet da ja jemand noch ein Problem.

    Gruß

    Rolf

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    Also wenn ich das richtig verstanden habe sollte ich generell kein RTC nehmen und die Uhrzeit per Config Clock = soft machen.
    Ich möchte aber eine relativ Genaue Uhrzeit haben. Ich habe nämlich die DCF Routine schonmal ausprobiert und mit internem Takt habe ich doch schon einige Sekunden pro Stunde Abweichungen gehabt.
    Welche Taktquelle wäre denn dann empfehlenswert?
    Ich versuche jetzt erstmal mein Glück mit DCF und Softclock und gebe dann mal bescheid.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    So, ich brauche jetzt erstmal Tipps zu meinem Code:

    Die DCF77 Routine funktioniert nur solange wie das Modul nicht eingesteckt ist. Wenn doch dann hängt er sich nach einer gewissen Zeit (1-2 Minuten) auf.

    Hier der Code:

    Hauptschleife:

    Code:
    $regfile = "m32def.dat"
    
    $crystal = 1000000
    
    $hwstack = 40
    
    $framesize = 24
    
    $swstack = 64
    
    $lib "glcdKS108.lbx"
    
    '*********************
    '* Bereich für Alias *
    '*********************
    
    Taster_mitte Alias Pind.1
    Taster_rechts Alias Pind.2
    Taster_links Alias Pind.3
    
    '*******************************
    '* Bereich für Konfigurationen *
    '*******************************
    
    Config Graphlcd = 128 * 64sed , Dataport = Porta , Controlport = Portc , Ce = 2 , Ce2 = 3 , Cd = 4 , Rd = 5 , Enable = 6 , Reset = 7
    
    Config Dcf77 = Pind.6 , Timer = 1
    
    Config Date = Dmy , Separator = .
    
    Config Taster_mitte = Input                                 'Pins für Taster als Eingang setzen
    Config Taster_rechts = Input
    Config Taster_links = Input
    
    '*****************************
    '* Bereich für Deklarationen *
    '*****************************
    
    
    
    '****************************************
    '* Bereich für Variablendimensionierung *
    '****************************************
    
    Dim Frameindex As Byte
    
    '* Hier sind nur Variablen aufgeführt, welche nach Beendigung wieder von anderen Routinen benutzt werden können!*
    
    Dim I As Byte                                               'Allgemeine Zählvariablen für Schleifen
    
    Dim Tvar1 As Byte , Tvar2 As Byte                           'Allgemeine Variablen für z.B. Rechenoperationen
    Dim Tvar3 As Byte
    
    Dim Str1 As String * 10
    
    Dim Merker1 As Bit                                          'Allgemeine Merker
    
    '****************************************
    '* Includes der Unterprogramm-Kopfteile *
    '****************************************
    
    $include "includes\Beleuchtung_Kopfteil.bas"
    $include "includes\Uebersicht_Kopfteil.bas"
    $include "includes\Menue_Kopfteil.bas"
    
    '***************
    '* Bootsequenz *
    '***************
    
    Enable Interrupts
    
    'Set Taster_mitte                                            'Pullups für Taster aktivieren
    'Set Taster_rechts                                           '!!!!!Funktioniert nicht
    'Set Taster_links
    
    Cls
    Waitms 100
    
    Tvar1 = Helligkeiteram
    
    Ocr2 = Lookup(tvar1 , Helligkeitswerte)
    
    Frameindex = 1
    
    '*****************
    '* Hauptprogramm *
    '*****************
    
    Do
    
    Select Case Frameindex
    
       Case 0 : Call Menue
       Case 1 : Call Uebersicht
       Case 2 : Call Konf_menue
       Case 8 : Call Beleuchtung
    
    
    End Select
    
    Loop
    
    End
    
    $include "includes\Beleuchtung.bas"
    
    $include "includes\Grafiken.bas"
    
    $include "includes\Uebersicht.bas"
    
    $include "includes\Menue.bas"
    
    $include "includes\font8x8.font"
    
    $include "includes\font16x16.font"
    Hier der Code in dem die Zeit angezeigt wird:

    Code:
    Sub Uebersicht
    
       If Muebersicht = 0 Then
    
             Cls
    
             Line(0 , 54) -(127 , 54) , 255
    
             Setfont Font8x8
    
             Lcdat 8 , 49 , "Men" ; Chr(129)
    
             Muebersicht = 1
    
       End If
    
             Setfont Font16x16
    
             Lcdat 1 , 1 , Time$
    
             Debounce Taster_mitte , 0 , Menueaufruf
    
    End Sub
    
    
    Menueaufruf:
    
             Frameindex = 0
    
             Muebersicht = 0
    
    Return
    Kennt jemand das Problem?

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Wer sagt, dass du keine RTC benutzen sollst?
    Für mich hat die RTC zwei Funktionen:
    Einmal die Zeit weiterlaufen lassen, auch wenn der Controller keinen Saft hat
    und zum zweiten eine genauere Zeitbasis als dies mit dem Controller möglich ist. Außerdem kannst du meistens noch ein paar Byte abspeichern.
    DCF ersetzt dir nur die zweite Funktion. Wenn der µC wieder los läuft, musst du erst einmal eine oder mehrere fehlerlose DCF Übertragungen bekommen, damit du die aktuelle Zeit wieder setzen kannst.
    Beides zusammen würde ich wohl nicht verwenden, dafür ist die Abweichung der RTC normalerweise zu gering.
    Wenn du die interne Taktquelle verwendest, hast du einen Fehler von bis zu 3%, was an einem Tag schon eine halbe Stunde ausmachen kann.
    Mit einem externen Quarz kommst du auf vielleicht 10 Sek. pro Tag. Mit einem zusätzlich angeschlossenen Uhrenquarz (32768Hz) im normalen Temperaturbereich auf etwa 2 Sek. pro Tag. Den Rest musst du durch Stellen beheben.
    Wenn du stündlich mit DCF synchronisierst hast du praktisch keine Abweichung.
    Warum sich der µC aufhängt, kann ich aus deinem Codeschnipsel nicht erkennen. Wie äußert sich das denn? Macht er einen Reset?

    Gruß

    Rolf

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    Hmm, also ich habe ja erst angedacht in einem Untermenü die RTC durch das DCF Signal einmalig (oder bei bedarf) Einzustellen und dann nur noch die RTC abzufragen. Also ist es ja anscheinend doch sinnvoll sowas zu machen.

    Das mit dem Problem des aufhängens äussert sich, wie oben schon erwähnt, einfach daurch, dass er sich nach 1 bis 2 Minuten aufhängt. Er macht einfach gar nix mehr. Taster reagieren auf jeden Fall nicht mehr.

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Evtl. sieht es ja auch nur so aus, als würde er nichts mehr machen.
    Es könnte z.B. eine Schleife sein, aus der er nicht mehr rauskommt. Wenn darin keine Ausgaben aufs LCD kommen, sieht es so aus, als täte sich nichts mehr.
    Sieh dir mal den Code daraufhin an. Wenn du nichts findest, füge mal ein paar Ausgaben aufs Display ein, dann kannst du sehen, was als letztes ausgegeben wurde.

    Gruß

    Rolf

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    oder stack und frame sind zu klein konfiguriert.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    Also eigentlich kann ich beim Programmablauf nichts finden. Wenn ich die Zeit weglasse geht ja auch alles.

    Und den Stack und Frame habe ich auch mal hochgesetzt....ist aber kein Unterschied ersichtlich.

Berechtigungen

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