32x16 RG-Matrix als Uhr für das Büro

Cassio

Aktives Mitglied
29 Okt 2008
4,027
17
38
Region Hannover
Sprachen
  1. BascomAVR
Hallo zusammen!

Vor ein paar Wochen bin ich durch ein paar indirekte Kollegen auf die Idee gekommen, mir eine große und gut sichtbare Uhr ins Büro zu hängen. :)

Nach kurzer Überlegung fiel mir ein, dass ich seit Juli 2013 immer noch die 32x16 Rot-Grün-Matrix von User Roto bei mir liegen habe.
Er hatte mir damals die Matrix zur Verfügung gestellt, damit ich ihm dafür eine fertige Ansteuerung schreibe.
Leider hat er sich bis Heute nicht mehr bei mir gemeldet und ich hoffe, dass es ihm gut geht!

Wer sich das Thema noch mal ansehen möchte, klickt bitte HIER!


Wie eingangs aber schon erwähnt, habe ich seit Jahren diese Anzeige hier liegen......
jedoch ein sinnvoller Verwendungszweck fehlte mir irgendwie immer dafür.
Nach knapp drei Jahren überlegen war aber nun endlich der Zeitpunkt gekommen, an dem sie zum Einsatz kommen sollte. ;)


Als ich dann in der letzten Zeit gerade dabei war die Uhr baulich zu erstellen und das Programm dafür zu entwickeln, tauchte plötzlich das Thema mit der Berlin-Uhr (Mengenlehreuhr) von gerd51 auf.
Von dieser Idee animiert habe ich kurzer Hand mein Programm erweitert und eine optionale Anzeige mittels "Berlin-Uhr" realisiert. :)
Ich danke daher gerd51 für die gute Idee zur rechten Zeit. :flowers:


Der aktuelle Ausbauzustand beinhaltet nun einen DCF77-Empfänger, eine RTC mit Goldcap, einen I2C-Temperatursensor und natürlich einen ATMega 1284.....
und das Ganze sieht nun so aus:
Uhr_komplett.jpg

Falls sich jemand über den abgesetzten Kasten über dem Gehäuse wundert....
darin befindet sich der DCF77-Empfänger.
Das Empfängergehäuse kann am Alu-Rohr in der Höhe herausgezogen werden, um etwas mehr Abstand zur Matrixanzeige zu bekommen.
Da die Matrix mit einer recht hohen Frequenz gemultiplext wird..... und die Anzeige recht groß ist.... stört sie leider den DCF77-Emfang. ;)

Die Front ist wieder mit einem "Halbspiegel" versehen, so dass die LED`s hindurchleuchten können.
Ohne diese Front sieht es so aus:
Uhr_Martrix.jpg


Nun noch ein kleiner Blick von hinten in das Gehäuse:

Uhr_offen.jpg

und ein Foto von den angefertigten Platinen:
Uhr_Platine.jpg

Den ATMega1284 habe ich auf einer separaten Modulplatine untergebracht.
Diese Platine wird einfach seitlich angesteckt. :)


Als Zusatzanzeigen gibt es dann z.B. noch die Temperaturanzeige, welche automatisch dreimal in einer Minute angezeigt wird:
Uhr_Temperatur.jpg


und natürlich die Berlin-Uhr (23:59 ;)):
Uhr_2359_Berlin.jpg
Diese Zeitanzeige muss allerdings per Tastendruck aktiviert werden und bleibt dann solange erhalten, bis sie wieder manuell deaktiviert wird.


Die Aufteilung der Matrix für die Berlin-Uhr könnt ihr hier sehen:
BerlinUhr_Speicher.jpg


Soweit erst mal zur Übersicht.....
weiteres folgt dann im nächsten Beitrag. ;)


Grüße,
Cassio
 
Zuletzt bearbeitet:

Cassio

Aktives Mitglied
29 Okt 2008
4,027
17
38
Region Hannover
Sprachen
  1. BascomAVR
Hallo.....
weiter gehts!

Da ich mir nicht sicher bin, ob der "nackte" Programmcode überhaupt sinnvoll ist, mache ich erst mal mit ein paar Erklärungen und Bildern weiter. ;)


Die Standardanzeige, wenn man nicht die Berlin-Uhr als Anzeige nutzen möchte, sieht nun folgendermaßen aus:

Uhr_2359_Datum.jpg

Unschwer zu erkennen ist die aktuelle Uhrzeit in der oberen Zeile in grün.
Daunter wird dann zeitweise das Datum (Tag & Monat) in rot angezeigt und
in der letzten Zeile laufen die Sekunden von links nach rechts.

Der Sekundenbalken baut sich in den ersten 30 Sekunden Stück für Stück auf, wobei jede 10. Sekunde in Orange dargestellt wird.
Ab der 31. Sekunde baut sich der Balken dann wieder Stück für Stück von Links nach Rechts ab. ;)


Die meiste Zeit wird aber die Uhr, der Wochentag und der Tag dargestellt:

Uhr_0000_Wtag.jpg

Wer die beiden Bilder nun vergleicht wird vielleicht bemerken, dass im ersten Bild in der oberen rechten Ecke ein grüner Punkt zu sehen ist.
Dies ist kein "Pixelfehler" :eek: sondern extra so gewollt. ;)
Der grüne Punkt zeigt nämlich an, dass sich die Uhr mit der Funkuhr nach der letzten Sekunde synchronisiert hat. :D

Bei der Berlin-Uhr habe ich das etwas anders gelöst.....
hier modifiziere ich die Sekundenanzeige.
Wenn ein oranges Quadrat aus vier LED`s blinkt, dann hat sich die Uhr mit dem DCF-Signal synchronisiert. Besteht die Anzeige aber aus einem orangen 8-fach LED-Rechteck, war der Empfang des DCF-Signals nicht in Ordnung.
Uhr_0000_Berlin.jpg

Hier kann man den breiten Balken der blinkenden Sekunden sehen...... aber sonst nichts! :eek:
Das liegt aber nur daran, dass es gerade 0:00 Uhr ist. ;)


Damit man zwischendurch auch mal sehen kann, ob das Empfangen und Zusammensetzen des DCF-Funksignals funktioniert, habe ich eine "Serviceroutine" ins Programm eingebaut.....
welche mit einem speziellen Tastendruck aufgerufen werden kann:
Uhr_DCF-Service.jpg

Dabei wird nicht nur die empfangene Zeit dargestellt sondern auch das Status-Bit 2 und 7 !


Apropos "Serviceroutine"......
Damit die Anzeige in der Nacht das Büro nicht künstlich erhellt und ggf. den Wachdienst nervös macht, wird außerhalb der Dienstzeiten die Anzeige abgedunkelt.
Während der Dienstzeit kann mit Hilfe eines 15-Stufen Dimmers die Anzeige dann heller eingestellt werden. Das Umschalten geschieht zwar automatisch, aber den Dimmwert kann man manuell einstellen.
Dafür gibt es dann diese Service-Routine:
Uhr_Dimmer.jpg



Ich denke, damit sollte ich wohl die wichtigsten Eigenschaften erwähnt haben und ggf. poste ich den Programmcode ja noch im nächsten Beitrag. ;)


Grüße,
Cassio
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4,321
159
63
Mittelhessen, Giessen
Sprachen
  1. ANSI C
  2. C++
  3. C#
  4. Java
  5. Kotlin
  6. Pascal
  7. Assembler
  8. PHP
Hallo Cassio!

Deine Uhr gefällt mir sehr gut, sie würde bei mir sicher auch gut ins Büro passen ;)

So ein Projekt wäre eigentlich auch gut für ein Gemeinschaftsprojekt im Forum!



Eine LED-Uhr wollte ich auch mal basteln. Leider hat mir letztendlich wieder die Zeit gefehlt, um das Projekt fertigzustellen. :(

Hier das Layout.
Ein Mix aus "analog" Uhr mit Matrixfeld. Das würde ich heute wahrscheinlich nicht mehr machen, es ist recht aufwändig. Es gibt inzwischen schöne LED-Matrix-Displays und bessere Treiber.

Dirk :ciao:

uhr.png
 

Cassio

Aktives Mitglied
29 Okt 2008
4,027
17
38
Region Hannover
Sprachen
  1. BascomAVR
Hallo Dirk!

Ja ja, es ist mal wieder nur eine Uhr geworden...... :rolleyes:
aber so hat die Matrix wenigstens einen sinnvollen Verwendungszweck bekommen. ;)

So eine analoge Matrix-Uhr habe ich auch schon mal gezeichnet, aber ebenfalls nicht gebaut. :cool:
Manchmal ist es aber nicht verkehrt solche Unterlagen in der Schublade zu haben. :)


Angenehm ist auch die Gesamtgröße meiner Büro-Uhr.
Die Außenmaße sind 250mm x 160mm

Aktuell habe ich hier aber noch andere Matrixanzeigen liegen, die weit aus größer sind.
Da hätte dann allein schon jedes 8x8 Modul gute 10x10cm bzw. 12x12cm!
Ich überlege aktuell, ob ich mir davon nicht eine Berlin-Uhr für zu Hause bauen sollte. ;)

Letztlich finde ich für den heimischen Wohnbereich die Word-Uhr von "HinterBlauenAugen" immer noch am Besten! (Klick HIER)
Apropos "HinterBlauenAugen".....
irgendwie vermisse ich ihn hier sehr! :drinks:



Wie dem aber auch sei....
Eigentlich wollte ich jetzt den Programmcode hier in Teilen einstellen.
Leider funktioniert das nicht, weil ich immer recht schnell die maximale Zeichenanzahl von 10000 Zeichen je Beitrag erreiche. :mad:
Scheinbar benötige ich das 5 bis 10 fache, um wenigstens sinnvolle Programmabschnitte hier einzustellen. :rolleyes:

Ergo muss ich mir etwas anderes überlegen.....
oder Dirk ändert die Vorgabe. ;)


Grüße,
Cassio
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4,321
159
63
Mittelhessen, Giessen
Sprachen
  1. ANSI C
  2. C++
  3. C#
  4. Java
  5. Kotlin
  6. Pascal
  7. Assembler
  8. PHP

Cassio

Aktives Mitglied
29 Okt 2008
4,027
17
38
Region Hannover
Sprachen
  1. BascomAVR
Hallo Dirk!

Danke schön! :flowers:


Dann wollen wir mal....

Programmkopf:


CodeBox BascomAVR

'SURE electronics
'32x16 Bicolor Matrixanzeige
'als Buero-Uhr
'by Cassio at MakerConnect.de

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


'Hier AVR-Typ und Systemfrequenz angeben!
$regfile = "m1284pdef.dat"  'ATMega 1284
$crystal = 12000000  '12 MHz


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



$hwstack = 192
$swstack = 192
$framesize = 192

' $baud = 19200  'Fehler bei 0,16%


'(
----AVR44DL-M-----
ATMega1284 @ 12MHz
-----------
PB0  |--o
PB1  |--o
PB2  |--o
PB3  |--o
PB4  |--o
PB5/MOSI  |--o
PB6/MISO  |--o
PB7/SCK  |--o
PD0/RxD  |--o
PD1/TxD  |--o
PD2/INT0  |--o
PD3/INT1  |--o I2C-INT
PD4  |--o
PD5  |--o
PD6  |--o
PD7  |--o
PC0/SCL  |--o I2C-CLK
PC1/SDA  |--o I2C-SDA
PC2  |--o
PC3  |--o
PC4  |--o
PC5  |--o Taster 3
PC6  |--o Taster 2
PC7  |--o Taster 1
PA7  |--o RC-Glied
PA6  |--o DCF-77 Signal
PA5  |--o
PA4  |--o
PA3  |--o CS
PA2  |--o CLK
PA1  |--o WR
PA0  |--o DATA
  |
AVcc  |--o
Vcc  |--o +5V
GND  |--o GND
-----------
')



' ==============================================================================

' Bestimme die Ein und Ausgänge
Ddra = &B_0000_1111  '1 ist Ausgang 0 ist Eingang
Porta = &B1111_0000  'auf Hi oder Low setzen

Ddrb = &B_1011_1111  '1 ist Ausgang 0 ist Eingang
Portb = &B0100_0000  'auf Hi oder Low setzen

Ddrc = &B_0000_0011  '1 ist Ausgang 0 ist Eingang
Portc = &B1111_1100  'auf Hi oder Low setzen

Ddrd = &B_1111_0010  '1 ist Ausgang 0 ist Eingang
Portd = &B0000_1101  'auf Hi oder Low setzen


'------------------------------------------------------------------------------
' RG-Matrix Steuerpins
'------------------------------------------------------------------------------

Cs Alias Porta.3  'Matrix CS (Serial-In A)
Clk Alias Porta.2  'Matrix CLK (Schieberegister Clock)
Wr Alias Porta.1  'Matrix WR (HT1632C Clock)
Daten Alias Porta.0  'Matrix DATA (HT1632C Daten)


'------------------------------------------------------------------------------
' RG-Matrix Declarationen
'------------------------------------------------------------------------------
$include "RGM_dec.inc"  'Variablen und Deklarationen

'(
Matrix-Speicheradressen
benötigt für Kommando:
HTmem "Chip" , "Speicheradresse" , "Byte (0-15)"

  1. Matrix grün  2. Matrix grün
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
D3|00|02|04|06|08|0A|0C|0E|D3|10|12|14|16|18|1A|1C|1E|
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
D2|  |  |  |  |  |  |  |  |D2|  |  |  |  |  |  |  |  |
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
D1|  |  |  |  |  |  |  |  |D1|  |  |  |  |  |  |  |  |
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
D0|  |  |  |  |  |  |  |  |D0|  |  |  |  |  |  |  |  |
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
D3|01|03|05|07|09|0B|0D|0F|D3|11|13|15|17|19|1B|1D|1F|
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
D2|  |  |  |  |  |  |  |  |D2|  |  |  |  |  |  |  |  |
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
D1|  |  |  |  |  |  |  |  |D1|  |  |  |  |  |  |  |  |
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
D0|  |  |  |  |  |  |  |  |D0|  |  |  |  |  |  |  |  |
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|

  1. Matrix rot  2. Matrix rot
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
D3|20|22|24|26|28|2A|2C|2E|D3|30|32|34|36|38|3A|3C|3E|
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
D2|  |  |  |  |  |  |  |  |D2|  |  |  |  |  |  |  |  |
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
D1|  |  |  |  |  |  |  |  |D1|  |  |  |  |  |  |  |  |
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
D0|  |  |  |  |  |  |  |  |D0|  |  |  |  |  |  |  |  |
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
D3|21|23|25|27|29|2B|2D|2F|D3|31|33|35|37|39|3B|3D|3F|
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
D2|  |  |  |  |  |  |  |  |D2|  |  |  |  |  |  |  |  |
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
D1|  |  |  |  |  |  |  |  |D1|  |  |  |  |  |  |  |  |
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
D0|  |  |  |  |  |  |  |  |D0|  |  |  |  |  |  |  |  |
  |--|--|--|--|--|--|--|--|  |--|--|--|--|--|--|--|--|
')


'------------------------------------------------------------------------------
' I2C Einstellungen
'------------------------------------------------------------------------------
$lib "i2c_twi.lbx"  ' Hardware I2C-LIB

Config Scl = Portc.0  ' SCL Pin
Config Sda = Portc.1  ' SDA Pin

I2cinit  ' Setzen der Pin´s

Config Twi = 100000  '100k BUS


'RTC PCF8583-----------------------------------
Const Rtc_8583w = &HA0  'RTC - PCF8583 Standard-Write-Adresse
Const Rtc_8583r = &HA1  'RTC - PCF8583 Standard-Lese-Adresse


'------------------------------------------------------------------------------
' I2C Temperatursensor DS1624
'------------------------------------------------------------------------------

'I2C-Adresse des DS1624 = &B1001_0000 = &H90
Const Ds1624 = &H90  ' I2C-Adresse

Dim Dsdaten(2) As Byte  'empfangene Datenbytes
Dim Dstemp As Single  'Temp-Single zur Berechnung

Dim Ds1624wert As Single  'Temperaturwert
Dim Temperatur As String * 5  'Temperaturwert formatiert
Dim Frac_wert As Single  'nur der Kommawert der Temperatur
Config Single = Scientific , Digits = 1  'nur eine Stelle nach dem Komma


Dsdaten(1) = &HAC  'permanente Temperaturmessung
Dsdaten(2) = &H00  'NULL

I2csend Ds1624 , Dsdaten(1) , 2
Waitms 50

Dsdaten(1) = &HEE
I2csend Ds1624 , Dsdaten(1) , 1
Waitms 50


'------------------------------------------------------------------------------
' Timer zur Anzeige
'------------------------------------------------------------------------------
'möglicher Prescaler 1,8,64,256, 1024
Dim Ladewert As Word
Ladewert = 42098  '256 mit 42098 für 500ms


Config Timer3 = Timer , Prescale = 256
On Timer3 Led_anzeige
Timer3 = Ladewert  '=500ms
Enable Timer3


'------------------------------------------------------------------------------
' Pollin DCF-77 Modul (doppelt invertiert!)
'------------------------------------------------------------------------------
Config Dcf77 = Pina.6 , Timer = 1 , Timer1sec = 1 , Debug = 1 , Update = 0 , Check = 2 , Inverted = 0 , Gosub = Sectic
Config Date = Dmy , Separator = .

Enable Interrupts

Date$ = "07.02.16"
Time$ = "09:30:00"


' #############################################################################
'Variablen für das Programm

Dim Z1 As Word  'Variable 1, 16bit breit

Dim Sec_old As Byte  'Sekunde zur Ausführung merken
Dim Memz As Byte  'Speicherzähler für Sekgraf
Dim Secz As Byte  'Sekundenzähler für Sekgraf
Dim Ftemp As String * 5  'formatierte Variable, temporär
Dim Uhr As String * 5  'Uhrzeit 12:34
Dim Datum As String * 5  'Datum 17.07
Dim Dp As String * 1  'Doppelpunkte
Dim Dtag As Byte  'Wochentag als Zahl
Dim Wtag As String * 5  'Wochentag als String
Dim Syszeit As Long  'System-Sekunden seit 01.01.2000
Dim Zeitspanne As Long  'Vergangene Systemsekunden
Dim Zeit As Long  'Sekundes des Tages

Dim Fuenfer As Byte  'Berlin_Uhr Fünfer
Dim Einer As Byte  'Berlin-Uhr Einer


Dim Dimm As Byte  'Dimmwert
Dim Dimmerwert As Eram Byte


'RTC Variablen---------------
Dim Rtc_b(6) As Byte  'BCD-Array zum Senden


'allgemeine Konstanten-------
Const Ja = 1
Const Nein = 0
Const Ein = 0
Const Aus = 1


'Alias Namen-----------------
Taster1 Alias Pinc.7
Taster2 Alias Pinc.6
Taster3 Alias Pinc.5


'Flags-----------------------
Dim Fb As Byte  'Flag-Byte
'Aufbau von FB:
'Bit: 7 6 5 4 3 2 1 0
'  | | | | | | | |
'  | | | | | | | DS1624 Flag
'  | | | | | | RTC schreiben-Flag
'  | | | | | Standard-Anzeige
'  | | | | Wochentag/Datum Anzeige-Flag
'  | | | Schalten_flag
'  | | Taster 1 + 3 Flag
'  | Taster 1 + 2 Flag
'  Taster 3 Flag

Dim Fb2 As Byte  'Flag-Byte-2
'Aufbau von FB2:
'Bit: 7 6 5 4 3 2 1 0
'  | | | | | | | |
'  | | | | | | | DP (Doppelpunkte-Flag)
'  | | | | | | Temperaturberechnungs-Flag
'  | | | | | Temperaturberechnung durchführen-Flag
'  | | | | Dimmer-Flag
'  | | |
'  | | Taster 2 Flag (Berlin-Uhr)
'  | Sync-Bit der DCF77-Uhr
'  RTC lesen-Flag


Dim Tb As Byte  'Tasterbyte
'TB dient NUR zur Erfassung des PINC und zum Filtern der Tasterbits
'Bit: 7 6 5 4 3 2 1 0
'  | | | | | | | |
'  | | | | | | | nicht verwendbar
'  | | | | | | nicht verwendbar
'  | | | | | nicht verwendbar
'  | | | | nicht verwendbar
'  | | | nicht verwendbar
'  | | Taster 3 (Wert=32)
'  | Taster 2 (Wert=64)
'  Taster 1 (Wert=128)




...geht gleich weiter.....
 

Cassio

Aktives Mitglied
29 Okt 2008
4,027
17
38
Region Hannover
Sprachen
  1. BascomAVR
Erster Start und Hauptarbeitsschleife:


CodeBox BascomAVR

' #############################################################################################
' #############################################################################################
'Erster Start
'------------------------------------------------------------
' Prüfen, ob die RTC vorhanden und erreichbar ist
I2cstart  'I2C Start
I2cwbyte Rtc_8583w  'RTC vorhanden?
I2cstop  'I2C Stop
'Wenn kein Fehler, dann RTC einstellen und Daten von der RTC holen
  If Err = 0 Then  'RTC OK, dann einstellen...
  Rtc_b(1) = 0  'Status/Control Register
  Rtc_b(2) = &B0000_1000  'mask flag = 1
  I2csend Rtc_8583w , Rtc_b(1) , 2  '2 Bytes senden
  Rtc_b(1) = 8  'Alarm Register
  Rtc_b(2) = &B0000_0000  'alles AUS
  I2csend Rtc_8583w , Rtc_b(1) , 2  '2 Bytes senden
  Fb2.7 = 1  'RTC auslesen aktiviert
  Gosub Rtc_read  'aktuelle Daten ins Programm laden
  Else
  End If


Dimm = Dimmerwert
Zeit = Secofday()  'aktuelle Sekunde des Tages abfragen
Waitms 100

Init_matrix  'RG-Matrix initialisieren
Waitms 100
Cls_matrix

'Matrix Helligkeit anpassen
Select Case Zeit
  Case 21602 To 72002  '06:00:02 bis 20:00:02 Uhr
  Dimmer Dimm  'Matrix hell
  Case Else
  Dimmer 0  'Matrix dunkel
End Select



' #############################################################################
'Programmschleife

Do

'Taster überprüfen und Flags setzen
Tb = Pinc And &B1110_0000

Select Case Tb
'  Case 96 :  'Taster 1
  Case 160 : Set Fb2.5  'Taster 2 Flag
  Case 192 :
  Reset Fb2.5  'Taster 3 Flag
  Cls_matrix
  Bitwait Taster3 , Set
  Case 32 : Set Fb.6  'Taster 1 & 2
  Case 64 : Set Fb.5  'Taster 1 & 3
End Select



'Temperatur- & Datums-Flag setzen--------------------------------------
Select Case _sec
  Case 14 : Fb.0 = 1  'Temperaturanzeige
  Case 34 : Fb.0 = 1  'Temperaturanzeige
  Case 54 : Fb.0 = 1  'Temperaturanzeige

  Case 4 : Fb.3 = 0  'Datum anzeigen
  Case 24 : Fb.3 = 0  'Datum anzeigen
  Case 44 : Fb.3 = 0  'Datum anzeigen

  Case 9 : Fb.3 = 1  'Wochentag anzeigen (Standard)
  Case 29 : Fb.3 = 1  'Wochentag anzeigen (Standard)
  Case 49 : Fb.3 = 1  'Wochentag anzeigen (Standard)
End Select




'Sync-Bit setzen oder rücksetzen-----------------------------
If _sec = 0 Then
  If Dcf_status.7 = Ja Then
  Fb2.6 = Ja  'Sync_bit setzen
  Fb.1 = 1  'RTC schreiben aktvieren
  Else
  Fb2.6 = Nein  'Sync_bit löschen
  Fb2.7 = 1  'RTC auslesen aktiviert
  End If
Else
End If


If _sec = 1 Then Reset Dcf_status.7  'Statusbit 7 zurück setzen




'Flag-Byte abarbeiten----------------------------------------
'Achtung ODER-Anwendung, Reihenfolge beachten!
If Fb.1 = 1 Then
  If _sec = 1 Then Gosub Rtc_write  'RTC schreiben

Elseif Fb2.7 = 1 Then
  If Zeit = 84630 Then
  Gosub Rtc_read  '23:30:30 RTC auslesen
  Else
  Fb2.7 = 0
  End If

Elseif Fb.0 = 1 Then
  Gosub Get_ds1624  'DS1624 lesen und anzeigen

Elseif Fb.5 = 1 Then
  Gosub Dimmwert  'Dimmerwert manuell ändern (Serviceroutine)

Elseif Fb.6 = 1 Then
  Gosub Dcf_service  'DCF-Zeit anzeigen (Serviceroutine)

Elseif Fb2.5 = 1 Then
  Gosub Berlin  'Berlin-Uhr anzeigen

Elseif Fb.2 = 1 Then
  Gosub Uhrzeit  'Uhrzeit anzeigen (Standard-Anzeige)

'Elseif Fb.7 = 1 Then  'nur Taster 3
'  Gosub
Else
End If



'Matrix von Mo. bis Fr. zur bestimmten Zeit dunkel oder hell dimmen
If Dtag < 5 Then
  Select Case Zeit
  Case 21602  '06:00:02 Uhr
  Dimmer Dimm  'Matrix hell
  Case 72002  '20:00:02 Uhr
  Dimmer 0  'Matrix dunkel
  End Select
Else
End If


Loop


End



....geht gleich weiter....
 

Cassio

Aktives Mitglied
29 Okt 2008
4,027
17
38
Region Hannover
Sprachen
  1. BascomAVR
Subroutinen, erter Teil:


CodeBox BascomAVR
' #############################################################################################
' #############################################################################################
Sectic:
If _sec = 0 Then Data_gn(63).0 = 0  'gesichert den letzten grafischen Sekundenpunkt entfernen

Zeit = Secofday()  'aktuelle Sekunde des Tages abfragen

Fb.2 = 1  'Uhrzeit anzeigen
Fb2.0 = 1  'Doppelpunkte ein
Timer3 = Ladewert  '500ms einstellen
Start Timer3

Return


' #############################################################################
'------------------------------------------------------------------------------
' Timer 500ms für das Blinken der Doppelpunkte
'------------------------------------------------------------------------------
Led_anzeige:

Fb.2 = 1  'Uhrzeit anzeigen
Fb2.0 = 0  'Doppelpunkte aus
Stop Timer3

Return


' #############################################################################
'------------------------------------------------------------------------------
' Standardanzeigen-Routine
'------------------------------------------------------------------------------
Uhrzeit:

'Anzeige von Uhr und Datum, zweifarbig
If Fb.2 = 1 Then  'Uhrzeit-Anzeige

  If Fb2.0 = 1 Then  'Doppelpunktanzeige abarbeiten
  Dp = ":"
  Else
  Dp = " "
  End If

  Dtag = Dayofweek()  'Wochentag ermitteln
  Wtag = Lookupstr(dtag , Wochentage)  'Wochentag als Text aus Data-Bereich

  If _hour < 10 Then
  Uhr = " "  'bei einstelligen Stunden, führende Null entfernen
  Uhr = Uhr + Str(_hour)
  Else
  Uhr = Str(_hour)  'zweistellige Stundenanzeige
  End If

  Uhr = Uhr + Dp  'Doppelunkte hinzu
  Ftemp = Str(_min) : Ftemp = Format(ftemp , "00")  'Minuten in String und zweistellig formatieren
  Uhr = Uhr + Ftemp  'Minuten hinzufügen

  Led G , 1 , Uhr  'Uhr in grün ausgeben


  If Fb.3 = 1 Then  'Wochentag anzeigen
  If _day < 10 Then  'bei einstelligem Tag...
  Datum = Wtag
  Datum = Datum + " "  'Leerzeichen einfügen
  Datum = Datum + Str(_day)
  Led R , 6 , Datum  'Wochentag ganz anzeigen
  'Punkt hinter dem Tag bei Wochentag-Anzeige
  Data_rt(63).1 = 1
  Data_rt(63).2 = 1
  Data_rt(64).1 = 1
  Data_rt(64).2 = 1
  Bytefarbe = R
  Gosub Send_daten


  Else  'bei zweistelligem Tag
  Datum = Wtag  'Wochentag hinzu
  Datum = Datum + Str(_day)  'beides zusammen setzen
  Led R , 6 , Datum  'Wochentag ganz anzeigen
  'Punkt hinter dem Tag bei Wochentag-Anzeige
  Data_rt(63).1 = 1
  Data_rt(63).2 = 1
  Data_rt(64).1 = 1
  Data_rt(64).2 = 1
  Bytefarbe = R
  Gosub Send_daten


  End If


  Else  'Datum anzeigen
  If _day < 10 Then  'einstelliger Tag
  Datum = " "
  Datum = Datum + Str(_day)
  Datum = Datum + "."
  Else  'zweistelliger Tag
  Datum = Str(_day)
  Datum = Datum + "."
  End If


  If _month < 10 Then  'einstelliger Monat
  Ftemp = Str(_month)
  Ftemp = Ftemp + "."
  Datum = Datum + Ftemp  'Tag und Monat zusammen setzen
  Data_rt(64).1 = 0
  Data_rt(64).2 = 0
  Led R , 6 , Datum  'Datum in rot ausgeben
  Else  'zweistelliger Monat
  Ftemp = Str(_month)
  Datum = Datum + Ftemp  'Tag und Monat zusammen setzen
  Led R , 6 , Datum  'Datum in rot ausgeben
  'Punkt hinter dem Monat zeichnen
  Data_rt(63).1 = 1
  Data_rt(63).2 = 1
  Data_rt(64).1 = 1
  Data_rt(64).2 = 1
  Bytefarbe = R
  Gosub Send_daten

  End If


  End If


  If Fb2.6 = Ja Then
  Data_gn(32).7 = 1
  Else
  Data_gn(32).7 = 0
  End If

Gosub Secgraf

Fb.2 = 0  'Uhrzeit nicht nochmal anzeigen

Else
End If


Return


' #############################################################################
'------------------------------------------------------------------------------
' grafische Sekunden-Anzeige
'------------------------------------------------------------------------------
Secgraf:
'grafische Sekundenanzeige in der unteren Zeile
'Bit-Manipulation findet direkt im Array statt
' Data_gn(64) As Byte
' Data_rt(64) As Byte

'grün Byte 34 für Sekunde 1
'grün Byte 63 für Sekunde 30

If _sec > 0 And _sec < 31 Then
  Memz = 34
  For Secz = 1 To _sec
  Data_gn(memz).0 = 1
  If Secz = 10 Or Secz = 20 Or Secz = 30 Then
  Data_rt(memz).0 = 1
  Else
  End If
  Incr Memz
  Next Secz


Elseif _sec > 30 Then
  Memz = 34
  For Secz = 1 To 30
  Data_gn(memz).0 = 1
  If Secz = 10 Or Secz = 20 Or Secz = 30 Then
  Data_rt(memz).0 = 1
  Else
  End If
  Incr Memz
  Next Secz

  Memz = 34
  Z1 = _sec - 30
  For Secz = 1 To Z1
  Data_gn(memz).0 = 0
  If Secz = 10 Or Secz = 20 Or Secz = 30 Then
  Data_rt(memz).0 = 0
  Else
  End If
  Incr Memz
  Next Secz


Else
End If


Bytefarbe = O
Gosub Send_daten

Return




....geht gleich weiter....
 

Cassio

Aktives Mitglied
29 Okt 2008
4,027
17
38
Region Hannover
Sprachen
  1. BascomAVR
Subroutine Berlin-Uhr:


CodeBox BascomAVR

' #############################################################################
'------------------------------------------------------------------------------
' Berlin-Uhr Anzeige
'------------------------------------------------------------------------------
Berlin:

If Fb.2 = 1 Then


For Im = 1 To 64  'Array grün & rot auf NULL
  Data_gn(im) = &H00
  Data_rt(im) = &H00
Next Im


'----------------------Minuten------------------------------
Einer = _min Mod 5  '5er Stellen ermitteln
Fuenfer = _min - Einer  'restliche 1er errechnen

Select Case Fuenfer
  Case 5 : Data_gn(33) = &B11111000
  Data_gn(34) = &B11111000
  Case 10 : Data_gn(33) = &B11111000
  Data_gn(34) = &B11111000
  Data_gn(36) = &B11111000
  Data_gn(37) = &B11111000
  Case 15 : Data_gn(33) = &B11111000
  Data_gn(34) = &B11111000
  Data_gn(36) = &B11111000
  Data_gn(37) = &B11111000
  Data_rt(39) = &B11111000
  Data_rt(40) = &B11111000
  Case 20 : Data_gn(33) = &B11111000
  Data_gn(34) = &B11111000
  Data_gn(36) = &B11111000
  Data_gn(37) = &B11111000
  Data_rt(39) = &B11111000
  Data_rt(40) = &B11111000
  Data_gn(42) = &B11111000
  Data_gn(43) = &B11111000
  Case 25 : Data_gn(33) = &B11111000
  Data_gn(34) = &B11111000
  Data_gn(36) = &B11111000
  Data_gn(37) = &B11111000
  Data_rt(39) = &B11111000
  Data_rt(40) = &B11111000
  Data_gn(42) = &B11111000
  Data_gn(43) = &B11111000
  Data_gn(45) = &B11111000
  Data_gn(46) = &B11111000
  Case 30 : Data_gn(33) = &B11111000
  Data_gn(34) = &B11111000
  Data_gn(36) = &B11111000
  Data_gn(37) = &B11111000
  Data_rt(39) = &B11111000
  Data_rt(40) = &B11111000
  Data_gn(42) = &B11111000
  Data_gn(43) = &B11111000
  Data_gn(45) = &B11111000
  Data_gn(46) = &B11111000
  Data_rt(48) = &B11111000
  Data_rt(49) = &B11111000
  Case 35 : Data_gn(33) = &B11111000
  Data_gn(34) = &B11111000
  Data_gn(36) = &B11111000
  Data_gn(37) = &B11111000
  Data_rt(39) = &B11111000
  Data_rt(40) = &B11111000
  Data_gn(42) = &B11111000
  Data_gn(43) = &B11111000
  Data_gn(45) = &B11111000
  Data_gn(46) = &B11111000
  Data_rt(48) = &B11111000
  Data_rt(49) = &B11111000
  Data_gn(51) = &B11111000
  Data_gn(52) = &B11111000
  Case 40 : Data_gn(33) = &B11111000
  Data_gn(34) = &B11111000
  Data_gn(36) = &B11111000
  Data_gn(37) = &B11111000
  Data_rt(39) = &B11111000
  Data_rt(40) = &B11111000
  Data_gn(42) = &B11111000
  Data_gn(43) = &B11111000
  Data_gn(45) = &B11111000
  Data_gn(46) = &B11111000
  Data_rt(48) = &B11111000
  Data_rt(49) = &B11111000
  Data_gn(51) = &B11111000
  Data_gn(52) = &B11111000
  Data_gn(54) = &B11111000
  Data_gn(55) = &B11111000
  Case 45 : Data_gn(33) = &B11111000
  Data_gn(34) = &B11111000
  Data_gn(36) = &B11111000
  Data_gn(37) = &B11111000
  Data_rt(39) = &B11111000
  Data_rt(40) = &B11111000
  Data_gn(42) = &B11111000
  Data_gn(43) = &B11111000
  Data_gn(45) = &B11111000
  Data_gn(46) = &B11111000
  Data_rt(48) = &B11111000
  Data_rt(49) = &B11111000
  Data_gn(51) = &B11111000
  Data_gn(52) = &B11111000
  Data_gn(54) = &B11111000
  Data_gn(55) = &B11111000
  Data_rt(57) = &B11111000
  Data_rt(58) = &B11111000
  Case 50 : Data_gn(33) = &B11111000
  Data_gn(34) = &B11111000
  Data_gn(36) = &B11111000
  Data_gn(37) = &B11111000
  Data_rt(39) = &B11111000
  Data_rt(40) = &B11111000
  Data_gn(42) = &B11111000
  Data_gn(43) = &B11111000
  Data_gn(45) = &B11111000
  Data_gn(46) = &B11111000
  Data_rt(48) = &B11111000
  Data_rt(49) = &B11111000
  Data_gn(51) = &B11111000
  Data_gn(52) = &B11111000
  Data_gn(54) = &B11111000
  Data_gn(55) = &B11111000
  Data_rt(57) = &B11111000
  Data_rt(58) = &B11111000
  Data_gn(60) = &B11111000
  Data_gn(61) = &B11111000
  Case 55 : Data_gn(33) = &B11111000
  Data_gn(34) = &B11111000
  Data_gn(36) = &B11111000
  Data_gn(37) = &B11111000
  Data_rt(39) = &B11111000
  Data_rt(40) = &B11111000
  Data_gn(42) = &B11111000
  Data_gn(43) = &B11111000
  Data_gn(45) = &B11111000
  Data_gn(46) = &B11111000
  Data_rt(48) = &B11111000
  Data_rt(49) = &B11111000
  Data_gn(51) = &B11111000
  Data_gn(52) = &B11111000
  Data_gn(54) = &B11111000
  Data_gn(55) = &B11111000
  Data_rt(57) = &B11111000
  Data_rt(58) = &B11111000
  Data_gn(60) = &B11111000
  Data_gn(61) = &B11111000
  Data_gn(63) = &B11111000
  Data_gn(64) = &B11111000
End Select

Select Case Einer
  Case 1 :
  For Z1 = 33 To 39
  Data_gn(z1) = Data_gn(z1) + 3
  Next Z1

  Case 2 :
  For Z1 = 33 To 39
  Data_gn(z1) = Data_gn(z1) + 3
  Next Z1
  For Z1 = 41 To 47
  Data_gn(z1) = Data_gn(z1) + 3
  Next Z1

  Case 3 :
  For Z1 = 33 To 39
  Data_gn(z1) = Data_gn(z1) + 3
  Next Z1
  For Z1 = 41 To 47
  Data_gn(z1) = Data_gn(z1) + 3
  Next Z1
  For Z1 = 50 To 56
  Data_gn(z1) = Data_gn(z1) + 3
  Next Z1

  Case 4 :
  For Z1 = 33 To 39
  Data_gn(z1) = Data_gn(z1) + 3
  Next Z1
  For Z1 = 41 To 47
  Data_gn(z1) = Data_gn(z1) + 3
  Next Z1
  For Z1 = 50 To 56
  Data_gn(z1) = Data_gn(z1) + 3
  Next Z1
  For Z1 = 58 To 64
  Data_gn(z1) = Data_gn(z1) + 3
  Next Z1
End Select


'----------------------Stunden------------------------------
Einer = _hour Mod 5  '5er Stellen ermitteln
Fuenfer = _hour - Einer  'restliche 1er errechnen

Select Case Fuenfer
  Case 5 :
  For Z1 = 1 To 7
  Data_rt(z1) = 48
  Next Z1

  Case 10 :
  For Z1 = 1 To 7
  Data_rt(z1) = 48
  Next Z1
  For Z1 = 9 To 15
  Data_rt(z1) = 48
  Next Z1

  Case 15 :
  For Z1 = 1 To 7
  Data_rt(z1) = 48
  Next Z1
  For Z1 = 9 To 15
  Data_rt(z1) = 48
  Next Z1
  For Z1 = 18 To 24
  Data_rt(z1) = 48
  Next Z1

  Case 20 :
  For Z1 = 1 To 7
  Data_rt(z1) = 48
  Next Z1
  For Z1 = 9 To 15
  Data_rt(z1) = 48
  Next Z1
  For Z1 = 18 To 24
  Data_rt(z1) = 48
  Next Z1
  For Z1 = 26 To 32
  Data_rt(z1) = 48
  Next Z1
End Select


Select Case Einer
  Case 1 :
  For Z1 = 1 To 7
  Data_rt(z1) = Data_rt(z1) + 6
  Next Z1

  Case 2 :
  For Z1 = 1 To 7
  Data_rt(z1) = Data_rt(z1) + 6
  Next Z1
  For Z1 = 9 To 15
  Data_rt(z1) = Data_rt(z1) + 6
  Next Z1

  Case 3 :
  For Z1 = 1 To 7
  Data_rt(z1) = Data_rt(z1) + 6
  Next Z1
  For Z1 = 9 To 15
  Data_rt(z1) = Data_rt(z1) + 6
  Next Z1
  For Z1 = 18 To 24
  Data_rt(z1) = Data_rt(z1) + 6
  Next Z1

  Case 4 :
  For Z1 = 1 To 7
  Data_rt(z1) = Data_rt(z1) + 6
  Next Z1
  For Z1 = 9 To 15
  Data_rt(z1) = Data_rt(z1) + 6
  Next Z1
  For Z1 = 18 To 24
  Data_rt(z1) = Data_rt(z1) + 6
  Next Z1
  For Z1 = 26 To 32
  Data_rt(z1) = Data_rt(z1) + 6
  Next Z1
End Select



'Sekunden blinken--------------------------
If Fb2.0 = 1 Then
  If Fb2.6 = Nein Then  'acht Segmente blinken OHNE Sync
  Data_gn(15).7 = 1
  Data_gn(15).6 = 1
  Data_gn(16).7 = 1
  Data_gn(16).6 = 1
  Data_gn(17).7 = 1
  Data_gn(17).6 = 1
  Data_gn(18).7 = 1
  Data_gn(18).6 = 1

  Data_rt(15).7 = 1
  Data_rt(15).6 = 1
  Data_rt(16).7 = 1
  Data_rt(16).6 = 1
  Data_rt(17).7 = 1
  Data_rt(17).6 = 1
  Data_rt(18).7 = 1
  Data_rt(18).6 = 1
  Else  'vier Segmente blinken MIT Sync
  Data_gn(16).7 = 1
  Data_gn(16).6 = 1
  Data_gn(17).7 = 1
  Data_gn(17).6 = 1

  Data_rt(16).7 = 1
  Data_rt(16).6 = 1
  Data_rt(17).7 = 1
  Data_rt(17).6 = 1
  End If
Else
End If


Bytefarbe = O
Gosub Send_daten

Fb.2 = 0

Else
End If


Return




...geht gleich weiter....
 

Cassio

Aktives Mitglied
29 Okt 2008
4,027
17
38
Region Hannover
Sprachen
  1. BascomAVR
restliche Subroutinen:


CodeBox BascomAVR

' #############################################################################
'------------------------------------------------------------------------------
' GRC-Service Routine
'------------------------------------------------------------------------------
Dimmwert:

Dimm = Dimmerwert
Cls_matrix

Dimmer Dimm
Ftemp = Str(dimm)
Ftemp = Format(ftemp , "00")

Led G , 1 , "LED  Dim"
Led R , 9 , Ftemp

Waitms 100
Bitwait Taster3 , Set


Do

If Taster3 = 0 Then

  If Dimm < 15 Then
  Incr Dimm
  Else
  Dimm = 0
  End If

  Dimmer Dimm

  Ftemp = Str(dimm)
  Ftemp = Format(ftemp , "00")
  Led R , 9 , Ftemp

  Waitms 250
  Bitwait Taster3 , Set
Else
End If

Loop Until Taster2 = 0


Dimmerwert = Dimm
Cls_matrix
Waitms 100
Bitwait Taster2 , Set

Fb.5 = 0

Return



' #############################################################################
'------------------------------------------------------------------------------
' DCF77-Service Routine
'------------------------------------------------------------------------------
Dcf_service:

Cls_matrix

Waitms 100
Bitwait Taster2 , Set

Do

If Sec_old <> Dcf_sec Then
  Ftemp = Str(dcf_hour) : Ftemp = Format(ftemp , "00")  'Stunden in String und formatieren
  Ftemp = Ftemp + ":"
  Led R , 1 , Ftemp

  Ftemp = Str(dcf_min) : Ftemp = Format(ftemp , "00")  'Minuten in String und formatieren
  Led R , 4 , Ftemp

  Ftemp = Str(dcf_sec) : Ftemp = Format(ftemp , "00")  'Sekunden in String und formatieren
  Led R , 6 , Ftemp


  Ftemp = Str(dcf_status.2) : Ftemp = Format(ftemp , "0")  'Status-Bit 2 in String und formatieren
  Led R , 10 , Ftemp  'in rot anzeigen
  Ftemp = Str(dcf_status.7) : Ftemp = Format(ftemp , "0")  'Status-Bit 7 in String und formatieren
  Led G , 9 , Ftemp  'in grün anzeigen


  If _sec = 1 Then
  If Dcf_status.7 = 1 Then
  Fb.1 = 1
  Gosub Rtc_write
  Reset Dcf_status.7  'Statusbit 7 zurück setzen
  Else
  End If
  Else
  End If


  Sec_old = Dcf_sec

Else
End If


Loop Until Taster2 = Ein


Fb.6 = 0
Cls_matrix

Waitms 100
Bitwait Taster2 , Set

Return



' #############################################################################
Get_ds1624:

If Fb2.1 = 0 Then

Fb.2 = 0

Dsdaten(1) = &HAA
I2creceive Ds1624 , Dsdaten(1) , 1 , 2  'Temperaturwerte holen


'Temperaturberechnung---------------------------------------
If Dsdaten(1).7 = 0 Then
  Ds1624wert = Dsdaten(1)  'positive Temperatur
Else
  Ds1624wert = Dsdaten(1)
  Ds1624wert = Ds1624wert - 255  'negative Temperatur
End If


Dstemp = Dsdaten(2)
Shift Dstemp , Right , 3
Dstemp = Dstemp * 0.03125  'Kommastelle errechnen
'Dstemp = Dstemp / 32  'Kommastelle errechnen

Ds1624wert = Ds1624wert + Dstemp  'Temperaturwert zusammenfügen
Temperatur = Fusing(ds1624wert , "##.&")

Cls_matrix

Led O , 1 , "Büro "
Led O , 6 , Temperatur

'Grad Celsius grün
Ht_mem 4 , &H10 , 0
Ht_mem 4 , &H11 , 0
Ht_mem 4 , &H12 , 12
Ht_mem 4 , &H13 , 0
Ht_mem 4 , &H14 , 12
Ht_mem 4 , &H15 , 0
Ht_mem 4 , &H16 , 1
Ht_mem 4 , &H17 , 14
Ht_mem 4 , &H18 , 2
Ht_mem 4 , &H19 , 1
Ht_mem 4 , &H1A , 2
Ht_mem 4 , &H1B , 1
Ht_mem 4 , &H1C , 2
Ht_mem 4 , &H1D , 1
Ht_mem 4 , &H1E , 1
Ht_mem 4 , &H1F , 2

'Grad Celsius rot
Ht_mem 4 , &H30 , 0
Ht_mem 4 , &H31 , 0
Ht_mem 4 , &H32 , 12
Ht_mem 4 , &H33 , 0
Ht_mem 4 , &H34 , 12
Ht_mem 4 , &H35 , 0
Ht_mem 4 , &H36 , 1
Ht_mem 4 , &H37 , 14
Ht_mem 4 , &H38 , 2
Ht_mem 4 , &H39 , 1
Ht_mem 4 , &H3A , 2
Ht_mem 4 , &H3B , 1
Ht_mem 4 , &H3C , 2
Ht_mem 4 , &H3D , 1
Ht_mem 4 , &H3E , 1
Ht_mem 4 , &H3F , 2


Fb2.1 = 1
Syszeit = Syssec()

Else
NOP
End If


Zeitspanne = Syssecelapsed(syszeit)

If Zeitspanne > 3 Then
  Cls_matrix
  Fb.0 = 0
  Fb2.1 = 0
  Fb.2 = 1
Else
End If

Return



' #############################################################################
'------------------------------------------------------------------------------
' RTC lesen
'------------------------------------------------------------------------------
Rtc_read:

If Fb2.7 = 1 Then

Rtc_b(1) = 2

I2creceive Rtc_8583w , Rtc_b(1) , 1 , 5  '1 byte senden, 5 byte holen


_sec = Makedec(rtc_b(1))  'Sekunden eintragem

_min = Makedec(rtc_b(2))  'Minuten eintragen

Rtc_b(3) = Rtc_b(3) And &B0011_1111  'nur die Zahlen der STD
_hour = Makedec(rtc_b(3))  'Stunden eintragen


Rtc_b(4) = Rtc_b(4) And &B0011_1111  'nur Tag betrachten
_day = Makedec(rtc_b(4))  'Tag eintragen


Dtag = Rtc_b(5) And &B1110_0000  'Wochentag eintragen
Shift Dtag , Right , 5  'zur richtigen Stelle schieben
Rtc_b(5) = Rtc_b(5) And &B0001_1111
_month = Makedec(rtc_b(5))  'Monat eintragen


Rtc_b(1) = &H0E  'Alarm-Register, aktuelles Jahr lesen
I2creceive Rtc_8583w , Rtc_b(1) , 1 , 1  '1 byte senden, 1 byte holen

_year = Makedec(rtc_b(1))  'Jahr eintragen

Fb2.7 = 0

Else
NOP
End If


Return


' #############################################################################
'------------------------------------------------------------------------------
' RTC schreiben
'------------------------------------------------------------------------------
Rtc_write:

If Fb.1 = 1 Then


Fb.1 = 0

Rtc_b(1) = 2  '2.Register anwählen

Rtc_b(2) = Makebcd(_sec)
Rtc_b(3) = Makebcd(_min)

'Hour= 7654_3210
'  ||||_||||
'  ||||_|||1
'  ||||_||2
'  ||||_|4
'  ||||_8
'  ||||
'  ||00-20
'  |0=AM/1=PM
'  0=24h/1=12h
Rtc_b(4) = Makebcd(_hour)  'immer 24h Anzeige und kein AM/PM


'Year/Day= 7654_3210
'  ||||_||||
'  ||||_|||1
'  ||||_||2
'  ||||_|4
'  ||||_8
'  ||||
'  ||00-30
'  ||
'  Year 0-3
Rtc_b(5) = _year / 3
Shift Rtc_b(5) , Left , 6
Rtc_b(5) = Rtc_b(5) + Makebcd(_day)


'Wtag/Month= 7654_3210
'  ||||_||||
'  ||||_|||1
'  ||||_||2
'  ||||_|4
'  ||||_8
'  |||10
'  |||
'  Wtag 0-6
Rtc_b(6) = Dtag
Shift Rtc_b(6) , Left , 5
Rtc_b(6) = Rtc_b(6) + Makebcd(_month)


I2cstart  'Start
I2cwbyte Rtc_8583w  'Write-Adresse
I2cwbyte 0  'Control-Register anwählen
I2cwbyte 8  'mask flag einstellen
I2cstop  'Stopp

I2csend Rtc_8583w , Rtc_b(1) , 6  'Daten senden

Rtc_b(1) = &H0E  'Alarm-Register, Sekunden
Rtc_b(2) = Makebcd(_year)  'aktuelles Jahr speichern
I2csend Rtc_8583w , Rtc_b(1) , 2  'Daten senden



Else
End If


Return



Wochentage:
Data "Mo " , "Di " , "Mi " , "Do " , "Fr " , "Sa " , "So "



' #############################################################################
'------------------------------------------------------------------------------
' RG-Matrix Subroutinen
'------------------------------------------------------------------------------
$include "RGM_subs.inc"



Das war es dann endlich! :)

Viel Spaß damit.
Vielleicht kann ja der Ein oder Andere ein paar Teile vom Programmcode gebrauchen. ;)

Grüße,
Cassio
 

Rudi54

Neues Mitglied
20 Mai 2015
11
0
1
Sprachen
Hallo Cassio!
Wie Du weisst, bin ich immer noch lernender.
Ich habe mal eine Frage zu Deinem Source-Code.
Da steht im Kopf Zeile 54 PA7 | --o RC-Glied.(Erläuterungszeile)
Hat das RC-Glied eine Relevanz in dem Programm?
Ich finde den PINA.7 so nicht wieder, ausser das er in der Konfiguration
als Input und mit Pullup deklariert ist.
Oder war das so schon auf Deinem Controller-Board?
Noch eine Frage. Auf dem Platinen-Foto unterhalb vom RTC
ist das ein Speicherkondensator?
Könntest Du mal einen Schaltplan von der Uhr-Platine hochladen?
Sonst prima Programm. Kann man als Anfänger viel draus lernen,
wie ein Code überhaupt aufgebaut wird.

Grüße , Rudi54
 

Cassio

Aktives Mitglied
29 Okt 2008
4,027
17
38
Region Hannover
Sprachen
  1. BascomAVR
Hallo Rudi54!

Entschuldige, dass ich erst so spät antworte.....
aber wie das manchmal so ist, mit der mangelnden Freizeit fürs Hobby. :rolleyes:

Das RC-Glied am PinA7 hatte ich zu Beginn mit eingeplant und sollte die automatische Helligkeitsanpassung steuern.
So hatte ich das bei anderen Uhren hier im Haushalt vorher auch schon gemacht.
Später habe ich das für die Bürouhr aber wieder verworfen und mit festen Zeiten gearbeitet.
Von daher kannst du den PinA7 gedanklich vernachlässigen. ;)

Der "Speicherkondensator" unter der RTC ist eine Goldcap und versorgt die RTC bei Stromausfall weiter.
Damit es ein wenig übersichtlicher wird, sollte ich den recht spärlichen Schaltplan wohl doch mal anhängen. :cool:

Ich habe allerdings inzwischen die Einheit ein wenig erweitert und modifiziert.
Der eingebaute I2C-Temperatursensor (DS1624) befindet sich nun seitlich an einer Gehäuseöffnung.
Zusätzlich habe ich noch einen "externen" 1Wire-Temperaturfühler (DS18S20) integriert (PinA5), welcher mit einem drei Meter langen Kabel und einem Steckkontakt verbunden ist.RG-Matrix_Uhr_Plan.GIF


Das zugehörige neue Programm prüft nun erst mal ob der DS18S20 erreichbar ist und ermittelt die Temperatur, welche dann angezeigt wird.
Sollte jedoch der 1Wire-Sensor nicht angesteckt bzw. erreichbar sein, wird automatisch der interne DS1624 ausgewertet und dessen Temperatur angezeigt. :)

Ich habe mir das mit dem externen Sensor nachträglich überlegt, weil teilweise die Sonne das Gehäuse aufheizte und es dadurch zu großen Abweichungen zur realen Raumtemperatur kam.

Wenn es noch interessant sein sollte und ich Zeit habe, kann ich die Programmänderungen hier ggf. noch nachreichen. ;)


Viele Grüße,
Cassio
 

Rudi54

Neues Mitglied
20 Mai 2015
11
0
1
Sprachen
Hallo Cassio !
Ich bin heute auch erst dazu gekommen, hier mal wieder rein zu schauen.
Danke für Deine Antwort und für den Plan.
Bin auch dabei mal eine Uhr zu bauen. Deshalb habe ich überall ein bißchen umhergestöbert.
Vor dem Goldcap habe ich noch einen Ladewiderstand von 56 Ohm. DCF von Pollin mit Z-Diode
für die 3,3V und den BS 170 von Dir. Musste aber Inverted auf 1 setzen. Jetzt läuft's. Nach rund
3 Min Sync hier auf Rügen.
Ansonsten, Respekt vor Deinen vielen Bau-Ideen.
Ää, hab da noch eine Frage. Was ist das für eine Spiegelfolie, die Du verwendest ?
Gruß von der Insel
Rudi54
 
Zuletzt bearbeitet:

Cassio

Aktives Mitglied
29 Okt 2008
4,027
17
38
Region Hannover
Sprachen
  1. BascomAVR
Hallo "Insel-Rudi"! ;)

Ich habe mein DCF-Modul über einen 3,3V Regler versorgt und nicht über eine Z-Diode.
Den Signalausgang des Moduls habe ich dann durch den ersten FET entlastet (invertiertes Signal).
Um wieder ein eindeutiges 5V-Signal am AVR zu bekommen habe ich einfach einen weiteren FET nachgeschaltet, der mir das Signal natürlich wieder invertiert.
Aus dem Grunde habe ich hinterher am AVR auch kein invertiertes Signal mehr. ;)

0_DCF_3V-5V.jpg

Das "Umspannen" der Spannung von 3,3V auf 5V ist nicht zwingend notwendig, da die 3,3V Signalpegel am AVR auch erkannt werden.
Ich hatte dies zusätzlich mal mit eingebaut, weil ich bei einer anderen Uhr hier immer wieder Schwierigkeiten hatte.
Allerdings hatte es hinterher dann doch nicht am Signalpegel gelegen. :rolleyes:

Bei meinen BTM222 -Modulen (Bluetooth-Module) arbeite ich auch nur mit 3,3V Signalpegel und die 5V AVR`s haben bis jetzt auch keine Problem damit gehabt. :)



Die Spiegelfolien bestelle ich immer online bei Velken.de
www.velken.de (Artikelnummer 131030)
Den Tipp habe ich vor Jahren auch mal von einem User hier aus dem Forum bekommen und kann ihn bedenkenlos weiter empfehlen.
Die haben viele verschiedene Spiegelfolien und weitere interessante Sachen zum Thema Folien.
Dazu noch einen schnellen Versand und tollen Service.


Wünsche dir noch viel Spaß bei deinen weiteren Ideen.

Viele Grüße,
Cassio

 

Rudi54

Neues Mitglied
20 Mai 2015
11
0
1
Sprachen
Hallo Cassio !

Vielen Dank für Deine Spiegelfolien info. Hab schon bei Ebay gesucht aber nicht das richtige gefunden.

Viele Grüße
Rudi54
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)