IR RC5, I2C, DCF77, 7-Segmente Uhr mit Alarm (mit Bildern)

Hallo !

Nun geht es erst mal hardwaretechnisch weiter.....

Zur Aufnahme aller Bauteile habe ich mir eine 200mm x 130mm Platine selbst erstellt.

Hier mal das Layout:
57mm-Platine.Rev4.gif
(Im Layout steht noch Mega8. Es wurde aber ein Mega168 verwendet!)


Danach wurde geäzt, viel gebohrt und ordentlich ein verlötet. ;)
a_DSCF0958.jpg

Wie zu erkennen ist, sitzen die Treiber-IC`s (ULN2803) unter den 7-Segment-Anzeigen.
Da ich diese mit Buchsenleisten steckbar gemacht habe, um im Fehlerfall eine Anzeige problemlos austauschen zu können, bleibt für die Widerstände und die Treiber-IC`s ausreichend Platz. :)



Anschließend werden die Anzeigen also nur noch eingesteckt.....
a_DSCF0963.jpg

Damit war die Hardware fertig !

Grüße,
Cassio
 
Hallo !

In einigen anderen Beiträgen habe ich ja schon ein paar mal von meinem I2C-LCD erzählt, dass ich als "Debug"-Anzeige verwende.

Auch dieses mal hat diese Einheit gute Dienste geleistet.... und jetzt hat es nebenbei auch erst mal ein vernünftiges Gehäuse bekommen. ;)

Ich nenne das gute Stück: I2C-Service-Einheit.......... oder kurz: ISE ! ;)

Und so sieht die Einheit zur Zeit aus:
ISE-1.jpg
ISE-2.jpg

Damit gewinne ich zwar nun keinen Schönheitspreis, aber es ist wenigstens alles vernünftig in ein Gehäuse gebaut.
Also nix mehr mit losen Drähten oder Flachleitungen die abzuknicken drohen. ;)

Im Inneren werkeln zur Zeit nur zwei PCF8574A...
Einer für die Matrix-Tastatur und einer für das 16x2 LCD.
Beide besitzen natürlich unterschiedliche Adressen, die man ja bekanntlich für jedes IC individuell einstellen kann.

Grüße,
Cassio
 
....und weiter gehts....


Wie oben schon erwähnt, habe ich meine ISE jetzt auch für "Debug"-Ausgaben verwendet.

Hier mal einige Beispiele, die ich in den Programmcode eingebaut habe:
Standard-Anzeige (bis Programm Rev. 4.1):
ISE-3.jpg


Anzeige von Alarmmenüs:
ISE-5.jpg


und noch einige andere nützliche Werte, oder als Rückmeldung für das ordnungsgemäße abarbeiten des Programms:
ISE-6.jpg ISE-7.jpg


Wenn ich mal wieder Zeit habe, dann werde ich die ISE noch erweitern.
Es wird ein kleines internes Menü (mit eigenem AVR) geben, so dass ich z.B. auch EEPROM-Werte auslesen, abspeichern und zurück sichern kann.
Das ist zur Zeit aber noch "Zukunftsmusik".

Grüße,
Cassio
 
Hallo zusammen!

Nach den ganzen Bildern und Hardwarebeschreibungen folgt nun auch eeeeendlich das Programm. :)

Meine aktuelle Version schreitet momentan immer noch voran..... aber das sind nur noch Zusatzfunktionen, die den Speicher füllen. ;)

Meine letzte getestete Version ist die Rev. 5.1 die ich hier nun auch einstellen werde.
Der letzte Versionssprung von 4.x zu 5.0 kam zustande, weil ich auf die DCF77.lib nebst Include-Datei DCF77_soft.bas von rn-wissen.de umgestiegen bin.

Mir war zwar vorher bekannt, dass die Original-LIB von BASCOM den Timer-1 verwendet..... den ich aber kurzzeitig für das Senden der RC5e-Signale benötigte.
Durch einen kleinen Test zu Beginn der Arbeiten hatte ich das zwar zum Laufen bekommen, allerdings hatte ich im Programm einen "Fehler" der mir erst später aufgefallen war.
Nachträglich ist es mir also nicht gelungen den Timer-1 für beide Anwendungen zu benutzen..... auch wenn das Senden der IR-Codes nur für ein bruchteil einer Sekunde benötigt wird. :rolleyes:

Momentan sieht es also so aus:
Timer-0 = RC5e-Empfang (permanent)
Timer-1 = Senden der RC5e-Signale (kurzzeitig) und Dimmung aller LED`s
Timer-2 = DCF77 (Dank rn-wissen.de)


Bevor ich hier aber viel zu viel schreibe, stelle ich einfach mal den ersten Teil des Programmcodes ein.
Da das Programm sowieso zu "lang" ist um es am Stück hier einzustellen, werde ich es in logische Teile zerschneiden.... und die ein oder andere Zeile dann darüber noch verlieren. ;)
Eigentlich ist es aber mit ausreichend Kommentaren versehen!


Programm-Kopf:


CodeBox Bascom

' -------Rev. 5.1--------
' 57mm LED Uhr mit I2C Schnittstelle
' DCF77-Empfang zum Stellen der Uhr
' TSOP1736 zum Empfang von RC5e-Signalen
' SFH485 zum Senden von RC5e-Signalen
' LDR zur automatischen Helligkeitsumschaltung
' I2C Temperatursensor (DS1624)
' Testtaster für IR-Signale
' I2C-Erweiterungsanschluss, z.B. für LCD & Matrix-Tastatur, oder Module
' ATMega168 für das Programm, die Datentabellen, EEPROM-Werte
' PCF8577C zur 7-Segment Ansteuerung (32 Segmente)
' PCF8574A zur Wochentagsanzeige mit LED`s (7x LED)
'
' Timer0 = RC5-Empfang
' Timer1 = RC5e senden und Dimmer für die LED`s
' Timer2 = DCF77 (www.rn-wissen.de)

$regfile = "m168def.dat"
$crystal = 8000000 'interner Takt

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


'PB.0 = IR-Sendefreigabe
'PB.1 = OC1A = IR-Sender
'PB.2 = -frei-
'PB.3 = OC2 = Lx-Regler (LED-Dimmer) / MOSI
'PB.4 = MISO
'PB.5 = SCK
'PB.6 = -frei-, XTAL1
'PB.7 = -frei-, XTAL2
Ddrb = &B_00_1011 '1 ist Ausgang 0 ist Eingang
Portb = &B11_0100 'auf Hi oder Low setzen

'PC.5 = SCL
'PC.4 = SDA
'PC.3 = Relais-1
'PC.2 = Relais-2
'PC.1 = frei
'PC.0 = TSOP1736 IR-Empfänger
Ddrc = &B_00_11_00 '1 ist Ausgang 0 ist Eingang
Portc = &B11_00_11 'auf Hi oder Low setzen


'PD.0 = Eingangs-Pin für Test-Taster
'PD.1 = -frei-
'PD.2 = -frei-
'PD.3 = -frei-
'PD.4 = RC-Messung für Dimmer
'PD.5 = -frei-
'PD.6 = DCF77-Signal
'PD.7 = Test-Taster
Ddrd = &B_0000_0000 '1 ist Ausgang 0 ist Eingang
Portd = &B1111_1111 'auf Hi oder Low setzen


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

Config Scl = Portc.5 ' SCL Pin
Config Sda = Portc.4 ' SDA Pin

'Config Twi = 100000 '100k BUS
'Config I2cdelay = 1

I2cinit ' Setzen der Pin´s


'I2C-Adresse des PCF8577C = &B0111_0100 = &H74
Const 7seg = &H74 'PCF8577C I2C-Adresse
'I2C-Adresse des PCF8574A = &B0111_0000 = &H70
Const Leds = &H70 'PCF8574A I2C-Adresse


'------------------------------------------------------------------------------
' I2C Matrixtastatur (ISE, I2C-ServiceEinheit)
'------------------------------------------------------------------------------
$lib "key_i2c.lib" 'LIB für I2C-Matrixtastatur
$external _key_code 'Externe Routine

'*****WICHTIG !*************************************************
'* Die Funktion "_key_scan", in der LIB "key_i2c.lib", MUSS ab BASCOM Ver. 2.0.3.0 auf _key_code geändert werden!
'* Ab BASCOM 2.0.3.0 dürfen Funktionen und Variablen NICHT mehr den selben Namen besitzen!
'* Bitte folgendes in der LIB ändern=
'* [_Key_code]
'* _Key_code:
'* Das war es dann auch schon !
'*****WICHTIG !*************************************************
Const Pcf8574_kbd = &H72 'I2C-Adresse des PCF8574A
'!rcall _Key_Init 'Initialisierung bei INT0/1 aufrufen

Dim _key_scan As Byte 'Variable für Tastenausgabe
Dim Kb As String * 1 'Matrix-Zifferntaste

'------------------------------------------------------------------------------
' I2C LC-Display (I2C-Serviceeinheit)
'------------------------------------------------------------------------------
$lib "Lcd_i2c.lib" 'LIB für I2C-LCD
Const Pcf8574_lcd = &H76 'I2C-Adresse des LCD`s

Dim _lcd_e As Byte ' _lcd_e Variable für LCD-Zeilen
_lcd_e = 128 ' 16x2 Displey

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

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

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

Dim Ds1624wert As Single 'Temperaturwert
Dim Frac_wert As Single 'nur der Kommawert der Temperatur


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

Config Single = Scientific , Digits = 1 'nur eine Stelle nach dem Komma

'------------------------------------------------------------------------------
' Damit DCF77 mit Timer2 arbeitet (Timer1 = RC5send und Dimmer), wird
' DCF77.lib & DCF77_soft.bas
' von www.rn-wissen.de verwendet!!!
'------------------------------------------------------------------------------
'_dayofweek -> 1..7 (Mo..So)
'Dcfstatus -> Bit0: 15. Impuls erreicht Bit4: 58 Impulse empfangen
' Bit1: Minutenparität OK Bit5: Gültiges DCF77-Telegramm
' Bit2: Stundenparität OK Bit6: Softclock nach DCF gestellt
' Bit3: Parität OK Bit7: DCF-Decoder EIN
' ACHTUNG: Bits 0..5 NUR LESEN!!!
'Dcfflags -> Bit0 (R) : Rufbit für Alarmierung der PTB-Mitarbeiter
' Bit1 (A1): Ankündigung des Wechsels MEZ <-> MESZ
' Bit2 (Z1): \__ Z1/Z2: 10 = MESZ, 01 = MEZ
' Bit3 (Z2): /
' Bit4 (A2): Ankündigung einer Schaltsekunde
' Bit5 (S) : Startbit f. Zeitinformationen (immer 1)
'_sec, _min, _hour, _day, _month, _year sind die Variablen der Softclock
'******************************************************************************
' Besonderheiten für dcf77_soft.bas & dcf77.lib
'******************************************************************************
$include "dcf77_soft.bas"
'dcf77_soft-bas ist für 8MHz und Timer2 vorgesehen!
'****************************************************************************** ACHTUNG !
'Standard-Input PinD.3 wurde in der ******************************************* ACHTUNG !
'dcf77.lib und dcf77_soft.bas ************************************************* ACHTUNG !
'auf PIND.6 geändert !!! ****************************************************** ACHTUNG !
'****************************************************************************** ACHTUNG !

Dcfstatus.7 = 1 'DCF-Decoder EIN
Dim Sekunde As Byte 'Wird für manuelle Secitc-Prüfung verwendet

'Config Date = Dmy , Separator = . 'entfällt, da in dcf77_soft.bas enthalten !
Date$ = "01.01.07"
Time$ = "01:30:00"


'------------------------------------------------------------------------------
' RC5, Infrarot (Timer0 wird von RC5 belegt !!!)
'------------------------------------------------------------------------------
Config Rc5 = Pinc.0

Dim _iradr As Byte , _ircmd As Byte , _irtb As Byte 'RC5-Code empfangen
Dim Ir_adr As Byte , Ir_cmd As Byte , Togbit As Byte 'RC5-Code für Programm


'------------------------------------------------------------------------------
' LED-Dimmer (verwendet PB3/OC2)
'------------------------------------------------------------------------------
'Timer1 mit 60536 laden, ergibt bei einem Prescale von 8 dann 200Hz als Periode
'PortB.3 wird getoggelt.... also 100Hz ein/aus = 10ms je Signal (High/Low)

Config Timer1 = Timer , Prescale = 8
On Timer1 Dimmer
Enable Timer1

Stop Timer1
Const Ladewert = 60536
Dim Timer1_aktiv_flag As Bit

'------------------------------------------------------------------------------
' Globale Interrupts
'------------------------------------------------------------------------------

Enable Interrupts


'------------------------------------------------------------------------------
' Variablen
'------------------------------------------------------------------------------
'Zähler----------------------
Dim I As Byte 'Indexzähler
Dim I2 As Byte 'Indexzähler2
Dim I3 As Byte 'Indexzähler3
Dim Pz As Byte 'Pulszähler
Dim Temp As Byte 'Temporäres-Byte

'RC/Dimmer-------------------
Dim Grc As Byte 'GetRC-Wert als Byte (trotz Anweisung der Hilfe)

'Uhrzeit---------------------
Dim Sync_bit As Bit 'Synchronisierungsbit
Dim Sec_old As Byte 'Sicherung der letzten Sekunde
Dim Ziffer(4) As Byte 'Ziffernarray zur Anzeige
Dim Stelle(4) As Byte 'LED-Zifferstellen

Stelle(1) = &H00 'Ziffernstellen-Array füllen
Stelle(2) = &H02 'Ziffernstellen-Array füllen
Stelle(3) = &H04 'Ziffernstellen-Array füllen
Stelle(4) = &H06 'Ziffernstellen-Array füllen

'Konstanten------------------
Const Ja = 1
Const Nein = 0


'Alarm-----------------------
Dim Aziffer(4) As Byte 'Alarmzeiten bei Eingabe
Dim Alarmzeit1(2) As Byte 'Alarm-Einschaltzeit-1
Dim Alarmzeit2(2) As Byte 'Alarm-Einschaltzeit-2
Dim Alarmaus As Byte 'Alarm-Ausschaltzeit
Dim Schlummer As Word '600sek. = 10min. Schlummerzeit
Dim Alarm_byte As Byte 'Alarm-Steuerung
'Das Alarmbyte:
'Bit: 7 6 5 4 3 2 1 0
' | | | | | | | |
' | | | | | | | Alarm-1 aktiv
' | | | | | | Alarm-2 aktiv
' | | | | | Werktag/Wochenende
' | | | | STD Ein
' | | | STD Aus
' | | Alarm-Minute erreicht
' | Alarmsignal Quittung
' AUS manuell getätigt


'Flags-----------------------
Dim Puls As Bit 'Toggle-Signal von Sectic
Dim Pz_flag As Bit 'Pulszähler aktivieren
Dim Sekunden_flag As Bit 'Sekunden anzeigen
Dim Datum_flag As Bit 'Datum anzeigen
Dim Ds_flag As Bit 'DS1624-Flag
Dim Alarm_menue_flag As Bit 'Alarm_menü aufrufen
Dim Schlummer_flag As Bit 'Schlummerfunktion aktiv/inaktiv
Dim Tsop_flag As Bit 'RC5e Codes anzeigen



'EEPROM Variablen-----------------------
Dim A1_std As Eram Byte
Dim A1_min As Eram Byte
Dim A2_std As Eram Byte
Dim A2_min As Eram Byte
Dim A_byte As Eram Byte 'Alarm_byte ins Eeprom sichern




In den nächsten Beiträgen folgen dann die einzelnen Subroutinen......

Grüße,
Cassio
 
....weiter gehts....


System-Start und Hauptprogrammschleife:



CodeBox bascom


'******************************************************************************
' Programmcode
'******************************************************************************
'------------------------------------------------------------------------------
' System-Start
'------------------------------------------------------------------------------
'Control Register des PCF8577C:
'00000010
' |_Sektorbit 1
' |__Sektorbit 2
' |___Sektorbit 4
' |____A0
' |_____A1
' |______A2
' |_______Bank A (0) oder Bank B (1)
' Sektoren Bank A, ID = 0, 2, 4, 6
' Sektoren Bank B, ID = 1, 3, 5, 7
'|________Direct (0) oder Duplex (1) Mode

'Segmente = &B1000_0001 = &H81 = 129dez

'Datenfluss= I2C-Adresse + Control-Register + Bank-Byte(Segment)
'Beispiel = 01110100 + 00000110 + 10000001
'Bedeutet = &H74 + Bank A, Sektor 6 + Erste & letzte LED ein

' BANK 0:
' Sektor 0 | Sektor 2 | Sektor 4 | Sektor 6
' ---a--- ---a--- ---a--- ---a---
'| | | | | | | |
'| | | | | | | |
'f b f b f b f b
'| | | | | | | |
'| | | | | | | |
' ---g--- ---g--- ---g--- ---g---
'| | | | | | | |
'| | | | | | | |
'e c e c e c e c
'| | | | | | | |
'| | | | | | | |
' ---d--- ---d--- ---d--- ---d---
' DP DP DP DP


Gosub Reeprom

Portb.3 = 1

For I = 1 To 4
Ziffer(i) = &HFF
Next I
Gosub Anzeigen77
Gosub Anzeigen74

Cls
Locate 1 , 1
Lcd "57mm LED Wecker "
Locate 2 , 1
Lcd " mit I2C Bus "

Wait 1


Gosub Cls_led

Ds_flag = 0

'******************************************************************************
' Arbeitsschleife
'****************************************************************************** Do-Loop
Do

Gosub Matrix_scan 'I2C-Matrixtasten abfragen
If Kb = "D" Then Gosub Service

Gosub Get_ir 'IR-Code holen

Gosub Flags 'Flags auswerten


'aktive Alarme prüfen----------------------------------------------------------
Temp = Alarm_byte And &B00111000
Select Case Temp
Case 40 : Gosub Schalten 'Einschaltzeit erreicht
Case 48 : Gosub Schalten 'Ausschaltzeit erreicht
Case Else : Reset Alarm_byte.6 'Senden Quittung löschen
End Select



'Sync-Bit setzen oder rücksetzen-----------------------------------------------
'Das Sync_bit wird durch Blinken im Gleichtakt von Wochentag und Sekunden angezeigt
If _sec = 0 Then
If Dcfstatus.6 = Ja Then
Sync_bit = Ja 'Sync_bit setze
Else
Sync_bit = Nein 'Sync_bit löschen
End If
Else
End If

If _sec = 1 Then Reset Dcfstatus.6



'Testtaster und Flags auswerten------------------------------------------------
If Pind.7 = 0 Then
Gosub Test_taster
Else
If Alarm_menue_flag = Ja Then
Gosub Alarm_menue
Elseif Sekunden_flag = Ja Then
Gosub Sekunden
Elseif Datum_flag = Ja Then
Gosub Datum
Elseif Tsop_flag = Ja Then
Gosub Tsop
Elseif Ds_flag = Ja Then
Gosub Get_ds1624
Else
'Uhrzeit & Datum aktualisieren-------------------------------------------
If _sec <> Sec_old Then
Gosub Dcf_service 'DCF-Service auf I2C-LCD
Gosub Uhrzeit 'Uhrzeit und Wochentag anzeigen
Else
End If
End If
End If



'Dimmer aktivieren-------------------------------------------------------------
If Grc < 51 Then
Start Timer1 'Licht auf 50%
Timer1_aktiv_flag = Ja 'Aktiv? Dann als Hinweis für IR-senden
Else
Portb.3 = 1 'Dauerlicht
Stop Timer1
Timer1_aktiv_flag = Nein
End If


'Erzeugen der Sectic-----------------------------------------------------------
If Sekunde <> _sec Then
Sekunde = _sec
Gosub Sectic
Else
End If


Loop

 
....weiter gehts....


Nun folgen die Subroutinen.....


Die Sectic, die jede Sekune ausgeführt wird (aber manuell !):


CodeBox bascom

'******************************************************************************
' Subroutinen
'****************************************************************************** Sectic
Sectic:
Toggle Puls

If Pz_flag = Ja Then 'Pulszähler aktiv?
Incr Pz 'Pulse zählen
Else
Pz = 0 'Pulszähler zurücksetzen
End If


If Schlummer_flag = 1 Then
If Schlummer < 600 Then '10min. Schlummerzeit
Incr Schlummer
Else
Schlummer = 0
Reset Alarm_byte.6
Gosub Senden_ein
End If
Else
End If

Return




Get_ir zum Empfangen der IR-Signale:


CodeBox bascom

'------------------------------------------------------------------------------ Get_IR
Get_ir:
Getrc5(_iradr , _ircmd)
_irtb = _ircmd.7

If _iradr < 255 Then
If Togbit <> _irtb Then
Ir_adr = _iradr
Ir_cmd = _ircmd And &B0111_1111
Togbit = _irtb
Else
End If
Else
Ir_adr = 255
End If

Return




Flags zur Auswertung der IR-Flags:


CodeBox bascom

'------------------------------------------------------------------------------ Flags
Flags:

'IR-Code prüfen und ggf. Flag setzen
If Ir_adr = 00 Then
If Ir_cmd = 12 Then
If Schlummer_flag = Nein Then
If Alarm_byte.6 = 1 Then
Schlummer_flag = Ja 'Schlummerfunktion aktiv
Reset Alarm_byte.6 'Senden-Quittung löschen
Gosub Senden_aus
Else
End If
Else
Schlummer_flag = Nein 'Schlummerfunktion inaktiv
Set Alarm_byte.7 'Aus-Befehl übergehen
End If
Elseif Ir_cmd = 82 Then
Toggle Datum_flag
Toggle Pz_flag
Elseif Ir_cmd = 13 Then
Toggle Sekunden_flag
Toggle Pz_flag
Else
End If
Elseif Ir_adr = 05 Then
If Ir_cmd = 82 Then
Alarm_menue_flag = Ja
Elseif Ir_cmd = 55 Then
Tsop_flag = Ja
Else
End If
Else
End If

'Temperatur flag setzen oder Rücksetzen----------------------------------------
Select Case _sec
Case 10 : Ds_flag = Ja
Case 30 : Ds_flag = Ja
Case 50 : Ds_flag = Ja
Case Else : Ds_flag = Nein
End Select


Return
 
....weiter gehst.....

Dimmer ist zum halbieren der Helligkeit aller LED`s


CodeBox bascom

'------------------------------------------------------------------------------ Dimmer
Dimmer:
Toggle Portb.3 'Port für LED-Transistor
Timer1 = Ladewert 'Reloadwert

Return




Alarm_menue zum Auswählen der beiden Alarmzeiten


CodeBox bascom

'------------------------------------------------------------------------------ Alarm_menue
Alarm_menue:
Locate 1 , 1
Lcd "Alarmenue "
Locate 2 , 1
Lcd " "

Aziffer(1) = 00 'Ziffern-Zwischenspeicher
Aziffer(2) = 00 'Ziffern-Zwischenspeicher
Aziffer(3) = 00 'Ziffern-Zwischenspeicher
Aziffer(4) = 00 'Ziffern-Zwischenspeicher

Ziffer(1) = 11 'A
Ziffer(2) = 21 'L
Ziffer(3) = 37 '_
Ziffer(4) = 37 '_

Gosub Umsetzen 'LED-Ansteuerung laden
Gosub Anzeigen77 'LED-Ausgabe


Do
Gosub Get_ir

If Ir_adr = 05 Then
Select Case Ir_cmd
Case 1 : Gosub Al1
Case 2 : Gosub Al2
Case 82 : Exit Do
End Select
Else
End If

Loop

Alarm_menue_flag = Nein

Return




AL1 dient zum Einstellen der 1.Alarmzeit (Werktags),
mit Plausibilitätsprüfung der Ziffern:


CodeBox bascom

'------------------------------------------------------------------------------ Alarm 1
Al1:
Locate 2 , 1
Lcd "Alarm 1 "

Ziffer(1) = &H1F 'LED`s Mo-Fr leuchten
Gosub Anzeigen74

Ziffer(1) = 11 'A
Ziffer(2) = 21 'L
Ziffer(3) = 37 '_
Ziffer(4) = 01 '1

Gosub Umsetzen 'LED-Ansteuerung laden
Gosub Anzeigen77 'LED-Ausgabe

Wait 1


'---------------------------------------
Ziffer(3) = Makebcd(alarmzeit1(2)) 'Minuten ins BCD-Format
Ziffer(4) = Ziffer(3) And &B0000_1111 'nur die ersten 4 Bits
Aziffer(4) = Ziffer(4)
Shift Ziffer(3) , Right , 4 'hohe 4 Bits zu low schieben
Aziffer(3) = Ziffer(3)

Ziffer(1) = Makebcd(alarmzeit1(1)) 'Stunden ins BCD-Format
Ziffer(2) = Ziffer(1) And &B0000_1111 'nur die ersten 4 Bits
Aziffer(2) = Ziffer(2)
Shift Ziffer(1) , Right , 4 'hohe 4 Bits zu low schieben
Aziffer(1) = Ziffer(1)

Gosub Umsetzen 'LED-Ansteuerung laden
Gosub Anzeigen77 'LED-Ausgabe



I3 = 1 'Stellenzähler
Do

Gosub Get_ir

If Ir_adr = 05 Then
If Ir_cmd = 82 Then 'Abbruch
I3 = 6
Goto Weiter1
Elseif Ir_cmd = 15 Then
Gosub A1save 'Alarmzeit speichern
Gosub A1on 'Alarm aktivieren?
I3 = 6
Goto Weiter1
Elseif I3 = 1 Then 'Zehner-Stunde
If Ir_cmd < 3 Then
Aziffer(1) = Ir_cmd 'erste Ziffer
Aziffer(2) = 37 '_
Aziffer(3) = 37 '_
Aziffer(4) = 37 '_
Incr I3
Else
End If
Elseif I3 = 2 Then 'Einer-Stunde
If Aziffer(1) = 2 Then
If Ir_cmd < 4 Then
Aziffer(2) = Ir_cmd
Incr I3
Else
End If
Else
Aziffer(2) = Ir_cmd
Incr I3
End If
Elseif I3 = 3 Then 'Zehner_Minute
If Ir_cmd < 6 Then
Aziffer(3) = Ir_cmd
Incr I3
Else
End If
Elseif I3 = 4 Then 'Einer-Minute
Aziffer(4) = Ir_cmd
Incr I3
Elseif I3 = 5 Then
NOP 'Anzeigenschleife
Else
End If
Else
Goto Weiter1
End If

Locate 1 , 1
Lcd "A1= " ; Aziffer(1) ; " " ; Aziffer(2) ; " " ; Aziffer(3) ; " " ; Aziffer(4) ; " "
Locate 2 , 1
Lcd "Z" ; Ziffer(1) ; " " ; Ziffer(2) ; " " ; Ziffer(3) ; " " ; Ziffer(4) ; " I=" ; I3

For I = 1 To 4
Ziffer(i) = Aziffer(i)
Next I

Gosub Umsetzen
Gosub Anzeigen77


Weiter1:
NOP

Loop Until I3 = 6

Ziffer(1) = &H00 'alle Wochentag-LED`S aus
Gosub Anzeigen74


Ziffer(1) = 11 'A
Ziffer(2) = 21 'L
Ziffer(3) = 37 '_
Ziffer(4) = 37 '_

Gosub Umsetzen 'LED-Ansteuerung laden
Gosub Anzeigen77 'LED-Ausgabe


Return




A1save speichert den eingestellten Alarm:


CodeBox bascom

'------------------------------------------------------------------------------ Alarm 1 Save
A1save:

Shift Aziffer(1) , Left , 4
Alarmzeit1(1) = Aziffer(1) + Aziffer(2) 'BCD-Stunden
Alarmzeit1(1) = Makedec(alarmzeit1(1)) 'DEC-Stunden

Shift Aziffer(3) , Left , 4
Alarmzeit1(2) = Aziffer(3) + Aziffer(4) 'BCD-Stunden
Alarmzeit1(2) = Makedec(alarmzeit1(2)) 'DEC-Stunden

Gosub Seeprom1

Ziffer(1) = 24 'S
Ziffer(2) = 11 'A
Ziffer(3) = 25 'V
Ziffer(4) = 15 'E

Gosub Umsetzen
Gosub Anzeigen77

Wait 1


Return




A1on dient zum aktivieren/deaktivieren des Alarms:


CodeBox bascom

'------------------------------------------------------------------------------ Alarm 1 On
A1on:
Ziffer(1) = 11 'A
Ziffer(2) = 21 'L
Ziffer(3) = 34 'o
Ziffer(4) = 33 'n

Gosub Umsetzen
Gosub Anzeigen77


Do
Gosub Get_ir

If Ir_adr = 05 Then
If Ir_cmd = 01 Then
Set Alarm_byte.0
Ziffer(1) = 10 'leer
Ziffer(2) = 20 'J
Ziffer(3) = 11 'A
Ziffer(4) = 10 'leer
Exit Do
Elseif Ir_cmd = 00 Then
Reset Alarm_byte.0
Ziffer(1) = 33 'n
Ziffer(2) = 15 'E
Ziffer(3) = 19 'I
Ziffer(4) = 33 'n
Exit Do
Else
End If
Else
End If

Loop

Gosub Umsetzen
Gosub Anzeigen77

Wait 1

Return
 
....weiter gehts....


AL2 wird zum Einstellen der 2.Alarmzeit (Wochenende) verwendet,
auch hier mit Plausibilitätsprüfung bei Eingabe der Ziffern:


CodeBox bascom

'------------------------------------------------------------------------------ Alarm 2
Al2:
Locate 2 , 1
Lcd "Alarm 2 "

Ziffer(1) = &H60 'LED`s Sa+So leuchten
Gosub Anzeigen74

Ziffer(1) = 11 'A
Ziffer(2) = 21 'L
Ziffer(3) = 37 '_
Ziffer(4) = 02 '2

Gosub Umsetzen 'LED-Ansteuerung laden
Gosub Anzeigen77 'LED-Ausgabe

Wait 1


'---------------------------------------
Ziffer(3) = Makebcd(alarmzeit2(2)) 'Minuten ins BCD-Format
Ziffer(4) = Ziffer(3) And &B0000_1111 'nur die ersten 4 Bits
Aziffer(4) = Ziffer(4)
Shift Ziffer(3) , Right , 4 'hohe 4 Bits zu low schieben
Aziffer(3) = Ziffer(3)

Ziffer(1) = Makebcd(alarmzeit2(1)) 'Stunden ins BCD-Format
Ziffer(2) = Ziffer(1) And &B0000_1111 'nur die ersten 4 Bits
Aziffer(2) = Ziffer(2)
Shift Ziffer(1) , Right , 4 'hohe 4 Bits zu low schieben
Aziffer(1) = Ziffer(1)

Gosub Umsetzen 'LED-Ansteuerung laden
Gosub Anzeigen77 'LED-Ausgabe



I3 = 1 'Stellenzähler
Do

Gosub Get_ir

If Ir_adr = 05 Then
If Ir_cmd = 82 Then 'Abbruch
I3 = 6
Goto Weiter2
Elseif Ir_cmd = 15 Then
Gosub A2save 'Alarmzeit speichern
Gosub A2on 'Alarm aktivieren?
I3 = 6
Goto Weiter2
Elseif I3 = 1 Then 'Zehner-Stunde
If Ir_cmd < 3 Then
Aziffer(1) = Ir_cmd 'erste Ziffer
Aziffer(2) = 37 '_
Aziffer(3) = 37 '_
Aziffer(4) = 37 '_
Incr I3
Else
End If
Elseif I3 = 2 Then 'Einer-Stunde
If Aziffer(1) = 2 Then
If Ir_cmd < 4 Then
Aziffer(2) = Ir_cmd
Incr I3
Else
End If
Else
Aziffer(2) = Ir_cmd
Incr I3
End If
Elseif I3 = 3 Then 'Zehner_Minute
If Ir_cmd < 6 Then
Aziffer(3) = Ir_cmd
Incr I3
Else
End If
Elseif I3 = 4 Then 'Einer-Minute
Aziffer(4) = Ir_cmd
Incr I3
Elseif I3 = 5 Then
NOP 'Anzeigenschleife
Else
End If
Else
Goto Weiter2
End If

Locate 1 , 1
Lcd "A2= " ; Aziffer(1) ; " " ; Aziffer(2) ; " " ; Aziffer(3) ; " " ; Aziffer(4) ; " "
Locate 2 , 1
Lcd "Z" ; Ziffer(1) ; " " ; Ziffer(2) ; " " ; Ziffer(3) ; " " ; Ziffer(4) ; " I=" ; I3

For I = 1 To 4
Ziffer(i) = Aziffer(i)
Next I

Gosub Umsetzen
Gosub Anzeigen77


Weiter2:
NOP

Loop Until I3 = 6

Ziffer(1) = &H00 'alle Wochentag-LED`S aus
Gosub Anzeigen74


Ziffer(1) = 11 'A
Ziffer(2) = 21 'L
Ziffer(3) = 37 '_
Ziffer(4) = 37 '_

Gosub Umsetzen 'LED-Ansteuerung laden
Gosub Anzeigen77 'LED-Ausgabe


Return




A2save dient wieder zum Speichern der eingestellten Alarmzeit:


CodeBox bascom

'------------------------------------------------------------------------------ Alarm 2 Save
A2save:

Shift Aziffer(1) , Left , 4
Alarmzeit2(1) = Aziffer(1) + Aziffer(2) 'BCD-Stunden
Alarmzeit2(1) = Makedec(alarmzeit2(1)) 'DEC-Stunden

Shift Aziffer(3) , Left , 4
Alarmzeit2(2) = Aziffer(3) + Aziffer(4) 'BCD-Stunden
Alarmzeit2(2) = Makedec(alarmzeit2(2)) 'DEC-Stunden

Gosub Seeprom2

Ziffer(1) = 24 'S
Ziffer(2) = 11 'A
Ziffer(3) = 25 'V
Ziffer(4) = 15 'E

Gosub Umsetzen
Gosub Anzeigen77

Wait 1


Return




A2on wird wieder zum Aktivieren/Deaktivieren des Alarms genutzt:


CodeBox bascom

'------------------------------------------------------------------------------ Alarm 2 On
A2on:
Ziffer(1) = 11 'A
Ziffer(2) = 21 'L
Ziffer(3) = 34 'o
Ziffer(4) = 33 'n

Gosub Umsetzen
Gosub Anzeigen77


Do
Gosub Get_ir

If Ir_adr = 05 Then
If Ir_cmd = 01 Then
Set Alarm_byte.1
Ziffer(1) = 10 'leer
Ziffer(2) = 20 'J
Ziffer(3) = 11 'A
Ziffer(4) = 10 'leer
Exit Do
Elseif Ir_cmd = 00 Then
Reset Alarm_byte.1
Ziffer(1) = 33 'n
Ziffer(2) = 15 'E
Ziffer(3) = 19 'I
Ziffer(4) = 33 'n
Exit Do
Else
End If
Else
End If

Loop

Gosub Umsetzen
Gosub Anzeigen77

Wait 1

Return
 
...weiter gehts....


Schalten dient zum Überprüfen der "Alarme" (IR-Signale):


CodeBox bascom

'------------------------------------------------------------------------------ Schaltzeiten
Schalten:
'Bit: 7 6 5 4 3 2 1 0
' | | | | | | | |
' | | | | | | | Alarm-1 aktiv
' | | | | | | Alarm-2 aktiv
' | | | | | Werktag/Wochenende
' | | | | STD-Ein erreicht
' | | | STD-Aus erreicht
' | | MIN erreicht
' | Alarmsignal Quittung
' AUS manuell getätigt

Temp = Alarm_byte And &B11111101 'relevante Nibbel betrachten
If Temp = &B00101001 Then 'Nibbel auswerten
Gosub Senden_ein
Elseif Temp = &B00110001 Then 'Nibbel auswerten
Gosub Senden_aus
Else
End If


Temp = Alarm_byte And &B11111110 'relevante Nibbel betrachten
If Temp = &B00101110 Then 'Nibbel auswerten
Gosub Senden_ein
Elseif Temp = &B00110110 Then 'Nibbel auswerten
Gosub Senden_aus
Else
End If


Return




Senden_ein sendet das Einschaltsignal für das Radiomodul:


CodeBox bascom

'------------------------------------------------------------------------------ Senden EIN
Senden_ein:

If Timer1_aktiv_flag = 1 Then Stop Timer1

'Togbit anpassen (128 oder 192)
' Tb = &B10000000 = 128 = Extended-Code, Togbit 0
' Tb = &B11000000 = 192 = Normal-Code, Togbit 0

' Tb = &B10100000 = 160 = Extended-Code, Togbit 32
' Tb = &B11100000 = 224 = Normal-Code, Togbit 32

If Alarm_byte.6 = 0 Then
Locate 1 , 1
Lcd "Alarmb.=" ; Alarm_byte
Locate 2 , 1
Lcd "SendenEIN 03/113"
Portb.0 = 1 'Sendefreigabe-Transistor
For I = 1 To 2
' Rc5sendext Togbit , Ir_adr , Ir_cmd 'IR-Code senden
' Signal EIN (03/113)
Rc5sendext &H80 , &H03 , &H71 'IR-Code senden
Next I
Portb.0 = 0 'Sendefreigabe-Transistor

Set Alarm_byte.6
Else
End If


If Timer1_aktiv_flag = 1 Then Start Timer1

Return




Senden_aus sendet das Signal zum Ausschalten des TV`s:


CodeBox bascom

'------------------------------------------------------------------------------ Senden AUS
Senden_aus:

If Timer1_aktiv_flag = 1 Then Stop Timer1

'Togbit anpassen (128 oder 192)
' Tb = &B10000000 = 128 = Extended-Code, Togbit 0
' Tb = &B11000000 = 192 = Normal-Code, Togbit 0

' Tb = &B10100000 = 160 = Extended-Code, Togbit 32
' Tb = &B11100000 = 224 = Normal-Code, Togbit 32

If Alarm_byte.6 = 0 Then
Locate 1 , 1
Lcd "Alarmb.=" ; Alarm_byte
Locate 2 , 1
Lcd "Senden-AUS 00/12"
Portb.0 = 1 'Sendefreigabe-Transistor
For I = 1 To 6
' Signal AUS (00/12)
Rc5sendext &HC0 , &H00 , &H0C 'IR-Code senden
Next I
Portb.0 = 0 'Sendefreigabe-Transistor

Set Alarm_byte.6
Else
End If


If Timer1_aktiv_flag = 1 Then Start Timer1

Return
 
...weiter gehts...


TSOP ist ein Service, um RC5e-Codes anzuzeigen:


CodeBox bascom

'------------------------------------------------------------------------------ TSOP, IR-Kontrolle
Tsop:
Set Pz_flag

Ziffer(1) = &H08
Gosub Anzeigen74

Ziffer(1) = 35
Ziffer(2) = 29
Ziffer(3) = 05
Ziffer(4) = 15

Gosub Umsetzen 'LED-Ansteuerung laden
Gosub Anzeigen77 'LED-Ausgabe


Waitms 50


Do

Gosub Get_ir

If Ir_adr < 255 Then
If Ir_cmd > 99 Then
Ziffer(1) = &H78
Gosub Anzeigen74
Ir_cmd = Ir_cmd - 100
Else
Ziffer(1) = &H00
Gosub Anzeigen74
End If


Ziffer(3) = Makebcd(ir_cmd) 'Minuten ins BCD-Format
Ziffer(4) = Ziffer(3) And &B0000_1111 'nur die ersten 4 Bits
Shift Ziffer(3) , Right , 4 'hohe 4 Bits zu low schieben

Ziffer(1) = Makebcd(ir_adr) 'Stunden ins BCD-Format
Ziffer(2) = Ziffer(1) And &B0000_1111 'nur die ersten 4 Bits
Shift Ziffer(1) , Right , 4 'hohe 4 Bits zu low schieben


Gosub Umsetzen 'LED-Ansteuerung laden
Ziffer(2) = Ziffer(2) + 1 'DP hinzufügen
Gosub Anzeigen77 'LED-Ausgabe

Waitms 100

If Ir_adr = 05 Then
If Ir_cmd = 50 Then Exit Do
Else
End If

If Pz = 59 Then Exit Do

Else
End If

Loop

Reset Pz_flag
Tsop_flag = Nein

Return




Dcf-Service ist nur ein Service zum Anzeigen der DCF-Bits am I2C-LCD:


CodeBox bascom

'------------------------------------------------------------------------------ DCF-Service
Dcf_service:
Locate 1 , 1
Lcd "0=" ; Dcfstatus.0 ; " 1=" ; Dcfstatus.1 ; " 2=" ; Dcfstatus.2 ; " 3=" ; Dcfstatus.3

Locate 2 , 1
Lcd "4=" ; Dcfstatus.4 ; " 5=" ; Dcfstatus.5 ; " 6=" ; Dcfstatus.6 ; " RC" ; Grc

Return




Uhrzeit ermittelt die Uhrzeit und den Wochentag und zeigt diese an:


CodeBox bascom

'------------------------------------------------------------------------------ Uhrzeit
Uhrzeit:
Sec_old = _sec

If Alarmzeit1(1) = _hour Then 'Stunde der 1.Alarmzeit prüfen
Reset Alarm_byte.4
Set Alarm_byte.3
Reset Alarm_byte.7
Alarmaus = Alarmzeit1(1) + 1 'Ausschaltzeit errechnen
If Alarmaus = 24 Then Alarmaus = 0 'von 24Uhr auf 0Uhr
Elseif Alarmzeit2(1) = _hour Then 'Stunde der 2.Alarmzeit prüfen
Reset Alarm_byte.4
Set Alarm_byte.3
Reset Alarm_byte.7
Alarmaus = Alarmzeit2(1) + 1 'Ausschaltzeit errechnen
If Alarmaus = 24 Then Alarmaus = 0 'von 24Uhr auf 0Uhr
Elseif Alarmaus = _hour Then
Set Alarm_byte.4
Reset Alarm_byte.3
Else
Reset Alarm_byte.3
Reset Alarm_byte.4
End If


If Alarmzeit1(2) = _min Then 'Minuten der Alarmzeiten prüfen
Set Alarm_byte.5
Elseif Alarmzeit2(2) = _min Then
Set Alarm_byte.5
Else
Reset Alarm_byte.5
End If


Ziffer(1) = Makebcd(_hour) 'Stunden ins BCD-Format
Ziffer(3) = Makebcd(_min) 'Minuten ins BCD-Format

Ziffer(2) = Ziffer(1) And &B0000_1111 'nur die ersten 4 Bits
Ziffer(4) = Ziffer(3) And &B0000_1111 'nur die ersten 4 Bits

Shift Ziffer(1) , Right , 4 'hohe 4 Bits zu low schieben
Shift Ziffer(3) , Right , 4 'hohe 4 Bits zu low schieben

If Ziffer(1) = 0 Then 'auf Null Stunden prüfen
Ziffer(1) = 10 'wenn Stunde = 0 dann Leerzeichen
Else
End If


Gosub Umsetzen 'LED-Ansteuerung laden



'Sekundenpunkt blinken lassen--------------------
If Puls = 0 Then
Ziffer(2) = Ziffer(2) + 1 'DP an zweiter Stelle bei Puls 0
Else
End If


'Aktive Alarme anzeigen--------------------------
If Alarm_byte.2 = 0 Then
If Alarm_byte.0 = 1 Then 'Werktagalarm aktiv?
Ziffer(4) = Ziffer(4) + 1 'Alarm aktiv Punkt hinter Stelle 4 anzeigen
Else
End If
Else
If Alarm_byte.1 = 1 Then 'Wochenendalarm aktiv?
Ziffer(4) = Ziffer(4) + 1 'Alarm aktiv Punkt hinter Stelle 4 anzeigen
Else
End If
End If


Gosub Anzeigen77



'------------------------------------------------------------------------------ Wochentag
'Die Wochentag-LED blinkt bei Puls = 0, wenn der Sync erfolgt ist (Gleichtakt mit DP)!
'War der Sync NICHT erfolgreich, blinkt Wochentag-LED und DP im Gegentakt!
If Sync_bit = 1 Then
If Puls = 0 Then 'Gleichgtakt bei Sync
If Schlummer_flag = 0 Then
Ziffer(1) = &HFF 'alle LED`s an
Else
Ziffer(1) = &H00 'alle LED`s aus
End If
Else
Ziffer(1) = Dayofweek() 'Wochentag ermitteln
If Ziffer(1) > 4 Then
Set Alarm_byte.2 'Wochenende vermerken
Else
Reset Alarm_byte.2 'Werktag vermerken
End If
Ziffer(1) = Lookup(ziffer(1) , Wochentag_led) 'LED-Ansteuerung laden
End If
Else
If Puls = 0 Then 'Gegentakt bei fehlendem Sync
Ziffer(1) = Dayofweek() 'Wochentag ermitteln
If Ziffer(1) > 4 Then
Set Alarm_byte.2 'Wochenende vermerken
Else
Reset Alarm_byte.2 'Werktag vermerken
End If
Ziffer(1) = Lookup(ziffer(1) , Wochentag_led)
Else
If Schlummer_flag = 0 Then
Ziffer(1) = &HFF 'alle LED`s an
Else
Ziffer(1) = &H00 'alle LED`s aus
End If
End If
End If

Gosub Anzeigen74

Return
 
...weiter gehts...


Datum zeigt Tag/Monat und das Jahr im Sekundenwechsel an:


CodeBox bascom

'------------------------------------------------------------------------------ Datum anzeigen
Datum:
If Pz = 59 Then
Reset Pz_flag
Datum_flag = Nein 'Nach 60 Sekunden automatisch zurück
Else
End If

If Puls = 0 Then
Ziffer(1) = Makebcd(_day) 'Tag ins BCD-Format
Ziffer(3) = Makebcd(_month) 'Monat ins BCD-Format

Ziffer(2) = Ziffer(1) And &B0000_1111 'nur die ersten 4 Bits
Ziffer(4) = Ziffer(3) And &B0000_1111 'nur die ersten 4 Bits

Shift Ziffer(1) , Right , 4 'hohe 4 Bits zu low schieben
Shift Ziffer(3) , Right , 4 'hohe 4 Bits zu low schieben
Else
Ziffer(1) = 02 '1.Stelle = 2
Ziffer(2) = 00 '2.Stelle = 0

Ziffer(3) = Makebcd(_year) 'Jahr ins BCD-Format
Ziffer(4) = Ziffer(3) And &B0000_1111 'nur die ersten 4 Bits
Shift Ziffer(3) , Right , 4 'hohe 4 Bits zu low schieben
End If

Gosub Umsetzen 'LED-Ansteuerung laden

If Puls = 0 Then
Ziffer(2) = Ziffer(2) + 1 'DP an zweiter Stelle bei Puls 0
Else
End If

Gosub Anzeigen77

Return




Sekunden zeigt nur die Sekunden an (mit blinkenden Sekundenpunkt):


CodeBox bascom

'------------------------------------------------------------------------------ Sekunden
Sekunden:
If Pz = 59 Then
Reset Pz_flag
Sekunden_flag = Nein 'Nach 60 Sekunden automatisch zurück
Else
End If

Ziffer(1) = 10
Ziffer(2) = 10

Ziffer(3) = Makebcd(_sec) 'Sekunden ins BCD-Format
Ziffer(4) = Ziffer(3) And &B0000_1111 'nur die ersten 4 Bits
Shift Ziffer(3) , Right , 4 'hohe 4 Bits zu low schieben



Gosub Umsetzen 'LED-Ansteuerung laden

If Puls = 0 Then
Ziffer(2) = Ziffer(2) + 1 'DP an zweiter Stelle bei Puls 0
Else
End If

Gosub Anzeigen77

Return




Get_ds1624 ermittelt die aktuelle Temperatur und den RC-Wert für den Dimmer:


CodeBox bascom

'------------------------------------------------------------------------------ Get DS1624
Get_ds1624:

Ds_flag = 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


'-------------Ausgabe der Temperatur----------------
Locate 1 , 1
Lcd "Temp=" ; Ds1624wert ; " "


Ziffer(1) = Int(ds1624wert) 'Temperaturwert vor Komma
Ziffer(1) = Makebcd(ziffer(1)) 'BCD Format erstellen
Ziffer(2) = Ziffer(1) And &B0000_1111 'zweite Ziffer ermitteln
Shift Ziffer(1) , Right , 4 'erste Ziffer ermitteln

Frac_wert = Frac(ds1624wert) 'Kommastelle ermitteln
Frac_wert = Frac_wert * 10 'Werterhöhung für Rundung
Ziffer(3) = Round(frac_wert) 'gerundete dritte Ziffer
If Ziffer(3) > 9 Then Ziffer(3) = 9 'Rundung ab 9,6 auf 10 vermeiden
Ziffer(3) = Makebcd(ziffer(3)) 'BCD Format erstellen

Ziffer(4) = 29 'kleines C anhängen


Gosub Umsetzen 'LED-Ansteuerung laden
Ziffer(2) = Ziffer(2) + 1 'DP hinzufügen
Gosub Anzeigen77 'LED-Ausgabe


'Grc bei Dunkelheit < 40
'Grc bei Dämmerung < 50
'Grc bei Hellligkeit >60
For I = 0 To 10
Grc = Getrc(pind , 4) 'aktuellen RC-Wert holen
Waitms 1
Next I

Locate 1 , 11
Lcd "RC=" ; Grc ; " " 'Grc-Wert anzeigen
Locate 2 , 1
Lcd "Alarmbt." ; Bin(alarm_byte) 'Grc-Wert anzeigen


For I = 0 To 254 'Anzeigepause
Gosub Get_ir 'auf IR reagieren
If Ir_adr < 255 Then
Gosub Flags 'IR-Eingabe auswerten
I = 254
Else
End If
Next I

Return
 
...weiter gehts...


Umsetzen setzt die Bytes in "Ziffern" für die 7-Segmente um:


CodeBox bascom

'------------------------------------------------------------------------------ Umsetzen
Umsetzen:
For I = 1 To 4 'Binärwerte in Anzeigewerte wechseln
Ziffer(i) = Lookup(ziffer(i) , Led_daten)
Next I

Return




Anzeigen77 schiebt die Daten zum PCF8577C:


CodeBox bascom

'------------------------------------------------------------------------------ Anzeigen77
Anzeigen77:

For I = 1 To 4
I2cstart
I2cwbyte 7seg
I2cwbyte Stelle(i) 'Ziffernstelle (0,2,4,6)
I2cwbyte Ziffer(i) 'Ziffer senden
I2cstop
Next I

Return




Anzeigen74 schiebt die Daten zum PCF8574A:


CodeBox bascom

'------------------------------------------------------------------------------ Anzeigen74
Anzeigen74:

I2cstart
I2cwbyte Leds 'PCF8574A Adresse senden
I2cwbyte Ziffer(1) 'LED-Byte
I2cstop

Return




Cls_led lässt alle Anzeigen dunkel werden:


CodeBox bascom

'------------------------------------------------------------------------------ CLS_LEDs
Cls_led:

Ziffer(1) = &H00
Ziffer(2) = &H00
Ziffer(3) = &H00
Ziffer(4) = &H00

Gosub Anzeigen77
Gosub Anzeigen74

Return




Matrix_scan dient zum Auslesen der Tasten an der I2C-Matrix-Tastatur:


CodeBox bascom

'------------------------------------------------------------------------------ Matrix_Scan
Matrix_scan:

!rcall _key_code 'externe Routine aufrufen
If _key_scan > 0 Then
Kb = Lookupstr(_key_scan , Matrix_wert) 'Wert vom Key_scan der Tastatur anpassen
Else
End If

Return




Getdatetime, Setdate, Settime verlangt die DCF77.lib und DCF77_soft.bas von rn-wissen.de:


CodeBox bascom

'******************************************************************************
' Notwendig für DCF77.lib & DCF77_soft.bas
'******************************************************************************
Getdatetime: 'Nicht genutzt!
Setdate:
Settime:
Return
'---------------------- Interrupt Routine DCF77 ----------------------------




Tim2_isr wird für DCF77 benötigt:


CodeBox bascom

Tim2_isr:
Timer2 = Startwert
Call Dcf77_soft
Return
'******************************************************************************
' Notwendig für DCF77.lib & DCF77_soft.bas
'******************************************************************************
 
...weiter gehts mit den letzten Teilen...


Service ist eine reine Serviceroutine mit Funktionstests:


CodeBox bascom

'******************************************************************************
' Testroutinen via Service
'****************************************************************************** Service
Service:

Gosub Cls_led
!rcall _init_lcd
Waitms 100

Locate 1 , 1
Lcd "Testmenue wahl.."
Locate 2 , 1
Lcd "1=113 2=17 3=LED"

While _key_scan > 0 'Keine Teste mehr gedrückt? Sonst warten!
Gosub Matrix_scan
Wend

While _key_scan = 0 'Warten bis eine Taste gedrückt wurde
Gosub Matrix_scan
Wend

If Kb = "1" Then
Locate 1 , 1
Lcd " TEST-Alarm !!! "
Locate 2 , 1
Lcd "Sende 03/113...."
Portb.0 = 1 'Sendefreigabe-Transistor
For I = 1 To 6
Rc5sendext &H80 , &H03 , &H71 'IR-Code 03/113 senden
Next I
Portb.0 = 0 'Sendefreigabe-Transistor
Wait 7

Locate 1 , 1
Lcd " TEST-Alarm !!! "
Locate 2 , 1
Lcd "Sende 00/12 ENDE"
Portb.0 = 1 'Sendefreigabe-Transistor
For I = 1 To 6
Rc5sendext &HC0 , &H00 , &H0C 'IR-Code 00/12 senden
Next I
Portb.0 = 0 'Sendefreigabe-Transistor
Wait 3

Elseif Kb = "2" Then
Locate 1 , 1
Lcd " TEST-Alarm !!! "
Locate 2 , 1
Lcd "Sende 17/63....."
Portb.0 = 1 'Sendefreigabe-Transistor
For I = 1 To 6
Rc5sendext &HC0 , &H11 , &H3F 'IR-Code 03/113 senden
Next I
Portb.0 = 0 'Sendefreigabe-Transistor
Wait 7

Locate 1 , 1
Lcd " TEST-Alarm !!! "
Locate 2 , 1
Lcd "Sende 16/61 ENDE"
Portb.0 = 1 'Sendefreigabe-Transistor
For I = 1 To 6
Rc5sendext &HC0 , &H10 , &H3D 'IR-Code 00/12 senden
Next I
Portb.0 = 0 'Sendefreigabe-Transistor
Wait 3

Elseif Kb = "3" Then
Locate 1 , 1
Lcd " TEST-Routine ! "
Locate 2 , 1
Lcd "Zeichenvorrat..."

Ziffer(1) = &B1100011
Gosub Anzeigen74

Waitms 500


I3 = 0
For I2 = 0 To 40
Incr I3
Ziffer(i3) = Lookup(i2 , Led_daten)
Gosub Anzeigen77
Waitms 500
If I3 = 4 Then I3 = 0
Next I2


Waitms 500
Gosub Cls_led
Wait 1

Else
Locate 1 , 1
Lcd "Testmenue......."
Locate 2 , 1
Lcd "beendet ! "
End If

While _key_scan > 0 'Keine Teste mehr gedrückt? Sonst warten!
Gosub Matrix_scan
Wend

Kb = "Z"
Waitms 500

Return




Test_taster dient als Service zum Testen der Ein- & Ausschaltsignale:


CodeBox bascom


'******************************************************************************
' Testroutinen via Taster
'****************************************************************************** Test_Taster
Test_taster:
Locate 1 , 1
Lcd " TEST-Alarm !!! "
Locate 2 , 1
Lcd "Sende 03/113...."
Portb.0 = 1 'Sendefreigabe-Transistor
For I = 1 To 6
Rc5sendext &H80 , &H03 , &H71 'IR-Code 03/113 senden
Next I
Portb.0 = 0 'Sendefreigabe-Transistor
Wait 7

Locate 1 , 1
Lcd " TEST-Alarm !!! "
Locate 2 , 1
Lcd "Sende 00/12 ENDE"
Portb.0 = 1 'Sendefreigabe-Transistor
For I = 1 To 6
Rc5sendext &H80 , &H00 , &H0C 'IR-Code 00/12 senden
Next I
Portb.0 = 0 'Sendefreigabe-Transistor
Wait 3

Return




Reeprom liest die Daten aus dem EEPROM und übergibt sie Systemvariablen:


CodeBox bascom

'******************************************************************************
' EEPROM Werte lesen und speichern
'****************************************************************************** EEPROM Werte

'-----------------------------
Reeprom: 'Read EEPROM
Alarmzeit1(1) = A1_std
Alarmzeit1(2) = A1_min
Alarmzeit2(1) = A2_std
Alarmzeit2(2) = A2_min
Alarm_byte = A_byte
Return





Seeprom1 speichert die neue Alarmzeit-1 in den EEPROM-Variablen:


CodeBox bascom

'-----------------------------
Seeprom1: 'Save EEPROM Alarm-1
A1_std = Alarmzeit1(1)
A1_min = Alarmzeit1(2)
A_byte = Alarm_byte
Return




Seeprom2 speichert die neue Alarmzeit-2 in den EEPROM-Variablen:


CodeBox bascom

'-----------------------------
Seeprom2: 'Save EEPROM Alarm-2
A2_std = Alarmzeit2(1)
A2_min = Alarmzeit2(2)
A_byte = Alarm_byte
Return




Und nun folgt endlich das:


CodeBox bascom

'****************************************************************************** Ende + Data


End


Ende des Programms! :)





Allerdings geht es danach dann doch noch weiter....... ;)


...auf ein letztes...
 
...nun folgen noch die Datentabellen...


Einmal die Matrix-Tabelle für die Ziffern auf der I2C-Matrix:


CodeBox bascom

'------------------------------------------------------------------------------ Matrix-Tabelle
Matrix_wert:
Data "Z" , "7" , "8" , "9" , "A" , "4" , "5" , "6" , "B" , "1" , "2" , "3" , "C" , "F" , "0" , "E" , "D"




Die Daten zur Anzeige der Wochentag_led`s:


CodeBox bascom

Wochentag_led:
Data &H7E , &H7D , &H7B , &H77 , &H6F , &H5F , &H3F , &HFF




Led_daten ist die Datentabelle für die 7-Segmentanzeigen:


CodeBox bascom

Led_daten:
Data &HFC '0 (48)
'---
Data &H60 '1
Data &HDA '2
Data &HF2 '3
Data &H66 '4
Data &HB6 '5
Data &HBE '6
Data &HE0 '7
Data &HFE '8
Data &HF6 '9 (57)
Data &H00 'leer (32)
'---
Data &HEE 'A (65)
Data &HFE 'B (66)
Data &H9C 'C (67)
Data &HFC 'D (68)
Data &H9E 'E (69)
Data &H8E 'F (70)
Data &HBE 'G (71)
Data &H6E 'H (72)
Data &H60 'I (73)
Data &H70 'J (74)
'---
Data &H1C 'L (76)
Data &HFC 'O (79)
Data &HCE 'P (80)
Data &HB6 'S (83)
Data &H7C 'U (85)
Data &H76 'Y (89)
Data &HDA 'Z (90)
Data &H3E 'b (98)
Data &H1A 'c (99)
Data &H7A 'd (100)
'---
Data &H2E 'h (104)
Data &H20 'i (105)
Data &H2A 'n (110)
Data &H3A 'o (111)
Data &H0A 'r (114)
Data &H38 'u (117)
Data &H10 '_ (95)
Data &H92 '3x waagerecht
Data &H01 'DP (46)
Data &HCA '?
'---
Data &HFF 'LED-Test




FERTIG !
Das war es nun aber wirklich! :)


Schöne Grüße,
Cassio
 
Hallo zusammen!

Nach so vielen Beiträgen mit Theorie, folgen nun mal wieder Beiträge mit den letzten Bildern zum Abschluss :)

Nun aber doch erst mal noch ein wenig Theorie..... :rolleyes:
Die Software hatte ich ja inzwischen noch weiter bearbeitet und nun werden z.B. auch die Relais mit angesteuert.
Natürlich lassen sich beide Relais einzeln mit der Fernbedienung ein- und ausschalten.
Taste 1 (mit VCR-Adresse) aktivier oder deaktiviert das Relais-1,
Taste 2 logscherweise das Relais-2.

Da das Relais-1 später die Steckdose für den Fernseher schaltet, damit dieser nicht jeden Tag 23 Stunden im Standby steht, musste ich dies natürlich bei den Alarmen, der Schlummerfunktion und den Service-Test mit berücksichtigen.
Aus dem Grunde war das Einbinden des Relais etwas kniffliger als zu erst gedacht. ;)

Nun ist es aber so geworden, dass Relais-1 extra 10 Sekunden VOR einem Alarm das TV mit Strom versorgt...... und 10 Sekunden NACH der "Gerät-Aus"-Meldung wieder vom Netz trennt.
Gleiches gilt natürlich für die Schlummerfunktion, oder auch bei Testbetrieb über die ISE und dem Test-Taster. :)


Apropos ISE und Test-Taster....
Mein Menü für die ISE habe ich noch mal überarbeitet.
Ich kann nun zwischen zwei Standardanzeigen wechseln:
Einmal werden unter Anderem alle Bits und Flags die DCF77 betreffen angezeigt---> Standard-1.jpg
und ein anderes Mal die Softclock-Werte---> Standard-2.jpg


Da ich zum Erfassen der Helligkeit mit GETRC() arbeite, kann ich nun per ISE einen "Umschaltwert" (Sollwert genannt) vorgeben.
GRC-Sollwert.jpg

Damit muss ich das Programm nicht extra neu in den Mega168 schieben, falls der derzeitge Wert hier im Büro mit den Lichtverhältnissen im Schlafzimmer nicht zu vereinbaren ist.

Der eingestellte "Sollwert" wird natürlich auch im EEPROM gespeichert, damit er bei einem Systemneustart nicht neu eingegeben werden muss.
GRC-gespeichert.jpg



Was ich sonst noch eingebaut habe folgt gleich......

Grüße,
Cassio
 
Hallo !

Auf gehts, zum wohl letzten Beitrag.....


Um die IR-Sendeeinheit (und den Standort der Uhr) zu überprüfen, kann ich verschiedene IR-Signale zum Test senden lassen.
Dafür habe ich ein kleines Untermenü erstellt....

Meldung über das Anwählen des Testmenüs---> IR-Testmenue.jpg

Danach kann ich zwischen vier verschiedenen IR-Codes wählen---> IR-Codes.jpg


Das Menü läuft in einer Schleife und wartet immer auf eine gültige Eingabe.
Wird eine andere Taste als 1-4 an der ISE gedrückt, verlässt man das Programm:
Testmenue-ende.jpg


Damit ich beim Aufstellen der Uhr auf dem Schrank die "IR-Verbindung" aber auch ohne ISE mal schnell prüfen kann, habe ich von vorn herein gleich einen Test-Taster vorgesehen.
Dieser Test-Taster sendet beim ersten Betätigen das Signal zum Einschalten des Radiomoduls und quittiert dies nun auch auf den 7-Segmenten:
IR-on.jpg


Beim nächtsten Tastendruck wird das AUS-Signal gesendet, was wieder optisch signalisiert wird:
IR-off.jpg



Das war es aber nun wirklich! ;)
Jetzt folgt nur noch der Test im realen Betrieb...... und irgendwann mal ein Gehäuse. :rolleyes:

Ich hoffe, es war interessant..... auch wenn es zu Beginn nur um eine "langweilige" Uhr mit Alarmfunktion ging. ;)

Grüße,
Cassio
 
Hallo zusammen!

Ich habe zwar inzwischen einige Änderungen an der Software vorgenommen, die ich hier nun nicht mehr alle eingestellt hatte......
aber eine Sache muss ich hier nun noch mal richtig stellen!


Ich hatte ja mit dem "GETRC()" und meinen Bauteilen gekämpft.
Nun ist mir auch aufgefallen, warum das nur unzufrieden funktionierte.....
Ich habe die ganze Zeit immer ein falsches Anschlussbild im Kopf gehabt. :banghead: :rolleyes:


Hätte mir nicht mal einer mitteilen können, dass meine Schaltung (wie in Beitrag 16 gezeigt) völliger Unsinn ist !? :cool:

Ich weiß gar nicht mehr, warum ich immer das Anschlussbild mit dem Mittelabgriff im Kopf gehabt habe. :hmmmm:
Ich hatte vor einigen Jahren schon mal mit "Getrc()" experimentiert.... bin da aber auch nicht wirklich glücklich mit geworden.
Damals hatte ich es nämlich auch so gemacht. :rolleyes:


Wie auch in der BASCOM-Hilfe so schön beschrieben, muss die Schaltung natürlich so aussehen:
Getrc-PIND0.gif

Nun funktioniert es auch wesentlich besser!
Die Messwerte sind stabiler und die Differenzen sind um einiges größer. :)


Ich wollte das hier jetzt nur noch mal richtig gestellt haben! :cool:
Die alten Beiträge, mit den falschen Überlegungen, habe ich schon editiert!


Ach so....
Es gibt natürlich auch wieder Bilder vom Scope dazu....
Ich habe den Befehl "Getrc()" mal jede Sekunde ausführen lassen und dann ein Bild vom beleuchteten LDR und einmal vom abgedeckten LDR erstellt.
Nun sieht das Ganze so aus:
Getrc_1.gif Getrc_2.gif

Damit ist das Problem nun auch erledigt! :)

Grüße,
Cassio
 

Ü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)