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.
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