PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche Rat: RTC Status oder Interrupt



Marten83
01.12.2007, 17:48
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

for_ro
01.12.2007, 18:29
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

Marten83
01.12.2007, 19:19
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.

Marten83
01.12.2007, 20:08
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:


$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:


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?

for_ro
01.12.2007, 21:36
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

Marten83
01.12.2007, 21:50
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.

for_ro
02.12.2007, 00:45
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

Vitis
02.12.2007, 03:19
oder stack und frame sind zu klein konfiguriert.

Marten83
02.12.2007, 08:27
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.