 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
California Član

Pridružen-a: Pet 26 Avg 2005 19:48 Prispevkov: 236 Aktiv.: 1.00 Kraj: Hrastnik
|
Objavljeno: Tor Mar 28, 2006 1:43 pm Naslov sporočila: OneWire in I2C na istem portu |
|
|
Pozdravljeni, rad bi uporabil PORTE na 18F458 za OW (RE2) in I2C (RE0, RE1) komunikacijo. Vsaka posebej deluje brez problema, skupaj pa nikakor. V čem je problem in kako ga rešiti? I2C je softverski.
OW je 6 x senzor temperature (DS 18S20),
I2C je RTC (PCF8583)
LP Vlado _________________ California |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Mar 28, 2006 1:52 pm Naslov sporočila: |
|
|
V čem pišeš? Kaki višjenivojski jeziki bi znali predstavljati problem glede same inicializacije porta. Sam sem brez težav izvedel tovrstno komunikacijo seveda v assemblerju. (mislim, da so primeri še nekje na forumu. V mojih primerih je bil "master" CPU ) _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
California Član

Pridružen-a: Pet 26 Avg 2005 19:48 Prispevkov: 236 Aktiv.: 1.00 Kraj: Hrastnik
|
Objavljeno: Tor Mar 28, 2006 2:29 pm Naslov sporočila: |
|
|
Pišem v mikroBasicu. Predvsem se mi zdi, da je problem v postavitvi PORTE in TRISE, AD morajo biti pa izklopljeni. Ampak kot rečeno senzorji delajo, ura pa tudi. Ko pa zadevo združim mi LCD kaže nekaj tretjega. Ko pridem iz službe prilepim kodo.
LP Vlado _________________ California |
|
Nazaj na vrh |
|
 |
CarpeDiem Član


Pridružen-a: Pon 16 Feb 2004 17:24 Prispevkov: 333 Aktiv.: 1.41 Kraj: Vrhnika
|
Objavljeno: Tor Mar 28, 2006 4:58 pm Naslov sporočila: |
|
|
Kako dela ura PCF8583?
Ne vem zakaj je bila pri meni zadeva vedno netočna. In to ne malo. Poiskušal sem z in brez trimer kondenzatorja. Na koncu sem obupal. Kaj boš z uro, če ni "točna"? |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Mar 28, 2006 5:05 pm Naslov sporočila: |
|
|
CarpeDiem je napisal/a: |
Kako dela ura PCF8583?
Ne vem zakaj je bila pri meni zadeva vedno netočna. In to ne malo. Poiskušal sem z in brez trimer kondenzatorja. Na koncu sem obupal. Kaj boš z uro, če ni "točna"? |
Daj je en kondezator ca. 2p med kristalom ter maso, pa bo ura šla kot je traba.
Sam imam na protobordu eno vezje katerega napajam baterijsko že nekje od konca lanskega leta. Do danes je ura sicer prehitela za slabe 4 minute. Brez tistega kondezatorja pa je pobenila toliko v enem dnevu. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
California Član

Pridružen-a: Pet 26 Avg 2005 19:48 Prispevkov: 236 Aktiv.: 1.00 Kraj: Hrastnik
|
Objavljeno: Tor Mar 28, 2006 6:31 pm Naslov sporočila: |
|
|
Glede točnosti ima Silvo prav, pravilno izbran kondenzator, še boljše trimer in zadeva mora špilat, vendar točnost ure me ne skrbi za razliko od zgoraj omenjenega problema. Če mi ne uspe na Eportu, bom pa I2C prestavil na Aport.
Vseeno vsak nasvet je dobrodošel. Evo še koda (okoli 8k).
Koda: |
program Temp_Read ' 18F458 mikroBasic2.2
symbol OWP = PORTE
symbol PIN = 2
dim T1,T3,T5 as byte[8]
dim T2,T4,T6 as byte[8]
dim b,iCnt,j1,j2,xCnt as byte
dim M0, M1, M2, M3, cnt as byte
dim ID as byte[8]
dim Temp1,Temp2,Temp3,Temp4,Temp5,Temp6 as integer
dim text1,text2,text3,text4,text5,text6 as char[8]
dim txt2,txt3,txt4,txt5,txt6 as char[16]
dim stp2,stp3,stp4,stp5,stp6 as integer
dim K1,K2,K3,K4,K5,K6 as integer
dim C2,C3,C4,C5,C6 as byte
dim D0,D1,D2,D3,D4 as byte
dim naslov as byte
dim Sec as byte
dim Min as byte
dim Hr as byte
dim Day as byte
dim Mn as byte
dim Year as byte
dim txt as char[16]
sub procedure EE_read_2
K2 = EEprom_read($00)
end sub
sub procedure EE_read_3
K3 = EEprom_read($10)
end sub
sub procedure EE_read_4
K4 = EEprom_read($20)
end sub
sub procedure EE_read_5
K5 = EEprom_read($30)
end sub
sub procedure EE_read_6
K6 = EEprom_read($40)
end sub
sub procedure EE_write
EEprom_write(naslov,K1)
end sub
sub procedure K1_KX
if cnt = 3 then K1 = K2 end if
if cnt = 4 then K1 = K3 end if
if cnt = 5 then K1 = K4 end if
if cnt = 6 then K1 = K5 end if
if cnt = 7 then K1 = K6 end if
end sub
sub Procedure SetID(dim xID as byte[8])
for xCnt = 0 to 7
b = xID[xCnt]
ID[xCnt] = b
next xCnt
end sub
sub procedure Ser_Out(dim byref xID as byte[8])
for iCnt = 0 to 7
b = xID[iCnt]
Ow_Write(OWP, PIN, b)
delay_ms(10)
next iCnt
end sub
sub procedure Word2Str(dim count as word)
dim rest as byte
'
rest = count mod 10
M3 = rest + 48
count = count div 10
rest = count mod 10
M2 = rest + 48
count = count div 10
rest = count mod 10
M1 = rest + 48
count = count div 10
rest = count mod 10
M0 = rest + 48
count = count div 10
end sub
sub function GetTemp(dim byref xID as byte[8]) as integer
Ow_Reset(OWP, PIN)
' Ow_Write(OWP, PIN, $CC) ' SKIP-ROM cmd
Ow_Write(OWP, PIN, $55) ' MATCH-ROM cmd
'Delay_us(120)
Ser_Out(xID) ' Send serialnumber
delay_us(120)
Ow_Write(OWP,PIN,$BE) ' READ SCRATCHPAD command [BEh]
j1 = OW_Read(OWP,PIN) ' Read LSB
j2 = OW_Read(OWP,PIN) ' Read MSB
result = (j2 << 8) + j1 ' result in 2's complement form
end sub
sub procedure StartConvert
Ow_Reset(OWP, PIN)
Ow_Write(OWP, PIN, $CC) ' SKIP-ROM cmd , send cmd to all devices
Delay_us(120)
Ow_Write(OWP, PIN, $44) ' CONVERT-TEMP cmd
'Delay_ms(1000) ' conversion delay ...
end sub
sub procedure Init(dim byref xID as byte[8])
ow_reset(OWP,PIN) ' onewire reset signal
ow_write(OWP,PIN,$55) ' MATCH-ROM command
Ser_Out(xID) ' ROM-ID-CODE
delay_us(120)
ow_reset(OWP,PIN) ' onewire reset signal
'ow_write(OWP,PIN,$CC) '
ow_write(OWP,PIN,$4E) '
ow_write(OWP,PIN,$FF) '
ow_write(OWP,PIN,$FF) '
ow_write(OWP,PIN,$7F) ' Set for 12 bit output
end sub
sub procedure Out_LCD_1
intToStr((Temp1 / 2),text1)
Lcd_Cmd(Lcd_Clear)
lcd_out(2,1,"Zunaj")
lcd_out(2,7,text1)
lcd_chr(2,13,",")
if Temp1.0 = 1 then lcd_chr(2,14,"5") else lcd_chr(2,14,"0") end if
lcd_chr( 2, 15, 223)
lcd_chr( 2, 16,"C")
end sub
sub procedure Out_LCD_2
naslov = $00
intToStr((Temp2 / 2),text2)
Lcd_Cmd(Lcd_Clear)
intToStr((K1 / 2),txt2)
lcd_out(1,7,txt2)
lcd_out(2,1,"Zgoraj")
lcd_out(2,7,text2)
lcd_chr(2,13,",")
if Temp2.0 = %1 then lcd_chr(2,14,"5") else lcd_chr(2,14,"0") end if
lcd_chr( 2, 15, 223)
lcd_chr( 2, 16,"C")
end sub
sub procedure Out_LCD_3
naslov = $10
intToStr((Temp3 / 2),text3)
Lcd_Cmd(Lcd_Clear)
intToStr((K1 / 2),txt3)
lcd_out(1,7,txt3)
lcd_out(2,1,"Spodaj")
lcd_out(2,7,text3)
lcd_chr(2,13,",")
if Temp3.0 = %1 then lcd_chr(2,14,"5") else lcd_chr(2,14,"0") end if
lcd_chr( 2, 15, 223)
lcd_chr( 2, 16,"C")
end sub
sub procedure Out_LCD_4
naslov = $20
intToStr((Temp4 / 2),text4)
Lcd_Cmd(Lcd_Clear)
intToStr((K1 / 2),txt4)
lcd_out(1,7,txt4)
lcd_out(2,1,"Pec")
lcd_out(2,7,text4)
lcd_chr(2,13,",")
if Temp3.0 = %1 then lcd_chr(2,14,"5") else lcd_chr(2,14,"0") end if
lcd_chr( 2, 15, 223)
lcd_chr( 2, 16,"C")
end sub
sub procedure Out_LCD_5
naslov = $30
intToStr((Temp5 / 2),text5)
Lcd_Cmd(Lcd_Clear)
intToStr((K1 / 2),txt5)
lcd_out(1,7,txt5)
lcd_out(2,1,"Bojler")
lcd_out(2,7,text5)
lcd_chr(2,13,",")
if Temp3.0 = %1 then lcd_chr(2,14,"5") else lcd_chr(2,14,"0") end if
lcd_chr( 2, 15, 223)
lcd_chr( 2, 16,"C")
end sub
sub procedure Out_LCD_6
naslov = $40
intToStr((Temp6 / 2),text6)
Lcd_Cmd(Lcd_Clear)
intToStr((K1 / 2),txt6)
lcd_out(1,7,txt6)
lcd_out(2,1,"Sonce")
lcd_out(2,7,text6)
lcd_chr(2,13,",")
if Temp3.0 = %1 then lcd_chr(2,14,"5") else lcd_chr(2,14,"0") end if
lcd_chr( 2, 15, 223)
lcd_chr( 2, 16,"C")
end sub
sub procedure Set_Clk
Soft_I2C_Start ' issue start signal
Soft_I2C_Write($A0) ' address PCF8583
delay_ms(5)
Soft_I2C_Write(0) ' start from word at address 0 (configuration word)
delay_ms(5)
Soft_I2C_Write($80) '0 write $80 to config. (pause counter...)
delay_ms(5)
Soft_I2C_Write(0) '1 write 0 to cents word
delay_ms(5)
Soft_I2C_Write(0) '2 write 0 to seconds word
delay_ms(5)
Soft_I2C_Write($59) '3 write $56 to minutes word
delay_ms(5)
Soft_I2C_Write($20+$3) ' 4 $80 is 12hr mode A.M., write $10 to hours word
delay_ms(5) ' $C0 is 12hr mode P.M.,
Soft_I2C_Write($80+$17)' 5 write $80=2006, +$17 to year/date word
delay_ms(5)
Soft_I2C_Write($02) ' 6 write $02 to weekday/month
delay_ms(5)
Soft_I2C_Stop ' issue stop signal
Soft_I2C_Start ' issue start signal
Soft_I2C_Write($A0) ' address PCF8530
delay_ms(5)
Soft_I2C_Write(0) ' start from word at address 0
delay_ms(5)
Soft_I2C_Write(0) ' write 0 to config word (enable counting)
delay_ms(5)
Soft_I2C_Stop ' issue stop signal
end sub
sub procedure Zero_fill(dim byref value as char[10]) ' fill text repesentation
if length(value) = 1 then ' with leading zero
value[2] = value[1]
value[1] = 48
value[0] = 2
end if
end sub
sub procedure Read_time(dim byref Sec as byte,
dim byref Min as byte,
dim byref Hr as byte,
dim byref Day as byte,
dim byref Mn as byte)
soft_i2c_start
delay_us(20)
soft_i2c_write($A0)
delay_us(20)
soft_i2c_write(2)
delay_us(20)
soft_i2c_start
delay_us(20)
soft_i2c_write($A1)
delay_us(20)
sec=soft_i2c_read(1)
min = soft_i2c_read(1)
hr = soft_i2c_read(1)
day =soft_i2c_read(1)
mn = soft_i2c_read(0)
soft_I2C_Stop
end sub
sub procedure Transform_time(dim byref Sec as byte,
dim byref Min as byte,
dim byref Hr as byte,
dim byref Day as byte,
dim byref Mn as byte,
dim byref Year as byte)
sec = ((sec and $F0) >> 4)*10 + (sec and $0F) ' formats date and time
min = ((min and $F0) >> 4)*10 + (min and $0F)
hr = ((hr and $F0) >> 4)*10 + (hr and $0F)
year = ((day and $C0)) >> 6
day = ((day and $30) >> 4)*10 + (day and $0F)
mn = ((mn and $10) >> 4)*10 + (mn and $0F)
end sub
sub procedure Display_time(dim Sec as byte,
dim Min as byte,
dim Hr as byte,
dim Day as byte,
dim Mn as byte,
dim Year as byte)
ByteToStr(day,txt)
Zero_fill(txt)
LCD_Out(1,6,txt)
ByteToStr(mn,txt)
Zero_fill(txt)
LCD_Out(1,9,txt)
LCD_Chr(1,16,52+year)
ByteToStr(hr,txt)
LCD_Out(2,6,txt)
ByteToStr(min,txt)
Zero_fill(txt)
LCD_Out(2,9,txt)
ByteToStr(sec,txt)
Zero_fill(txt)
LCD_Out(2,12,txt)
end sub
main:
'
adcon1 = 255 ' configure RE2 pin as digital I/O
CMCON=7 'comparators on portD off
PORTB = 0 ' initialize PORTB
PORTC = 0 ' initialize PORTC
PORTD = 255 ' initialize PORTD
TRISB = 0 ' designate PORTB as output
TRISC = 0 ' designate PORTC as output
TRISD = 255 ' designate PORTD as input
soft_i2c_config(PORTE,1,0)
Lcd_Init(PORTB)
lcd_cmd( LCD_CURSOR_OFF)
'
T1[0] = 16 '$10
T1[1] = 221 '$DD
T1[2] = 65 '$41
T1[3] = 128 '$80
T1[4] = 0 '$00
T1[5] = 8 '$08
T1[6] = 0 '$00
T1[7] = 254 '$FE
'
T2[0] = 16 '$10
T2[1] = 213 '$D5
T2[2] = 133 '$85
T2[3] = 128 '$80
T2[4] = 0 '$00
T2[5] = 8 '$08
T2[6] = 0 '$00
T2[7] = 98 '$62
T3[0] = $10
T3[1] = $8A
T3[2] = $75
T3[3] = $80
T3[4] = $00
T3[5] = $08
T3[6] = $00
T3[7] = $CE
T4[0] = $10
T4[1] = $B6
T4[2] = $71
T4[3] = $8D
T4[4] = $00
T4[5] = $08
T4[6] = $00
T4[7] = $DC
T5[0] = $10
T5[1] = $60
T5[2] = $61
T5[3] = $80
T5[4] = $00
T5[5] = $08
T5[6] = $00
T5[7] = $4B
T6[0] = $10
T6[1] = $D6
T6[2] = $7A
T6[3] = $80
T6[4] = $00
T6[5] = $08
T6[6] = $00
T6[7] = $F2
cnt = 1
K2 = 46
K3 = 46
K4 = 106
K5 = 90
K6 = 70
while true
SetBit(PORTC,0)
StartConvert
Delay_ms(250) ' 1000
Temp1 = GetTemp(T1)
Temp2 = GetTemp(T2)
Temp3 = GetTemp(T3)
Temp4 = GetTemp(T4)
Temp5 = GetTemp(T5)
Temp6 = GetTemp(T6)
Read_Time(Sec, Min, Hr, Day, Mn) ' read time from RTC(PCF8583)
Transform_Time(Sec, Min, Hr, Day, Mn, Year) ' format data and time
'Display_Time(Sec, Min, Hr, Day, Mn, Year) ' prepare and display on LCD
Lcd_Chr(1,9,".")
Lcd_Chr(1,12,".")
Lcd_Chr(2,9,":")
Lcd_Chr(2,12,":")
Delay_ms(1000) ' wait 1s
D0 = TestBit(PORTD,0) ' testiranje bita (PORTD, 0)
if D0 = 1 ' izbira menija na LCD gor
then inc(cnt) K1_KX
if cnt = 8 then cnt = 1 end if '
end if
D4 = TestBit(PORTD,4) ' testiranje bita (PORTD, 4)
if D4 = 1 ' izbira menija na LCD dol
then dec(cnt) K1_KX
if cnt = 0 then cnt = 7 end if '
end if
'if cnt = 1 then Out_LCD_0 end if
if cnt = 1 then Display_Time(Sec, Min, Hr, Day, Mn, Year) end if
if cnt = 2 then Out_LCD_1 end if
if cnt = 3 then EE_read_2 Out_LCD_2 end if
if cnt = 4 then EE_read_3 Out_LCD_3 end if
if cnt = 5 then EE_read_4 Out_LCD_4 end if
if cnt = 6 then EE_read_5 Out_LCD_5 end if
if cnt = 7 then EE_read_6 Out_LCD_6 end if
D1 = TestBit(PORTD,1) ' testiranje bita (PORTD, 1)
if D1 = 1
then EE_write ' Zapis v EEPROM
end if
D2 = TestBit(PORTD,2) ' testiranje bita (PORTD, 2)
if D2 = 1 ' če je log.1
then Inc(K1) ' Povečaj K2
end if
D3 = TestBit(PORTD,3) ' testiranje bita (PORTD, 3)
if D3 = 1 ' če je log.1
then Dec(K1) ' Zmanjšaj K2
end if
'ZGORAJ
C2 = TestBit(PORTC,2) ' testiranje bita (PORTC, 2)
if C2 = 1 ' če je log.1
then stp2 = K2 ' je setpoint 46
else stp2 = K2 - 1 ' drugače pa 45
end if
if Temp2 > stp2 then ' Primerjava (50:2=25)
clearBit(PORTC, 2) ' Logična 1 na RC2
else
setBit(PORTC, 2) ' Logična 0 na RC2
end if
'SPODAJ
C3 = TestBit(PORTC,3) ' testiranje bita (PORTC, 3)
if C3 = 1 ' če je log.1
then stp3 = K3 ' je setpoint 46
else stp3 = K3 - 1 ' drugače pa 45
end if
if Temp3 > stp3 then ' Primerjava (50:2=25)
clearBit(PORTC, 3) ' Logična 1 na RC3
else
setBit(PORTC, 3) ' Logična 0 na RC3
end if
'Peč
C4 = TestBit(PORTC,4) ' testiranje bita (PORTC, 4)
if C4 = 1 ' če je log.1
then stp4 = K4 ' je setpoint 90
else stp4 = K4 - 10 ' drugače pa 80 H=-5 (10:2)
end if
if Temp4 > stp4 then ' Primerjava (50:2=25)
clearBit(PORTC, 4) ' Logična 1 na RC4
else
setBit(PORTC, 4) ' Logična 0 na RC4
end if
'Bojler
C5 = TestBit(PORTC,5) ' testiranje bita (PORTC, 2)
if C5 = 1 ' če je log.1
then stp5 = K5 ' je setpoint
else stp5 = K5 - 10 ' drugače pa H=-5 (10:2)
end if
if Temp5 > stp5 then ' Primerjava (50:2=25)
clearBit(PORTC, 5) ' Logična 1 na RC5
else
setBit(PORTC, 5) ' Logična 0 na RC5
end if
'Sonce
C6 = TestBit(PORTC,6) ' testiranje bita (PORTC, 6)
if C6 = 1 ' če je log.1
then stp6 = K6 ' je setpoint
else stp6 = K6 + 10 ' drugače pa; H=+5 (10:2)
end if
if Temp6 < stp6 then ' Primerjava (50:2=25)
clearBit(PORTC, 6) ' Logična 1 na RC6
else
setBit(PORTC, 6) ' Logična 0 na RC6
end if
ClearBit(PORTC,0)
Delay_ms(250) ' 1000
wend ' neskoncna zanka
end. |
_________________ California |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Ned 19 Sep 2004 22:04 Prispevkov: 16777193 Aktiv.: 70819.56
|
Objavljeno: Tor Mar 28, 2006 6:48 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
California Član

Pridružen-a: Pet 26 Avg 2005 19:48 Prispevkov: 236 Aktiv.: 1.00 Kraj: Hrastnik
|
Objavljeno: Sre Mar 29, 2006 1:21 pm Naslov sporočila: |
|
|
Sorry borisz.
Silvo, zanima me kako bi ti inicializiral PORTE za ta primer in pa kako bi razvrstil subrutine?
LP Vlado _________________ California |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sre Mar 29, 2006 1:30 pm Naslov sporočila: |
|
|
Žal so zame višjenivojski jeziki "Španksa vas" . Tukaj ti bo moral pomagati kdo drug. _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
California Član

Pridružen-a: Pet 26 Avg 2005 19:48 Prispevkov: 236 Aktiv.: 1.00 Kraj: Hrastnik
|
Objavljeno: Pon Apr 10, 2006 8:06 pm Naslov sporočila: |
|
|
Če ne gre skupaj, gre pa narazen! I2C na portu E, OneWire pa na portu A.
Lep pozdrav! _________________ California |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 493 dni
Powered by phpBB © 2001, 2005 phpBB Group
|