www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Mala šola AVR - 5.dan

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14557
Aktiv.: 65.26
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Ned Sep 19, 2010 8:58 pm    Naslov sporočila:  Mala šola AVR - 5.dan Odgovori s citatom

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...



ds1820.pdf
 Opis:
Datasheet

Download
 Ime datoteke:  ds1820.pdf
 Velikost datoteke:  151.87 KB
 Downloadano:  24 krat


_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14557
Aktiv.: 65.26
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Pon Sep 20, 2010 10:27 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14557
Aktiv.: 65.26
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Pon Sep 20, 2010 10:31 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14557
Aktiv.: 65.26
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Tor Sep 21, 2010 9:19 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14557
Aktiv.: 65.26
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Tor Sep 21, 2010 8:26 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Halon
Član
Član



Pridružen-a: Ned 11 Apr 2010 10:02
Prispevkov: 80
Aktiv.: 0.47
Kraj: Topolšica

PrispevekObjavljeno: Tor Sep 21, 2010 9:49 pm    Naslov sporočila:   Odgovori s citatom

Pozdrav!
Dobra in poučna predstavitev. Applause
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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
davide
Član
Član



Pridružen-a: Pet 10 Sep 2010 16:45
Prispevkov: 149
Aktiv.: 0.90
Kraj: Savinjska

PrispevekObjavljeno: Pon Feb 28, 2011 10:47 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14557
Aktiv.: 65.26
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Pon Feb 28, 2011 11:03 pm    Naslov sporočila:   Odgovori s citatom

"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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
davide
Član
Član



Pridružen-a: Pet 10 Sep 2010 16:45
Prispevkov: 149
Aktiv.: 0.90
Kraj: Savinjska

PrispevekObjavljeno: Tor Mar 01, 2011 12:12 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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