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 

PIC in rotacijski enkoder
Pojdi na stran Prejšnja  1, 2
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
bolha95
Član
Član



Pridružen-a: Pet 14 Dec 2007 21:33
Prispevkov: 296
Aktiv.: 1.49
Kraj: Križe / Tržič

PrispevekObjavljeno: Pon Dec 22, 2008 2:45 pm    Naslov sporočila:   Odgovori s citatom

teslo je napisal/a:
uf.. mene pa zanima kje se da nabaviti tak enkoder?


Scroller od miške Very Happy

_________________
LP,
Robi
Kjer se znanje konča, se domišljija začne
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
podboj
Član
Član



Pridružen-a: Sre 25 Maj 2005 11:48
Prispevkov: 1251
Aktiv.: 5.63
Kraj: Postojna, Sežana, Ljubljana

PrispevekObjavljeno: Pon Dec 22, 2008 4:01 pm    Naslov sporočila:   Odgovori s citatom

Program mi ob vklopu zaradi interrupta zabluzi, moram malo datasheet od PIC-a pregledat Smile
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dkone
Član
Član



Pridružen-a: Sre 07 Mar 2007 18:53
Prispevkov: 2104
Aktiv.: 10.13
Kraj: Krško

PrispevekObjavljeno: Pon Dec 22, 2008 8:09 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Sre 25 Maj 2005 11:48
Prispevkov: 1251
Aktiv.: 5.63
Kraj: Postojna, Sežana, Ljubljana

PrispevekObjavljeno: Pon Dec 22, 2008 11:02 pm    Naslov sporočila:   Odgovori s citatom

Najlepša hvala za tole Smile . Kar se pic-ev tiče se še malo lovim in ne poznam najbolj teh pravil.

Lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1712
Aktiv.: 7.71
Kraj: Ig

PrispevekObjavljeno: Pon Dec 22, 2008 11:14 pm    Naslov sporočila:   Odgovori s citatom

Č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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
podboj
Član
Član



Pridružen-a: Sre 25 Maj 2005 11:48
Prispevkov: 1251
Aktiv.: 5.63
Kraj: Postojna, Sežana, Ljubljana

PrispevekObjavljeno: Sre Dec 24, 2008 1:04 am    Naslov sporočila:   Odgovori s citatom

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 Smile
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
podboj
Član
Član



Pridružen-a: Sre 25 Maj 2005 11:48
Prispevkov: 1251
Aktiv.: 5.63
Kraj: Postojna, Sežana, Ljubljana

PrispevekObjavljeno: Sre Dec 24, 2008 8:51 pm    Naslov sporočila:   Odgovori s citatom

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 Confused. Poskusil sem zamenjat _DATA_EE_DATA in _DATA_ EE_ADDR, pa ne dela Sad

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



LCD_V4.zip
 Opis:

Download
 Ime datoteke:  LCD_V4.zip
 Velikost datoteke:  3.85 KB
 Downloadano:  3 krat

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 PIC-a v Assembler-ju Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2
Stran 2 od 2

 
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: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group