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 - 6.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: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sre Sep 22, 2010 8:18 pm    Naslov sporočila:  Mala šola AVR - 6.dan Odgovori s citatom

Danes bom malo krajši. Čez dan ni bilo dosti časa. Čaka me še nočna ...

Prejšnji dan sem omenil, da imamo spisane vse glavne procedure za komunikacijo na 1Wire vodilu. Pa poglejmo, če je res oz poglejmo si primer branja DS1820 v primeru, ko je na vodilu sam ter ne preverjamo ID-ja.



Iz tabele je razvidno, da potrebujemo reset proceduro z preverjanjem prisotnosti, proceduro za pošiljanje ter proceduro za sprejemanje. Vse smo že napisali. Torej potrebno je vse to združit v eno proceduro. Pa poglejmo kako lahko to izgleda.


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: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sre Sep 22, 2010 8:27 pm    Naslov sporočila:   Odgovori s citatom

Izgled procedure za branje scratchpad-a DS1820.



Koda:
;--------------------------------
;Branje scratchpad-a brez id-ja
;--------------------------------
Beri1W:
   rcall Reset1W          ;klic reset procedure
   ldi tmp,0xCC            ;v tmp register vpišem 0xCC
   rcall Tx1W               ;ter to pošljem na vodilo. (senzor poslano razume kot ignoriranje branja ID-ja
   ldi tmp,0x44            ;
   rcall Tx1W               ;pošljem 0x44 kar razume kot začetek konverzije temperature
   rcall Reset1W            ;reset ter preverjanje prisotnosti
   ldi tmp,0xCC            
   rcall Tx1W               ;ignoriranje branja ID-ja
   ldi tmp,0xBE            ;
   rcall Tx1W               ;ukaz razume kot branje scratchpad-a
   rcall SprejmiSB         ;procedura bere vsebino scratchpad-a ter ga vpisuje v sram
   rcall Reset1W
   ret

;---------------------------------
;procedura bere scratchpad
;ter podatke zapisuje
;inidrekt v sram
;---------------------------------
SprejmiSB:
   ldi tmp2,9
   clr XH
   ldi XL,LsbT
NaprejSB:
   rcall Rx1W
   st X+,tmp
   dec tmp2
   brne NaprejSB
   ret


Drugi del indirektnega naslavlanja bom razložil jutri - danes nimam več časa.

_________________
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: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Čet Sep 23, 2010 7:26 pm    Naslov sporočila:   Odgovori s citatom

Najprej razlaga drugega dela procedure, ki je nisem utegnil pokomentirati včeraj. Za lažjo razlago se za moment vrnemo "prvi dan". Iz datasheta je razvidno, da ima Tiny13 64 baytov SRAM-a. To je dejansko 8 bitni pomnilnik z razliko od EEproma se mu ob izklopu napetosti vrednosti ne ohranijo. Do njega lahko dostopamo z instukcijami LDS in STS v danem primeru pa indirektno preko registrov, ki omogočajo indirektni dostop. V proceduri sem uporabil X register. Če pogledamo v datashet mikrokontrolerja vidimo, da gre dejansko za dva splošnonamenska registra, ki imata poleg osnovne možnosti registra, še dodatno možnost indirektnega naslavljanja. Postopek indirektnega naslavljanja je sicer precej preprost. V registra XL (spodnji biti) ter XH (zgornji biti) vpišemo lokacijo SRAM-a v katerega želimo nekaj vpisati oz. iz njega nekaj prebrati. Pri avr-jih se SRAM začne z lokacijo 0x60 velikost pa je lahko različna glede na mikrokontroler. Zaradi lažjega programiranja sem tej lokaciji na začetku programa dodelil ime equ LsbT=0x60. Torej lokacijo vpišemo v XL in XH register. V nadaljevanju s pomočjo instrukcije ST X+, reg shranemo vrednost ki je v registru reg v SRAM. '+' bo po končanem vpisu povečal vrednost v registru X za 1 kar pomeni, da nasledni vpis sledi v naslednjo lokacijo.
_________________
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: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Čet Sep 23, 2010 7:51 pm    Naslov sporočila:   Odgovori s citatom

Sedaj imamo spisano vse, za branje senzorja ter pošiljanje podatkov na serijski port računalnika. Naša glavna rutina je dolga celih 6 vrstic. Kot sem že omenil, vse podrutine lahko sedaj shranemo v posebno datoteko, procedure, oz procedure spremenimo v makroje. Tako lahko sedaj te procedure koristimo tudi v drugih programih.

Koda:
GlZanka:
   rcall Beri1W            ;procedura Izvede branje DS1820 ter poslane podatke shranje v sram Prvi poslan byte na 0x60 naslednji na 0x61....vseh 9 baytov
   lds tmp,LsbT            ;preberem v tmp 1.podatek iz srama
   rcall SerialTx         ;ga pošljem na serijski port
   mov tmp,DsErr            ;v registru DsErr je shranjeno stanje vodilia  "O' ok 'E' Err. Informacija je namenjena računalniškem vmesniku
   rcall SerialTx         ;podatek pošljem na serijski port
   rcall Pavza1S            ;pavza pred naslednjo meritvijo
   rjmp GlZanka


_________________
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: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Čet Sep 23, 2010 8:11 pm    Naslov sporočila:   Odgovori s citatom

Pa poglejmo katere podatke smo shranili v SRAM oz kaj nam sploh lahko pošlje DS1820. Blok podatkov je sestavljen iz 9-tih 8 bitnih registrov.
Prva dva poslana bajta sta podatki o izmerjeni temperaturi. (LSB,MSB)
Sledita dva bajta eeproma TH/USER BYTE 1,TL/USER BYTE 2
Sledita dva rezervna bajta (prebrano kot 0xff)
Še dva bajta sta COUNT REMAIN, COUNT PER °C s pomočjo katerih se da izračunat temperatura natančneje od 0.5°C.
Zadnji bajt je CRC





Tukaj je sedaj naš celoten program.


Koda:
.org 0x0
   rjmp GlProg

.org 0x0A
   
;------------------------------------------------
;glavni program
;Osnovni program iz katerega se potem kličejo
;podrutine
;------------------------------------------------
GlProg:
   ldi tmp,low(ramend)
   out SPL,tmp                  ;določitev sklada

   sbi PortTx                  ;določim port, ki bo uporabljen za ser.pošiljanje kot izhod




GlZanka:
   rcall Beri1W            ;procedura Izvede branje DS1820 ter poslane podatke shranje v sram Prvi poslan byte na 0x60 naslednji na 0x61....vseh 9 baytov
   lds tmp,LsbT            ;preberem v tmp 1.podatek iz srama
   rcall SerialTx         ;ga pošljem na serijski port
   mov tmp,DsErr            ;v registru DsErr je shranjeno stanje vodilia  "O' ok 'E' Err. Informacija je namenjena računalniškem vmesniku
   rcall SerialTx         ;podatek pošljem na serijski port
   rcall Pavza1S            ;pavza pred naslednjo meritvijo
   rjmp GlZanka


;****************************************************************
;razne procedure
;****************************************************************

Tekst1:
.db "*** www.elektronik.si Forum o elektroniki in racunalnistvu ***",0

Napis1:
   ldi ZL,low(Tekst1*2)
   ldi ZH,high(Tekst1*2)
   rjmp PosljiRS232

PosljiRS232:
   lpm tmp,Z
   tst tmp
   breq KonecTxt
   rcall SerialTx
   inc ZL
   brne PC+2
   inc ZH
   rjmp PosljiRS232


KonecTxt:
   ret

;serijska komunikacija
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

;-----------------------------------------------------
;serijsko pošiljanje
;procedura ob klicu pošlje na serijski port byte, ki ga
;dobi v register tmp
;hitrost 2400-N-1  (2400bps 0-paritetni 1 stop bit)
;------------------------------------------------------
SerialTx:
   ldi stevec,8         ;poslano bo 8 bitov
   cbi TxPin               ;tx pin na nizko stanje
   rcall Pavza415uS   ;pavza enega bita (start bit)
NextBit:
   ror tmp                  ;shift desno Izrinjen bit bo poslan
   brcs Bit1               ;če je C postavljen se pošlje 1
   cbi TxPin               ;sicer 0
   rjmp StejBit         ;
Bit1:
   sbi TxPin
StejBit:
   rcall Pavza415uS   ;pavza dolžine trajanja bita
   dec stevec            ;stevec -1
   brne NextBit         ;če rezultat še ni 0 potem nadaljuj
   sbi TxPin               ;konec bitov
   rcall Pavza415uS   ;stop bit    
   ret


;-----------------------------------------------------------
;Pavza 415uS   Oscilator 9,6Mhz
;-----------------------------------------------------------
Pavza415uS:
   push r20
   push r21
   ldi r20,38
   ldi r21,6
P_zanka:
   dec r20
   brne P_zanka
   dec r21
   brne P_zanka
   pop r21
   pop r20
   nop
   nop
   ret




;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;1wire rutine
;------------------------------
;1 wire rutine
;------------------------------
;*********************************

;--------------------------------
;Branje scoreboarda brez id-ja
;--------------------------------
Beri1WId:
   rcall Reset1W
   ldi tmp,0x33
   rcall Tx1W
   rcall SprejmiId
   rcall Reset1W
   sts DsId+8,DsErr
   ret

;---------------------------------
;procedura bere scratchpad
;ter podatke zapisuje
;inidrekt v sram
;---------------------------------
SprejmiId:
   ldi tmp2,9
   clr XH
   ldi XL,DsId
NaprejId:
   rcall Rx1W
   st X+,tmp
   dec tmp2
   brne NaprejSB
   ret




;--------------------------------
;Branje scratchpad-a brez id-ja
;--------------------------------
Beri1W:
   rcall Reset1W          ;klic reset procedure
   ldi tmp,0xCC            ;v tmp register vpišem 0xCC
   rcall Tx1W               ;ter to pošljem na vodilo. (senzor poslano razume kot ignoriranje branja ID-ja
   ldi tmp,0x44            ;
   rcall Tx1W               ;pošljem 0x44 kar razume kot začetek konverzije temperature
   rcall Reset1W            ;reset ter preverjanje prisotnosti
   ldi tmp,0xCC            
   rcall Tx1W               ;ignoriranje branja ID-ja
   ldi tmp,0xBE            ;
   rcall Tx1W               ;ukaz razume kot branje scratchpad-a
   rcall SprejmiSB         ;procedura bere vsebino scratchpad-a ter ga vpisuje v sram
   rcall Reset1W
   ret

;---------------------------------
;procedura bere scratchpad
;ter podatke zapisuje
;inidrekt v sram
;---------------------------------
SprejmiSB:
   ldi tmp2,9
   clr XH
   ldi XL,LsbT
NaprejSB:
   rcall Rx1W
   st X+,tmp
   dec tmp2
   brne NaprejSB
   ret

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

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



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

   




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





;-----------------------------------------------------------
;Pavza 1S   Oscilator 9,6Mhz
;-----------------------------------------------------------
Pavza1S:
   push r20
   push r21
   push r22
   ldi r20,96
   ldi r21,180
   ldi r22,49
P_zanka1:
   dec r20
   brne P_zanka1
   dec r21
   brne P_zanka1
   dec r22
   brne P_zanka1
   pop r22
   pop r21
   pop r20
   nop
   ret



Če sedaj sprogramirano mikrokontrloler, priklopimo senzor ter se povežemo z računalnikom preko serijskega porta. (USB + FT232 ali sličen) ter poćenemo Bray-ev terminal, bo rezultat nekaj takega.

_________________
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: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Čet Sep 23, 2010 8:15 pm    Naslov sporočila:   Odgovori s citatom



Prvi poslani bajt je LSB temperature sledi bajt stanja vodila 'O' ok 'E' napaka. Na screenshotu testiranje. 'E' je bil poslan, ko sem vodilo kratko sklenil na maso oz. sem senzor snel v protoborda.

_________________
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: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Pet Sep 24, 2010 2:59 pm    Naslov sporočila:   Odgovori s citatom

Prišel sem na idejo, da iz tega, kar smo naredili do sedaj naredimo uporabno zadevo. Recimo nek termostat, kateremu temperaturo ne prestavljamo pogosto, poleg tega pa ne potrebujemo stalnega prikaza le te. Tipičen tak termostat je cevni termostat za vklop črpalke centralne kurjave. (temperaturo praktično nastavimo le enkrat, prav tako ne potrebujemo dodatnega prikaza temperature.) Poleg tega so cevni termostati dokaj nenatančni. Prav tako jih večini ne moreš nastaviti diference. Z "našim" saj slednje ne bi smelo biti problem.

Kaj imamo do sedaj:
- spisane vse rutine za 1Wire komunikacijo
- komunikacija v smeri mikrokontroler -> PC
- možnost prejema vseh podatkov, ki jih pošilja DS na PC

Za termostat nam še manjka:
- komunikacija v smer PC - mikrokontroler (možnost za nastavitev)
- shranitev nastavljenih vrednosti v eeprom
- upravljanje z enim pinom, ki bo krmilil rele

Prostih pinov imamo za enkrat še dovolj. Tudi pomnilnika imamo še več kot dovolj. Do sedaj ga je porabljenega slabih 50%.



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: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Pet Sep 24, 2010 7:02 pm    Naslov sporočila:   Odgovori s citatom

Ker pač uporabljen mikrokontroler nima hardwerskega USART-a bomo morali tudi za sprejemni del spisati svojo proceduro. Procedura mora delati zelo podobno kot oddajna, le da tukaj namesto pošiljamo sprejemamo.

Koda:
;-----------------------------------------------------
;serijsko sprejemanje
; 2400 0 1
;-----------------------------------------------------
SerialRx:
   clr tmp
   ldi stevec,8
   rcall Pavza207uS   ;polovica start bita
NasBRx:                     ;naslednji bit rx
   rcall Pavza415uS
   sec                  ;C bit =1
   sbic RxPin      ;je stanje na rx pinu nizko
   rjmp RxB1         ;ne skok na del, ki shrani sperejeti bit
   clc                  ; stanje na rx pinu je nizko    C bit = 0
RxB1:                  ;poslan bit1
   ror tmp            ;rotiranje desno
   dec stevec      ;stevec -1
   brne NasBRx      ; še ni 0
   rcall Pavza415uS   ;0   stop bit
   rcall Pavza207uS   ;1/2  bita
   ret



Če hočemo, da ne bomo zamudili kakega bit-a moramo proceduro pognati takoj, ko bo poslan startni bit. Najlažje bomo to izvedli, če bomo uporabili zunanjo prekinitev. V ta namen smo izbrali za sprejem ravno pin, ki proži zunajo prekinitev.Spet skok na "Prvi dan" V poglavju 9 stran 44 imamo opisane prekinitvene vektorje. Kaj pravzaprav prekinitev je? Kot že ime samo pove, nekaj se bo prekinilo. V trenutku ko se pojavi katerakoli prekinitev, ki smo jo predhodno vključili se izvajanje glavnega programa prekine. V sklad se shrane lokacija, kjer je bil program prekinjen. Programski števec se postavi na reset vektor ustrezne prekinitve. Od tam pa ga je potrebno preusmerit na proceduro, ki se naj izvede, ko se bo prekinitev zgodila. Prekinitveno rutino zaključimo z instrukcijo RETI. Ko program pride do te instrukcije se iz sklada pobere lakacija, kjer je bil program prekinjen. Program se potem nadaljuje za prekinitvijo.

Ob inicializaciji vključimo zunanjo prekinitev.

Koda:
ldi tmp,(1<<ISC00)
   out MCUCR,tmp            ;prekinitev se bo izvedla ob padajoci fronti
   ldi tmp,(1<<INT0)      
   out GIMSK,tmp            ;vklop zunanje prekinitve
   sei                           ;vklop prekinitev


Napišemo še klic procedure, ki se bo izvedla po prekinitvi. Ob prekinitvi se bo kalzalček postavil na 0x01 kjer je prekinitveni vektor zunanje prekinitve. Prekinitev se bo sprožila ob padajoči fronti.

Koda:

.org 0x0
   rjmp GlProg
.org 0x01
   rjmp ZPrek






Še prekinitvena rutina:


;
Koda:
-------------------------------------------
;zunanja prekinitev
;-------------------------------------------
ZPrek:
   push tmp               ;shranem registre, ki jih bom morda uporabil v rutini v sklad
   push tmp2
   push stevec
   in stmp,SREG         ;shranem tudi status register

;   tukaj bomo napisali kodo, ki se naj izvede ob prekinitvi

   ldi tmp,(1<<INTF0)      
   out GIFR,tmp         ;brisanje prekinitvene zastavice, ki se je postavila med prekinitvijo
   pop stevec            ;vrnem shranjene registre
   pop tmp2
   pop tmp
   out SREG,stmp
   reti                     ;konec prekinitvene rutine

_________________
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: 14673
Aktiv.: 61.94
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Pet Sep 24, 2010 9:44 pm    Naslov sporočila:   Odgovori s citatom

Še zadnja procedurca, preden vse "zmečemo" skupaj. To je vpis v EEprom ter branje iz njega. EEprom smo na kratko omenili že v "prvem dnevu". Gre za pomnilnik, kateri ohrani vrednosti tudi potem, ko se mikrokontrolerju izklopi napajanje. Naš mikrokontroler ga ima 64 bajtov. Za enkrat bomo uporabili le dva. Za temperaturno mejo ter diferenco. Če pogledamo v datashet, (poglavje 5.3) vidimo, da ima mikrokontroler za upravljanje z eepromom tri registre. EEARL - register v katerega vpišemo naslov kamor želimo pisati oz od kod želimo brati. EEDR - register v katerega zapišemo podatek za shranjevanje oz iz njega preberemo podatek pri branju. Za upravljanje služi kontrolni register z imenom EECR. Procedura za vpis je pravzaprav zelo enostavna. Pri vpisu v eeprom vpišemo podatke v zgoraj omenjena EEARL ter EEDR. V kontrolnem registru določimo način vpisa,omogočimo vpis ter vpis izvedemo. Pri branju je podobno. Določimo naslov, izvedemo branje, Rezultat preberemo v EEDR

;
Koda:
-------------------------------
;shranjevanje v eeprom
;-------------------------------
EeVpis:
   sbic EECR,EEPE   ;je prejšne vpisovanje končano?
   rjmp EeVpis
   ldi tmp,(0<<EEPM1)|(0<<EEPM0)
   out EECR,tmp   ;brisanje in vpis
   out EEARL,EeNaslov
   out EEDR,EePodatek
   sbi EECR,EEMPE            ;master program enable
   sbi EECR,EEPE               ;program enable-vpis
   ret



;-------------------------------------------
;procedura ob klicu prebere
;vrednost z lokacije eeproma
;katero dobi v tmp
;rezultat vrne v tmp
;-------------------------------------------
EeBranje:
   sbic EECR,EEPE
   rjmp EeBranje         ;je vpis končan
   out EEARL,tmp
   sbi EECR,EERE         ;izvedem branje
   in tmp,EEDR
   ret

_________________
lp
Silvo
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: 493 dni


Powered by phpBB © 2001, 2005 phpBB Group