Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   104 / 1210
(#) Hp41C válasza t_oszi hozzászólására (») Márc 30, 2011 /
 
Szia!

A 16F87x és a 16F88x közötti eltérések, a 16F88x kiegészítéseit nem sorolom fel:

- T1 timer Gate funkcióval kiegészítve (T1CON 7..6),
- A CCP1 modul a 88x -en Enhancced Capture/Compare/PMW modul. CCP1CON 7.8 bitje definiált, A CCP1M biteknél négy kombináció (1100 .. 1111) más-más PWM módot jelent.
- Az uart illesztő EUART (TXSTA,4 ), 16 bites Baud generátorral, BAUDCTL regiszterrel kiegészítve,
- Az AD illesztő bitkiosztása és működése is eltér.
- MSSI SSP MASK regiszterrel bővítve,
- A komparátor modul az A/D -t és a T1 -et tudja vezérelni,
- A leglényegesebb etérés:
A 16F88x -en egyes portbitek digitálissá állításához az ANSEL és ANSELH regiszterekbe kell megfelelő értéket beírni, a 16F87x(A) -n a ADCON1 regiszterbe.

Valamint érdemes a két típus errata dokumentációját is összehasonlítani - nem biztos, hogy ugyan azokat a hibákat találjuk bennük...

Ha a 16F87x(A)-ra fejlesztett program a regiszterek nem használt bitjeit 0 értékkel írta, akkor működni fognak az illesztők, a portok beállítása és az A/D kivételével.
(#) pajti2 válasza t_oszi hozzászólására (») Márc 30, 2011 /
 
Valószínűleg .cof fileokról lehet inkább szó. A .hex fileok szöveges állományok, és pld ilyen sorokból állnak:

:100440000000fe004440a900a00020000000e000e1

Ha tényleg .hex file-jaid vannak, szöveges formában elő tudod keresni a gyárihoz képest azt a sort, ami eltérő. Koppantsd be plz az eredeti sort is, meg azt is, amit te csináltál. Ezekben a sorokban memória offset cím is benne van az adattal együtt. Lévén ismert a pic típusa is, amibe betöltenéd, egészen pontosan vissza lehet keresni a pic adatlapból, hogy melyik config bitet mire cserélted volna le a gyárihoz képest. A dolog forrása persze a programfile-ban lesz, de már tudni fogod, mit keress.
(#) Hp41C válasza Hp41C hozzászólására (») Márc 30, 2011 /
 
Egy-két dolog kimaradt:

- A 16F87x -nek 1, a 16F88x -nek két konfigurációs szava van - eltérő bitkiosztással,
- A programtár írásában is van eltérés...
(#) icserny válasza Hp41C hozzászólására (») Márc 30, 2011 /
 
Én már csak azt nem értem, hogy a PIC16F87x hogy jött a képbe...
(#) watt válasza pajti2 hozzászólására (») Márc 30, 2011 /
 
Igen és reagálni is elfelejtenek egyesek, pedig tálán a megoldást is megkapták, bár lehet, hogy nem értették meg...
(#) pajti2 válasza watt hozzászólására (») Márc 31, 2011 /
 

Ha ezt a #958428-ra értetted, amiatt ugyan ne törd a fejed. Volt anno 286-os processzoron idtr regiszter, át lehett állítani a megszakítás vektro táblát. Pic32-n egyesével saját kézbe lehet venni a táblát, és programozottan ugyan ezt megcsinálni RAM területen átfuttatni az összes vektort. A kernel modulokat szétosztani linux alatt pld az int 0x80-as vektoron általános gyakorlat, pic-en is lehet hasonlót csinálni. Kernel memóriának ott az anno ROM-BIOS munkaterület, még felépítésre is kézre áll (Abonyi Zsolt PC-Hardver kézikönyv). Memória szeletelésre meg az egykori MS-DOS paragrafus alapú memória felosztása remek példa (IBM PC DOS 3.3 reference). Adat újracímzésre bevált gyakorlat volt DOS alatt az .exe programok relokálása. Szóval ilyesmikből bőven el vagyok látva használható tapasztalatokkal. A gondom tényleg csak fordító oldalon van, mert ha nem sikerül kényelmes módot találni egy C szintű program írására olyan módon, hogy az utána gépi kód szintjén is blokkosan kezelhető maradjon, akkor ez az ötlet tuti a levesben végzi. És ha még mindig kérdés lenne, ugyan mivégre, akkor újra leírom, hogy működés közben akarok ethernetes pic elektronikán szoftvert frissíteni távolról a működési adatok megzavarása / vesztése nélkül. Erre pedig technológia kell kitalálni. Ezért próbálkozom dolgokkal. És igen, előfordulhat, hogy bebukom.
(#) trudnai válasza pajti2 hozzászólására (») Márc 31, 2011 /
 
Ez nem hiszem, hogy kezdo PIC-es tema, de nem gondolod, hogy a relokalas csak amiatt kell, mert a cimzes nem relativ? Egy DOS-os EXE-nel mikor az operacios rendszer betolti az allomanyt, akkor szepen egyesevel vegig patcheli a nem relativ cimzesu utasitasokat, hogy azok a megfelelo emoria cimre mutassanak. Neked erre nincs szukseged a PIC eseteben.

Ha tobb modulod van amiket cserelgetni szeretnel, akkor kell egy un API tablat felepiteni, ami nagyon hasonlo ahhoz ahogy a Windows-ban is mukodnek a DLL API hivasok. Tehat a modulnak az 1-es verzioja aktiv, kozben feltoltod a 2-es verziot. Ekkor meg az ugro tabla (API tabla) az 1-es verziora mutat meg mindig. Mikor ez sikeres a letoltes, akkor az osszes megszakitast letiltod es ezt az ugro tablat irod at a 2-es verziora. Innentol kezdve a szoftver a modulod 2-es verziojat hasznalja. Ha hiba van, a user megnyom egy gombot mikor is egyszeruen csak vissza allitod a tablat az 1-es verziora (azal meg mukodott effektus...)

Kb ilyen egyszeru a keplet. Beagyazott rendszereknel elegge bevalt gyakorlat, hogy a firmware-nel tobb valtozata is el van tarolva, nem kell kitalalni a spanyol viaszt.

(OFF-ba tettem mert ez nem kezdoknek valo tema)
(#) watt válasza pajti2 hozzászólására (») Márc 31, 2011 /
 
A félreértés abból adódott, hogy nem pontosan kérdezted meg amit szerettél volna, ezért mindenki a flash írásával kapcsolatosan kezdett válaszolgatni, én is.

A C fordítót nem hiszem, hogy gépi kód szinten lehetne vezényelni, mármint, hogy mit hová fordítson és ezzel elérni, hogy a megfelelő részeket kézben tartsd a célzott flash égetéshez. Bár a #pragma code paraméterezésével lehetne próbálkozni.
A biztos megoldás, hogy Assemblerben programozol...
(#) pajti2 hozzászólása Márc 31, 2011 /
 
Történetesen éppen asm kód fordítással van egy kis bajom. Parancssoros scriptet írok fordításhoz. Amikor beküldöm az assembler eredményét a linkerbe, kapok egy ilyet:
Idézet:
„built in linker script:666: undefined symbol `__reset' referenced in expression”


Ez a __reset nem tudom minek kell a linkernek, de ez nincs benne a pic libjeiben sem. A forráskódban sincsen ilyen hivatkozás.

Az indító parancssor egyébként ez volt:
Idézet:
„pic30-ld --processor 33FJ128GP802 -omf=coff -L "C:\Program Files\Microchip\MPLAB C30\lib\dsPIC33F" --stats --report-mem -o main.bin main.o”


Mit szúrtam el?
(#) icserny válasza pajti2 hozzászólására (») Márc 31, 2011 /
 
A __reset szimbólumot neked kellene globális címkeként deklarálnod a főprogram elején. A linkernek csak azért kell, mert itt kezdődne a program...

Például:
  1. .include "p33Fxxxx.inc"
  2. .global __reset
  3.  
  4.          .bss           ; adatterület
  5. i:       .space 2       ; 2 bájt i-nek
  6.  
  7. .text                   ; kódterület
  8. __reset:                ; program kezdete
  9.     mov #2047, W0       ; W0 = 2047
  10.     mov WREG,i          ; i = 2047
  11.     ...
  12.  
  13. done:
  14.     goto    done        ; végtelen ciklus
  15. .end       ; program vége
(#) pajti2 hozzászólása Márc 31, 2011 /
 
Hogyan van arra lehetőség, hogy én a .global-nak más nevet megadva le tudjam fordítani a programot? Mondjuk ugyan az lenne minden, épp csak a __reset helyett __kutyagumi -t akarok használni. Ez a __reset bele van hardkódolva a linkerbe? Elvileg nem kellene, hogy úgy legyen.
(#) icserny válasza pajti2 hozzászólására (») Márc 31, 2011 /
 
Van egy olyan sanda gyanúm, hogy a startup (crt0_standard.o vagy crt1_standard.o) kódjába van bedrótozva. Nem látom semmi értelmét a név megváltoztatásának. Ha más címre akarod fordítani a programot, akkor a linker scriptet (esetedben a p33FJ128GP802.gld állományt) szabd át!
  1. MEMORY
  2. {
  3.   data  (a! xr)  : ORIGIN = 0x800,         LENGTH = 0x4000
  4.   reset          : ORIGIN = 0x0,           LENGTH = 0x4
  5.   ivt            : ORIGIN = 0x4,           LENGTH = 0xFC
  6.   aivt           : ORIGIN = 0x104,         LENGTH = 0xFC
  7.   program (xr)   : ORIGIN = 0x200,         LENGTH = 0x15600
  8. ...
  9. }

program (xr) a program (a .text szekció) kezdőcíme, bootloader esetén pl. ezt kell megváltoztatni. A jelek szerint a reset és az interrupt vektorok címe is átírható a program számára (csak aztán legyen, aki beleugrat!).

PIC24/dsPIC esetén egyébként van alternatív interrupt vektor tábla (AIVT) is. Ez arra jó, hogy gyorsan át lehessen kapcsolni a felhasználói és a felügyeleti környezet között. Természetesen másra is használható, például ott, ahol különböző algoritmusok vagy alternatív rendszerek (pl. bootloader és felhasználói program) közötti váltogatásra van szükség. Az alternatív interrupt vektorok táblázata egyetlen bit módosításával, az INTCON2 regiszter 15. bitjének (ALTIVT) '1'-be állításával aktiválható.
(#) pajti2 hozzászólása Márc 31, 2011 /
 
Interrupt táblára köszönöm a tippet. Bárcsak már ott tartanék. De még nem. Pontosítanék egy problémát.

Ez lefordul:
Idézet:
„.global __reset
__reset:
mov #200,w0
mov w0,[w14]
mov #1,w0
return
.end”


Ez meg nem fordul le:
Idézet:
„.global _main
_main:
mov #200,w0
mov w0,[w14]
mov #1,w0
return
.end”



Hogy miért akarom én a másodikat erőltetni? Tök egyszerű. Mert a compilerrel ha asm forrást gyártatok, annak ilyen .global van a kimenetén. Nem találtam sem az assembler sem a linker paraméterezésében olyan kapcsolót, ami symbol helyettesítést csinálna. Ha mást nem, akkor még ellenőrzöm pic32 alatt is megvan-e ez, és ha ott is, akkor írok egy szöveg file feldolgozót csak emiatt - bár szívesebben megúsznám.

És amúgy valóban szívesebben írnám tisztán asm-ben a kódot, ha nem lenne eszetlen egy munka pld tcpip + flash + usb stacket átírni C-ről asm-re. Az MC support C-ben van. Azt mindenestül újracsinálni..
(#) icserny válasza pajti2 hozzászólására (») Márc 31, 2011 /
 
Szerintem kevered a szezont a fazonnal! A C program is így fordul:

  1. 0x0000    goto __reset
  2.  
  3. 0x0200   __reset: mov.w     #0x800, w15 ;verem inicializálás
  4.           ...    ;PSV inicializálás, adatterület inicializálás, majd
  5.           call  _main
  6.           .pword 0xda4000
  7.           reset

Most akkor mi lesz ebből, ha a __reset címkét is _main-nak nevezed el?
(#) pajti2 hozzászólása Márc 31, 2011 /
 
Van egy C program:
  1. int main(void) {
  2.   unsigned i1;
  3.   i1= 200;
  4.   return 1;}


Ennyi. Ezt bedobom compilernek -S kapcsolóval, csinál belőle egy ilyet:
  1. .file "D:\\hello_led\\main.c"
  2.         .align  2
  3.         .global _main   ; export
  4. _main:
  5.         .set ___PA___,1
  6.         lnk     #2
  7.         mov     #200,w0
  8.         mov     w0,[w14]
  9.         mov     #1,w0
  10.         ulnk   
  11.         return 
  12.         .set ___PA___,0
  13.  
  14.         .section __c30_signature, info, data
  15.         .word 0x0001
  16.         .word 0x0001
  17.         .word 0x0000
  18.  
  19.         .set ___PA___,0
  20.         .end


És nem igazán tudom neki megmondani, hogy a start symbol-nak _main helyett __reset-et adjon be. Vagy kihagytam valamit, de mit?

Ha azt a _main-t átírom __reset-re, és csak ennyit csinálok, akkor le is fordul. Egyébként meg nem fordul le. Egy scriptben ez azért gáz, mert ezt automatizálni kellene, és nem kézzel csinálni. Amíg a scriptem egy lépésben C-ből objectet fordított, és azt dobtam a linkernek, nem volt ilyen gond. Szépen megcsinálta. Most, hogy asm-en keresztül megyek, mert a compiler után az assemblerrel csináltatom a cuccot, mert kell a lista file is, és tuti biztosan annak megfelelő object kimenet kell, ergo azt az assembly kódot kell tovább fordítani, így már elakad.
(#) trudnai válasza pajti2 hozzászólására (») Ápr 1, 2011 /
 
Ebben nincs benne a startup kod -- azt bongeszd inkabb!
(#) icserny válasza pajti2 hozzászólására (») Ápr 1, 2011 /
 
Én így néztem meg: Link
(#) pajti2 hozzászólása Ápr 1, 2011 /
 
icserny:
Az ott egy ASM program, nem C.

trudnai:
Sőt, a pic függő assembly include állományban sincsen benne startup kód részlet. És egyébként is ennyi volt a compiler teljes kimenete. Ha nem generált le valami szükséges cuccost, akkor azt hiba folytán nem tette meg. Jobbat nem tudok, most meglesem ugyan ezt pic32 alatt is.
(#) icserny válasza pajti2 hozzászólására (») Ápr 1, 2011 /
 
Idézet:
„Az ott egy ASM program, nem C.”
Az nem program csak egy main függvény.
(#) pajti2 válasza icserny hozzászólására (») Ápr 1, 2011 /
 
Na, összehoztam végre valahára. A compilerrel dobáltattam tovább az utasítást az assemblernek is, meg a linkernek is. A végeredményről kaptam object listet, meg van mem report.

Egyébként ami a .hex-be lekerült, abban annyi a sallang a reportolt dolgokhoz képest, hogy csak lesek. Lévén azt a cuccot a linker ragasztotta hozzá, nyugodtan nézze csak meg mindenki, aki az assembly tisztaságában hisz, mi is történik a kódjával, mire a linker hex-et gyárt belőle.
(#) icserny válasza pajti2 hozzászólására (») Ápr 1, 2011 /
 
Idézet:
„Egyébként ami a .hex-be lekerült, abban annyi a sallang a reportolt dolgokhoz képest, hogy csak lesek.”
1. Fel kell tölteni a RESET vektort és az IVT, valamint az AIVT vektortáblákat.
2. Be kell állítani a vermet
3. Ha konstansokat használsz, akkor be kell állítani a PSV-t (kódterület láthatósága), ellenkező esetben pedig letiltásra kerül.
4. Ha van felhasználói inicializálás, akkor meghívásra kerül az __user_init függvény
5. Végül meghívásra kerül a _main függvény

Ez a crt1_standard.s-ben található rövidített litánia, ami a --no-data-init opció használata esetén érvényes.
Idézet:
„nyugodtan nézze csak meg mindenki, aki az assembly tisztaságában hisz, mi is történik a kódjával”
Észrevetted már, hogy te mondod meg, hogy mit csatoljon hozzá, és mit ne a programodhoz? Nézd meg a linker állomány (.gld) elejét!
  1. OUTPUT_ARCH("33FJ128GP802")
  2. CRT0_STARTUP(crt0_standard.o)
  3. CRT1_STARTUP(crt1_standard.o)
  4.  
  5. OPTIONAL(-lp33FJ128GP802)
(#) pajti2 hozzászólása Ápr 2, 2011 /
 
Ezt a kettő objectet valahogy nem találom. Pedig még a libeket is kinyitogattam bináris editorral, és rákerestem az object névre.
(#) icserny válasza pajti2 hozzászólására (») Ápr 3, 2011 /
 
Szerintem a libpic30-coff.a és a libpic30-elf.a tartalmazza, mert nálam a forrásuk is az src/pic30/libpic30.zip-ben van.
(#) szitko hozzászólása Ápr 5, 2011 /
 
Sziasztok.
Volna egy apró gondom, mégpedig egy 12f675-el. A probléma, hogy két PIC-et szeretnék meghajtani egy rezonátorral (vagy kvarcal). Próbának beállítottam a 12f675-t külső 4Mhz oscira (XT_OSC), és rámértem a 3-as lábra, de csak pár khz jön ki rajta. Ha ugyanezt megcsinálom pl 16f84-en (15 láb) ott megvan a 4Mhz és igy már menne a másik PIC is. Már átolvastam a 12f675 adatlapját, de nemnagyon találtam ezen a téren semmit, vagy csak elkerülte a figyelmem. A kérdésem , hogy a 12fxxx be mit kell még beállítani, hogy lássam a 4Mhz-t?
(#) icserny válasza szitko hozzászólására (») Ápr 5, 2011 /
 
Idézet:
„A probléma, hogy két PIC-et szeretnék meghajtani egy rezonátorral (vagy kvarccal).”
Nincs neki ilyen üzemmódja (egy kvarcról két PIC). Hivatalosan csak önálló, külső oszcillátor jele vihető be több PIC-be.
Idézet:
„Próbának beállítottam a 12f675-t külső 4Mhz oscira (XT_OSC), és rámértem a 3-as lábra”
Esetleg próbálkozz HS móddal, hátha csak az a baj, hogy túl sok volt a terhelés!

Egyébként mi értelme lenne a dolognak, a belső órajel miért nem jó?
(#) szitko válasza icserny hozzászólására (») Ápr 5, 2011 /
 
Egy kapcsolásban láttam ezt a megoldást, hogy ott mi értelem van azt nem tudom pontossan, talán, hogy mind a két PIC ugyanazon ferkin járjon. A képen látszik, hogy köti össze a két PIC-et, Én is így szerettem volna, ja és a 12c508-al megy, de a 12f508 meg a 12f675-el már nem működik. Amúgy csak szerettem volna kipróbálni, és mivel a csatolt kapcsiba megy, nálam meg nem, mint probléma szerettem volna megoldani.

kep.jpg
    
(#) szitko válasza icserny hozzászólására (») Ápr 5, 2011 /
 
Hálás köszönet Icserny Úrnak, átraktam HS_OSC -ba s lőn világosság megjelent a 4Mhz és a progi is pontossan fut. Még lenne egy kérdésem, hogy lehet a lehető legkönyebben létrehozni egy 10 perces időzítést? Pontossabban azt szeretném, hogy a pic-en lévő program 10 perc után megálljon, és mondjuk egy gombnyomásra újabb 10 percig menjen.
(#) icserny válasza szitko hozzászólására (») Ápr 5, 2011 /
 
Idézet:
„hogy lehet a lehető legkönyebben létrehozni egy 10 perces időzítést?”
Attól függ, hogy milyen nyelven programozol. JAL nyelven például csak be kell csatolni a késleltetéseket definiáló könyvtárat.
  1. include 12f675
  2. pragma target clock  4_000_000
  3. pragma target OSC  INTOSC_NOCLKOUT
  4. pragma target WDT  disabled
  5. pragma target MCLR external
  6.  
  7. include delay
  8. enable_digital_io()
  9. pin_A0_direction =  output
  10.  
  11. forever loop
  12.   pin_A0 = on
  13.   delay_1s(600)
  14.   pin_A0 = off
  15.   delay_1s(600)
  16. end loop
(#) potyo válasza icserny hozzászólására (») Ápr 5, 2011 /
 
Bocs, de úgy nézem, hogy ez a JAL 2004-ben vagy 2003-ban volt utoljára frissítve, szerintem el kellene inkább felejteni. Lehet, hogy vannak benne jó dolgok, de a fenti okból kifolyólag szerintem nem érdemes vele foglalkozni...
(#) szitko válasza icserny hozzászólására (») Ápr 5, 2011 /
 
Bocsánat, hogy nem írtam, asm-ben próbálkozok.Ja és PIC16f882-ről van szó.
Következő: »»   104 / 1210
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem