Szép estét!
Bajlódom egy programmal és sehogy sem boldogulok.
Röviden timer0-val lekérdezem a DS1307-et kiíratom lcd-re
Timer1-el lekérdezem a DS1621-ből a hőmérsékletet, majd kiíratom lcd-re
Ezek működnek is rendesen látom az lcd-n az adatokat. Azért csinálom megszakításból, mert majd a főprogramban szeretnék még alkotni és ezek amúgy is működnek, tehát miért is ne lehesen igy használni.
A probléma a következő Timer2 vel szeretném megcsinálni az LCD háttérvilágítás fényerőszabályozását. De ha bekonfigurálom a timer2-t ,és lefordítom a programot, akkor a beégetés és indítás után az óra megbolondul kiírja hogy
dátumnak és időnek, a hőmérséklet kiírás teljesen jó. Ha kikapcsolom a Timer2-t vagyis nem fordítom bele a programba, akkor minden teljesen jól működik
A program:
Kód: Egész kijelölése
$regfile = "m8def.dat"
$crystal = 4000000
Wait 1
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portd.7 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
Config Lcdmode = Port
Initlcd
Cursor Off
Cls
Config Sda = Portd.0
Config Scl = Portd.1
Const Ds1307w = &HD0
Const Ds1307r = &HD1
Config Clock = User
Config Date = Ymd , Separator = .
Dim X As Byte : Dim Szobatemp As Byte : Dim Szobatemptized As Byte
Dim B As Byte : Dim Weekday As Byte
Config Timer2 = Pwm , Async = Off , Pwm = On , Compare Pwm = Clear Down , Prescale = 1 'Ez a háttérvilágítás
Config Portd.4 = Input
Portd = &B00010000
Const Timer0reload = 65
Const Timer1reload = 3036
config timer0=timer,prescale = 1024
Config Timer1 = Timer , Prescale = 64
Load Timer0 , Timer0reload
Load Timer1 , Timer1reload
On Ovf0 Datetime
On Ovf1 Hőmérséklet
enable ovf0
Enable Ovf1
Start Timer0
Start Timer1
Start Timer2
enable interrupts
'Start Convert
I2cstart
I2cwbyte &H90
I2cwbyte &HEE
I2cstop
'-------------
'Start Convert
I2cstart
I2cwbyte &H91
I2cwbyte &HEE
I2cstop
'-------------
Time$ = "23:59:45"
Date$ = "11/12/31"
Ocr2 = 127
Do
If Pind.4 = 0 Then Gosub Enter
Loop
Le:
X = X - 1
Return
Fel:
X = X + 1
Return
Enter:
Waitms 15
Locate 1 , 11 : Lcd "ENTER"
Bitwait Pind.4 , Set
Cls
Return
Hőmérséklet: 'Read Temperature
'--------------
I2cstart
I2cwbyte &H90
I2cwbyte &HAA
I2cstop
I2cstart
I2cwbyte &H91
I2crbyte Szobatemp , Ack
I2crbyte Szobatemptized , Nack
I2cstop
'--------------
If Szobatemptized = 128 Then Szobatemptized = 5 Else Szobatemptized = 0
Locate 1 , 1 : Lcd Szobatemp ; "," ; Szobatemptized
Return
Datetime:
'--------
Locate 4 , 1 : Lcd "20" ; Date$
Locate 4 , 13 : Lcd ; Time$
Return
'called from ds1307clock.lib
Getdatetime:
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)
Return
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
Az óra program a saple-ból van mert teljesen jól működött máskor is.
A Timer0 és Timer1-et AVRcalc-al csináltam. Az egész program még csak test, hogy miért nem fut normálisan ha timer2-t belefordítom a programba.
A timer2-t többfajta képpen próbáltam konfigurálni de sehogy sem lett jó, megbolondította az órát. A DS-ek felhúzó ellenállása 4.7kohm
Előre is köszönöm!