Hoi,

Denkelijk voor de pro een makkelijke oplossing.

Ik krijg in mijn lcd de tijd als volgt te staan 14:8:44
krijg deze via een ds1307 werk met een Mega8

ziet niet netjes uit omdat dan steeds het verspringt als de uren,minuten en seconden verspringen hoort dus eigenlijk
14:08:44 te staan. maar hoe moet dit?

groetjes Rene.

P.S.
heb nog een probleem voor de liefhebber.. maar is een lastige.
hoe kan ik tijden in de eeprom van een Mega8 opslaan.

menu maken lukt me wel maar...

ik heb 8 relais die ik op bepaalde tijden aan/uit wil laten gaan,
(via een pcf8574 en een ulnxxxx i2c dus).

maar het moet mogelijk zijn om per relais meerdere tijden in te stellen... b.v. van 7:00 tot 13:00 en van 15:00 tot 2:00.

en .. hoe zet ik dit dus in de eeprom, en hoe laat ik in de loop routine zonder dat mijn tijd hangen blijft controleren als iets moet worden aan/uitgeschakeld.

dus eigenlijk een 8 voudige schakelklok

ja best een lastige vind ik..

Daar heeft Bascom een format functie voor:

S = "123"
S = Format(S , "00000")

Geeft 00123

Tijden vergelijken, dat doe je gewoon met een if statement.
If (eepromhour = hour AND eepromminute = minute) then doe iets leuks.

bedankt met de tijd is het me na ff uitzoeken gelukt..

moest nog van tijd formaat een string maken

heb dit in de ds1307 stuk geplaatst:

I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307

I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte _sec , Ack
I2crbyte _min , Ack ' MINUTES
I2crbyte _hour , Ack ' Hours
'I2crbyte Weekday , Ack ' Day of Week
I2crbyte _day , Ack ' Day of Month
I2crbyte _month , Ack ' Month of Year
I2crbyte _year , Nack ' Year
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
U = Str(_hour)
U = Format(u , "00")
Mn = Str(_min)
Mn = Format(mn , "00")
Sc = Str(_sec)
Sc = Format(sc , "00")
End Sub

met de eeprom is denkelijk stuken lastiger.
de tijden en het nummer van de relais en on/off status moet erin komen op een of ander manier, en ik zou dit via een menu moeten kunnen aanpassen of verwijderen.

b.v.
7:00-relais1-aan
8:00-relais3-uit
13:00-relais1-uit
15:00-relais1-aan
.
.
.

helaas heb ik nog nooit met eeprom gedeelte iets gedaan.
en ik ben bang dat dit veel tijd van de uc vergt..
als hij steeds iedere minuut dit moet nakijken via een interupt.
waardoor dus mijn tijd stil staat op dat moment denk ik.
maar wie weet heeft iemand goed voorbeeld..

alvast bedankt.

je tijd staat nooit stil, want je gebruikt toch juist dat externe realtime clock IC?
Daarnaast moet je de opgeslagen schakelpunten bij opstarten gewoon van eeprom in ram laden.
Ik zou alles omrekenen naar seconden en dan kijken of de huidige tijd hoger op lager is dan het schakelpunt.

Joi

ok maar hoe zet ik b.v de tijden in het eeprom via een menu..
en roep ik deze op.

ik dacht zelf om 8 bits te gebruiken voor de relais status..
011101010, en hierbij de tijd maar als ik straks iets in het eeprom zet schuift dit vanzelf naar een volgende eeprom adres als ik er weer een tijd bij zet .

liefst zou ik b.v. ca 3 schakeltijden willen kunnen gebruiken per uitgang dan kom ik op 3x8 24 stuks

dus eigenlijk moet het programma kijken waar in de eeprom iets vrij is
en daar de gegevens zetten. denk dus kijken op ieder adress of er ff staat of zoiets.
tevens moet het mogelijk zijn om deze uit te vegen.

zal me nog meer moeten verdiepen in het eeprom gedoe..
want zo als ik nu begrijp moet ik steeds zelf aangeven waar iets komt. en is er plaats voor 1 byte per adress
en dus voor op te roepen moet ik dit ook aangeven.

maar het idee is er

tijd 7:00 om gezet in minuten (hoeft niet op de seconde nauwkeurig te zijn) wordt dus 420 kan dus niet opgeslagen worden als byte
gaat maar tot 255. bij 23.59 heb ik als 14150 minuten
of bedoel de 23 en 59 apart. 1380 en 59 heb ik ook meer dan een byte
WRITEEEPROM var , address
in het voorbeeld van bascom zie ik e steeds alleen met bytes werken.

dus straks in het eeprom geheugen

$eeprom
Data 255 , 14150 '(pcf8574 portbits 11111111),(time in minutes 23:59)
$data

ik zou blij zijn als er iemand een voorbeeld had van een soortgelijk project al dan met een kanaal of zo om te kijken hoe zet MEERDERE tijden opslaan. en afroepen naar het ram.

Met de tijd .. dat die stil staat bedoel ik op het i2c LCD scherm
programma onderbreekt denk ik de loop waar hij dus de tijd mee weergeeft. om gegevens uit de eerom te halen (iedere minuut) en te vergelijken met de huidige tijd.

lang geleden dat ik bascom gebruikt heb, maar volgens mij kan je ook gewoon words in het eeprom laden, alleen heb je dan 2 addressen nodig.
Ik zou gewoon een vaste struktuur kiezen en niet gaan kijken waar er plaats is. Dan weet je altijd waar wat staat.
eeprom voorbeeld code voor bascom is er zat te vinden.
zie de appnotes op http://www.mcselec.com/

Hallo,

weet niet of iemand ook interesse heeft in het project,, maar ben tot nu zo ver gekomen dat ik al 1 kanaal kan laten werken. maar omdat ik demo versie bascom heb kom ik niet meer verder qua code helaas.

Dus tips om het kleiner te krijgen zonder functie verlies, of een methode om alle 24 adressen in het eeprom te scannen zijn heel erg welkom.

Daarna ben ik nog aan het denken wat als de stroom even zou uitvallen, dan ben ik natuurlijk de aan/uit standen kwijt die hij als gehad heeft. dat zou zeer onplezierig zijn..
dus daar moet ik ook nog iets makkelijks op vinden

$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 64
$swstack = 64
$framesize = 64
$lib "Lcd_i2c.lib"
'8 Kanaals tijdschakelaar
'gebruikt DS1307, PCF8574 phillips sturing lcd 2*16, PCF8574AN texas intr.
'gaat straks relaisof solidstate's schakelen. 3 switches voor bediening up/down/enter

Dta: 'tijdelijk eeprom file met aan/uit tijden en pcf pin
$eepromhex
$EEPROM
' starth,startm,port,endh,endm,port
' ah,am,P,bh,bm
Pro1:
Data 07 , 13 , 1 , 13 , 00 , 00
Pro2:
Data 15 , 00 , 1 , 13 , 00 , 00
Pro3:
Data 00 , 00 , 1 , 00 , 00 , 00
Pro4:
Data 00 , 00 , 2 , 00 , 00 , 00
Pro5:
Data 00 , 00 , 2 , 00 , 00 , 00
Pro6:
Data 00 , 00 , 2 , 00 , 00 , 00
Pro7:
Data 00 , 00 , 3 , 00 , 00 , 00
Pro8:
Data 00 , 00 , 3 , 00 , 00 , 00
Pro9:
Data 00 , 00 , 3 , 00 , 00 , 00
Pro10:
Data 00 , 00 , 4 , 00 , 00 , 00
Pro11:
Data 00 , 00 , 4 , 00 , 00 , 00
Pro12:
Data 00 , 00 , 4 , 00 , 00 , 00
Pro13:
Data 00 , 00 , 5 , 00 , 00 , 00
Pro14:
Data 00 , 00 , 5 , 00 , 00 , 00
Pro15:
Data 00 , 00 , 5 , 00 , 00 , 00
Pro16:
Data 00 , 00 , 6 , 00 , 00 , 00
Pro17:
Data 00 , 00 , 6 , 00 , 00 , 00
Pro18:
Data 00 , 00 , 6 , 00 , 00 , 00
Pro19:
Data 00 , 00 , 7 , 00 , 00 , 00
Pro20:
Data 00 , 00 , 7 , 00 , 00 , 00
Pro21:
Data 00 , 00 , 7 , 00 , 00 , 00
Pro22:
Data 00 , 00 , 8 , 00 , 00 , 00
Pro23:
Data 00 , 00 , 8 , 00 , 00 , 00
Pro24:
Data 00 , 00 , 8 , 00 , 00 , 00
$data

'configureer de scl en sda pins
Config Scl = Portc.5 'Configureer i2c SCL
Config Sda = Portc.4 'Configureer i2c SDA
'configureer i2c delay
Config I2cdelay = 10
'configureer adres van PCF 8574AN
Const Bw01 = &H70 '8574an(texas) op 000
' Const Bw02 = &H72 '8574an(texas) op 001
'configureer address van ds1307
Const Ds1307w = &HD0 ' Addresses of Ds1307 clock
Const Ds1307r = &HD1
Config Clock = User
Config Date = Dmy , Separator = -
' 1 Hz SQW Output eventueel voor isr
'I2cstart
'I2cwbyte Ds1307w
'I2cwbyte &H07
'I2cwbyte &B10010000
'I2cstop
'Time$ = "07:12:30"
' Date$ = "03-10-09"
'configureer adres van pcf8574 LCD
Const Pcf8574_lcd = &H40
'init the i2c
I2cinit
'Dim variables
Dim _lcd_e As Byte 'voor 4 bits LCD
_lcd_e = 128
Dim A As Byte , B As Byte , Menu_byte As Byte
Dim Relay As Byte
Relay = 255
Dim ___lcdno As Bit
Dim Stat As String * 4
Dim U As String * 10 , Mn As String * 10 , Sc As String * 10
Dim S As Byte , M As Byte , H As Byte , D As Byte , Month As Byte
Dim Ah As Byte , Am As Byte , P As Byte , Bh As Byte , Bm As Byte

Config Portd.5 = Input : Set Portd.5 : Enter Alias Pind.5 ' Enter button
Config Portd.6 = Input : Set Portd.6 : Up Alias Pind.6 ' UP button
Config Portd.7 = Input : Set Portd.7 : Down Alias Pind.7 ' Down button

Declare Sub Tijd() 'tijd uit DS1307 haalen
Declare Sub Klokinstellen() 'tijd programmeren in DS1307
Declare Sub Relay() 'relais handmatig bedienen
Declare Sub Schakeltijden() 'Schakeltijden programmeren

Main:
Cls
Do
Call Tijd
If _sec = 0 Then Gosub Isr_sec 'ga kijken of er iets geschakeld moet worden
Upperline
Lcd Ah ; ":" ; Am ; "-" ; P ; "-" ; Bh ; ":" ; Bm 'tijdelijk voor contr.
'Lcd _day ; "/" ; _month ; "/" ; _year ; " "
Lowerline
Lcd U ; ":" ; Mn ; ":" ; Sc ; " "
If Enter = 0 Then
Goto Menu
End If
Loop

Menu:
Do
' ******************** SELECT MENU
Cls
Locate 1 , 1
Lcd " SELECT MENU"
Locate 2 , 1
Lcd " PRESS UP !"
Bitwait Up , Reset
Menu_byte = 1
Locate 2 , 1
Lcd " Tijd instellen"

'MENU PRESS UP TO SELECT WHEN RIGHT MENU THEN ENTER
Do
If Enter = 0 Then Exit Do
If Up = 0 Then
Incr Menu_byte
If Menu_byte > 5 Then Menu_byte = 1
Cls
Locate 1 , 1
Lcd " PRESS UP/ENTER"
Locate 2 , 1
If Menu_byte = 1 Then Lcd " Tijd instellen"
If Menu_byte = 2 Then Lcd " Handmatig"
If Menu_byte = 3 Then Lcd " Schakeltijden"
If Menu_byte = 4 Then Lcd " schakt. verw."
If Menu_byte = 5 Then Lcd " EXIT "
Waitms 200
End If
Loop

Bitwait Enter , Set
Select Case Menu_byte
Case 1 : Call Klokinstellen()
Case 2 : Call Relay()
Case 3 : Call Schakeltijden()
Case 4 : Goto Main 'NOG AANPASSEN
Case 5 : Goto Main
Case Else : Cls
Lcd "ERROR"
Wait 2
End Select

Loop

' ******************** routine die moet gaan kijken of er geschakeld moet worden
' nog even in verdiepen kijkt nu aleen nog maar naar Pro1 wat eigenlijk tot 24 moet gaan

Isr_sec:
Cls
Readeeprom Ah , Pro1
Readeeprom Am
Readeeprom P
Readeeprom Bh
Readeeprom Bm
'Upperline
'Cls
'Lcd Ah ; ":" ; Am ; "-" ; P ; "-" ; Bh ; ":" ; Bm
'Lowerline
'Lcd _hour ; ":" ; _min
If Ah = _hour And Am = _min Then
Goto Switch_ralay_on
End If
If Bh = _hour And Bm = _min Then
Goto Switch_ralay_off
End If
Return

' ******************** KLOK INSTELLEN
Sub Klokinstellen()
Cls
H = _hour
M = _min
Gosub Uur
Gosub Minuut
_hour = H
_min = M
_sec = 0
Gosub Settime:
End Sub

' ******************** KIES RELAIS EN SCHAKEL HANDMATIG
Sub Relay()
Cls
Gosub Get_relay
Cls
Gosub Switch_relay
End Sub

' ******************** PROGRAMMEREN VAN SCHAKELTIJDEN
Sub Schakeltijden
Cls
Gosub Get_relay
P = H - 1
Cls
Locate 1 , 1
Lcd "Start Tijd uur "
B = 1 : M = 10 : H = 10
Locate 2 , 1
Lcd H ; ":" ; M
Gosub Uur
Cls
Upperline
Lcd "Start Tijd minuut"
M = 10
Lowerline
Lcd H ; ":" ; M
Gosub Minuut
Am = M : Ah = H
Cls
Locate 1 , 1
Lcd "Stop Tijd uur "
B = 1 : M = 10 : H = 10
Locate 2 , 1
Lcd H ; ":" ; M
Gosub Uur:
Cls
Upperline
Lcd "Stop Tijd minuut"
M = 10
Lowerline
Lcd H ; ":" ; M
Gosub Minuut
Bm = M : Bh = H
Writeeeprom Ah , Pro1
Writeeeprom Am
Writeeeprom P
Writeeeprom Bh
Writeeeprom Bm
End Sub

' ************************************ EINDE

Switch_relay: 'routine om pin status momenteel te zien
P = H - 1
Again:
A = Relay.p
If A = 0 Then
Stat = "AAN"
End If
If A = 1 Then
Stat = "UIT"
End If
Upperline
Lcd "Nr." ; H ; " is :" ; Stat ; " "
Do
Lowerline
Lcd "Rl.Nr." ; H ; " " ; Stat ; " "
If Up = 0 Then 'UP/OFF
Relay.p = 0
Goto Again
End If

If Down = 0 Then 'DOWN/ON
Relay.p = 1
Goto Again
End If

If Enter = 0 Then 'ENTER
Incr B
I2cstart 'SET PIN AT PCF8574AN
I2cwbyte Bw01
I2cwbyte Relay
I2cstop
Waitms 100
End If
Loop Until B = 3
Return

Get_relay:
B = 1
H = 1
A = 1
Do
If A < 30 Then
Upperline
Lcd "Selecteer relais"
Else
Upperline
Lcd "Enter to Select "
End If
Lowerline
Lcd "Relais nummer :" ; H
If Up = 0 Then 'UP
Incr H
If H > 8 Then H = 1
Waitms 200
End If

If Down = 0 Then 'DOWN
Decr H
If H < 1 Then H = 8
Waitms 200
End If

If Enter = 0 Then 'ENTER
Incr B
Cls
Upperline
Lcd " Relais Nr." ; H
Waitms 500
End If
Loop Until B = 2
Return

'---------- uur instellen
Uur:
Cls
B = 1
A = 1
Do
If A < 30 Then
Upperline
Lcd "Press Up/Down "
Else
Upperline
Lcd "Enter to Select "
End If
Lowerline
Lcd H ; ":" ; M ; " "

If Up = 0 Then 'UP
Incr H
If H > 23 Then H = 0
Waitms 200
End If

If Down = 0 Then 'DOWN
Decr H
If H > 23 Then H = 23
Waitms 200
End If

If Enter = 0 Then 'ENTER
Incr B
Cls
Lcd "1 moment"
Waitms 500
End If

Incr A
If A = 60 Then
A = 0
End If

Loop Until B = 2

Return

'---------- minuten instellen
Minuut:
Cls
B = 1
A = 1
Do
If A < 30 Then
Upperline
Lcd "Press Up/Down "
Else
Upperline
Lcd "Enter to Select "
End If
Lowerline
Lcd H ; ":" ; M ; " "
If Up = 0 Then 'UP
Incr M
If M > 59 Then M = 0
Waitms 200
End If

If Down = 0 Then 'DOWN
Decr M
If M > 60 Then M = 59
Waitms 200
End If

If Enter = 0 Then 'ENTER
Incr B
Cls
Lcd "1 moment"
Waitms 500
End If
Incr A
If A = 60 Then
A = 0
End If
Loop Until B = 2
Return

Sub Tijd()

I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307

I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte _sec , Ack
I2crbyte _min , Ack ' MINUTES
I2crbyte _hour , Ack ' Hours
'I2crbyte Weekday , Ack ' Day of Week
I2crbyte _day , Ack ' Day of Month
I2crbyte _month , Ack ' Month of Year
I2crbyte _year , Nack ' Year
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
U = Str(_hour)
U = Format(u , "00")
Mn = Str(_min)
Mn = Format(mn , "00")
Sc = Str(_sec)
Sc = Format(sc , "00")
End Sub

'Setdate:
' _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
' I2cstart ' Generate start code
' I2cwbyte Ds1307w ' send address
' I2cwbyte 4 ' starting address in 1307
' I2cwbyte _day ' Send Data to SECONDS
' I2cwbyte _month ' MINUTES
' I2cwbyte _year ' Hours
' I2cstop
'Return

Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte _sec ' Send Data to SECONDS
I2cwbyte _min ' MINUTES
I2cwbyte _hour ' Hours
I2cstop
Return

Switch_ralay_on:
Cls
Upperline
Lcd "switch routine"
Lowerline
Lcd P ; "--" ; Relay
Relay.p = 0 '10101010
I2cstart
I2cwbyte Bw01
I2cwbyte Relay
I2cstop
Waitms 100
Goto Main

Switch_ralay_off:
Cls
Upperline
Lcd "switch routine"
Lowerline
Lcd P ; "--" ; Relay
Relay.p = 1 '10101010
I2cstart
I2cwbyte Bw01
I2cwbyte Relay
I2cstop
Waitms 100
Goto Main