Kod za DS1307

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
User avatar
dejanmaksa
Napredujem
Napredujem
Posts: 159
Joined: 28-10-2008, 22:15
Location: Velika Plana

Kod za DS1307

Post by dejanmaksa »

Napravio sam program koji ce da mi na 7-seg led displeju sa 4 cifre ispisuje sta je procitao sa DS1307.
Kod mi ide ovako:

Code: Select all

'************************************************* ***************
' Ime programa: RTC.BAS
' Opis: program ilustruje primenu sata realnog vremena DS1307.
' Za povezivanje sa mikrokontrolerom se koristi I2CREAD
' naredba.
'************************************************* ***************
TRISB = %00000000
TRISC = %00011000
TRISD = %00000000
TRISA = %000000
trise=%000
symbol SCL = PORTC.3 ' I2C data pin
symbol SDA = PORTC.4 ' I2C clock pin

Mi var byte ' Minuti
Sa var byte ' Sati
Me var byte ' Meseci
Se var byte ' Sekunde
Go var byte ' Godine
Da var byte ' Dani
i var byte
symbol led=porte.0
output led

Sat_1 var word
sat_2 var word
min_1 var word
min_2 var word
min_min var word
Dan1 var word
Dan2 var word
mes1 var word
mes2 var word
OPTION_REG = $7f ' Omoguci PORTB pullup otpornike

Main:
I2CREAD SDA,SCL,%11010001,1,[Mi] 'Cita minute i smesta u Mi
I2CREAD SDA,SCL,%11010001,2,[Sa] 'Cita sate i smesta u Sa
I2CREAD SDA,SCL,%11010001,0,[Se] 'Cita sekunde i smesta u Se
I2CREAD SDA,SCL,%11010001,5,[Me] 'Cita mesece i smesta u Me
I2CREAD SDA,SCL,%11010001,6,[Go] 'Cita godine i smesta u Go
I2CREAD SDA,SCL,%11010001,4,[Da]  'Cita dane i smesta u Da

Prikaz:
for i=0 to 50 
min_min = Mi
sat_1 = sa DIG 0
sat_2 = Sa dig 1
min_1 = Min_min dig 1
min_2 = Min_min dig 0

PORTB = sat_1
PORTC = sat_2
PORTD = min_1
PORTA = min_2
toggle led
pause 100
next i
goto Datum

Datum:
for i=0 to 50
dan1=Da dig 0
dan2=da dig 1
mes1=me dig 1
mes2=me dig 0

portb = dan1
portc=dan2
portd=mes1
porta=mes2
pause 100
next i



goto Main ' Ponovi sve

End ' Kraj programa
Probam u proteusu ali mi za pravi problem kada treba da procita vrednosti koje su dvocifrene.

Primera radi za broj 10 casova mi pokazuje 16. i tako sve i svasta.
Pretpostavljam da treba da konvertujem broj koji dobijem iz DS1307 u binarni oblik da bi mi pokazao kako treba jer kad sam isto to probao na LCD-u radilo je okej stom razlikom sto sam ubacivao naredbu HEX ispred projeva koje treba da mi pokaze na displeju.
Ne znam da li ovde treba da radim sa maskama pa da ako mi procita broj 16 da ja upisem broj na displeju 10. Koristio sam PIC16F877. sa 4 kola 74LS47 i nisam isao u multiplex mod nego svaki port po jedan displej.
User avatar
dejanmaksa
Napredujem
Napredujem
Posts: 159
Joined: 28-10-2008, 22:15
Location: Velika Plana

Re: Kod za DS1307

Post by dejanmaksa »

Ukapirao sam o cemu se radi ali ne znam kako da broj iz HEX formata prebacujem u Decimalni. Ako bih koristio maske verujem da bi se otegao kod poprilicno jer trebam da imam 60 maski za minute.
User avatar
sasa45
Odlično uznapredovao
Odlično uznapredovao
Posts: 518
Joined: 19-01-2007, 07:42
Location: Subotica - Srbija
Contact:

Re: Kod za DS1307

Post by sasa45 »

ja sam taj problem resavao ocitavanjem zapisa u binarnom tj decimalnom broju i to na sledeci nacin...

pokusacu da ti objasnim moj princip pa ti pravi kod kako zelis...

komandom
I2CREAD SDA,SCL,%11010001,1,[Mi] si iscitao podatak

Mi ti je recimo 12

u binarnom obliko iscitani podaci su ti
%00010010

gde ti bitovi 0,1,2,3 oznacavaju jedinice (u ovom slucaju 0010 sto ti u decimalnom oznacava broj 2)
i bitovi 4,5,6,7 ti oznacavaju desetice (0001 sto ti je 1)

kad kompletan kod ocitas komandom hex on ce ti ocitati vrednost 12

tako da bi broj dobio u decimalnom izrazu ja sam radio

minj.0=mi.0
minj.1=mi.1
minj.2=mi.2
minj.3=mi.3

mind.0=mi.4
mind.1=mi.5
mind.2=mi.6
mind.3=mi.7

minut=mind*10+minj

i onda ti vrednost minut sadrzi broj 12 u decimalnom zapisu
a ako tebi trebaju cifre pojedninacno mozes koristiti mind i minj

nadam se da si me razumeo

a u datasheet-u pogledaj koji ti bit sta oznacava mozda ti ne negde nisu potrebni svih 8 bitova da bi ispisao broj...mislim da je to kod sati i meseci...
yt1nvs
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 286
Joined: 30-03-2009, 16:54

Re: Kod za DS1307

Post by yt1nvs »

Ja to radim ovako:

sat var byte[8] 'ds1307 promenljiva

I2CREAD SDA,klk,$D0,$00,[STR sat\8 ]'sek min sati dan datum mesec god
a = sat[1]'obradjujem min sat[0] su sek sat[2] su sati itd

obrada:

aj = a &%00001111'vrednost jedinica iz a
ad = a &%11110000'vrednost desetica iz a
ad = ad >> 4'vrednost desetica iz a

ovo su samo delovi programa citanja 1307 i pretvaranja iz bcd
User avatar
dejanmaksa
Napredujem
Napredujem
Posts: 159
Joined: 28-10-2008, 22:15
Location: Velika Plana

Re: Kod za DS1307

Post by dejanmaksa »

E sad jos jedan problem.
Kad na sve to stavim i DS1820 javlja mi se problem kod iscitavanja temperature kada je u minusu.

Code: Select all

'************************************************* ***************
' Ime programa: experiment.BAS
' Opis: Proba da se uklopi sve do sada na jednom mestu.
'************************************************* ***************
TRISB = %00000000
TRISC = %00011000
TRISD = %10000000
TRISA = %000000
trise=%000
symbol SCL = PORTC.3 ' I2C data pin
symbol SDA = PORTC.4 ' I2C clock pin
symbol DQ = PORTD.7
SYMBOL SIMBOL = PORTE.1

Mi var byte ' Minuti
Sa var byte ' Sati
Me var byte ' Meseci
Se var byte ' Sekunde
Go var byte ' Godine
Da var byte ' Dani
i var byte
symbol led=porte.0
output led
temperatura Var Word ' Promen.za cuvanje izmer. temp.
count_remain Var Byte ' Ostatak takta
count_per_c Var Byte ' Takt po stepenu C
T1 VAR BYTE
T2 VAR BYTE
T3 VAR BYTE
T4 VAR BYTE
V VAR WORD
ZNAK VAR BYTE
T VAR WORD
Sat_1 var word
sat_2 var word
min_1 var word
min_2 var word
min_min var word
Dan1 var word
Dan2 var word
mes1 var word
mes2 var word
OPTION_REG = $7f ' Omoguci PORTB pullup otpornike
minj var byte
mind var byte
minut var byte
satj var byte
satd var byte
sati var byte

danj var byte
dand var byte
dani var byte
mesj var byte
mesd var byte
meseci var byte
tproba var word
TEM VAR WORD
T5 VAR BYTE
Main:
I2CREAD SDA,SCL,%11010001,1,[Mi] 'Cita minute i smesta u Mi
I2CREAD SDA,SCL,%11010001,2,[Sa] 'Cita sate i smesta u Sa
I2CREAD SDA,SCL,%11010001,0,[Se] 'Cita sekunde i smesta u Se
I2CREAD SDA,SCL,%11010001,5,[Me] 'Cita mesece i smesta u Me
I2CREAD SDA,SCL,%11010001,6,[Go] 'Cita godine i smesta u Go
I2CREAD SDA,SCL,%11010001,4,[Da]  'Cita dane i smesta u Da
START:
OWOut DQ, 1, [$CC, $44] ' Start merenja temperature

Cekaj: OWIn DQ, 4, [count_remain] ' Provera da li jos traje
If count_remain = 0 Then Cekaj
OWOut DQ, 1, [$CC, $BE] ' Procitaj izmerenu temperaturu
OWIn DQ, 0, [temperatura.LOWBYTE, temperatura.HIGHBYTE, Skip 4, count_remain, count_per_c]
temperatura = (((temperatura >> 1) * 100)-25) + (((count_per_c - count_remain) * 100) / count_per_c)
v=20000-temperatura

Prikaz:
for i=0 to 10
minj.0=mi.0
minj.1=mi.1
minj.2=mi.2
minj.3=mi.3

mind.0=mi.4
mind.1=mi.5
mind.2=mi.6
mind.3=mi.7

minut=mind*10+minj

satj.0=sa.0
satj.1=sa.1
satj.2=sa.2
satj.3=sa.3

satd.0=sa.4
satd.1=sa.5
satd.2=sa.6
satd.3=sa.7

sati=satd*10+satj
sat_1 = sati dig 0    
sat_2 = sati dig 1
min_1 = minut dig 1
min_2 = minut dig 0

PORTB = sat_1
PORTC = sat_2
PORTD = min_1
PORTA = min_2
toggle led
pause 100
next i
goto Datum

Datum:
for i=0 to 10
danj.0=da.0
danj.1=da.1
danj.2=da.2
danj.3=da.3

dand.0=da.4
dand.1=da.5
dand.2=da.6
dand.3=da.7

dani=dand*10+danj

mesj.0=Me.0
mesj.1=Me.1
mesj.2=Me.2
mesj.3=Me.3

mesd.0=Me.4
mesd.1=Me.5
mesd.2=Me.6
mesd.3=Me.7

meseci=mesd*10+mesj

dan1=Dani dig 0
dan2=dani dig 1
mes1=meseci dig 1
mes2=meseci dig 0

portb = dan1
portc=dan2
portd=mes1
porta=mes2
pause 100
next i
GOTO TERMO


IzberiZnak:
If v = 20000 then                      ' Temperatura = 0 C.
Znak=" "                       ' brez znaka
Else
If v < 20000 then                     ' <> 0
Znak="+"
                            ' Temperatura pod 0 C.    
Else
Znak="-" 
                           ' Temperatura nad 0 C.
EndIf
endif
     
PrikaziTemp:
If V >= 20000 then                     ' nad 0 C.     
temperatura = v-20000
GOTO TERMO
ELSE
temperatura = 20000-v
GOTO TERMOMINUS
ENDIF
    
TERMO:
FOR I=0 TO 20
t=temperatura/100
portb=T dig 1
portc=T dig 2
portd=T dig 0                 
porta=T dig 3
PAUSE 100
NEXT I


TERMOMINUS:
FOR I=0 TO 20
T=temperatura/100
portb=T DIG 1
portc=T DIG 2
portd=T DIG 0                 
porta=T DIG 3
PAUSE 100
NEXT I
goto Main ' Ponovi sve

End ' Kraj programa
Ovaj kod sam koristio kod LCD-a i sve je radilo ok ali sa LED displejom nece da prikaze temperaturu kako treba. sada mi ispisuje neke brojeve bezveze koji nemaju veze sa stvarnom temperaturom.
Gde pravim gresku.
yt1nvs
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 286
Joined: 30-03-2009, 16:54

Re: Kod za DS1307

Post by yt1nvs »

Procitaj datasheet za DS1820!
Iz tvog primera nesto ovako:
temperatura.HIGHBYTE sedmi bit je vazan ako je 1 znaci da je temperatura u minusu pa vidi kako to primeniti,snadji se malo sam.
Mislim da pises predugacke programe ako sam dobro video u ovom primeru imas oko 30 promenljivih.Zamisli da radis neki kompleksniji program trebalo bi ti 28 razno raznih PIC-eva!!!
Programer treba da vodi racuna da su programi sto efikasniji i sto je moguce kraci.
User avatar
dejanmaksa
Napredujem
Napredujem
Posts: 159
Joined: 28-10-2008, 22:15
Location: Velika Plana

Re: Kod za DS1307

Post by dejanmaksa »

Posto sam od skora poceo sa PIC-evima i sa programiranjem, prvo da skontam kako sve to radi pa cu posle i da se pozabavim duzinom programa. Taj deo oko temperature lepo radi na LCD-e ali me ovde zeza.
User avatar
dejanmaksa
Napredujem
Napredujem
Posts: 159
Joined: 28-10-2008, 22:15
Location: Velika Plana

Re: Kod za DS1307

Post by dejanmaksa »

Nisam ni video da mi je resenje bilo pred nosem

Code: Select all

PrikaziTemp:
If V >= 20000 then    ' nad 0 C.     
Temperatura=V-20000
HIGH PORTA.5
t=temperatura/100
portb=T dig 1
portc=T DIG 2
HIGH PORTB.7
portd=T dig 0                 
porta=T dig 3
Else                                   
Temperatura=20000-V ' pod 0 C                
t=temperatura/100
portb=T dig 1
portc=T DIG 2
portd=T dig 0                 
porta=T dig 3
EndIf 
Sad mi ostaje samo da ubacim jos podesavanje datuma i sata.
Post Reply