|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14557 Aktiv.: 65.26 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Ned Sep 19, 2010 8:58 pm Naslov sporočila: Mala šola AVR - 5.dan |
|
|
Kot sem že napovedal, v nadaljevanju bomo obdelali 1Wire protokol ter spisali ustrezne procedure. Tisti, ki programirajo v višjenivojskih jezikih načeloma tega ne potrebujejo, kajti procedure je spisal za njih že nekdo drug. Žal pa se v praksi kasneje izkaže, da je dobro, da sam protokol pozna tudi tak programer, sploh tedaj ko zaide v težave. Sam protokol namreč skriva tudi določene pasti, katere mora poznati tudi tak programer.
Sam protokol je načeloma zelo enostaven. Večina timingov ni kritičnih razponi med min ter max so veliki.
Ena iz med zelo pomembnih stvari, ki jih je potrebno upoštevati pri programiranju je, da NIKOLI ne postavljamo logične 1 s pinom definiranim kot izhod. Ko želimo logično 1 vodilo le sprostimo – pin preklopimo na vhod. Na visoko stanje pa ga potem potegne pullup. (seveda, če ga kdo od tistih, ki so priključeni na vodilo ne drži navzdol.) Tako v nobenem primeru ne more priti do 'kurcšlusa' oz. do tega, da bo slabši popustil, oz da bi prišlo v najslabšem primeru do uničenja.
V nadaljevanju bomo videli, da je protokol precej počasen, če tudi bi vzeli min. dopustne timinge. To pomeni, da vzame kar precej procesorskega časa. Poleg tega ga v določenih fazah ne smemo prekinjati. (uporabit prekinitev) kar lahko dodatno otežuje naše programiranje.
Inicializacija – reset:
Sam postopek je zelo enostaven. Master potegne vodilo navzdol za 480 do 960 uS zatem vodilo sprosti in počaka od 15-60 us ter preveri v kakem stanju je vodilo. DS se bo namreč na reset odzval tako, da bo potegnil vodilo navzdol za 60-240uS. Če v tem času zaznamo nizko stanje na vodilu, smo na dobri poti, da je na vodilu kak uporabnik ter se je odzval na reset. Da smo 100% prepričani, da vodilo ni slučajno v kratkem stiku po poteku 240uS še enkrat preverimo vodilo. DS bo vodilo potem spret sprostil. Če je vodilo na visokem stanju, imamo na vodilu goste.
Nadaljevanje sledi...
Opis: |
|
Download |
Ime datoteke: |
ds1820.pdf |
Velikost datoteke: |
151.87 KB |
Downloadano: |
24 krat |
_________________ lp
Silvo |
|
Nazaj na vrh |
|
|
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14557 Aktiv.: 65.26 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Sep 20, 2010 10:27 pm Naslov sporočila: |
|
|
Reset Rutina:
Rutino sem pokomentiral. V prejšnem sporočilu pa tudi opisal. V koliko ni kaj jasno lahko vprašajte.
Koda: |
;---------------------------------
;reset 1wire
;---------------------------------
Reset1W:
sbi Port1Wire ;pin definramo kot izhod z nizkim stanjem (vodilo potegne na nizek nivo
ldi XCas,55 ;register, ki ga koristi spremenjiva pavza
rcall XPavza ;ki je dolžina ca 10uS ter se ponovi tolikokrat koliko je vrednost v registru XCas (ca 550uS
cbi Port1Wire ;sprostimo vodilo
ldi XCas,6 ;
rcall XPavza ;čakamo ca 60uS
ldi tmp,'E' ;v register tmp naložimo "E" z njim označimo stanje vodila (error opis v nadaljevanju)
sbic Pin1Wire ;preverimo če je vodilo visoko
rjmp Err1W ;napaka ni odziva z vodila
ldi XCas,30 ;je nizko, velika verjetnost da se je nekdo na vodilu odzval - če ni v stiku z maso
rcall XPavza ;čakam, da bo vodilo sproščeno
sbis Pin1Wire ;je vodlilo sproščeno?
rjmp Err1W ;ne napaka na vodilu
ldi tmp,'O'
mov DsErr,tmp ;označim, da je vodilo OK
ldi XCas,20
rcall XPavza
ret
Err1W:
ldi XCas,50
rcall XPavza
mov DsErr,tmp
ret
;-----------------------------------------------------------
;Pavza 10uS Oscilator 9,6Mhz
;-----------------------------------------------------------
XPavza:
push r20
ldi r20,28
P_zanka2:
dec r20
brne P_zanka2
pop r20
nop
dec XCas
brne XPavza
ret
|
Nadaljevanje sledi...
_________________ lp
Silvo
Nazadnje urejal/a Silvo Tor Sep 21, 2010 9:44 am; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
|
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14557 Aktiv.: 65.26 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Sep 20, 2010 10:31 pm Naslov sporočila: |
|
|
Po resetu sužnji na vodilu pričakujejo ukaze, ki jih bo poslal mikokontroler v nadaljevanju gospodar. Trajanje enega poslanega bita pri 1wire vodilu imenujemo slot. Iz tabele je razvidno, da je lahko trajanje enega slota od 60 – 120 uS. Minimalni čas med sloti pa 1uS. Za logično 1 bo gospodar vodlilo potegnil na dol v trajanju 1-15 uS nato ga sprostil do konca trajanja slota. Za logično 0 pa mora vodilo biti na nizkem stanju od 60 – 120uS. Iz napisanega je razvidno, da sam protokol časno ni zelo zahteven. Skriva pa nekaj pasti, ki sem jih omenil na začetku. V času pošiljanja ne sme biti vključena kaka prekinitev. Namreč, če bi se prekinitev zgodila ravno v trenutku, ko se recimo pošilja 1 bi prekinitvena rutina lahko iz želene poslane 1 lahko takoj naredila 0 pa je že zmešnava tukaj.
Nadaljevanje sledi...
_________________ lp
Silvo |
|
Nazaj na vrh |
|
|
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14557 Aktiv.: 65.26 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Sep 21, 2010 9:19 am Naslov sporočila: |
|
|
V nadaljevanju bomo spisali oddajno rutino. (rutina, ki bo ob klicu na vodilo poslala 8 bitno vrednost)
Vsako vrstico sem komentiral - za nejasnosti lahko vprašajte...
Koda: |
;---------------------------------
;procedura na 1W vodilo pošlje
;vrednost, ki jo dobi v tmp
;--------------------------------
Tx1W:
ldi stevec,8 ; v register z imenom števec vpišemo 8 ( štel bo poslane bite)
NasBit:
ror tmp ;rotiramo register tmp v desno (izrinjen bo najižji bit ki bo setiral C bit)
brcs Hbit1W ;izrinjen bit je visok skok na rutino, ki pošlje visok bit na vodilo
rcall Bit0_1W ;ne je nizek zato na vodilo pošljemo nizek bit
rjmp StejB ;na štetje poslanih bitov
Hbit1W:
rcall Bit1_1W ;klic rutine ki pošlje na vodilo visok bit
StejB:
dec stevec ;števec -1
brne NasBit ;še ni 0 skok na labelo NasBit
ret ;konec poslanega
Bit1_1W: ;rutina na vodilo pošlje logično 1
sbi Port1Wire ;nizko stanje na vodilu
ldi XCas,1 ;
rcall XPavza ;traja ca 10uS
cbi Port1Wire ;vodilo sprostim
ldi Xcas,7 ;
rcall XPavza ;čakam konec slota ca 70uS
ret
Bit0_1W: ;rutina pošlje na vodilo logično 0
sbi Port1Wire ;nizko stanje na vodili
ldi XCas,7 ;
rcall XPavza ;traja ca 70uS
cbi Port1Wire ;vodilo sprostim
ldi Xcas,1
rcall XPavza ;počamam do konca slota
ret
|
_________________ lp
Silvo |
|
Nazaj na vrh |
|
|
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14557 Aktiv.: 65.26 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Sep 21, 2010 8:26 pm Naslov sporočila: |
|
|
Pozvan suženj bo na poziv začel odgovarjati. Na zgornji fotografiji je timing diagram. Vidimo, da tudi pri sprejemanju tempo diktira gospodar. Pa poglejmo kako to izgleda. Iz timing diagrama je razvidno, da master potegne vodilo do 15uS nadol nato ga sprosti, na kar preveri, kako je stanje na vodilu. V koliko suženj vodilo zadrži spodaj gosporar razume, da mu sporoča '0', v koliko pa je vodilo sproščeno, pa mu sporoča '1' Dolžina slota je tudi pri branju enaka kot pri pisanju. Pa dajmo spisati proceduro.
Koda: |
;-------------------------------------
;procedura izvede branje vodila
;vrednost bo prebrana v tmp
;-------------------------------------
Rx1W:
clr tmp
ldi stevec,8 ;register števec dobi vrednost 8. Štel bo prejete bite
NexBitRx:
sbi Port1Wire ;nizko stanje na vodilo
rcall Pavza2uS ;pavza ca 2uS
cbi Port1Wire ;sprostimo vodilo
ldi Xcas,2
rcall XPavza ;pavza ca 20uS
sbic Pin1Wire ;preverjanje stanja vodila je vodilo nizko?
rjmp Bere1 ;ne suženj pošilja 1
clc ;brisanje bita C
rjmp StejBRx ;na štetje bitov
Bere1:
sec ;vodilo je visoko postavim bit C
StejBRx:
ror tmp ;rotiranje registra tmp v desno - bit ki vstopa je "C"
ldi Xcas,7 ;
rcall Xpavza ;pavza ca 70uS (čakanje do konca slota)
dec stevec ;števec -1
brne NexBitRx ;števec še ni nič na labelo NexBitRx
ret ;konec sprejemanja
;-----------------------------------------------------------
;Pavza 2uS Oscilator 9,6Mhz
;-----------------------------------------------------------
Pavza2uS:
push r20
ldi r20,2
P_zanka4:
dec r20
brne P_zanka4
pop r20
nop
nop
ret
|
Glavne 1wire procedure so spisane. V nadaljevanju bomo iz teh procedur spisali uporabno proceduro za branje DS senzorja.
Nadaljevanje sledi ....
_________________ lp
Silvo |
|
Nazaj na vrh |
|
|
Halon Član
Pridružen-a: Ned 11 Apr 2010 10:02 Prispevkov: 80 Aktiv.: 0.47 Kraj: Topolšica
|
Objavljeno: Tor Sep 21, 2010 9:49 pm Naslov sporočila: |
|
|
Pozdrav!
Dobra in poučna predstavitev.
Zadeva, ki bi jo skoraj vsak želel imeti.
Sam poskušam slediti izobraževanju in programiranju,
žal pa nimam komponent, da bi zadevo spravil v življenje.
Moram čimprej dobiti.
LP
|
|
Nazaj na vrh |
|
|
davide Član
Pridružen-a: Pet 10 Sep 2010 16:45 Prispevkov: 149 Aktiv.: 0.90 Kraj: Savinjska
|
Objavljeno: Pon Feb 28, 2011 10:47 pm Naslov sporočila: |
|
|
Silvo je napisal/a: |
Pozvan suženj bo na poziv začel odgovarjati. Na zgornji fotografiji je timing diagram. Vidimo, da tudi pri sprejemanju tempo diktira gospodar. Pa poglejmo kako to izgleda. Iz timing diagrama je razvidno, da master potegne vodilo do 15uS nadol nato ga sprosti, na kar preveri, kako je stanje na vodilu. V koliko suženj vodilo zadrži spodaj gosporar razume, da mu sporoča '0', v koliko pa je vodilo sproščeno, pa mu sporoča '1' Dolžina slota je tudi pri branju enaka kot pri pisanju. Pa dajmo spisati proceduro.
Koda: |
;-------------------------------------
;procedura izvede branje vodila
;vrednost bo prebrana v tmp
;-------------------------------------
Rx1W:
clr tmp
ldi stevec,8 ;register števec dobi vrednost 8. Štel bo prejete bite
NexBitRx:
sbi Port1Wire ;nizko stanje na vodilo
rcall Pavza2uS ;pavza ca 2uS
cbi Port1Wire ;sprostimo vodilo
ldi Xcas,2
rcall XPavza ;pavza ca 20uS
sbic Pin1Wire ;preverjanje stanja vodila je vodilo nizko?
rjmp Bere1 ;ne suženj pošilja 1
clc ;brisanje bita C
rjmp StejBRx ;na štetje bitov
Bere1:
sec ;vodilo je visoko postavim bit C
StejBRx:
ror tmp ;rotiranje registra tmp v desno - bit ki vstopa je "C"
ldi Xcas,7 ;
rcall Xpavza ;pavza ca 70uS (čakanje do konca slota)
dec stevec ;števec -1
brne NexBitRx ;števec še ni nič na labelo NexBitRx
ret ;konec sprejemanja
;-----------------------------------------------------------
;Pavza 2uS Oscilator 9,6Mhz
;-----------------------------------------------------------
Pavza2uS:
push r20
ldi r20,2
P_zanka4:
dec r20
brne P_zanka4
pop r20
nop
nop
ret
|
Glavne 1wire procedure so spisane. V nadaljevanju bomo iz teh procedur spisali uporabno proceduro za branje DS senzorja.
Nadaljevanje sledi .... |
zanima me katero funkcijo kliče ukaz rjmp Bere1 če je v programu ni?
ali pa kdaj sploh kličemo funkcijo P_zanka4 ali se ta izvede samodejno, sem začetnik in hvala za odgovore!
|
|
Nazaj na vrh |
|
|
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14557 Aktiv.: 65.26 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Feb 28, 2011 11:03 pm Naslov sporočila: |
|
|
"rjmp" je instrukcija, ki izvede skok na labelo, ki je zapisana za njo. V danem primeru skočimo na mesto označeno z "Bere1" ter se program odvija od tam naprej. Za klic procedure se uporablja instrukcija "rcall" razlika med rjmp ter rcall je v tem, da se pri instrukciji rcall PC shrane v sklad program se nadaljuje na labeli napisani za instrukcijo. Ko program naide na ukaz "ret" se iz sklada pobere PC program se nadaljuje za instrukcijo rcall.
PS
Poglej v Help v avr studio.
_________________ lp
Silvo |
|
Nazaj na vrh |
|
|
davide Član
Pridružen-a: Pet 10 Sep 2010 16:45 Prispevkov: 149 Aktiv.: 0.90 Kraj: Savinjska
|
Objavljeno: Tor Mar 01, 2011 12:12 am Naslov sporočila: |
|
|
Silvo je napisal/a: |
"rjmp" je instrukcija, ki izvede skok na labelo, ki je zapisana za njo. V danem primeru skočimo na mesto označeno z "Bere1" ter se program odvija od tam naprej. Za klic procedure se uporablja instrukcija "rcall" razlika med rjmp ter rcall je v tem, da se pri instrukciji rcall PC shrane v sklad program se nadaljuje na labeli napisani za instrukcijo. Ko program naide na ukaz "ret" se iz sklada pobere PC program se nadaljuje za instrukcijo rcall.
PS
Poglej v Help v avr studio. |
hvala za razlago in oprosti nisem videl, da je kje drugje v kodi omenjen Bere1 in mi ni bilo jasno kam gre skok.
Hvala!
|
|
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: 78 dni
Powered by phpBB © 2001, 2005 phpBB Group
|