PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Projekt: Steuerung Lüftung/Heizung mit M2561 und 2,1"



Dani-Bruchflieger
19.10.2008, 14:56
Hi,

EDIT: ich hab das mal umbenannt, da ich im verlauf dieses Projektes sicher noch ofters Fragen haben werde, und nicht jedes mal ein neues Thema aufmachen will...

Geplant ist folgendes:
Für einen Saal mit 15*8m Fläche soll eine automatische Lüftung mit Zusatzheizung realisiert werden. Das ganze soll von eimem M2561 gesteuert werden und Visualisierung auf einem 2,1" Grafik-LCD von Display3000.de

Lüftung mittels 4 Radiallüfter a 700m³/h - je 2 Zuluft und 2 Abluft. Alle 4 sind einzeln schaltbar.

In diesem Saal finden mehrmals Wöchentlich Veranstaltungen von ca. 2 Stunden dauer statt. 2 Stunden vor Beginn soll Luftaustausch beginnen, 1 Stunde vor Beginn wird das Heizregister zugeschalten. Während der Veranstaltung wird die Lüftung auf halber Leistung weiter betrieben und Temperatur weiter geregelt. Danach geht die Heizung wieder in die temperaturabsenkung und nur noch Frostschutz auf 5...7°C wird per Heizkörper aufrechterhalten.
(Soweit im Groben die Aufgabenstellung)

Temperatursensoren geplant:
Raumtemperatur - Fühler am Ansauggitter Abluft
Außentemperatur - Fühler an Nordwand
Zulufttemperatur nach Heizregister
Vorlauftemperatur
Rücklauftemperatur

Schaltfunktionen:
Lüfter Abluft 1
Lüfter Abluft 2
Lüfter Zuluft 1
Lüfter Zuluft 2
Heizung einschalten - geht auf einen Eingang an der Gastherme
Luftauslaß an Außenwand verschließen
Lufteinlaß an Außenwand verschließen
Ventil für Heizregister - eventuell Stufenlos per PWM-Ansteuerung

So das ersteinmal im Groben, was die Steuerung können soll.... - jetzt wieder den Original-Post.....


Hi,

ich hab mal wieder eine Frage:
Ich müßte mal wissen, welche Timer die Soft_Clock in einem Mega2561 belegt, die ich nicht mehr für andere Aufgaben nutzen kann...

Ich habe den Code aus der mcs.lib angesehen, aber da ich null Ahnung von Assambler habe, hilft mir das auch nicht weiter...

Wenn ich später die Softclock 1*täglich durch ein DCF-Signal aktualisieren möchte - brauchen die dazu nötigen Routinen ja auch min. 1 Timer.... - welche bleiben mir dann eigentlich noch frei?

Dirk
19.10.2008, 16:41
Für die Softclock wird immer der Timer benutzt, der im asynchronen Betrieb (mit ext. Uhrenquarz) arbeiten kann.

Ich habe gerade kein Datenblatt des 2561, aber da müßte das zu finden sein.

Gruß Dirk

Dani-Bruchflieger
19.10.2008, 16:51
Danke - habs gerade gefunden - am 2561 ist es Timer2, der für die Uhr verwendet wird...

Dirk
19.10.2008, 17:13
Kurze Ergänzung:

Wenn du später über DCF77 nachdenkst, dann funktioniert das mit Timer 1 (soll später mal auch mit anderen Timern klappen, einen Parameter "Timer = ... " gibt es ja schon bei Config DCF77, aber der funktioniert glaube ich noch nicht!).

Dafür hast du den Timer 2 dann wieder frei ...

Gruß Dirk

Dani-Bruchflieger
19.10.2008, 18:53
Bei der Uhr hatte ich überlegt, Die Steuerung per Watchdog überwachen zu lassen, nach Reset wird DCF eingelesen, und erst dann das Hauptprogramm gestartet. Die Soft_Clock wird 1* Täglich per DCF abgeglichen - damit möchte ich die temp.drift der Soft_clock ausgleichen...

Oder bin ich da auf dem Holzweg - ich ging davon aus, daß ich von den DCF Antennen, wie sie bei Conrad, Reichelt oder Pollin erhältlich sind, nur die Telegramme erhalte. Die Uhr wäre dann ein extra "Programm".


Hab aber noch eine Frage:
Ich habe schon ernstahft gegrübelt, welche Temperatursensoren ich nehmen soll. LM75 kann ich nicht nehmen, da ich teilweise um die 20m Kabellänge zum Sensor haben werde. Also bleiben PTC / NTC - da hatte ich zB den KTY81-110 schon mal ins Auge gefaßt. Allerdings würde mich vor allem Interessieren, wie ich die am besten anschließe, und wie es dann mit der Kalibration realisiert wird.

Die Steuerung mit dem µC wird wahrscheinlich auf dem Dachboden installiert, wo im Winter Außentemperatur und im Sommer bis zu 40°C oder höher ist. Allerdings nur, wenn das LCD die lange Verbindungsleitung zum µC auch akzeptiert. (Ich habe bereits eine Steuerung für die Tiefkühltruhe gebaut, dort habe ich einen LM75 als Sensor und das 2*16 Zeichen LCD an 10m geschirmter Leitung angeschlossen, und hoffe, daß es bei den Grafiklcd auch so problemlos funktioniert)


PS: Ich werde aber auch nochmal die Suche bemühen - aber es kann ja sein, daß jemand einen Vorschlag hat, den ich so nicht finden kann, oder ich liege bei einigen Punkten so völlig daneben... ;)

Dirk
19.10.2008, 19:50
Das ist ja eine häufige Anwendung: Man synchronisiert eine Uhr 1x pro Stunde oder Tag mit DCF. In Bascom kann man dazu mit Config Dcf77 den DCF-Decoder einbinden. Man kann dann den Decoder einmal einschalten und wieder ausschalten, sobald der Empfang eines gültigen Telegramms gelungen ist.
Also: Das ersetzt quasi die Softclock.

Bei den Messungen mit KTY Sensoren über lange Entfernungen könnte man das mit 3- oder 4-Leitertechnik machen:
http://www.thermoguard.ch/download/TG-Vierleiter.pdf

Gruß Dirk

stekohl
19.10.2008, 20:20
Na das mit dem warten auf eine vollständige Uhrzeit vom DCF-77 Empfänger würde ich mal nicht zur Programmstartvoraussetztung machen.
Ich habe verschiedene DCF-77 Module ausprobiert und habe immer das Problem gehabt, dass je nach Tageslaune oder Wetter die Uhr sich schnell oder langsam eingerenkt hat.

Ich bin dann den Weg gegangen und habe zum DCF-77 Modul noch eine externe Echtzeituhr mit Pufferbatterie genommen.(Saunasteuerung) Ich würde allerdings, so wie viele Heizungs- und Reglungshersteller den DCF-77 Empfänger nach draussen hängen. (evtl. direkt mit Aussenfühler)
Da die Datensignale der meisten DCF-77 Empfängermodule nicht aussreichen längere Strecken zu überbrücken, würde ich dann einen Tiny zur Kommunikation nehmen oder mit Treibern arbeiten. Da kommt man mit drei Leitungen aus (GND,VCC,DATA) . Oder man nimmt eine RS485 bzw. RS422 Verbindung dann allerdings mit vier Leitungen (GND,VCC,DATA+,DATA-) die kann dann aber auch wirklich lang sein. Gerade zur Schnittstelle hat die Seite ja eine sehr gute WIKI https://www.roboternetz.de/wissen/index.php/RS485.

Soll die Steuerung denn auch Ferngesteuert werden (WEB / Telefon)?

Ach ja, aus meiner berufl. Erfahrung kann ich nur sagen: Heizregister oder Heizungen immer mit einem vorrangigen redundanten analogen Temperaturmesssystem schützen. Soll heißen: macht die Steuerung was sie will kann eine analoge Temperaturüberwachung immer noch die Heizung ausschalten. Sonst kann schnell aus einem Saal ein türkisches Dampfbad oder eine fin. Sauna werden. Dann sollte allerdings auch die Steuerung das mitbekommen und neu starten und Meldung geben.

Ach ja, noch eine letzte Sache: Was mich bei meiner Saunasteuerung echt zum Wahnsinn getrieben hat ist das Thema EMV und Netzstörungen im Allgemeinen.
Obwohl ich alles gepullupt und mit Entstörkondensatoren versehen habe, bin ich erst nach Tagen und einigen Ferritkernen zur Einsicht gekommen: Nicht umsonst ein Job für Entwickler mit dem entsp. Instrumentarium. Da kommt man ohne entspr. Equipm. schnell ans Ende. Gerade beim Schalten von Leistungen (induktiv od. kapazitiv) gibt es ein wahres Feuerwerk an Impulsen und Störungen. Egal ob per Schütz oder elektro. Leistungsrelais. Ich habe da in der Vergangenheit gerne mal über die Ferrite gelächelt. Dieses Thema hat fast 60% der Entwicklungzeit gekostet. (Zugegeben ist meine Saunasteuerung etwas trivialer als eine Heizungssteuerung.)

Nach Deiner Beschreibung bleibt der Saal lange unbeaufsichtigt, da würde ich die Möglichkeit der Fehlermeldung per Telef. oder Handy mit überdenken.

Gruß,

Stephan

for_ro
19.10.2008, 21:03
Hab aber noch eine Frage:
Ich habe schon ernstahft gegrübelt, welche Temperatursensoren ich nehmen soll. LM75 kann ich nicht nehmen, da ich teilweise um die 20m Kabellänge zum Sensor haben werde. Also bleiben PTC / NTC - da hatte ich zB den KTY81-110 schon mal ins Auge gefaßt. Allerdings würde mich vor allem Interessieren, wie ich die am besten anschließe, und wie es dann mit der Kalibration realisiert wird.
Ich habe in meiner Heizungssteuerung 7 DS1820 verbaut. Die längste Leitung ist dabei bestimmt 15m lang. Das geht ohne Probleme, allerdings mit 3 Adern (VDD,GND,Signal).


Die Steuerung mit dem µC wird wahrscheinlich auf dem Dachboden installiert, wo im Winter Außentemperatur und im Sommer bis zu 40°C oder höher ist. Allerdings nur, wenn das LCD die lange Verbindungsleitung zum µC auch akzeptiert. (Ich habe bereits eine Steuerung für die Tiefkühltruhe gebaut, dort habe ich einen LM75 als Sensor und das 2*16 Zeichen LCD an 10m geschirmter Leitung angeschlossen, und hoffe, daß es bei den Grafiklcd auch so problemlos funktioniert)

Ich habe das 1,5" LCD von Display3000. Da gehen 10m Anschlussleitung (SPI) nur, wenn man das Signal am Display noch mal etwas aufbereitet. Die Übertragungsrate ist hier schon bedeutend höher als bei einem 2*16 Zeichen Text Display.

Gruß

Rolf

thewulf00
20.10.2008, 08:05
Na das mit dem warten auf eine vollständige Uhrzeit vom DCF-77 Empfänger würde ich mal nicht zur Programmstartvoraussetztung machen.
Ich habe verschiedene DCF-77 Module ausprobiert und habe immer das Problem gehabt, dass je nach Tageslaune oder Wetter die Uhr sich schnell oder langsam eingerenkt hat.

Genau dieses Problem erachte ich als ersten Stolperstein. Laut Datenblatt von Pollin (als Beispiel) kann deren DCF-Empfänger bis zu 20 Minuten brauchen, bis er sich "aufsynchronisiert" hat.
Bei meinen privaten Amateur-Experimenten hat sich eine Zeit von 3-6 Minuten als normal herausgestellt. Ich würde mein Hauptprogramm nicht so lange warten lassen. Das wäre mir zu riskant. Evtl. kommt sogar garkein Signal und dann geht nichts.

Dani-Bruchflieger
20.10.2008, 13:31
Naja - ich habe das so gedacht: Wenn die Anlage sich wirklich aufgehangen hat, und der Watchdog einen Reset machen mußte, wird die Anlage mit einem Datum und einer uhrzeit geladen, wo keine Veranstaltung stattfindet. Dadurch hat diese genug Zeit sich die korrekte Zeit und Datum zu besorgen über DCF-Signal. Somit ist sie sozusagen im Standby bis die korrekte Uhrzeit empfangen wurde.

Während diese Regelung im Standby ist, ist ja immernoch die Eigentliche Steuerung der Gastherme aktiv, die ja die "Nachtabsenkung / Frostschutz realisiert.... - dort würde die neue Steuerung nur eingreifen und die Therme zuschalten, wenn die Temperatur im Saal unter die 5°C fällt - was aber nie passieren sollte.

Wenn dieser Reset während einer Veranstatung passiert, geht dann eben solange die Lüftungsanlage nicht, aber das wäre eventuell auch noch zu verschmerzen. - Außerdem macht ja jeweils nur der Prozessor einen Selbstreset, nicht das DCF-Modul - somit sollte dieses ja sofort wieder die Zeittelegramme zur verfügung haben.... - hoffe ich...

Ich werde jedenfalls (bin ja schon dabei) die ganze Geschichte vorher ausgiebeig auf alle Eventualitäten am Steckbrett testen - hab ja für den M2561 und einige andere AVR-Prozessoren entsprechende testplatinen geätzt..., mit denen ich Schaltungen simulieren und testen kann - sicherlich gibt es in einem fertigen Layout hinterher noch neue Probleme, wie zB die Geschichte mit dem EMV usw. aber darum muß ich mich dann eben hinterher kümmern - Wenn ich aber alles geschirmt einbaue und mit geschirmten Leitungen arbeite, sollten diese Störungen doch hoffentlich minimiert werden können. (Hoffe ich zumindest)

Momentan kann ich mich aber erstmal nur auf die gestaltung des Layout auf dem Display kümmern, da mir zum weiteren Testen die temperatursensoren fehlen...
Bus-Sensoren wollte ich diesmal vermeiden, da ich beim LM75 in der Tiefkühltruhe neg. Erfahrungen gemacht habe - dieser liefert ab und zu Werte von 80°C oder -80°C und das läßt sich nur durch ein Aus- und Einschalten der Tiefkühltruhe beheben. - Damit das Kühlgut nicht komplett auftauen kann, bei einem solchen Fehler hab ich schon eine Routine implementiert, die dann sofort und dauerhaft die Kühlung einschaltet (Lieber einen Eisblock, als alles aufgetaut) und einen extralauten Alarm gibt. Wenn ich noch einen freien Pin am verwendeten Mega8 finde, werde ich da mal ein relais einbauen, daß dann nur die Stromversorgung des LM75 für 10 Sekunden unterbricht. Hooffentlich hilft das dann... - aber da gehört ja eigentlich gar nicht zu diesem Thema...

Dani-Bruchflieger
21.10.2008, 15:16
Ich habe gerade mal in den Weiten des Internet gestöbert, und hab folgendes dabei gefunden:

http://www.sprut.de/electronic/temeratur/temp.htm#ad590

da hier ja dei Temperaturen in µA ausgegeben werden, ist ja die Leitungslänge zum Sensor mehr oder weniger uninteressant. Das wäre dann ja eigentlich der Ideale Meßfühler für dieses Projekt. (AD590/592)

Ich glaube da werde ich ein paar davon auf meinen Bestellzettel schreiben...

Dirk
22.10.2008, 02:12
da hier ja dei Temperaturen in µA ausgegeben werden, ist ja die Leitungslänge zum Sensor mehr oder weniger uninteressant. Das wäre dann ja eigentlich der Ideale Meßfühler für dieses Projekt. (AD590/592)
Leider ist die Leitungslänge gerade bei diesem Sensor gar nicht egal! Durch den geringen Strom sind die Leitungsverluste enorm. Er ist also nicht wirklich geeignet.

Gruß Dirk

Dani-Bruchflieger
22.10.2008, 12:50
Hmm - wenn ich den Sensor am Eingang 9 oder gar 12 V gebe, und dann mit dem µC den Spannungsfall am 10kOhm Widerstand messe, kann ich auf der Leitung 1 V oder gar 4 V Spannungsfall haben, die mich nicht stören, da der Sensor ja eine KonsatnStromquelle proportional zur Temperatur ist. Der Sensor selbst braucht nur 4 V und bei 25°C ist mit einem Strom um 298,2µA zu rechnen also 2,982 V am 10KOhm Widerstand. selbst bei 80°C am Vorlauftemperatursensor wären das nur 353,2µA also 3,532V
4V+3,5V =7,5V - bei 9V Spannungsversorgung also noch 1,5V für Spannungsfall auf den Leitungen übrig.

Das einzigste, was ich eventuell hierpei als Problematisch ansehen würde, ist die Möglichkeit von EMV-Einflüssen auf das Meßsignal - ich hoffe daß es da dann ausreicht, wenn ich geschirmte Leitungen verwende. (zB geschirmtes Telefonkabel... oder flexible Leitung mit Schirmgeflecht, die aber einiges teurer sein werden...)

Ich kann mich bei dem Ganzen hier aber auch total auf dem Holzweg befinden, dann bitte ich um Korrektur. (darum poste ich ja meine Überlegungen hier...)

Dirk
22.10.2008, 16:22
Hallo Dani-Bruchflieger,

Das einzigste, was ich eventuell hierpei als Problematisch ansehen würde, ist die Möglichkeit von EMV-Einflüssen auf das Meßsignal

Ich muss mich (meinen Beitrag v. 22.10.) berichtigen: Die Leitungslänge ist beim AD592 kein Problem, da der Leitungswiderstand deutlich unter dem Meßwiderstand liegt. Die Sache müßte z.B. mit Twisted pair Kabel auch ohne Abschirmung funktionieren.

(Hatte da einen anderen Sensor vor Augen ... Sorry!)

Gruß Dirk

Dani-Bruchflieger
23.10.2008, 21:05
Also ich habe gestern mal bei Reichelt diese Sensoren bestellt und auch ein DCF-Empfänger. Also kann ich vielleicht schon Morgen weiterprobieren... und mit neuen Fragen nerven *fg*

Dani-Bruchflieger
25.10.2008, 17:41
Wie versprochen - die neuen Fragen oder Probleme:

ich hab jetzt schlicht die Zeile Config Clock = Soft gegen die neue Zeile Config Dcf77 = Pine.2 , Invertet = 1 , Timer = 1 ausgetauscht. In meinem Programm lasse ich dann nur die Stunden und Minuten anzeigen, indem ich die Variablen _hour und _minute verwende. Auch das Datum wird auf dem Display angezeigt aber dazu nehme ich die Datum$.

Falls es von Belang sein sollte - ich hab auf der Platine zwischen VCC und GND gleich an den anschlußpads noch einen SMD 100nF Kondensator angelötet, um unerwünschtem Ripple auf der Versorgungsspannung vorzubeugen....

Problem:
ganz einfach die Anzeige zählt von der Vorladung 1.1.01 12:30 weiter aber übernimmt nicht die Werte vom DCF Empfänger.

Bisherige Lösungsversuche:
Pine.2 als Eingang nochmal extra vorher deklariert
Das Signal vom DCF-Empfänger mit einem BC547B in Kollektorschaltung verstärkt, daß auch sicher auf 5V ist und vom µC erkannt werden kann.
Auch mal invertet auf 0 gesetzt, aber in der Beschreibung von dem Sensor (Reichelt: http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=1;INDEX=0;FILENAME=X600%252FD CF77.pdf.pdf) steht auf Seite 4, daß er "am Signalausgang ein pulsförmiges Signal liefert, das dem (invert.) demodulierten DCF-Signal entspricht"
-> warum das invert. in Klammern steht weiß ich allerdings nicht....

Ich werde jetzt nochmal mit einem anderen Pin probieren....

Edit: Auch nach Pinwechsel keine Veränderung...
Eine LED, die ich an einem 2.Transistor nachgeschalten habe blinkt aber fröhlich vor sich hin, also gehe ich davon aus, daß der DCF-Empfänger korrekt arbeitet.

Dirk
26.10.2008, 06:43
Der Reichelt-DCF-Empfänger arbeitet bei mir auch nur mit 2 Besonderheiten:
1. +UB mit 0,1 uF und 10 uF direkt am Modul geglättet und über eine Diode 1N4148 an die Versorgungsspannung 5V.
2. Am Ausgang Treiberstufe (BC547B mit 33 kOhm Basiswiderstand).

Da das Modul bei dir aber funktioniert (LED blinkt ja), bleiben 2 Dinge:
1. Empfangsqualität schlecht? Modul zu nahe an Störquellen?
2. Probier 'mal einen anderen Portpin von Port A..D.

Sonst: K.A.

Gruß Dirk

Dani-Bruchflieger
26.10.2008, 11:50
Danke - ich werd dann nochmal den 10µF und die Diode dazulöten.
Aber vom Programmiertechnischen her brauche ich nur die Config Softclock gegen config dcf austauschen und kann dennoch mit den gleichen Variablen weiterarbeiten also auch _minute und _hour verwenden?
oder muß ich noch irgend etwas anderes auch noch beachten?

Ich habe meinen Transistor mit ?kOhm als Basiswiderstand und 2kOhm als Emitterwiderstand aufgebaut und greife also am Emitter das Signal für den µC ab.

Dirk
26.10.2008, 13:15
Ja, die "normalen" Clock-Variablen funktionieren mit Config DCF.

Transistor:
BC547B (o.ä.) mit Basis über Vorwiderstand 33 kOhm (kann auch 10..22 kOhm sein) an den DCF-Ausgang des Moduls.
Emitter an Masse GND.
Kollektor an uC-Eingangspin, von dort der Pullup-Widerstand (z.B. 2,2 kOhm oder 4,7 kOhm) an +5V, alternativ auch gar kein externer Pullup, sondern der uC-Interne.

Gruß Dirk

Dani-Bruchflieger
26.10.2008, 15:46
Ich habe jetzt nochmal umgesteckt:
Transistor 33kOhm Basis
2KOhm Collektor-pullup
Emitter an GND
Abgriff des nun invertierten invertierten Signals am Collektor des Transistors

Config dcf -> invertet =0 geändert

In der programmschleife mal einen anderen Pin, an dem eine led hängt per if then mitleuchten lassen, wenn signal am Pin des DCF-Signals erkannt wird - LED blinkt auch...

Allerdings wird die Uhr immernochnicht gestellt...

-------------------------------------------------------------------------------------
Neuer Versuch:
ich habe direkt das Example von config dcf77 aus der Hilfe kopiert und nur den Prozessor, Takt, Baudrate und Eingangspin des Signals angepaßt und den Pullup des Pins aktiviert. Den Transistor hab ich jetzt in Schrumpfschlauch verpackt direkt an der Platine des DCF-Empfängers angelötet.
Ergebnis:
hin und wieder erkennt er die korrekte Zeit, aber noch bevor diese übernommen wird, erkennt er wieder totalen Müll wie z.B. 17:71:54 41.04.88

Ich hab das ganze zwar nur mit experimentierboards und steckverdrahtung aufgebaut, aber das sollte doch nicht so störend auf diese Auswertung auswirken können?


EDIT 1:

Habe jetzt auf 10kOhm basiswiderstand verringert - immernoch das gleiche... Die Sekunden hat er ja stets richtig nur dann vermacht er sich andauernd...

hat er in einer minute die korrekte uhrzeit entdröselt aus dem DCF-Signal vermacht er sich gleich in der nächsten Minute schon beim Entdröseln der Minute und dann bei allen anderen Werten ebenfalls...

EDIT 2:
Hab ich ganz vergessen:
der M2561 wird per 14,7xxxxMHz Quartz getaktet und hat auch den 32khz Uhrenquartz dran...

EDIT 3:
ich füge mal ein Log an, welches um 18:31:00 endete am 26.10.08

raggy
26.10.2008, 17:19
Hallo
Hast Du mal diese Seiten durchgesehen?
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=18073&highlight=dcf77
Von dieser Seite habe ich das Programm ohne Uhrenquarz.
Ich habe bei meinem Conrad -Modul DCF zum beispiel keinen wiederstand oder Pullup .
In einer Stunde ca.3 sekunden abweichung aber fuer die Lichtsteuerung nicht relevant.
DCF habe ich mit Atmega8 gemacht und Atmega32 steuert das Licht in der Wohnung und Orchideen bewaesserung.
Der Atmega8 übergibt bei jedem Minuten wechsel die Zeit zB. 21:16
an dem Atmega32 über UART(RS232)

Dani-Bruchflieger
27.10.2008, 10:40
Hi,

ja diesen Beitrag im Forum hatte ich ziehmlich als ersten schon gelesen und auch die lib geladen. Allerdings hab ich diese Lib noch nicht ausprobiert, da ja eigentlich die normale in Bascom eingebaute Lib auch funktionieren sollte... Wozu hab ich denn schließlich die Vollversion?

Allerdings verstehe ich nicht, warum er es manchmal korrekt interpretiert, und sich dann in der nächsten Minute ab dem Empfangen des Minuten-Signals so total vermacht...

raggy
27.10.2008, 14:46
Hier mal ein komplettes Programm mit lib,von der Seite die ich schrieb.
die lib hat nur einen anderen Namen, weil ich die auf dem Pinb.1 geaendert hatte,um die orginale nicht zu veraendern.
Das ganze geht ohne Uhrenquarz.


$regfile = "m32def.dat" 'ATmega 32
$crystal = 8000000 'Quarz: 8 MHz
$baud = 9600
$hwstack = 32 'hardware stack
$swstack = 10 'software stack
$framesize = 40 'frame space

Config Date = Dmy , Separator = . 'deutsches Format für Datum
Config Clock = Soft
Disable Timer2 'ausgeschaltet lassen

$lib "K_DCF.lib" 'LIB für DCF77
$external Dcf77
Declare Sub Dcf77

'################################################# ##########################

'Hauptprogramm:

'LCD konfigurieren:
Wait 1
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
Config Lcd = 20 * 2 'LCD 164A

'Startmeldung:
Cls
Lcd "* RNBFRA V1.22 * "
Wait 5
Cls

Config Timer0 = Timer , Prescale = 1024 'Timer 40Hz
Const Startwert = 61 'Für 8MHz
Timer0 = Startwert
On Timer0 Tim0_isr 'Überlauf alle 25ms
Enable Interrupts
Enable Timer0

'---------------------- Pin für DCF Eingang definieren ---------------------
'Jeder Portpin kann benutzt werden.
'Auch in der "Dcf77_soft.lib" entsprechend anpassen !!!

Config Pinb.1 = Input 'DCF 77 Eingang ***Alt Pind.3 **
Set Portb.1 'Pullup ein Alt***Portd.3****

Declare Sub Showstatus()
Declare Sub Showtime()

'------------------- Variablen für DCF Routine -----------------------------

Dim Status As Byte , Zaehler As Byte , Buffer As Byte , Impuls As Byte
Dim H_sek As Byte , T_min As Byte , T_std As Byte , Wotag As Byte
Dim Pari As Byte , Pau As Byte , Imp As Byte

Dim I As Byte

'---------------------------------------------------------------------------

'Hauptprogramm:
Cls
Cursor Off

Date$ = "01.01.00"
Time$ = "00:00:00"

Status.7 = 0 'Uhr nach DCF stellen: AUS
Status.5 = 0 'Uhr wurde nicht gestellt
I = 0
'****************** HAUPTPROGRAMMSCHLEIFE **********************************
Cls
Do
'Cls
Call Showtime()
Call Showstatus()
If _min = 58 And Status.7 = 0 Then Status.5 = 0 '1x pro Stunde nach DCF stellen
If Status.5 = 0 Then Status.7 = 1 Else Status.7 = 0 'Zeit nicht aktuell: Stellen!
Wait 1
Loop

End

'************* ENDE HAUPTPROGRAMM ******************************************

Sub Showstatus() 'Status anzeigen
End Sub
'---------------------------------------------------------------------------

Sub Showtime()

Locate 1 , 5
Lcd Time$
If Status.5 = 1 Then
Locate 2 , 3
Wotag = Dayofweek()
Lcd Lookupstr(wotag , Wochentag) ; ". "
Lcd Date$
End If

End Sub
'---------------------- Interrupt Routine DCF77 ----------------------------

Tim0_isr:
Timer0 = Startwert
Call Dcf77
Return

'################################################# ##########################
'Programm Ende:

End

'---------------------- Daten für Wochentag --------------------------------
Wochentag:
Data "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa" , "So"

'################################################# ##########################

und nun die lib.


copyright = W.Krueger
comment = DCF 77 Decoder
libversion = 2.00 (D. Ottensmeyer)
date = 09.04.2006
statement = ----------------------------------
statement = muss alle 25ms ausgeführt werden !
statement = ----------------------------------

[Dcf77]
Dcf77:
.equ DCF_Port = $16 ;$16 = Pinb
.equ DCF_Pin = 1 ;1 = Pin 1

.equ Imp0min = 70 ;minimale Länge des Minutenimpulses
.equ Imp1min = 6 ;minimale Länge des "1" Impulses
;alles darunter wird als "0" Impuls gewertet
.def Temp1 = r16
.def Temp2 = r17
.def Temp3 = r18
.def Minute = r19
.def Stunde = r20
.def Status = r21
;Bit0 = aktueller DCF Status
;Bit1 = vorheriger DCF Status
;Bit2 = Uhr synchronisieren
;Bit3 = 59 Impulse empfangen
;Bit4 = Parität OK
;Bit5 = Uhr wurde 1x gestellt
;Bit7 = Uhr nach DCF stellen
.def Impuls = r22
.def Zaehler = r23
.def Buffer = r24
.def Pari = r25
;------------------------------------
*lds Status,{Status} ;Status laden
rcall Softuhr ;Softuhr bearbeiten
bst Status,7 ;Status Uhr nach DCF stellen ?
brts Puls0 ;ja -> weiter
*sts {Status},Status
ret
Puls0:
*lds Impuls,{Impuls} ;Variablen laden
*lds Zaehler,{Zaehler}
*lds Buffer,{Buffer}
*lds Pari,{Pari}
in temp1,Dcf_Port ;DCF Port lesen
bst temp1,Dcf_Pin ;Status holen
bld Status,0 ;aktuellen Status speichern
inc Zaehler ;Impulslänge erhöhen
bst Status,0 ;akuellen Status prüfen
brts Puls20 ;Status Low -> weiter
bst Status,1 ;vorherigen Status prüfen
brtc Puls40 ;vorheriger Status Low -> Ende
ldi temp1,Imp0min ;Minutenimpuls Minimalwert laden
cp Zaehler,temp1 ;Impulslänge Minimalwert überschritten
brcs Puls10 ;nein -> weiter
*sts {Pau},Zaehler ;--------> Minutenimpulslänge speichern für Debug
clr Buffer ;Empfangspuffer löschen
clr Impuls ;Impulszähler löschen
bst Status,4 ;Parität OK ?
brtc Puls5 ;Nein -> weiter
bst Status,3 ;59 Impulse empfangen ?
brtc Puls5 ;Nein -> weiter
set
bld Status,2 ;Status Uhr synchronisieren setzen
Puls5:
clt
bld Status,3 ;Status 59 Impulse löschen
bld Status,4 ;Status Parität OK löschen
Puls10:
clr Zaehler ;Impulslänge löschen
rjmp Puls40 ;Ende
Puls20:
bst Status,1 ;vorherigen Status prüfen
brts Puls40 ;vorheriger Status Low -> Ende
ldi temp1,Imp1min ;Minimalwert für "1" Impuls laden
cp Zaehler,temp1 ;Minimalwert unterschritten ?
brcs Puls30 ;ja -> weiter
*sts {imp},Zaehler ;--------> Impulslänge Height speichern für Debug
cpi Impuls,28 ;beim Paritätsbit Min keine Negation
breq Puls25
cpi Impuls,35 ;beim Paritätsbit Std keine Negation
breq Puls25
ldi Temp1,1
eor Pari,Temp1 ;Paritätsbit Negation
Puls25:
sec ;Carry setzen ( "1" empfangen )
ror Buffer ;Carry in Empfangspuffer
inc Impuls ;Impulszähler erhöhen
rcall Auswerten ;Impulse auswerten
rjmp Puls40 ;Ende
Puls30:
*sts {imp},Zaehler ;--------> Impulslänge Low speichern für Debug
clc ;Carry löschen ( "0" empfangen )
ror Buffer ;Carry in Empfangspuffer
inc Impuls ;Impulszähler erhöhen
rcall Auswerten ;Impulse auswerten
Puls40:
bst Status,0 ;aktuellen Status holen
bld Status,1 ;Status speichern
*sts {Status},Status ;Variablen wieder speichern
*sts {Impuls},Impuls
*sts {Zaehler},Zaehler
*sts {Buffer},Buffer
*sts {Pari},Pari
ret
;-------------------------------------------------------------------------------
Softuhr:
*lds Temp1,{H_Sek}
*lds Temp2,{_sec}
*lds Minute,{_min}
*lds Stunde,{_hour}
bst Status,2 ;Status Uhr synchronisieren ?
brtc Soft10 ;nein -> weiter Softuhr
clt
bld Status,2 ;Status Synchron löschen
bst Status,7 ;Status Uhr nach DCF stellen ?
brtc Soft10 ;nein -> nicht neu stellen
set
bld Status,5 ;Status Uhr 1x gestellt setzen
clr Temp1 ;Hundertstel löschen
clr Temp2 ;Sekunde löschen
*lds Minute,{T_Min} ;Minute auf empfangene Minute
*lds Stunde,{T_Std} ;Stunde auf empfangene Stunde
rjmp Soft20 ;empfangene Zeit übernehmen
Soft10:
inc Temp1 ;Hundertstel Sek erhöhen
cpi Temp1,40 ;1000ms erreicht ?
brne Soft20 ;nein -> Ende
clr Temp1 ;Hundertstel Sek löschen
inc Temp2 ;Sekunde erhöhen
cpi Temp2,60 ;60 Sekunden erreicht ?
brne Soft20 ;nein -> Ende
clr Temp2 ;Sekunde löschen
inc Minute ;Minute erhöhen
cpi Minute,60 ;60 Minuten erreicht ?
brne Soft20 ;nein -> Ende
clr Minute ;Minute löschen
inc Stunde ;Stunde erhöhen
cpi Stunde,24 ;24 Stunden erreicht ?
brne Soft20 ;nein -> Ende
clr Stunde ;Stunde löschen
*lds Temp3,{_day}
inc Temp3 ;Tag erhöhen
cpi Temp3,29 ;Tag 29 erreicht ?
brlo Soft19 ;bis 28 -> Ende
clt ;ab 29 -> Hat Monat 29,30,31 Tage ?
bld Status,5 ;Status Uhr 1x gestellt löschen
; set ;Datum nach DCF stellen !
; bld Status,7 ;Status Uhr nach DCF stellen setzen
cpi Temp3,32 ;Tag 32 erreicht ?
brne Soft19 ;nein -> Ende
ldi Temp3,1 ;Tag 1 setzen
*sts {_day},Temp3
*lds Temp3,{_month}
inc Temp3 ;Monat erhöhen
cpi Temp3,13 ;Monat 13 erreicht ?
brne Soft18 ;nein -> Ende
ldi Temp3,1 ;Monat 1 setzen
*sts {_month},Temp3
*lds Temp3,{_year}
inc Temp3 ;Jahr erhöhen
cpi Temp3,100 ;Jahr 100 erreicht ?
brne Soft17 ;nein -> Ende
clr Temp3 ;Jahr 00 setzen
Soft17:
*sts {_year},Temp3
rjmp Soft20
Soft18:
*sts {_month},Temp3
rjmp Soft20
Soft19:
*sts {_day},Temp3
Soft20:
*sts {H_Sek},Temp1
*sts {_sec},Temp2
*sts {_min},Minute
*sts {_hour},Stunde
ret
;-------------------------------------------------------------------------------
Auswerten:
cpi Impuls, 21 ;21. Impuls
brne Aus10 ;nein -> weiter
clr Buffer
clr Pari
Aus10:
cpi Impuls, 28 ;28. Impuls
brne Aus15 ;nein -> weiter
lsr Buffer ;Buffer 1x schieben, da Minute nur 7 Bit
rcall Bcd2dez ;in Dezimal wandeln
*sts {T_Min},Buffer ;Temp Minute schreiben
clr Buffer
Aus15:
cpi Impuls, 29 ;Minuten Parität
brne Aus20
clr Temp3
bst Buffer,7 ;Paritätsbit selektieren
bld Temp3,0 ;Paritätsbit in Temp3 Bit0 kopieren
cp Temp3,Pari ;Parität überprüfen
brne Aus26 ;Fehler -> Ende
clr Pari
clr Buffer
Aus20:
cpi Impuls, 35 ;35. Impuls
brne Aus25 ;nein -> weiter
lsr Buffer ;Buffer 2x schieben, da Stunde nur 6 Bit
lsr Buffer
rcall Bcd2dez ;in Dezimal wandeln
*sts {T_Std},Buffer ;Temp Stunde schreiben
clr Buffer
Aus25:
cpi Impuls, 36 ;Stunden Parität
brne Aus30
clr Temp3
bst Buffer,7 ;Paritätsbit selektieren
bld Temp3,0 ;Paritätsbit in Temp3 Bit0 kopieren
cp Temp3,Pari ;Parität überprüfen
breq Aus27 ;Pari OK -> weiter
Aus26:
ret ;Fehler -> Ende
Aus27:
set ;T-Bit setzen
bld Status,4 ;Bit4 Status setzen (Parität)
clr Buffer
Aus30:
cpi Impuls,42 ;42. Impuls
brne Aus40
lsr Buffer ;Buffer 2x schieben, da Tag nur 6 Bit
lsr Buffer
rcall Bcd2dez ;in Dezimal wandeln
*sts {_day},Buffer ;Tag schreiben
clr Buffer
Aus40:
cpi Impuls,45 ;45. Impuls
brne Aus50
lsr Buffer ;Buffer 5x schieben, da Wochentag nur 3 Bit
lsr Buffer
lsr Buffer
lsr Buffer
lsr Buffer
rcall Bcd2dez ;in Dezimal wandeln
*sts {WoTag},Buffer ;Wochentag schreiben
clr Buffer
Aus50:
cpi Impuls,50 ;50. Impuls
brne Aus60
lsr Buffer ;Buffer 3x schieben, da Monat nur 5 Bit
lsr Buffer
lsr Buffer
rcall Bcd2dez ;in Dezimal wandeln
*sts {_month},Buffer ;Monat schreiben
clr Buffer
Aus60:
cpi Impuls,58 ;58. Impuls
brne Aus70
rcall Bcd2dez ;in Dezimal wandeln
*sts {_year},Buffer ;Jahr schreiben
clr Buffer
Aus70:
cpi Impuls,59 ;59. Impuls
brne Aus80
set ;T-Bit setzen
bld Status,3 ;Bit3 Status setzen (59 Impulse)
Aus80:
cpi Impuls,60 ;bei mehr als 59 Impulsen (Störimpulse)
brne Aus90
clt ;T-Bit löschen
bld Status,3 ;Bit3 Status löschen (59 Impulse)
bld Status,4 ;Bit4 Status löschen (Parität)
Aus90:
ret
;-------------------------------------------------------------------------------
Bcd2dez:
mov Temp1,Buffer
andi Temp1,$0F
Bcd10:
subi Buffer,$10
brcs Bcd20
subi Temp1,$F6
rjmp Bcd10
Bcd20:
mov Buffer,Temp1
ret
[end]


das sollte so laufen sonst ist was an der Hardware.
funktioniert auch mit Atmega8 !
Unbedingt einen 8Mhz takt verwenden(Quarz) ansonsten muß der Startwert fuer den Timer geaendert werden.
wunsch Dir viel Erfolg ! raggy
Nochwas zu der verstaerkung des Signals,wenn schrott Empfangen wird wird auch nur Schrott verstaerkt,das darf man nicht vergessen!
Gruß

Dirk
27.10.2008, 16:52
Hey, da habt ihr ja unsere alte Lib wieder ausgegraben ...

Aber eigentlich gebe ich dir, Dani-Bruchflieger, Recht: Die "eingebaute" Lib funktioniert gut.

Poste doch 'mal dein ganzes Testprogramm, genau so, wie du es verwendest.

Die Wahrscheinlichkeit ist hoch, dass dein DCF-Modul keinen störungsfreien Empfang liefert. Mach doch evtl. 'mal ein Foto von deinem Aufbau!

Gruß Dirk

Dani-Bruchflieger
27.10.2008, 17:11
Testprogramm hab ich das aus der Help von Config dcf77 genommen - nur Prozessor auf mega2561 geändert , Crystal 14,7xxMHz und Baudrate 38400 - aso und Pin E.2 als Signaleingang - ansonsten so wie es dort steht...
Foto kann ich machen - füge ich nacher hier ein - aber ich habe eben nur ein paar Platinen geätzt, wo ich den M2561 auf einer 3*3cm Platine aufgelötet habe mit den 2 Quartzen, und diversen Kondensatoren. Diese ist in eine andere Platine gesockelt, wo ich dann die Ports per Steckbuhsen verkabeln kann - meistens Flachbandkabel dazu verwendet, weil ich von dem 10pol. 30m mal gekauft hatte...
Störunge wären so durchaus möglich - allerdings würde bei gestörtem Empfang das Signal nicht ganz wegbleiben?

@raggy - danke für die lib - ich werde sie auch einmal ausprobieren, allerdings würde ich gern bei den 14,7xx MHz takt bleiben, den Uhrenquartz hab ich im Design der µC Platine vorgesehen, wird demnach auch bleiben, aber für andere Projekte ist das sicher eine alternative zur eingebauten Lib von Bascom.

Hab heute mal ein wenig im RN-Wissen rumgestöbert und dabei die Beschreibung des Datentelegramms entdeckt - hatte da schonmal überlegt, inwieweit man die lib so umschreiben könnte, daß sie Telegrammteile überprüft und wenn sie plausibel sind übernimmt.
-> also wenn in einem Telegramm die Uhrzeit 18:10:xx korrekt war und im nächsten 31:78:xx decodiert wurde, könnte man ja dfür dieses datenset die info des letzten telegramms um eine Minute erhöht mit der empfangenen Parität überpüfen und übernehmen... usw. denn bestimmt ist nicht jedes Datentelegramm komplett falsch empfangen worden - meist sind es nur Teile davon...

mat-sche
27.10.2008, 18:19
Hallo,
ich habe gerade auch die Routine für DCF aus Bascom am Start. Auf einem Board mit Mega32 läuft Sie völlig zufriedenstellend, mit meinem anderen Board, mega128, leider nicht und ich habe auch gelesen das der verwendete Timer beim mega128 nicht der für den Uhrenquarz ist.
Wie weit weiss jemand bescheid wie man den Timer von der DCF Routine ändern kann? Leider läuft mir einfach die Uhr zu ungenau auf dem mega 128.

ps. Dani-Bruchflieger => es sind ca. 30km Fluglinie zwischen uns :D

Gruß MAT

Dirk
27.10.2008, 18:48
@Dani-Bruchflieger:

danke für die lib - ich werde sie auch einmal ausprobieren, allerdings würde ich gern bei den 14,7xx MHz takt bleiben

Wenn du deinen Aufbau testen willst, könntest du auch bei dem Quarz 14,7456 MHz bleiben, wenn du einen 16-Bit-Timer nimmst mit ...:
Prescale = 8
Const Startwert = 19463

... oder auf eine andere Weise eine ISR mit 40 Hz einbaust.

Gruß Dirk

laase
19.03.2010, 00:07
Ist zwar schon ein Weilchen her, Eure Diskussion zu LM75, AD592 und DS1820, vielleicht interessiert es aber den einen oder anderen:

Hatte zur Messung der Brunnentemperatur einen AD592 an einem ATMEGA88 zu hängen (parallel zum Shunt, natürlich). Was im Labor sehr gut funktionierte, brachte im rauhen Betrieb an 20m Leitung nachher nur Käse: die gemessenen Temperaturen schwankten zwischen -5 bis +5°C, trotz Mittelung über 30 Auslesungen. Die Leitung zum Fühler verläuft über einige Strecken parallel zum Pumpenkabel; die Tiefbrunnenpumpe selbst (Grundfos) hat wahrscheinlich einen Umrichter drin. Fazit: die Störungen sind so gravierend, daß ein anderer Sensor mit digitaler Übertragung her mußte.
Seit einem Jahr tut jetzt ein DS18B20 seinen Dienst hervorragend. Ich schätze auch die außerordentlich hohe Auflösung dieses Typs gegenüber dem hierzulande oft erhältlichen DS1820 bzw. DS18S20. Die Auswertung ist sogar noch einfacher.

for_ro
19.03.2010, 06:56
Ich schätze auch die außerordentlich hohe Auflösung dieses Typs gegenüber dem hierzulande oft erhältlichen DS1820 bzw. DS18S20.
Dies ist ein Gerücht, welches sich hierzulande hartnäckig hält.
Alle drei Sensoren haben die gleiche Auflösung und Genauigkeit.


Die Auswertung ist sogar noch einfacher.
Das ist wohl wahr, wenn du die hohe Auflösung beim DS1820/S20 bekommen möchtest.