|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
bolha95 Član
Pridružen-a: Pet 14 Dec 2007 21:33 Prispevkov: 296 Aktiv.: 1.49 Kraj: Križe / Tržič
|
Objavljeno: Pon Dec 22, 2008 2:45 pm Naslov sporočila: |
|
|
teslo je napisal/a: |
uf.. mene pa zanima kje se da nabaviti tak enkoder? |
Scroller od miške
_________________ LP,
Robi
Kjer se znanje konča, se domišljija začne |
|
Nazaj na vrh |
|
|
podboj Član
Pridružen-a: Sre 25 Maj 2005 11:48 Prispevkov: 1251 Aktiv.: 5.61 Kraj: Postojna, Sežana, Ljubljana
|
Objavljeno: Pon Dec 22, 2008 4:01 pm Naslov sporočila: |
|
|
Program mi ob vklopu zaradi interrupta zabluzi, moram malo datasheet od PIC-a pregledat
|
|
Nazaj na vrh |
|
|
dkone Član
Pridružen-a: Sre 07 Mar 2007 18:53 Prispevkov: 2104 Aktiv.: 10.09 Kraj: Krško
|
Objavljeno: Pon Dec 22, 2008 8:09 pm Naslov sporočila: |
|
|
igo je napisal/a: |
Problem se lahko zgodi, kadar se izvaja podprogram QUAD_STATE , ki je bil klican (call) iz ZANKA , nato pa se zgodi prekinitev, v kateri se ponovno kliče isti QUAD_STATE. Nastane rekurzivni klic in naključni skok, glede na stanje vhodov.
Zadeva se zgodi silno redko, ko pa se, je panika.
Rešitev:
Iz ZANKA vrzi ven "call QUAD_STATE". Naj bo samo v prekinitvi.
Pazi tudi na PCLATH pri tabelah za izpis besedil. V View--> Disassembly Listing lahko vidiš, da si že nevarno blizu naslova 0x0100 . Če se katera od tabel "prelomi" čez
0x00FF/0x0100 , bo spet prišlo do nepredvidljivih skokov/klicev.
Rešitev:
Prestavi vse tabele čim bolj na začetek prostora 0x0000....0x00FF (ali pa poskrbi za pravilne PCLATH-e in tabele prestavi kam na ORG 0x0700)
LP,
Igor |
_________________ Denis |
|
Nazaj na vrh |
|
|
podboj Član
Pridružen-a: Sre 25 Maj 2005 11:48 Prispevkov: 1251 Aktiv.: 5.61 Kraj: Postojna, Sežana, Ljubljana
|
Objavljeno: Pon Dec 22, 2008 11:02 pm Naslov sporočila: |
|
|
Najlepša hvala za tole . Kar se pic-ev tiče se še malo lovim in ne poznam najbolj teh pravil.
Lp
|
|
Nazaj na vrh |
|
|
RGorazd Član
Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1712 Aktiv.: 7.68 Kraj: Ig
|
Objavljeno: Pon Dec 22, 2008 11:14 pm Naslov sporočila: |
|
|
Če ti slučajno kaj pomaga. Aly mi je nekoč pomagal narediti aplikacijo, ki yelo dobro teče na AVRjih (merilna letev) in je spesnjeno v Bascomu (glavni del kode je narejen v ASM).
Koda: |
Dim Poz As Integer , Mmx As String * 6 , Error As Bit
Dim Mm As Single , Abold As Byte , Abselect As Byte , C As Byte
Dim A As Byte , B As Byte
Cls
Enable Interrupts
Enable Int0
On Int0 Int0isr
Config Pind.0 = Input
Config Pind.1 = Input
Siga Alias Pind.0
Sigb Alias Pind.1
A = Siga
B = Sigb
$asm
lds r16,{a}
lds r17,{b}
lsl r16
lsl r16
or r17,r16 ' ; oklestimo nepotrebne bite
Sts {Abold} , R17 ' ; pospravimo staro stanje
$end Asm
Do
Mm = Poz
Mm = Mm / 200
Mmx = Fusing(mm , "#.###")
Locate 1 , 1
Lcd Mmx : Locate 1 , 14 : Lcd "mm"
If Error = 1 Then
Locate 2 , 1
Lcd "Error"
End If
Loop
Int0isr:
A = Siga
B = Sigb
$asm
lds r20,{a}
lsl r20
lds r21,{b}
or r20,r21
sts {c},r20
'in r16, pind ' branje - v r16 je trenutno stanje
'andi r16, 0b00000011 ' ; oklestimo nepotrebne bite
lds r17, {ABold}
lsl r17
lsl r17 ' ; dvakrat premaknjen
lds r16,{c}
or r17, r16 '; združeno v r17
sts {ABselect}, r17 ; damo v spremenljivko ki jo vidi bascom
sts {ABold}, r16 ' ; pospravimo staro stanje
' ; damo vspremenljivko ki jo vidi bascom
' ; pospravimo staro stanje
$end Asm
Select Case Abselect
Case 0 : Poz = Poz 'ni spremembe
Case 1 : Decr Poz 'letev dol
Case 2 : Incr Poz 'letev gor
Case 3 : Error = 1 'napaka
Case 4 : Incr Poz 'letev gor
Case 5 : Poz = Poz 'ni spremembe
Case 6 : Error = 1 'napaka
Case 7 : Decr Poz 'letev dol
Case 8 : Decr Poz 'letev dol
Case 9 : Error = 1 'napaka
Case 10 : Poz = Poz 'ni spremembe
Case 11 : Incr Poz 'letev gor
Case 12 : Error = 1 'napaka
Case 13 : Incr Poz 'letev gor
Case 14 : Decr Poz 'letev dol
Case 15 : Poz = Poz 'ni spremembe
End Select
Return
|
Tole deluje. upošteva tudi napake, ki se lahko pojavijo na enkoderju. Tole je sicer prilagojeno merilni letvi s 5mikronsko resolucijo, z malo modifikacije bi delalo tudi z rotacijskim enkoderjem. Kar pa se hardvera tiče, rabiš dvoje XOR vrat, na katere pripelješ A in B signala iz enkoderja, in ki ti potem generirata interrupt vsakič, ko se stanje na enkoderju spremeni.
_________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
|
podboj Član
Pridružen-a: Sre 25 Maj 2005 11:48 Prispevkov: 1251 Aktiv.: 5.61 Kraj: Postojna, Sežana, Ljubljana
|
Objavljeno: Sre Dec 24, 2008 1:04 am Naslov sporočila: |
|
|
dkone je napisal/a: |
igo je napisal/a: |
Problem se lahko zgodi, kadar se izvaja podprogram QUAD_STATE , ki je bil klican (call) iz ZANKA , nato pa se zgodi prekinitev, v kateri se ponovno kliče isti QUAD_STATE. Nastane rekurzivni klic in naključni skok, glede na stanje vhodov.
Zadeva se zgodi silno redko, ko pa se, je panika.
Rešitev:
Iz ZANKA vrzi ven "call QUAD_STATE". Naj bo samo v prekinitvi.
Pazi tudi na PCLATH pri tabelah za izpis besedil. V View--> Disassembly Listing lahko vidiš, da si že nevarno blizu naslova 0x0100 . Če se katera od tabel "prelomi" čez
0x00FF/0x0100 , bo spet prišlo do nepredvidljivih skokov/klicev.
Rešitev:
Prestavi vse tabele čim bolj na začetek prostora 0x0000....0x00FF (ali pa poskrbi za pravilne PCLATH-e in tabele prestavi kam na ORG 0x0700)
LP,
Igor |
|
Kljub temu da sem upošteval ta navodila je PIC16F628A deloval zelo nestabilno, zato sem kodo predelal za 16F877A, kjer pa dela brez težav
|
|
Nazaj na vrh |
|
|
podboj Član
Pridružen-a: Sre 25 Maj 2005 11:48 Prispevkov: 1251 Aktiv.: 5.61 Kraj: Postojna, Sežana, Ljubljana
|
Objavljeno: Sre Dec 24, 2008 8:51 pm Naslov sporočila: |
|
|
Spet imam težave, tokrat s pisanjem v EEPROM od 16F877A. Rad bi ob pritisku na tipko shranil trenutno vrednost enkoderja (COUNT) v EEPROM, tako da bi se shranjena vrednost pojavila ob ponovnem vklopu naprave. Primere kode sem vzel iz datasheeta, kar nekaj časa mi je vzelo, prej ko sem opazil, da so se v primerih pozabili vrniti v banko 0. To sem popravil, koda pa vseeno ne dela. Branje eeproma dela. (če z mplabom postavim neko vrednost v 0x0 naslov eeprom-a mi jo pravilno prebere)
Če pa s tipko shranjujem razne vrednosti in potem z MPLABOM berem eeprom mi na neke poljubne naslove shranjuje vrednost 00 . Poskusil sem zamenjat _DATA_EE_DATA in _DATA_ EE_ADDR, pa ne dela
EDIT: Uporabil sem tudi kodo od Silvota za vpis v 16F628, ki sem jo našel na forumu (sem jo predelal, da gre v banko 2) pa je isto, torej izgleda, da je nekaj drugega narobe
Koda: |
DATA_EE_ADDR Equ 0x0
DATA_EE_DATA EQU COUNT
; VPIS V EEPROM
BSF STATUS, RP1 ;
BSF STATUS, RP0 ;Bank 3
BTFSC EECON1,WR ;Wait for write
GOTO $-1 ;to complete
BCF STATUS, RP0 ;Bank 2
MOVF DATA_EE_ADDR,W ;Data Memory
MOVWF EEADR ;Address to write
MOVF DATA_EE_DATA,W ;Data Memory Value
MOVWF EEDATA ;to write
BSF STATUS,RP0 ;Bank 3
BCF EECON1,EEPGD ;Point to DATA
;memory
BSF EECON1,WREN ;Enable writes
BCF INTCON,GIE ;Disable INTs.
MOVLW 55h ;
MOVWF EECON2 ;Write 55h
MOVLW 0xAA ;
MOVWF EECON2 ;Write AAh
BSF EECON1,WR ;Set WR bit to
;begin write
BSF INTCON,GIE ;Enable INTs.
BCF EECON1,WREN ;Disable writes
CLRF STATUS |
Celotna koda je dolga, zato je v priponki. Na portu D je tudi ena led dioda ki utripne ob vpisu v eeprom
Opis: |
|
Download |
Ime datoteke: |
LCD_V4.zip |
Velikost datoteke: |
3.85 KB |
Downloadano: |
3 krat |
|
|
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: 70 dni
Powered by phpBB © 2001, 2005 phpBB Group
|