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   1029 / 1203
(#) erzsé válasza Hp41C hozzászólására (») Ápr 17, 2018 /
 
Köszönöm szépen. Holnap reggel megpróbálom én is. Most nem vagyok már gépközelben.
(#) cassis hozzászólása Ápr 17, 2018 /
 
Mi a leggyorsabb C kódja a 16 bites <<--->> 8 bites változók közti értékátadásnak? Természetesen garantálva azt, hogy a maximális érték 255 nél nem nagyobb előjel nélküli?
Egyik irányban valami ilyesmire gondolok:
  1. void Write (unsigned char *Data)    
  2. {
  3.   ...
  4.   unsigned int test;
  5.   test = *Data;           // helyett mi a jó megoldás ?????            
  6.  ...
  7. }


És fordítva:

  1. unsigned int Read (unsigned long Address)  
  2. {
  3.   ...
  4.   unsigned int test;
  5.   unsigned  char a = 50;
  6.   ...
  7.   test = a;         // helyett mi a jó megoldás?????            
  8.   return (test);
  9. }


A fenti kódok csak arra példák mire gondolok konkrétan a 16/8 bites átalakítással kapcsolatosan.
(#) superuser válasza cassis hozzászólására (») Ápr 18, 2018 /
 
Változók közötti értékátadásra gondolsz, vagy eljárások paraméter átadására?
Azért kérdem, mert megtévesztő, hogy komplett eljárásokat másoltál be.
Miért van ennek jelentősége? Ennyire ki van hajtva a proci, hogy ez számít?
Véleményem szerint beírod az értékadást, a többit a fordítóra bízod; jobb úgysem lesz.
b) összehasonlíthatod az egyes módszerek közötti különbséget, ha megnézed a fordított kód hosszát. Rövidebb kód = gyorsabb kód.
(#) kissi válasza cassis hozzászólására (») Ápr 18, 2018 /
 
A hozzászólás módosítva: Ápr 18, 2018
(#) pajti2 hozzászólása Ápr 18, 2018 / 1
 
Moderátorokhoz kérdés. Mi a hócipő történik, hogy nem tudok postot küldeni a fórumra? Üres üzenet jelenik meg helyette.
(#) pajti2 válasza cassis hozzászólására (») Ápr 18, 2018 /
 
(#) Bakman válasza cassis hozzászólására (») Ápr 18, 2018 /
 
Szerva itt, csere ott.
(#) erzsé válasza Hp41C hozzászólására (») Ápr 18, 2018 /
 
Szia!
Próbáltam, ahogy írtad, de nekem veled szemben teljes kudarc.
Nagyon az elején vagyok még, s ennyiből nem sikerült megértenem.
Próbálkozom még, nem adom fel.
(#) Hp41C válasza erzsé hozzászólására (») Ápr 18, 2018 /
 
Itt a módosított project. Kitöröltem belőle néhány felesleges search path bejegyzést a "Project" menü "Edit Search Paths" menüpontjával. Ekkor eltűnnek a "Specified search path does not exist:..." sorok is.
(#) cassis válasza superuser hozzászólására (») Ápr 18, 2018 /
 
Alapvetően 16/8 bites változók közti értékátadásra gondolok. A paraméterbeli átadás ebben a tekintetben - szerintem - hasonlóan kezelendő.
A fenti kód egyébként jól működik, hibátlanul alakulnak a 8/16 bites változók egymásba. Ugyan számomra nem pontosan világos hogyan történik meg mindez.
Például a Write függvény 5. sora így kerül lefordításra:

  1. ze [w1],w0       // Zero-extend the Least Significant Byte in source                               //working  register Ws  to a 16-bit value and store the                           // result in the destination working register Wnd.      
  2. mov.w w0,test

Értem a ze utasítás lényegét, de nekem ebből nem következik a 8/16 bites konverzió végrehajtása.
Gyanítom nem korrektek, csak "éppen működőek" a fenti példa kódok (előző hozzászólásomban), és talán egy ADDRESS ERROR TRAP GENERATED is előáll, csak nem ellenőrzöm.
Szóval hogyan is lehetne ezt a 8/16 bites konverziót egyszerűen kezelni C ben? (dsPIC33F)
A hozzászólás módosítva: Ápr 18, 2018
(#) erzsé válasza Hp41C hozzászólására (») Ápr 18, 2018 /
 
Ezer köszönet! Ma már nem, de holnap kipróbálom.
De jó napom volt ma
(#) superuser válasza cassis hozzászólására (») Ápr 18, 2018 /
 
Idézet:
„Szóval hogyan is lehetne ezt a 8/16 bites konverziót egyszerűen kezelni C ben?”


Egyszerűen használod a C szintaktikát és nem foglalkozol a generált kóddal. A fordító elvégzi a fordítást és a kód működni fog.
{
unsigned char b;
unsigned int w;
w = b; //nyilvan ez a sor torolni fogja w felso 8 bitjet
b = w; //ez a sor pedig figyelmen kivul hagyja w felso 8 bitjet
}
Remélem a kérdésedre válaszoltam.
(#) cassis válasza superuser hozzászólására (») Ápr 18, 2018 /
 
Igen, magam is így csináltam és jól működik. Kicsit hezitáltam hogy korrekt -e a megoldás, esetleg elvi hibás működés "véletlen" eredményeként kapok mégis megfelelő értékeket. Így akár a 32/8 bites konverzió is megoldható? Persze ügyelve a max. ábrázolhatóságra
(#) superuser válasza cassis hozzászólására (») Ápr 18, 2018 /
 
Azt gondolom technikailag ugyanaz, csak a változók mérete tér el.
Ha már beszélgetünk róla, aminél tapasztaltam, hogy nem fordítja jól az XC8,
az az alábbi kifejezés:
w = b*10; //w-word, b-byte
Ezt mindenáron bájton akarja kiszámolni, ha meg typecast-et használok, akkor hozzávesz 8 bájt nem inicializált területet és hibás lesz az eredmény.
Szóval ehelyett:
w = b;
w *= 10;
Ha valaki tudja, hogy mit kellett volna írjak egysoros kifejezést, az ossza meg velem, had tanuljak.
(#) JosKa válasza superuser hozzászólására (») Ápr 18, 2018 /
 
Nincs kéznél C fordító, de szerintem:
  1. w = ((int)b) * 10;


De ha jól rémlik, akkor ez is jó:
  1. w = (int)b * 10;
(#) Hp41C válasza cassis hozzászólására (») Ápr 19, 2018 /
 
C szabályai szerint a unsigned char *Data egy pointer, amit az eljárás előtt a stack -ra tetet a fordító. A hívás után a pointer a W1 regiszterbe kerül. a ze [w1],w0 utasítás a w0 regiszter felső 8 bitjét nullázza, az alsó 8 bitre a [w1] alsó 8 bitjét másolja. A mov.w w0,test utasítás az így a w0-ban keletkezett szót teszi a test címére.
(#) Hp41C válasza superuser hozzászólására (») Ápr 19, 2018 /
 
Idézet:
„Ha már beszélgetünk róla, aminél tapasztaltam, hogy nem fordítja jól az XC8,
az az alábbi kifejezés:
w = b*10; //w-word, b-byte”

A C szabályai szerint a kifejezéseket az első operandus adatábrázolásának megfeleő adatábrázolással kezdi a fordító. Mivet a b 8 bites (char) a szorzás eredménye is 8 bitesre konvertálódik.

  1. w = (word)b*10; //w-word, b-byte

Ebben a sorban azt írjuk elő, hogy a b változót a számítás előtt konvertálja word típusra. Mivel az első operandus ezek után word, a többi művelet is 16 bitesen végződik el.
(#) superuser válasza Hp41C hozzászólására (») Ápr 19, 2018 /
 
Ha a konvertáláshoz nem 0x00 inicializált területet használt a fordító és emiatt módosult a változó értéke, az fordító hiba? Mert konkrétan ezt tapasztaltam.
(#) Hp41C válasza superuser hozzászólására (») Ápr 19, 2018 /
 
Fejtsd ki bővebben, mert így nem érthető a probléma.
(#) superuser válasza Hp41C hozzászólására (») Ápr 19, 2018 /
 
pl. b értéke 175 (0xAF) a művelet előtt
w=(WORD)b*10;
és az mplab C18 úgy kezeli a b változót, mintha WORD-ként deklaráltam volna,
tehát hozzáveszi a szomszédos memória cím tartalmát.
Ha a PIC RAM-ban lévő értékek 0x01, 0x02, 0x03, 0xAF, 0x05, 0x06
akkor a typecast során a fordító a 0x05AF értéket (little endian) veszi a B változó értékének,
és w = 0x05AF * 10; lesz.

És nem tudom, hogy ez feature vagy bug.
(#) Hp41C válasza superuser hozzászólására (») Ápr 19, 2018 /
 
Nem erről van szó.
Amikor előírod a típuskonverziót, a fordító egy átmeneti változót használ fel a konvertált érték tárolására. Ezt a változót használja fel a további számításokhoz.

Lássunk egy példát. Sajnos itt és most a C18 nem elérhető, de használjuk a jogutódját (XC8) és hogy ne kelljen új project -et csinálni egy 16F1455 -hoz készültbe írtam bele a következő sorokat:
WORD w;
BYTE b;
...
w = 65000;
b = 175;
w= (WORD) b * 10;
Az első képen a futást megállítottam a b feltöltése után. Látható, hogy a w értéke 65000 - 0xFDE8, a b -é 175 - AF.
A w címe 0x1E1, a b címe 0x1E3.
A második képen a fordított kód látható.
A b értéke épen a WREG -ben marad az előző utasítás után, így nem kell előszedni. Az értékét a 1. lapon a 0x5e címen levő változóba (0x15E) teszi. Az 1. lapon a 0x5f címen levő adatot nullázza. Ezzel előállítja b értékét 16 bitre. Ezután a 10 -et (0x0A) tesz a 0x160 címre (a felső byte-ját kinullázza a 0x161 címen) és meghívja a szorzás eljárást (16 bit * 16 bit).
A harmadik képen az eredmény látható. Megfelel az elvárásoknak w új értéke 1750 - 0x6D6.
(Az FSR1 = w; utasítás azért kell, hogy az optimalizáló ki ne dobja az amúgy felesleges utasításokat hiszen a w értékét nem használjuk fel.)
A hozzászólás módosítva: Ápr 19, 2018
(#) eSDi hozzászólása Ápr 19, 2018 /
 
PICkit 4 első teszt. Egy hiper-szuper két LED-es villogó.

Mivel szegény PK3-am túlfeszültség áldozata lett, így beruháztam ebbe, ha már elérhető nálunk is. A régi javítását elkezdtem, de jutányos áron lecsapott rá egy kedves fórumtárs. Remélem sikerül neki rendbe hozni.

P4197410.jpg
    
(#) usane válasza eSDi hozzászólására (») Ápr 19, 2018 /
 
Általában csak a vonal végi dual supply bus-(oka)t kell cserélni. (SN74lvc145) Meg esetleg a védődiódát
A hozzászólás módosítva: Ápr 19, 2018
(#) eSDi válasza usane hozzászólására (») Ápr 19, 2018 /
 
Minden IC, ami az 5V-os vonalon van és egy dióda meghalt. Mindegyik levétele után szűnt csak meg a zárlat. Amúgy is birizgálta már a fantáziámat a PK4, csak nem így akartam a váltást elkövetni.
(#) superuser válasza Hp41C hozzászólására (») Ápr 19, 2018 /
 
Idézet:
„Nem erről van szó.”


Pontosan azt írtam le amibe belefutottam. Amit írtam az egy hibakeresésnek a végeredménye.

Köszönöm a részletes magyarázatodat, mert ez alapján látszik, hogy nem úgy kéne működjön a fordító, mint amit leírtam.
(#) cassis válasza Hp41C hozzászólására (») Ápr 19, 2018 /
 
Így teljesen világos, köszönöm mindkettőtöknek.
A stack tetején - a hívó program által elhelyezett - paraméter értéket (itt: &Data) a függvényben W1 veszi fel. Ez jól látható a visszafordított kódban. Majd megnézem ha több paraméter is átadásra kerül hogyan használja a függvény ezeket. Várnám a W2 - W13 közti regisztereket, de úgy tudom nincs limitálva a paraméterlista, így ez kicsit ellentmondást szül most.
(#) Zsora válasza cassis hozzászólására (») Ápr 20, 2018 /
 
Nincs ellentmondás. A paramétereknek LNK utasítással foglalnak helyet a veremben, majd elhelyezik őket ott. A szubrutin offszetes indirekt hivatkozással (MOV [Ws+Slit10],Wnd) használja fel őket, tehát csak a W14 regiszterre, ill. egy-két egyéb munkaregiszterre van szükség. (...még többszáz paraméter esetén is.) A visszatérési érték(ek) szintén a verembe kerülnek.
(#) Hp41C válasza superuser hozzászólására (») Ápr 20, 2018 /
 
Nem véletlenül az alábbiba futottál bele?
  1. #pragma pack 1  // Nem hagy ki tárterületet a változó között
  2.  BYTE b;
  3.  BYTE c;
  4.  WORD w;
  5.  BYTE *p;

Ezekkel a változókkal a következő utasításokat hajtjuk végre:
  1. w = 65000;
  2.  c = 5;
  3.  b = 175;
  4.  p = &b;

A memóriában a b kezdőcímétől az alábbi a adatok lesztek (byte -osan)
  1. 0xAF 0x05 0xE8 0xFD

  1. w = ((word*) p) * 10;

Utasításban a ((word*) p) a p -val megcímzett BYTE helyett WORD típusú adatot kezel, így a 175 (0xAF) helyett a 1455 (0x05AF) értéket fogja 10 -zel szorozni. Ekkor valóban nem 1750 lesz az eredmény, hanem 14550.
(#) oregharcos hozzászólása Ápr 20, 2018 /
 
Sziasztok!
Tanulgatom az assemblyt, pár éve találtam egy jó leírást. Az első megszakítások részéig megcsináltam mindent az MPLAB-ban és a Proteusban kipróbáltam és jól működik. Az RB-megszakítást is beraktam a proteusba, fut a fény de a gombokkal nem lehet váltani a ledek irányát, tehát nem csinálnak semmit. Itt a megszakítás állítaná be az irányt és a főprogram léptet a fényt, de nem csinálja. A programot innen szedtem le: Bővebben: Link

  1. ;A megszakítás állítja be az irányt és a főprogram lépteti a fényt.
  2. LIST P=16F84
  3.  #INCLUDE "P16F84.INC"
  4.  __CONFIG _XT_OSC&_CP_OFF&_WDT_OFF
  5.  
  6.         CBLOCK  0X0C
  7.         WSAVE
  8.         IRANY
  9.         T1
  10.         T2
  11.         PB
  12.         ENDC
  13.         ORG     0
  14.         GOTO    START
  15.  
  16.         ORG     4
  17.         BCF     INTCON,RBIF
  18.         MOVWF   WSAVE
  19.         MOVFW   IRANY
  20.         BTFSS   PORTB,6
  21.         MOVLW   00
  22.         BTFSS   PORTB,7
  23.         MOVLW   01
  24.         MOVWF   IRANY
  25.         MOVFW   WSAVE
  26.         RETFIE
  27.  
  28. START:  BSF     STATUS,RP0      ;BANK1
  29.         MOVLW   B'00011111'
  30.         MOVWF   TRISA
  31.         MOVLW   B'11000000'
  32.         MOVWF   TRISB
  33.         MOVLW   B'10000111'
  34.         MOVWF   OPTION_REG
  35.         BCF         STATUS,RP0  ;BANK0
  36.         CLRF    IRANY
  37.         MOVLW   01
  38.         MOVWF   PORTB
  39.         BSF         INTCON,GIE
  40.         BSF         INTCON,RBIE
  41.  
  42. JOBBRA: BTFSS   PORTB,0
  43.         GOTO    FORGJ
  44.         MOVLW   B'00100000'
  45.         MOVWF   PORTB
  46.         CALL    DELAY
  47.         GOTO    JOBBRA
  48.  
  49. FORGJ:  MOVLW   B'00111111'
  50.         ANDWF   PORTB,W
  51.         MOVWF   PB
  52.         CLRC
  53.         RRF     PB,W
  54.         MOVWF   PORTB
  55.         CALL    DELAY
  56.         GOTO    JOBBRA
  57.  
  58. BALRA:  BTFSS   PORTB,5
  59.         GOTO    FORGB
  60.         MOVLW   01
  61.         MOVWF   PORTB
  62.         CALL    DELAY
  63.         GOTO    JOBBRA
  64.  
  65. FORGB:  CLRC
  66.         RLF     PORTB,F
  67.         CALL    DELAY
  68.         GOTO    JOBBRA
  69.  
  70. DELAY:  MOVLW   d'150'
  71.         MOVWF   T1
  72. DEL:    MOVLW   d'255'
  73.             MOVWF       T2
  74. DEL1:   NOP
  75.             NOP
  76.             NOP
  77.             NOP
  78.             NOP
  79.             NOP
  80.             NOP
  81.             NOP
  82.        DECFSZ   T2,f
  83.       GOTO      DEL1
  84.       DECFSZ    T1,f
  85.       GOTO      DEL
  86.           RETURN
  87.           END


Ránéznétek, hogy mi lehet a gond.
Előre is köszönöm a segítséget!
(#) superuser válasza Hp41C hozzászólására (») Ápr 20, 2018 /
 
Nem. Visszanéztem mielőtt beírtam.
Nem találtam olyan szintaktikát amivel jól megcsinálta volna a fordító, végül szétszedtem két sorra.
Nem az első esete a C18-nak, hogy a különböző méretű változók között a kisebbik méretén végzi a műveletet és ez hibát okoz. WORD és DWORD között is belefutottam.
Következő: »»   1029 / 1203
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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