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   498 / 1210
(#) cross51 hozzászólása Márc 8, 2014 /
 
Sziasztok!
Az megvalósítható, hogy egy LCD-nél amit ki szeretnék írni szöveget ne így kelljen megírni assembly-ben hanem:
  1. Data_1
  2.     ADDWF   PCL, F
  3.     RETLW   "<"
  4.     RETLW   "="
  5.     RETLW   "="
  6.     RETLW   " "
  7.     RETLW   "2"
  8.     RETLW   "x"
  9.     RETLW   "1"
  10.     RETLW   "6"
  11.     RETLW   " "
  12.     RETLW   "L"
  13.     RETLW   "C"
  14.     RETLW   "D"
  15.     RETLW   " "
  16.     RETLW   "="
  17.     RETLW   "="
  18.     RETLW   ">"

Hanem C-hez hasonlóan: "<== 2x16 LCD ==>"
C-ben van a printf fv. meg eléggé sokféle módot találtam a neten C-re de hát assembly-be nem lehet *.h fájlt berakni(tudtommal) és a C-vel még nem akarok komolyabban foglalkozni.

Köszönöm!
(#) Hp41C válasza cross51 hozzászólására (») Márc 8, 2014 /
 
  1. Data_1
  2.     ADDWF   PCL, F
  3.     DT    "<== 2x16 LCD ==>"
(#) cross51 válasza Hp41C hozzászólására (») Márc 8, 2014 /
 
Köszönöm Hp41C!
Előbb kellet volna kérdezzek mert keresgetés során találkoztam ezzel a DT paranccsal csak nem tudtam, hogy pont ez kell nekem.
(#) don_peter hozzászólása Márc 8, 2014 /
 
Uraim, mondja már el valaki nekem, hogy miért nem tudok lebegőpontos (float) változót kiíratni az LCD kijelzőre?

A kód amivel próbálkozom sallang nélkül:
  1. #include <p18f4550.h> //chip beállítása
  2. #include <stdio.h> //I/O portok beállítása
  3. #include <delays.h> //Időzítő
  4. //#include <tesztheader.h>     //Implicit módon becsatolja p18cxxx.h-t is!  
  5. //#include <adc.h>
  6. #include "teszt_lcd.c"  
  7.  
  8. float flo_at = 12.334563;
  9. unsigned char cha_r; //próbáltam ezt is: unsigned char cha_r[32];
  10.  
  11. void main(void){
  12.        
  13.         int i = 0;
  14.  
  15.         TRISC = 0; //C PORT kimentre állítva (LCD-hez kell)
  16.  
  17.     lcd_init();                     // Az LCD modulinicializálása
  18.     lcd_init_cgram();               // Az ékezetes betűk feltöltése
  19.     stdout = _H_USER;               // Az LCD legyen a standard kimenetnt
  20.         printf("                    ");
  21.     lcd_write(0xC0,0,1,1);  
  22.         printf("                    ");
  23.         lcd_write(0x94,0,1,1);                          //törlom at LCD sorait
  24.         printf("                    ");
  25.         lcd_write(0xD4,0,1,1);
  26.         printf("                    ");
  27.         lcd_write(0x80,0,1,1);
  28.         Delay100TCYx(10000);
  29.  
  30.         while(1){
  31.  
  32.                 printf("Ciklus: %i", i); //integer változó kiíratása (ciklus számoló)
  33.         lcd_write(0xC0,0,1,1);
  34.  
  35.                 //itoa(flo_at, (char *)cha_r + 0); //változót karakterré konvertáljuk
  36.             //printf(cha_r); //lebegőpontos szám kiíratása
  37.             //lcd_write(0x94,0,1,1);
  38.                
  39.             printf("-> %f", flo_at); //lebegőpontos szám kiíratása
  40.             lcd_write(0x94,0,1,1);
  41.                
  42.                 printf("3. sor");
  43.                 lcd_write(0xD4,0,1,1);
  44.                 printf("4. sor");
  45.                 lcd_write(0x80,0,1,1);
  46.                 Delay100TCYx(10000);
  47.  
  48.         i++;
  49.         }
  50. }


Sajnos az itoa() függvény sem segít mert mikor átkonvertál egy csomó zagyvaság kerül a változóba.
Előre is köszi.

ui: PICCOLO projekt LCD driver-ét használom.
A hozzászólás módosítva: Márc 8, 2014

a.JPG
    
(#) Hp41C válasza don_peter hozzászólására (») Márc 8, 2014 /
 
Ahogy icserny jelezte, nincs megírva... Az ezedménynek vedd az egész részét, írasd ki egészként int változóból, írj tizedespontot, a törtrészt szorozd meg 10 annyiadik hatványával, ahány tizedes jegyet szeretnél, írd ki az egész részét unsigned int változóból. Ha az egész rész nagyobb, mint 32767, akkor használj long -ot. Ha a5 tizedes jegynél több kell, akkor használj ott unsigned long -ot.
A hozzászólás módosítva: Márc 8, 2014
(#) don_peter válasza Hp41C hozzászólására (») Márc 8, 2014 /
 
Azt most átírtam.
int flo_at = 12.334563; változó értékét kiíratom az most 12 és megjelenik.
Írtam mögé egy pontot vagyis tizedes lesz.
2tizedesig akarom kiíratni a végeredményt.
Ez eddig világos.

"a törtrészt szorozd meg 10 annyiadik hatványával, "
Ehhez előbb szét kéne szednem a változó értékét vagy legalább is meg kellene szereznem a tizedes utáni részt.
Ezt hogyan kell csinálni?

Egy kis példaprogramot nem tudsz összedobni ami bemutatná ezt az egész folyamatot?
Köszi előre is a segítséget.
(#) icserny válasza don_peter hozzászólására (») Márc 8, 2014 /
 
Idézet:
„Uraim, mondja már el valaki nekem, hogy miért nem tudok lebegőpontos (float) változót kiíratni az LCD kijelzőre?”
Azért, mert nem úgy csinálod, ahogy mondtam.

  1. // float flo_at = 12.334563; <--- ezt felejtsd el! Helyette:
  2. long no_float = 12334563;
  3. outdec(no_float,6);


A kiírató rutint a PICCOLO projektben megtalálod:

  1. /** Decimális kiíratás adott számú tizedesjegyre.
  2.  * \param data a kiírandó szám (előjelesen)
  3.  * \param ndigits a kiírandó tizedesek száma
  4.  */
  5. void outdec(long data, unsigned int ndigits) {
  6. static char sign, s[12];
  7. unsigned int i;
  8.         i=0; sign='+';
  9.         if(data<0) { sign='-'; data = -data;}
  10.         do {
  11.                 s[i]=data%10 + '0';
  12.                 data=data/10;
  13.                 i++;
  14.                 if(i==ndigits) {s[i]='.'; i++;}
  15.         } while(data>0);
  16.         _user_putc(sign);
  17.         do{
  18.                 _user_putc(s[--i]);
  19.         } while(i);
  20. }


Felteteleztem, hogy az _user_putc() függvényt úgy definiáltad, hogy az LCD-re írjon.
(#) don_peter válasza icserny hozzászólására (») Márc 8, 2014 /
 
Köszi, ebből már kihámozok valamit.
Ez a függvény nekem nem volt benne az LCD driverbe.
Köszi még egyszer.

ui: _user_putc() definiálva van mert jól működik.
Majd még a a képernyő törlést kell megoldanom, hogy ne ragadjon be a nem használt terület illetve, hogy a tizedes elé, hogy ha kisebb az érték 1-nél akkor egy 0-át tegyen be.
Ezeket már megírom.
A hozzászólás módosítva: Márc 8, 2014
(#) Hp41C válasza Hp41C hozzászólására (») Márc 8, 2014 /
 
  1. fval=fval-floor(fval);

Nem tudok saját példát megadni, mert eddigi mikrokontrolleres programjaimban nem használtam float típust. (Pedig már néhány tucatot megítam...) Fogadd meg, amit Icserny ajánl. Az int műveletek sokkal gyorabbak, tömörebbek, hatékonyabbak.
(#) icserny válasza don_peter hozzászólására (») Márc 8, 2014 /
 
Idézet:
„Ez a függvény nekem nem volt benne az LCD driverben.”
Miért is volna benne, amikor semmi köze az LCD-hez? Az a felhasználó magánügye, hogy az _user_putc()-t hova definiálja... Egyébként a piccolo_usb.c-ben használom/definiálom az outdec() függvényt.
A hozzászólás módosítva: Márc 8, 2014
(#) icserny válasza don_peter hozzászólására (») Márc 8, 2014 /
 
Idézet:
„hogy a tizedes elé, hogy ha kisebb az érték 1-nél akkor egy 0-át tegyen be.”

Ezt ebben a hozzászólásban már megválaszoltam néhány napja VSzabi fórumtársunknak.
(#) don_peter válasza icserny hozzászólására (») Márc 8, 2014 /
 
Királyság
Thanks.
(#) don_peter válasza icserny hozzászólására (») Márc 8, 2014 /
 
Ohh
Azt hittem ez az LCD vezérlés része volt még.
Érdekes viszont akkor, hogy megy nekem egyből.
Vagy lehet a header állományomban még benne van ez a függvény.
Gyakorolgatok ezerrel, de nem könnyű így kezdőnek.

Ne haragudjatok, ha az idegeitekre megyek az alap kérdéseimmel, de muszáj segítséget kérjek, hogy tanuljak a hibákból és a megoldásokból.
Köszi még egyszer.
(#) don_peter válasza icserny hozzászólására (») Márc 8, 2014 /
 
Ha csak simán két tizedesig (3.14) akarom kiíratni a feszültséget akkor milyen módosításokat kell elvégeznem?
Itt is a megszakítás feltételéhez kell nyúlni?
(#) NyariG hozzászólása Márc 8, 2014 /
 
Érdeklődnek hogy a kvarc mellett a kondenzátoroknak milyen szerepe van és mit befolyásol az értéke.
Konkrét problémám hogy van egy 32.768 kHz kvarcom és azt az adatlap szerint két 33pF es kondival kellene bekötni de olyanom nincs szóval vagy vagy kap 1-1db 22pF eset vagy kap 2-2db 15pF-t párhuzamosan kötve.
(#) vicsys válasza NyariG hozzászólására (») Márc 8, 2014 /
 
Szerintem tedd be a 2db. 22pF-ot és egyikkel párhuzamosan elég tenni egy 15pF-ot, ha nem indul.
(#) NyariG válasza vicsys hozzászólására (») Márc 8, 2014 /
 
Beindult a plusz nélkül is
(#) dani9228 válasza icserny hozzászólására (») Márc 8, 2014 /
 
Asszem meg van a baja. A panelra C-ben kell rátölteni a progit nem assemblyben.
(#) don_peter válasza don_peter hozzászólására (») Márc 8, 2014 /
 
Közben megoldottam magam is a kérdést:
  1. void outdec(long data, unsigned int ndigits, unsigned int maxtizedes) {
  2.     static char sign, s[12], volt;
  3.     unsigned int x;
  4.     x=0; sign='+'; volt='v';
  5.     if(data<0) { sign='-'; data = -data;}
  6.     do {
  7.             s[x]=data%10 + '0';
  8.             data=data/10;
  9.             x++;
  10.             if(x==ndigits) {s[x]='.'; x++;}
  11.     }
  12.         while(data>0 || x<ndigits+2);
  13.         _user_putc(sign);
  14.     do{
  15.                 if(x>=maxtizedes){
  16.                 _user_putc(s[--x]);
  17.                 }else{ break; }
  18.     }
  19.         while(x);
  20.         _user_putc(volt); //Volt "v" kiíratása a végére
  21.         printf("                    "); //LCD sor frissítése
  22. }

Ez már úgy van átalakítva, hogy ha kisebb 1nél az érték akkor a tizedes pont elé teszt be egy nullát és meghatható hány tizedesig írjon ki.
Pl:
Volt = 345678
outdec(volt, 3, 2);
Eredmény: +3.45v
Ha van szebb és hatásosabb megoldás akkor kérlek jelezzétek.
Köszi.
A hozzászólás módosítva: Márc 8, 2014
(#) don_peter hozzászólása Márc 9, 2014 /
 
Uraim, kérném, hogy ellenőrizétek le a kapcsolási rajzomat nehogy elrontsak valamit.
Csatolom a képet.
Szeretnék készíteni egy olyan teszt környezett ahol az összes felhasználható portot tudom használni, ha akarom.
Nem vagyok túl jó a kapcsolásokban sem szóval bíráljatok felül.
Köszi előre is.

a.JPG
    
(#) Bakman válasza don_peter hozzászólására (») Márc 9, 2014 /
 
Ha belső órajelről hajtod a PIC-et, akkor nem kell rá kvarc, egyel több portot tudsz tesztelni. A 100 n kondi legyen a lehető legközelebb az IC-hez, a másik oldalra is tegyél egyet. Ha a Reset lábat bemenetként használod, szintén kapsz plusz egy portot. Ha mégsem, akkor az 1 k ellenállást cseréld 10 kOhm-ra.
(#) cross51 hozzászólása Márc 9, 2014 /
 
Sziasztok!
Újabb problémába ütköztem C-ből Assebly-be alakítás terén.
LCD-be definiált 8 karakter (á, é, í, ó, ú, ü, ö, ő) 0x00.. 0x07 kódjait szeretném hozzá rendelni a neki megfelelő ASCII kódhoz.
A PICCOLO-nál találtam ezt, de ez sajnos C:
  1. void _user_putc(char c) {
  2.     switch(c) {
  3.             case 'á':  c = 0x00; break;
  4.             case 'é':  c = 0x01; break;
  5.             case 'í':  c = 0x02; break;
  6.             case 'ó':  c = 0x03; break;
  7.             case 'ú':  c = 0x04; break;
  8.             case 'ü':  c = 0x05; break;
  9.             case 'ű':  c = 0x06; break;
  10.             case 'ő':  c = 0x07; break;
  11.             case 'ö':  c = 0xEF; break;

Valaki tudna segíteni ez, hogyan nézne ki Assembly-ben?
Köszönöm!
(#) don_peter válasza Bakman hozzászólására (») Márc 9, 2014 /
 
Köszi,

Kiegészítettem, kérlek nézd meg, hogy így már jó e.
Thanks

a.JPG
    
(#) Bakman válasza don_peter hozzászólására (») Márc 9, 2014 /
 
A 7805-ös stb. IC bemenetéhez az adatlapja szerint 330 n dukál, a kimenethez 100 n. A biztonságos üzemeltetéséhez legalább 7,5 V (de inkább 8 V) bemeneti feszültség kell. Ha csak a kontroller lesz rajta akkor nem, nagyobb terhelésnél már kell hűtőborda is a hátára. A többi jónak tűnik.
(#) ferkoo válasza don_peter hozzászólására (») Márc 9, 2014 /
 
Üdv linkelek egy gyári demo panel leírást az alapján tudsz te is készíteni Farnell.com
A hozzászólás módosítva: Márc 9, 2014
(#) don_peter válasza ferkoo hozzászólására (») Márc 9, 2014 /
 
Köszi, van már Piccolo, de korlátoz. (nem látom át rendesen)
Saját kell amin nincs semmi sallang.
A hozzászólás módosítva: Márc 9, 2014
(#) don_peter válasza Bakman hozzászólására (») Márc 9, 2014 /
 
Akkor ehhez jó a tantál kondenzátor?
Az adatlapján nem látom hogy fontos lenne a polaritás.
(#) nedudgi válasza don_peter hozzászólására (») Márc 9, 2014 /
 
Ha egy kondenzátoron jelölve van polaritás, akkor fontos, hogy milyen irányban kötöd be.
A 7805 adatlapja kerámia kondenzátorra számít, annál tényleg mindegy a polaritás.
(#) vicsys válasza don_peter hozzászólására (») Márc 9, 2014 /
 
Nem pont fordítva van a 7805?
(#) don_peter válasza vicsys hozzászólására (») Márc 9, 2014 /
 
Nem, mert a tükörképe lesz a nyákra vasalva.
Tehát most a nyák hátulját látod.
A nyákot hátulról megvilágítva lesznek szemből olvashatóak a felíratok.


ui: bár most elbizonytalanodtam
Igen a rajz van rosszul, de az IC-ét meg lehet fordítani.
Figyelni kell majd beültetésnél a ki és bemenetet.
Amúgy alapértelmezett az 1-es láb = input-al? (7805)
A hozzászólás módosítva: Márc 9, 2014
Következő: »»   498 / 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