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


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 17.03 Kraj: Črnuče
|
Objavljeno: Ned Avg 12, 2012 1:27 pm Naslov sporočila: DS1820 se noče pogovarjat z mano |
|
|
Z protoboardom na katerem je LPC1343 skušam vzpostavit komunikacijo z DS1820.
DS je vezan na +3,3V, med podatkovnim izhodom in + nogico je 1K upor (trenutno)
Uporabljam 3 povezave na DS1820.
Z ukazom uspešno pošljem reset pulz, na katerega DS odgovori.
Nato po ~ 500us pošljem ukaz 0x33 - read rom, na katero pa DS1820 ne odgovori.
DS je dober, saj od njega na drugi testni plošči (druga platforma) dobim odgovor.
Poizkusil sem na delujoči platformi izmeriti čase in potem oblikovati pulze za LPC, kot je vidno z oscilograma se na oko skoraj ne vidi razlike, le DS ne odgovarja.
Edina razlika je, da na Easypic plošči napajam DS1820 z 5V.
V bistvu mi je zmanjkalo idej kaj storiti. Kako dolge pulze - za izpis (1 ali 0) ukaza uporabljate?
Opis: |
Oscilogram - rumeni deluje na Easypic5 plošči - zeleni ni odziva po poizvedbi |
|
 Download |
Ime datoteke: |
razlika.png |
Velikost datoteke: |
21.29 KB |
Downloadano: |
46 krat |
_________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
 |
xsyt Član


Pridružen-a: Sre 28 Maj 2008 22:19 Prispevkov: 1346 Aktiv.: 6.48 Kraj: Slov.Bistrica
|
Objavljeno: Ned Avg 12, 2012 2:35 pm Naslov sporočila: |
|
|
Da ti tale tvoj LPC ne drži potem visokega stanja?
_________________ If you're in control, you aren't going fast enough |
|
Nazaj na vrh |
|
 |
Musty Član



Pridružen-a: Sob 28 Apr 2007 8:54 Prispevkov: 1575 Aktiv.: 7.13 Kraj: Rače
|
Objavljeno: Ned Avg 12, 2012 3:38 pm Naslov sporočila: |
|
|
DS18B20 dela brez problema z 3.3V. Tudi na par metrov kabla.
|
|
Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 17.03 Kraj: Črnuče
|
Objavljeno: Ned Avg 12, 2012 3:47 pm Naslov sporočila: |
|
|
Nebi smel.
Output postavim najprej na 1 nato pa gre DIR register na 0 -> pin bi moral biti vhod.
Koda: |
void write_0(){
DS1820_IO(1); // Pin DS1820 je izhod
DS1820_Data(0); // Izhod na 0
Delay_us(85);
DS1820_Data(1); // Izhod na 1
Delay_us(21);
DS1820_IO(0); // Pin DS1820 je vhod
|
Koda: |
// Pin da na izhod 1 ali 0
#define DS1820_Data(x) ((x) ? (LPC_GPIO2->DATA |= PIN_DS1820) : (LPC_GPIO2->DATA &= ~PIN_DS1820) );
// Pin je definiran kot izhod - 1 / 0 - vhod
#define DS1820_IO(x) ((x) ? (LPC_GPIO2->DIR |= (PIN_DS1820)) : (LPC_GPIO2->DIR &= ~(PIN_DS1820)) );
|
_________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
 |
tiger Član

Pridružen-a: Čet 05 Feb 2004 0:22 Prispevkov: 1161 Aktiv.: 4.90
|
Objavljeno: Ned Avg 12, 2012 3:51 pm Naslov sporočila: |
|
|
Probaj povečat vrednost pull up upora iz 1K na ~3K.
Po data sheet je ta upor 4.7K za 5V napajanje.
LP
|
|
Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 17.03 Kraj: Črnuče
|
Objavljeno: Ned Avg 12, 2012 4:31 pm Naslov sporočila: |
|
|
Ma sem imel že 4,7K, pa 2,7K, na testni plošči za pice je ta upor kar 1K (je fiksen plošča pa ima namenski konektor za DS1820) Tako da mislim, da to ni tako kritično.
Zahteva tok do 1.5mA, pri 3.3V in 1K je to 3,3mA Tako da upor ni pretirano majhen.
_________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 17.03 Kraj: Črnuče
|
Objavljeno: Pon Avg 13, 2012 8:47 pm Naslov sporočila: |
|
|
Sem poizkušal še Pull up/down upore izklopit na portu, pa ni nič pomagalo.
Nič mi ni jasno.....
_________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.01
|
Objavljeno: Pon Avg 13, 2012 9:22 pm Naslov sporočila: |
|
|
Ali si že kdaj komuniciral s kakšnim DS1820?
Če ne:
Pred vsako komunikacijo najprej resetiraš DS s 700us trajajočo "0".
Ko daš pin spet na vhod, ti mora DS odgovoriti tako, da on povleče pin na "0".
Šele potem komuniciraš z njim.
Koda: |
pDSreset
;DS VHOD
BSF STATUS,RP0 ;banka 1
bsf ioDSpin ;TRISC4= 1 = VHOD
bcf STATUS,RP0 ;banka 0
nop
; DS IZHOD
bcf ioDSpin
BSF STATUS,RP0 ;banka 1
bcf ioDSpin ;TRISC4= 0 = IZHOD
bcf STATUS,RP0 ;banka 0
movlw .139
call Cak5Wus ;caka 5*(W+1) = zakasnitev 700us
;DS VHOD
BSF STATUS,RP0 ;banka 1
bsf ioDSpin ;TRISC4= 1 = VHOD
bcf STATUS,RP0 ;banka 0
movlw .13
call Cak5Wus ; caka 5*(W+1) = 70us
btfss ioDSpin
bsf ioDSpin
movlw .126
call Cak5Wus ; caka 5*(W+1) = 630
RETURN
;========================================================================================
;========================================================================================
pDSpisi ;podprogram za pisanje vrednosti v DS
; kličem z 8-bitnim podatkom v W
movwf PODATEK ;spremenljivka katera ima podatek za na senzor
movlw .8
movwf STEVEC ; da zapise vseh osem bitov
pDSisiZ ; zanka
; DS IZHOD
bcf ioDSpin
BSF STATUS,RP0 ;banka 1
bcf ioDSpin ;TRISC4= 0 = IZHOD
bcf STATUS,RP0 ;banka 0
;---- Sedaj je izhod 0
NOP
NOP
NOP
NOP
NOP
rrf PODATEK,F ;vrtim v desno in pogledam kak je izrinjen bit
BSF STATUS,RP0
btfsc STATUS,C ;če je 0 preskočim naslednji ukaz
bsf ioDSpin ;RC4=1
BCF STATUS,RP0
;----- v enajsti us gre bodisi na 1 bodisi ostane 0.
movlw .17
call Cak5Wus ; caka 5*(W+1) = 90us = pavza 60...120us
;DS IZHOD
BSF STATUS,RP0 ;banka 1
bsf ioDSpin ;TRISC4= 1 = VHOD
bcf STATUS,RP0 ;banka 0
NOP
NOP
NOP
NOP
decfsz STEVEC,F ;sem prebral vseh osem bitov
goto pDSisiZ ;nisem, zato ponovim branje ; ZANKA
BCF STATUS,RP0
return
;========================================================================================
;========================================================================================
pDSberi ;podprogram za branje podatkov iz DSeeproma
movlw .8
movwf STEVEC ; da prebere vseh osem bitov
CLRF PODATEK
pDSberiZ
; DS IZHOD
bcf ioDSpin
BSF STATUS,RP0 ;banka 1
bcf ioDSpin ;TRISC4= 0 = IZHOD
bcf STATUS,RP0 ;banka 0
; ------- zacetek, pin je skočil na 0
NOP
NOP
;DS VHOD
BSF STATUS,RP0 ;banka 1
bsf ioDSpin ;TRISC4= 1 = VHOD
bcf STATUS,RP0 ;banka 0
; ------ minilo je 6us, pin je spet vhod
NOP
NOP
NOP
NOP
NOP
rrf PODATEK,F
bcf PODATEK,7
btfsc ioDSpin ; 13-a mikrosekunda - preberem, kaj je poslal senzor
bsf PODATEK,7
movlw .17
call Cak5Wus ; caka 5*(W+1) = 90us = pavza 60...120us
decfsz STEVEC,F
goto pDSberiZ
return |
Tvojih 85us čakanja pri pisanju je sumljivih. Poglej moje pavze. Sicer gre za PIC zbirnik, a dogajanje se jasno vidi.
Na začetku ne kompliciraš z "Match ID", zato delaš s "Skip ID" .
_________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 17.03 Kraj: Črnuče
|
Objavljeno: Pon Avg 13, 2012 10:27 pm Naslov sporočila: |
|
|
Seveda, da ne komuniciram, zato pa pišem tule.
V bistvu naredim reset, DS se odzove z enim pulzom na 0 .
Potem pa poizkušam od njega dobit samo številko. (SerialNumber) (pošljem mu 0x33. To je vse. Samo na ukaz 0x33 ne dobim odgovora.
Če prav berem, ti postaviš Pin na 0
počakaš 5 NOP ukazov (ne vem kakšen si imel kristal), greš gledat kakšen bi moral biti izhod (0 ali 1) Pin postaviš na 1, če je to potrebno, počakaš 90us, in zadevo ponoviš. Tako so tvoji pulzi dolgi rahlo več kot 90us, s tem, da je 0 rahlo daljša od 1. (pač za tistih 5 nop-ov
Mojo zadnjo verzijo (sem jih poizkusil kar nekaj - verjemi mi) sem poizkusil izdelati po datasheetu - Figure 11.
Pisanje 0: Potegneš signal na 0 za čas, ki je daljši od 60us (sem poizkusil od 60 do 120us), na koncu signal sprostiš, da ga pull-up upor potegne na 1
Pisanje1, potegneš signal na 0 za čas rahlo večji od 1us, nato pa na 1 spet za več kot 60us
Pa nič...
Koda deluje, saj jo spremljam na osciloskopu - sem že prej pripel eno sliko. Pričakoval bi, da se mi čip oglasi. Nič drugega zaenkrat.
_________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.01
|
Objavljeno: Pon Avg 13, 2012 11:10 pm Naslov sporočila: |
|
|
Uf, pozabil napisati ...
1 cikel je 1us.
PISIds
Za pisanje 8ih bitov podatka v zanki 8-krat ponovi zaporedje:
[
- pin na izhod in na 0
- 11us čakanja
- če želim vpisati "1", postane pin vhod, da ga pull-up postavi na "1", sicer ostane izhod
- 90us čakanja
- pin postane vhod (gre na "1")
- počaka vsaj 10us (vmes preveri, če je že poslal 8 bitov ...)
]
BERIds
Za branje 8ih bitov podatka v zanki 8-krat ponovi zaporedje:
[
- pin na izhod in na 0
- 6us čakanja
- pin postane vhod, da ga pull-up postavi na "1"
- 6us čakanja, oziroma v trinajsti us preberem vhod, kaj je senzor poslal
- 90us čakanja
]
Pri tako kratkih časih se razne 6us pavze izvede z NOP ukazi (prazen ukaz, ko MCU ne počne ničesar).
Točnost mikrosekund okrog 90us ni pomembna, dogodki ob 6us, 11us, 13us pa naj bi se zgodili ravno takrat. Torej je pomemben samo trenutek, ko gre za vsak bit prvič na "0" in dogajanje prvih 13us v tem bitu, potem pa tistih približno 90us pavze določa splošno hitrost komunikacije za branje/pisanje osmih bitov. Tistih 90us je dokaj ohlapnih (60..120us), zato lahko v miru shraniš prebranih 8 bitov v neko spremenljivko in ponoviš klic zanke za branje novih 8 bitov. V miru lahko tudi shraniš spremenljivko v spremenljivko, ki nastopa znotraj zanke za pošiljanje (da ne uničiš originala).
Koda: |
call RESET
movlw 0xCC ;preskoci branje ID
call PISIds
movlw 0x44 ; ukaz za merjenje temperature (ConvertT)
call PISIds ;ukaz pošljem na senzor
Čez 0,7s ali kasneje pošlješ zahtevo za branje temperature
call RESET
movlw 0xCC ;preskoci branje ID
call PISIds
movlw 0xBE ;ukaz za branje DS pomnilnika "SCRATCPAD"
call PISIds
call BERIds
movwf ZACASNA ;LSB temp., TEMPERATURA ; shrani 8 bitov v ZACASNA
call BERIds
movwf ZACASNA1 ;MSB temp., PREDZNAK ; shrani 8 bitov v ZACASNA1 |
Morda se DS ne odzove, ker mu za resetom ne ukažeš "Skip Match ID" in ne ve, da se pogovarjaš z njim. Šele po tem ukazu lahko ukažeš ostalo.
Če imaš več DS-jev, moraš pa za resetom najprej poslati ukaz 0x55 (Match ROM), nato 8 bytov ID , nato pa ukazuješ naprej samo še izbranemu DS-ju (ostali ignorirajo ukaze do naslednjega reseta)
Koda: |
pPrimROM ; primerjaj ROM
movf DR,W ;v delovni register W vpišem prvih osem bitov iz senzorja
call PISIds ; pošljem prvih 8 bitov na DS
movf byte1,W ;vpišem drugih osem bitov
call PISIds
movf byte2,W ;vpišem tretjih osem bitov
call PISIds
movf byte3,W
call PISIds
movf byte4,W
call PISIds
movf byte5,W
call PISIds
movf byte6,W
call PISIds
movf CRC,W
call PISIds
return |
Da pa sploh izveš ID od senzorja, ga moraš najprej prebrati in potem shraniti prebrane byte nekam v tabelo znotraj EEprom-a, da lahko prebereš ID od naslednjega senzorja.
Koda: |
ReadROM ;preberem ROM senzorja neglade na njegov ID, zato moram priklopiti en senzor
CLRF PCLATH
call RESET
movlw 0x33 ;ukaz za na senzor, kateri bere ROM neglede na ID
call PISIds ;podprogram za pošiljanje ukazov na senzor
call BERIds ;podprogram za branje podatkov iz senzorja, preberem podatke
movwf DR ;v spremenljivko vpišem prvih osem bitov iz senzorja
call BERIds
movwf byte1 ;vpišem drugih osem bitov
call BERIds
movwf byte2
call BERIds
movwf byte3
call BERIds
movwf byte4
call BERIds
movwf byte5
call BERIds
movwf byte6
call BERIds
movwf CRC ;vpišem pripadnost družini, tako imam 8x8=64bitov
return |
_________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 17.03 Kraj: Črnuče
|
Objavljeno: Tor Avg 14, 2012 9:28 am Naslov sporočila: |
|
|
Igo hvala za opise bom popoldne še enkrat poizkusil.
Drugače pa: z dS1820 sem že delal, imam nekaj projektov, ki mi delujejo (tudi z 5 senzorji na enem vhodu). Zaporedje ukazov mi je tudi jasno. Žal so projekti, ki mi delajo napisani v Basicu za Pic-e, kjer so že spisane funkcije. Tule pa zadevo delam s C in LPC, funkcije, ki sem jih staknil pa nekako ne delujejo.
Sem napisal programček v Basicu, ki naredi točno isto, kar hočem doseči na LPC-ju. Torej samo Reset in preverjanje ID številke. Tam DS lepo odgovori. Tule pa ne.
Poročam
_________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.01
|
Objavljeno: Tor Avg 14, 2012 12:33 pm Naslov sporočila: |
|
|
DS ničesar ne pošlje sam od sebe. Vedno mu MCU določi začetek vsakega bita posebej. MCU povleče pin na 0 in takrat se začnejo šteti mikrosekunde. Praktično vse se zgodi v prvih 20us v katere se, poleg praznih NOP korakov, štejejo tudi koraki, ki jih MCU potrebuje, da preklopi pin iz vhoda v izhod oziroma obratno. Nadaljnjih 90us (oziroma ohlapnih 60 do 120) pavze je za premetavanje (shift) bitov in preverjanje števca 8ih bitov ... da se zanka v miru vrti.
In potem spet MCU poskrbi za prehod iz 1 v 0 za začetek naslednjega bita.
Ko konča pisanje byta, v miru pripraviš novo spremenljivko in poženeš zanko za novo pošiljanje.
Ko pa prebereš byte, v miru shraniš podatek v spremenljivko, nato bereš dalje.
Tisto "v miru" ni mišljeno, da vmes bereš ali vpisuješ po EEprom-u od MCU-ja, ampak delaš s spremenljivkami v RAM-u. Jaz imam v RAM-u spremenljivke npr. od naslova 0x30 do 0x3F za RAMvEE in EEvRAM. Najprej v zanki iz željenih naslovov v EE preberem podatke in jih shranim v RAM, nato jih pošljem po I2C, 1-Wire, 232 , ... . Ko pa sprejemam nekaj, spet v zanki shranjujem podatke v RAM in jih kasneje obdelam. Komunikacija z biti in byti tako vedno poteka znotraj predvidenih časovnih okvirov.
_________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 17.03 Kraj: Črnuče
|
Objavljeno: Pon Avg 20, 2012 4:50 pm Naslov sporočila: |
|
|
Citiram: |
DS ničesar ne pošlje sam od sebe. Vedno mu MCU določi začetek vsakega bita posebej. MCU povleče pin na 0 in takrat se začnejo šteti mikrosekunde |
Ja, tole je tisto, kar me je presenetilo. Ne vem zakaj. Po eni strani je popolnoma logično. Glede na to, da ni prisoten signal ure s katerim bi se DS in procesor lahko sinhronizirala.
Presenetila me je tudi "kratkost" odgovorov. Če gledam na osciloskopu celotno poizvedbo (reset, pošiljanje h33 in nato še klicanje odgovorov) so razlike med signaloma, ko je v vezju DS1820 ali pa če ga ni tako majhne, da se jih skoraj ne vidi. Je treba čas skrajšat, da se vidi kakšne odgovore.
DS torej že lepo odgovarja. (Pravzaprav oba). Odgovore sem primerjal s tistimi, ki jih dobim preko easypic razvojne plošče.
Hvala za trud
_________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
 |
dgrude Član

Pridružen-a: Sob 15 Nov 2008 13:44 Prispevkov: 203 Aktiv.: 1.01 Kraj: Velike Lašče
|
|
Nazaj na vrh |
|
 |
rafaellsi Član


Pridružen-a: Ned 11 Sep 2011 18:54 Prispevkov: 479 Aktiv.: 2.86 Kraj: Radovljica
|
Objavljeno: Čet Sep 19, 2013 2:16 pm Naslov sporočila: |
|
|
Sezor potrebuje določen čas za konverzijo temperature (cca. 750ms, oz. glej datasheet) ....
|
|
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: 494 dni
Powered by phpBB © 2001, 2005 phpBB Group
|