DCF-Uhr mit Pollin DCF-Modul in Bascom

OP Persönliche Seite #1347750
Lesenswert?

Hi,

Ferienzeit = Bastelzeit

Anbei mal meine Version einer einfachen Uhr.

Die Ausgabe erfolgt über Uart auf ein Nokia Miniterminal.
Beitrag "Minniterminal mit Nokia 3310 LCD und 4x4 Tasten"
Genutzt wird auch der 3,3V Regler für die Versorgung des
mega8(L) und des Empfangsmoduls (Gesamtstrom 11mA)
Ich habe festgestellt das bei 5V das Test-Empfangsmodul nach einer
Zeit aussetzt.
Pon wird 250ms auf Low gehalten.
Die Softuhr zählt bei Empfangsstörungen weiter.
Im Display blinken die Strings "--" bei richtiger Ausrichtung
der Antenne.
Der Controller ist mit 30% ausgelastet und kann mit Stunden-Beep
usw. erweitert werden

Alles in Allem ein Wochenendprojekt und mit einem Pollin-Display
unter 10 Euro machbar.

Wigbert
Angehängte Dateien:
#4650793
Lesenswert?

'*********************************************************************** 
********
'* 
------------------------------------------------------------------------ 
---  *
'*                       DCF-Uhr von Pollin 
*
'* 
------------------------------------------------------------------------ 
---  *
'*********************************************************************** 
********

'Dies ist ein kleines Testprogramm zum Ausprobieren des DCF77-Empfängers
'von Pollin
'Das DCF-Modul wird mit 3,3V über dem Miniterminal versorgt,
'optimale Antennenausrichtung wenn Portd.5 blinkt bzw. die
'"--" Zeichen im Display blinken



'Die $Include Zeichenausgabe_3310.bas
'im selben Verzeichnis kopieren




'Von Wigbert Picht
'Elektro-Picht@gmx.de
'Vers.19.07.09

'Ausgabe über:Nokia 3310-Minitermial über RS232 Schnittstelle
'mit Positionszeiger
'mit erstellen der Prüfsumme
'nach: Steffen Taubmann
'stta@gmx.de


'!!!Diese Software ist nur für den privaten Gebrauch bestimmt!!!
'  !!!Komerzielle Anwendungen bedürfen meiner Zustimmung!!!

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

$regfile = "m8def.dat"                                      'mein AVR, 
ein L Typ
$crystal = 3686400                                          'Quarz wegen 
Softuhr Genauigkeit u. Baudratenfehler
$baud = 9600 
'Baudeinstellung für mein Miniterminal


$hwstack = 128
$swstack = 128
$framesize = 128

'----------------------------------------------------------------------- 
--------
'Miniterminal-Anzeige konfigurieren (6 Zeilen / 14 Zeichen )
'----------------------------------------------------------------------- 
--------

Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 1 , 
Databits = 8 , Clockpol = 0       'nicht veränderbar

Dim Text As String * 14                                     '14 Zeichen 
max in einer Zeile
Declare Sub Position(byval X As Byte , Byval Y As Byte) 
'Positionszeiger
Declare Sub Nprint                                          'Ausgabe



'----------------------------------------------------------------------- 
--------
'DCF77 von Pollin konfigurieren
'----------------------------------------------------------------------- 
--------
'            __________
'           I            I
'           I          O I VCC
'           I            I
'           I          O I GND
'           I            I
'           I          O I Pinb.1(Dat)
'           I            I
'           I          O I Pinb.2(Pon)
'           I____________I
'

'Config Dcf77 = Pind.2 , Debug = 1 , Inverted = 0 , Check = 2 , Update = 
0 , Updatetime = 30 , Switchpower = 0 , Secondticks = 50 , Timer1sec = 1 
, Powerlevel = 1 , Timer = 1

Config Dcf77 = Pinb.1 , Timer = 1 , Debug = 1 , Inverted = 0 , Timer1sec 
= 1 , Check = 1

Config Pind.5 = Output                                      'LED
Config Pinb.2 = Output                                      'Pon

'----------------------------------------------------------------------- 
--------
'was so immer gebraucht wird
'----------------------------------------------------------------------- 
--------
Portb.1 = 0                                                 '**** Pullup 
abschalten Wichtig !!!!*****
Portb.2 = 1                                                 'Für Pon 
Aktiv

Waitms 200                                                  'Zeit für 
High von Pon(250ms)
Printbin &H02 ; &H43 ; &H41 ;                               'Display 
löschen
Waitms 50

Portb.2 = 0                                                 'Für Pon low

Dim I As Integer
Dim Sec_old As Byte , Dcfsec_old As Byte
Dim Wochentag As String * 12 , Wochentag_old As String * 12
Dim Zeit As String * 10
Dim Datum As String * 10 , Datum_old As String * 10

Config Date = Dmy , Separator = .

Enable Interrupts

Sec_old = 99 : Dcfsec_old = 99                              ': 
DCF_Debug_Timer = 0


'----------------------------------------------------------------------- 
--------
'Start mit "Bla Bla Bla"
'----------------------------------------------------------------------- 
--------
Text = "DCF-Uhr"
Waitms 50
Position 4 , 0                                              'X Sind Die 
Zeichen(0 -13), Y Entsprechend Die Zeilen(0 -5)
Call Nprint                                                 'zur Sub und 
String mit Prüfsumme ausgeben
'Print "Test DCF-Uhr"                                        'Debugg
Wait 1

'----------------------------------------------------------------------- 
--------
'Hier geht es endlich los:
'----------------------------------------------------------------------- 
--------

Do

  For I = 1 To 78                                           'vorher 78
     Waitms 10
     If Sec_old <> _sec Then
        Exit For
     End If
     If Dcfsec_old <> Dcf_sec Then
        Exit For
     End If
  Next

 Waitms 120
  Sec_old = _sec
  If Dcf_sec <> Dcfsec_old Then Gosub Led

  Dcfsec_old = Dcf_sec

  Zeit = Time$
  Text = Zeit                                               'Was die 
Stunde geschlagen hat
  Waitms 50
  Position 3 , 2                                            'X Sind Die 
Zeichen(0 -13), Y Entsprechend Die Zeilen(0 -5)
  Call Nprint                                               'zur Sub und 
String mit Prüfsumme ausgeben

  Datum = Date$                                             'Datum nur 
ausgeben wenn neues Datum empfangen wird
If Datum <> Datum_old Then
If _sec = 15 Then
  Text = Datum
  Waitms 50
  Position 3 , 3                                            'X Sind Die 
Zeichen(0 -13), Y Entsprechend Die Zeilen(0 -5)
  Call Nprint                                               'zur Sub und 
String mit Prüfsumme ausgeben
  Datum_old = Datum
End If
End If

Gosub Wochenauswahl
If Wochentag <> Wochentag_old Then                          'Wochentag 
nur neu ausgeben, wenn neuer Tag beginnt
If _sec = 30 Then
  Text = Wochentag
  Waitms 50
  Position 2 , 5                                            'X Sind Die 
Zeichen(0 -13), Y Entsprechend Die Zeilen(0 -5)
  Call Nprint                                               'zur Sub und 
String mit Prüfsumme ausgeben
Wochentag_old = Wochentag                                   'welcher Tag 
ist denn heute
End If
End If


'Debugger:

'Print Time$ ; " " ; Date$ ; " " ; Time(dcf_sec) ; " " ; Date(dcf_day) ; 
" " ; Bin(dcf_status) ; " " ; Bin(dcf_bits) ; " " ; Bdcf_impuls ; " " ; 
Bdcf_pause

Loop

'----------------------------------------------------------------------- 
--------
'  Sub's
'----------------------------------------------------------------------- 
--------



Led:
Toggle Portd.5                                              'Ausgabe 
Sekundentakt für Ausrichtung der DCF-Antenne
If Portd.5 = 1 Then
   Text = "--"                                              'Einfach 2 
String's "-" mit toggeln lassen
  Else
   Text = "  "
  End If
  Position 6 , 1                                            'X Sind Die 
Zeichen(0 -13), Y Entsprechend Die Zeilen(0 -5)
  Call Nprint                                               'zur Sub und 
String mit Prüfsumme ausgeben
Return

Wochenauswahl:

   Select Case Dayofweek()                                  'Wochentag 
Auswahl

     Case 0 : Wochentag = "  Montag  "
     Case 1 : Wochentag = " Dienstag "
     Case 2 : Wochentag = " Mittwoch "
     Case 3 : Wochentag = "Donnerstag"
     Case 4 : Wochentag = " Freitag  "
     Case 5 : Wochentag = " Samstag  "
     Case 6 : Wochentag = " Sonntag  "

   End Select

Return


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

$include Zeichenausgabe_3310.bas                            'Berechnung 
der Zeichenkette fürs Miniterminal

End


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

ist das  richtig ???
(ist mein erster versuch mit bascom)
Gast #4651134
Lesenswert?

> ist das  richtig ???

Soll das ein Scherz sein?

Was glaubst du, wie viele Leute imstande sind, das ganze Programm 
anhand einer Sichtkontrolle zu prüfen?

Probiere es aus, dann weißt du, ob es in Ordnung ist.
Gast #4651404
Lesenswert?

Kann es sein, dass du vor einem extrem niedrig auflösenden Monitor 
sitzt, und es dir deshalb schwer fällt ein "kleines L" von einer "Eins" 
zu unterscheiden?
Es gab hier irgendwo auch schon mal einen Thread, dass diese beiden 
Zeichen nicht gut zu unterscheiden sind.
(Anhang: 1:1 Bildausschnitt von iPad Pro)
Angehängte Dateien:
Gast #4651727
Lesenswert?

> jetzt brauche ich nur noch
> die Fuse-Bits für den atmega8l

Die Fuse Bits befinden sich im Mikrocontroller, und du kannst sie mit 
dem ISP-Tool deiner Wahl einstellen.

Wie lautet deine Frage dazu?
Gast #4652635
Lesenswert?

Das hängt gemeinerweise von deinem Programm ab. Manche stellen eine 
aktivierte Fuse als HIGH dar, andere wiederum als LOW.

Am besten benutzt du einen "Online Fuse Calculator" und überträgst dann 
die davon erzeugten Hexadezimalzahlen in dein Flash Tool. Damit bist du 
auf der sicheren Seite.

http://www.engbedded.com/fusecalc/

Benutze die Einstellung "Ext RC. OSC" mit dem passenden Frequenzbereich 
und der höchsten Startup Time.

Alle anderen Settings lässt du an Besten auf den Vorgabewerten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren