 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.33
|
Objavljeno: Tor Mar 28, 2006 4:29 pm Naslov sporočila: Težava pri komunikaciji s PICem 12F675 |
|
|
Pozdravljeni!
Že nekaj časa sem izgubil z isaknjem napake, za katero predvidevam da izvira v programu PICa 12F675 glede na to, da je program brez težav delal na 16F877. S programom skušam serijsko sprejet stanja na vhodu GP0 ter ta ista stanja vrniti serijsko nazaj preko porta GP1. Torej, ko se procesorja najdeta, sledi začetni bit, podatkovni in končni bit (to se ponovi 3x), kar naj bi pic prebral preko GP0. Potem pa sledi začetni bit 3 podatkovni biti in končni bit iz pica preko GP1. Na osciloskopu zgleda vse ok, dokler ne pridemo do faze oddajanja 3 bitov nazaj. Stanje je vedno enako, ne glede na to kakšni so bili biti na vhodu. Zanimivo je tudi to, da se poruši osnovna perioda, ki znaša 0,5 sekunde.
Zanimivo je tudi to, da če želim prenesti v pic samo 1 ali 2 bita, potem vrne pravilno vrednost, čim želim prenesti 3 ali več, ne dela več. Zanimivo je tudi to, da če želim prenesti skupek 8 bitov, jih lahko prenesem maksimalno 2x8 medtem ko 3x8 ali več spet ne gre. Glede na to, da sem preizkusil vse mogoče __congig možnosti, od internal osc, spreminjanje časovne periode komunikacije, prebral večino datasheeta in še marsikaj, mi je idej za odkrivanje problema zmanjkalo.
Prilagam sliko komunikacije na osciloskopu (rumena linija iz procesorja, ki picu pošlje 3bite, modra linija od pica, ki se v prvi polovici uspešno časovno sinhronizira z oddajajočim procesorjem, vendar bitov ne vrne - razvidno je da so periode popačene) ter program, ki ne dela.
Upam da je komu jasno za kaj se gre...
Lp Matjaž
list p=12F675
#include <p12F675.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _WDT_OFF & _XT_OSC
; ---- Spremenljivke
Cblock 0x20
byte0
byte1
byte2
z1
z2
z3
endc
;-----------------------------------------------------------
; Nastavitev vektorjev
org 0x00
bsf STATUS,RP0 ; banka 1
call 0x3FF ; retrieve factory calibration value
movwf OSCCAL ; update register with factory cal value
bcf STATUS,RP0
goto Start
org 0x05
;***************************PODPROGRAMI****************************************
delay1s
;PIC Time Delay = 0,5000020 s with Osc = 4 MHz
movlw D'3'
movwf z3
movlw D'140'
movwf z2
movlw D'83'
movwf z1
loop1 decfsz z1,1
goto loop1
decfsz z2,1
goto loop1
decfsz z3,1
goto loop1
retlw 0x00
delay0.5s
;PIC Time Delay = 0,2500020 s with Osc = 4 MHz
movlw D'2'
movwf z3
movlw D'70'
movwf z2
movlw D'168'
movwf z1
loop2 decfsz z1,1
goto loop2
decfsz z2,1
goto loop2
decfsz z3,1
goto loop2
retlw 0x00
;*****************************************************************************
Start
;--------- Inicializacija registrov vhodno/izhodnih vmesnikov
bcf INTCON,GIE ;Disable INTs
;clrf GPIO ;Init GPIO
movlw 07h ;Set GP<2:0> to
movwf CMCON ;digital IO
bsf STATUS,RP0 ;Bank 1
clrf ANSEL ;Digital I/O
movlw 0x01
movwf TRISIO ;GP0 je input ostali output
bcf OPTION_REG,NOT_GPPU ;pullup ENABLED
movlw b'00111111'
movwf WPU
bcf STATUS,RP0 ;banka0
; jedro programa
;*********************sprejemanje signala **************
bcf GPIO,1 ;pic pripravljen - spustil nivo na 0V
;____________________________________________________________________________
zacetek0
btfsc GPIO,0 ;testiraj signal , ee 1 preskoci naslednji ukaz
nop
nop
btfsc GPIO,0
goto zacetek0 ;vrni se na main ce je 0
call delay0.5s
call delay1s
btfsc GPIO,0 ;testiraj podatkovni bit 0 v vratih GP0
bcf byte0,0 ;vpis 1 v byte0
btfss GPIO,0 ; po testiranju preskoei ee je 0
bsf byte0,0 ; zapis 0 v bit 0 spremenljivke byte0
call delay0.5s
bsf GPIO,1 ;koncni bit
call delay0.5s
konec0 btfsc GPIO,0 ;testiraj signal na gp0, ee 0 preskoci naslednji ukaz
goto konec0 ;časovna sinhronizacija dveh procesorjev
bcf GPIO,1
;-------------------------------------------------------------
zacetek1
call delay0.5s
call delay1s
btfsc GPIO,0 ;testiraj podatkovni bit 0 v vratih GP0
bcf byte1,0 ;vpis v byte1
btfss GPIO,0 ; po testiranju preskoei ee je 0
bsf byte1,0 ; zapis 0 v bit 0 spremenljivke byte1
call delay0.5s
bsf GPIO,1 ;koncni bit
call delay0.5s
konec1 btfsc GPIO,0 ;testiraj signal na gp0, ee 0 preskoci naslednji ukaz
goto konec1 ;časovna sinhronizacija
bcf GPIO,1
;-------------------------------------------------------------
zacetek2
call delay0.5s
call delay1s
btfsc GPIO,0 ;testiraj podatkovni bit 0 v vratih GP0
bcf byte2,0 ;vpis v byte2
btfss GPIO,0 ; po testiranju preskoei ee je 0
bsf byte2,0 ; zapis 0 v bit 0 spremenljivke byte2
call delay0.5s
bsf GPIO,1 ;koncni bit
call delay0.5s
konec2 btfsc GPIO,0 ;testiraj signal na gp0, ee 0 preskoci naslednji ukaz
goto konec1 ;časovna sinhronizacija p
bcf GPIO,1
;********************koda za pošiljanje ***************
call delay1s
btfsc byte0,0
bsf GPIO,1 ;postavi, ee je 1
btfss byte0,0
bcf GPIO,1 ;izbriši, ee je
call delay1s ;zakasnitev 1 periode
btfsc byte1,0
bsf GPIO,1
btfss byte1,0
bcf GPIO,1
call delay1s ;zakasnitev 1 periode
btfsc byte2,0
bsf GPIO,1
btfss byte2,0
bcf GPIO,1
call delay1s ;zakasnitev 1 periode
bsf GPIO,1
call delay1s ;zakasnitev pol periode
konec
goto konec
end
Opis: |
|
 Download |
Ime datoteke: |
komunikacija.png |
Velikost datoteke: |
6.35 KB |
Downloadano: |
11 krat |
|
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Mar 28, 2006 5:42 pm Naslov sporočila: |
|
|
V samo jedro programa se nisem spuščal - v tem trenutku nimam časa. (mogoče zvečer). Ozančil bom nekaj "nerodnih" zadev, ki pa verijetno niso krive za težavo a meni so moteče.
__CONFIG _CP_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _WDT_OFF & _XT_OSC
Kak osciloator uporabljaš? Spodaj kalibriraš internega tukaj imaš navedenega exsternega
; ---- Spremenljivke
Cblock 0x20
byte0
byte1
byte2
z1
z2
z3
endc
;-----------------------------------------------------------
; Nastavitev vektorjev
org 0x00
bsf STATUS,RP0 ; banka 1
call 0x3FF ; retrieve factory calibration value
movwf OSCCAL ; update register with factory cal value
bcf STATUS,RP0
goto Start
org 0x05 tole konec koncev ni potrebno če bi bilo vmes še kaj kode bi tale od lokacije 0x05 dalje prekrila kodo ki bi segala dlje
;***************************PODPROGRAMI****************************************
delay1s
;PIC Time Delay = 0,5000020 s with Osc = 4 MHz
movlw D'3'
movwf z3
movlw D'140'
movwf z2
movlw D'83'
movwf z1
loop1 decfsz z1,1
goto loop1
decfsz z2,1
goto loop1
decfsz z3,1
goto loop1
retlw 0x00
delay0.5s
;PIC Time Delay = 0,2500020 s with Osc = 4 MHz
movlw D'2'
movwf z3
movlw D'70'
movwf z2
movlw D'168'
movwf z1
loop2 decfsz z1,1
goto loop2
decfsz z2,1
goto loop2
decfsz z3,1
goto loop2
retlw 0x00
;*****************************************************************************
Start
;--------- Inicializacija registrov vhodno/izhodnih vmesnikov
bcf INTCON,GIE ;Disable INTs
;clrf GPIO ;Init GPIO
movlw 07h ;Set GP<2:0> to
movwf CMCON ;digital IO
bsf STATUS,RP0 ;Bank 1
clrf ANSEL ;Digital I/O
movlw 0x01
movwf TRISIO ;GP0 je input ostali output
bcf OPTION_REG,NOT_GPPU ;pullup ENABLED
movlw b'00111111'
movwf WPU kateri register je to ?
bcf STATUS,RP0 ;banka0
; jedro programa
;*********************sprejemanje signala **************
bcf GPIO,1 ;pic pripravljen - spustil nivo na 0V
zacetek0
btfsc GPIO,0 ;testiraj signal , ee 1 preskoci naslednji ukaz tole je nesmiselno
nop
nop
btfsc GPIO,0
goto zacetek0 ;vrni se na main ce je 0
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.33
|
Objavljeno: Sre Mar 29, 2006 8:55 am Naslov sporočila: |
|
|
Ko sem uporabljal externi oscilator sem dal gor 4MHz. Opazil sem, da v odzivu PICa ni nobene razlike med internim in externim oscilatorjem.
Prav tako se program enako obnaša, če uporabim org instrukcije ali ne.
Inicializacija WPU registra dejansko ni potrebna, ker so privzete vrednosti tako ali tako na 1. Služi pa za posamezno vklapljanje internih pull-up uporov. Ne vpliva na obnašanje PICa.
btfsc GPIO,0 ;testiraj signal , ee 1 preskoci naslednji ukaz tole je nesmiselno
nop
nop
Ta del je res nesmiselen, vendar ne vpliva na delovanje...
Vem da pri 12C508 je potrebno kodo primerno razporediti po memoriji saj morajo biti podprogrami, ki jih kličemo v prvi polovici memorije. Je pri tem PICu podobno? Verjetno prav tako ne pride do stack overflow, ker bi mi simulator to javil...
kako morajo biti nastavljen register TRISIO v primeru uporabe ext osc? Morata biti pina GP4 in GP5 vhodna, ali to ni važno?
Opazil sem da pri uporabi ext osc mclr ne dela. Je to normalno?
Drugače imam na pic priklopljen +5V na Vdd(pin1), 4MHz kristal na GP5 in GP4 +2 7pF na GND (pin 2 in 3), 10k pull-up in tipko na GND na GP3 (pin4), GP2 je prost (pin5), GP1 (izhod) je povezan na direktno na vhodni pin drugega procesorja (pin6) ter GP0 (vhod) z internim pull-upom je vezan preko tranzistorja na izhod drugega procesorja.
Poskusil sem uporabiti tudi externe pull up upore na obeh linijah, vendar je obnašanje PICa enako.
Kakršnikoli predlogi so dobrodošli!
|
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sre Mar 29, 2006 9:33 am Naslov sporočila: |
|
|
Poglej tale moj primer IR daljinske komande. Pisan je sicer za malčka 10F200. Kodo je brez težav predelati na omenjenega pica. Dela tokaj podobno kot tukaj pri tebi, le da so timingi v rangu 100mS. (Za direkno povezavo bi moral odmakinti proceduro na oddajniku, ki genereira 38KHz impulze za ir diodo) Prodecura oddaja ter sprejema 8 bitni podatek. Najprej se pošlje sinhronizacijski bit. Logična 1/0 je sestavljena iz dveh "polbitov" 1-0 /0-1 (podobno kot RC5 protokol)
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
jur Član


Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 21.71 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Sre Mar 29, 2006 11:01 am Naslov sporočila: |
|
|
Predelava programa iz enega procesorja na drugega lahko povzroči probleme, čeprav so si chipi podobni. Najbolje je, da vzameš datasheete za oba chipa in jih med seboj paralelno primerjaš. Če program na enem chipu dela, na drugem pa ne, je verjetno kriva razlika v hardweru. Mogoče različen config word, različno število registrov, oscilator, reset, .... v programu je potrebno popraviti tudi include file.
Pri neupoštevanju razlike v hardweru med chipoma tudi simulator ne bo pokazal napake.
...GP0 (vhod) z internim pull-upom je vezan preko tranzistorja na izhod drugega procesorja... Ta tranzistor obrne fazo signala? Če jo, ali software to ve?
Na te grablje (menjavo chipa z istim softwerom) sem večkrat stopil. Krvavo podpluta očesa....
Jur
|
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14673 Aktiv.: 61.94 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Sre Mar 29, 2006 11:17 am Naslov sporočila: |
|
|
Jur, s trditvijo se popolnoma strinjam. Mogoče tista beseda "predelava" ni čisto na pravem mestu. Vem, da bo nepoznavalcu problem "spraviti" ASM za 16F84 v 16F628.
Če se vrnem k zgornjem primeru - verjami mi, da bi prej in lažje napisal program na novo kot ugotavljal kaj je zgoraj narobe, kajti prej moram ugotoviti sploh kako je avtor želel, da zadeva dela. Ravno v ta namen sem nakazal povezavo na tisti moj program, kajti zadeva je identična gornji.
_________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
jur Član


Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 21.71 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Sre Mar 29, 2006 4:19 pm Naslov sporočila: |
|
|
Jaz sem en kup programov "predelal" (vse v assemblerju) iz 16Cxx in 16Fxx v 16F87x in 18Fxxx. Predvsem zaradi UARTa in več portov. Ko enkrat ugotoviš razliko med procesorjema gre predelava hitro. Je pa potrebno dobro prebrati na videz nebistvene detajle.
Se pa povsem strinjam, da je predelava programa drugega avtorja (kljub komentarjem, če so) težka stvar.
Jur
|
|
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: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|