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   886 / 1210
(#) ativagyok hozzászólása Dec 16, 2016 /
 
Üdv,
Egy PIC16F1789 kontrollerrel analóg részével van egy kis gondom.
ADC-t és DAC-t is szeretném használni, egyelőre sikertelenül:
Hiába állítom be pozitív referenciának az FVR-t, továbbra is a VCC-t veszi maximumnak. A kimenet formátumát szintén hiába állítgatom (ADRMD_bit), semmi nem változik.
Ahogy nézem az adatlapot, egy picit bonyolítva van az AD konverter ebben a PIC-ben, de nem jövök rá, hogy mit csinálok rosszul.
A DAC is problémásan működik: A maximális értéken (0x1F) 3150mV-ot ad a kimenetén. Itt is hiába állítom VCC-re, vagy FVR-re a pozitív referenciát, semmit nem változtat.
Az errataban találtam egy bejegyzést az FVR-re vonatkozólag, miszerint 4x-es erősítésre konfigurálva (4096mV) +/-8%-ot tévedhet, de az én esetemben úgy gondolom erre nem fogható.
A kontroller minden táplábon megkapja a stabil 5V-ot kerámia kondikkal szűrve.
MikroC-ben írt forrásom:

  1. void main() {
  2. OSCCON = 0x72;
  3. SDOSEL_bit = 0; //SDO is on pin RC5
  4. SDISEL_bit = 0; //SDi is on pin RC4
  5. SCKSEL_bit = 0; //SCL/SCK is on pin RC3
  6.  
  7. TRISA =  0x07;
  8. TRISB =  0x14;
  9. TRISC =  0x18;
  10. TRISD =  0x00;
  11. TRISE =  0x07;
  12.  
  13. ANSELA = 0x27;
  14. ANSELB = 0x14;
  15. ANSELC = 0x00;
  16. ANSELD = 0x04;
  17. ANSELE = 0x07;
  18.  
  19. CHSN3_bit = 1;
  20. CHSN2_bit = 1;
  21. CHSN1_bit = 1;  //ADC Negative reference – selected by ADNREF
  22. CHSN0_bit = 1;
  23.  
  24. FVRCON = 0xC3;
  25. ADFVR1_bit = 1;
  26. ADFVR0_bit = 1;  //11 = ADC Fixed Voltage Reference Peripheral output is 4x (4.096V)(2)
  27. ADPREF0_bit = 1;
  28. ADPREF1_bit = 1; //11 =VREF+ is connected internally to FVR Buffer 1
  29. ADNREF_bit = 0;    //0 =VREF- is connected to VSS
  30. ADFM_bit = 0;   //0 = Sign-magnitude result format / 1 = 2’s complement format.
  31. ADRMD_bit = 1; // 1 = 10bit adc, 0 = 12 bit format
  32. ADIE_bit = 0;
  33.  
  34. CM1CON0 = 0;
  35. CM2CON0 = 0;
  36. CM3CON0 = 0;
  37. CM4CON0 = 0;
  38.  
  39. DAC2CON0 = 0xA0;
  40. DAC4CON0 = 0xA0;
  41. DAC2CON1 = 0x0F;
  42. DAC4CON1 = 0x0F;
  43.  
  44. do{
  45. adc1=ADC_Read(0);
  46. adc2=ADC_Read(1);
  47. adc3=ADC_Read(2);
  48.  
  49. }while(1);
  50. }
(#) menyus válasza pajti2 hozzászólására (») Dec 16, 2016 /
 
Igen, lehet "ágyúval verébre" a dolog de így viszont szinte határtalan a lehetőségek tárháza. A mikrovezérlővel pl. meg tudom oldani a motor azonnali fékezését is az adott nyomaték elérése után. Motor rövidre zárása közvetlenül a nyomaték határolás után, így nincs túlfutás, az áttétel tehetetlensége miatt a gép lendületből nem húzza tovább a behajtandó csavart. LED állapot visszajelzések, akkufeszültség kontrollja / low batt jelzés (NI-MH s most alakítom át LI-ON ra. Egyébként végül egy 16LF648 al oldom meg, ez alacsony tápfeszültség igényű, 2V ról már ketyeg, 2 komparátor van benne. Persze ez főleg túlzás ehhez a feladathoz, de elfér a Makita házában ( SO18 ) és van is itthon. Főleg azért kell a nyomatékhatárolás mert pont hogy nem izmos csavarokat húznának be vele. Az a baj hogy a legkisebb mechanikus nyomatékon is átszakítja a menetet. Műszerdobozok sorozatos összeszerelésére használják, önmetszős csavarokat hajtanak be vele műanyagba. Vagy átszakad a menet vagy a rosszabbik eset mikor szétrepeszti a műanyag házat a csavar. De köszönöm az ötletet!
A hozzászólás módosítva: Dec 16, 2016
(#) ativagyok válasza ativagyok hozzászólására (») Dec 16, 2016 /
 
A DAC hibája megoldódott...10k ellenállással volt terhelve, ez sok volt neki áramban.
Az adatlapban nem találok utalást a terhelhetőségre.
Az ADC hibája továbbra is fennáll.
(#) DJozso hozzászólása Dec 16, 2016 /
 
Nem tudom, mit rontok el, de már megőrjít a dolog. Gondoltam írok néhány sort, hátha valaki csípőből megoldja a problémámat. Jelenleg egy 18F4550-es kontrollerrel küzdők. A fejlesztő környezetem MikroC for PIC (különböző verzióit próbáltam), az égetést az MPLab végzi a generált Hex filéből. Az égető egy PICKIT 3 klón. A történet annyi, hogy írom a forráskódot ezerrel , folyamatosan fordítom, égetem, minden OK. Majd amikor elér egy szintet a program mérete a fordítás hibás lesz. Ekkor az adott PIC-nél a használt memóriák ROM 12%, RAM 6%. Ha valamely részt kiveszem a kódból, akkor egy ideig tudok mást írni helyette, de egy idő után ismét rossz a fordítás. Pontosan a "hibátlannak tűnő" fordított hex file beégetése után a PIC nem indul el (mintha üres lenne). A mikroC környezetem nem Demo, ennél nagyobb forráskódot is képes volt hiba nélkül fordítani. Van valakinek bármilyen ötlete, mi okozhatja ezt?
Minden segítséget megköszönök.
(#) ktamas66 válasza ativagyok hozzászólására (») Dec 16, 2016 /
 
Az órajel beállítását nem látom (ADCS).
(#) Elektro.on válasza DJozso hozzászólására (») Dec 16, 2016 /
 
Szia!
A hiba oka az ingyenes MikroC. Mivel nem fizettél érte, nincs licens file-od. És ezért 2K a fordítási határod!
A hozzászólás módosítva: Dec 16, 2016
(#) attika válasza Elektro.on hozzászólására (») Dec 16, 2016 /
 
Idézet:
„A mikroC környezetem nem Demo, ennél nagyobb forráskódot is képes volt hiba nélkül fordítani.”

Itt említi, hogy nem demót használ.
(#) Elektro.on válasza attika hozzászólására (») Dec 16, 2016 / 1
 
Akkor ezt benéztem...
(#) Hp41C válasza attika hozzászólására (») Dec 16, 2016 / 1
 
Pedig a 18F4550 -nek 32768 byte a program memóriája, ami 16384 szó. A demo limit 2k szó. 16384 * 0.12 = 1966,08 szó. Hmmmm... Mégiscsak demo módban megy.
A hozzászólás módosítva: Dec 16, 2016
(#) DJozso válasza Hp41C hozzászólására (») Dec 16, 2016 /
 
Aha, értem. Köszönöm szépen.
(#) patrik81 hozzászólása Dec 17, 2016 /
 
Miért van az,hogy ha azt írom,hogy if (templ&8) RC0=1; akkor megcsinálja a feladatot,de ha if ((templ&8)==1) RC0=1; akkor már nem?
(#) icserny válasza patrik81 hozzászólására (») Dec 17, 2016 / 1
 
Idézet:
„ha if ((templ&8)==1) RC0=1;”

Az a helyzet, hogyt templ&8 soha nem lesz 1. Az csak 0b1000 lehet, vagy 0b0000.
Tehát ezek a működő megoldások:
  1. if (templ&8) RC0=1;
  2. if (templ&8 == 8) RC0=1;

A második már egy kicsit túl van komplikálva...
(#) szuperman hozzászólása Dec 17, 2016 /
 
Sziasztok!

Van egy egyszerű kis hello world programom, de egyszerűen nem akar működni. Valaki tudna segíteni? Mi baj lehet a configgal?
  1. #include <xc.h>
  2.  
  3. // CONFIG
  4. #pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
  5. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
  6. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  7. #pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
  8. #pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
  9. #pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
  10. #pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
  11. #pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
  12.  
  13. #define _XTAL_FREQ 4000000
  14.  
  15. void main() {
  16.     TRISB0 = 0; //RB0 as Output PIN
  17.     while (1) {
  18.         RB0 = 1; // LED ON
  19.         __delay_ms(1000); // 1 Second Delay
  20.         RB0 = 0; // LED OFF
  21.         __delay_ms(1000); // 1 Second Delay
  22.     }
  23. }

hello.pdsprj
    
(#) Hp41C válasza szuperman hozzászólására (») Dec 17, 2016 /
 
Milyen típus? Az analóg funkcióval rendelkező lábak (különosan az RB0) digitálisra vannak állítva.
(#) szuperman válasza Hp41C hozzászólására (») Dec 17, 2016 /
 
PIC 16F628A
(#) kriszrap válasza Hp41C hozzászólására (») Dec 17, 2016 /
 
Idézet:
„float Homerseklet = (float)(kod)/16.0;

float - lebegőpontos típus, hogy a tört fokok is eltárolódjanak.
kod a read paranccsal kiolvasott hőmérséklet kód.
Ha assembly -ben programozol:
a (kod) értékét eltárolod két byte -ban, eltárolod az előjelet kiíráshoz.
Ha negatív, minden bitet negálsz és hozzáadsz 1 -et (16 bitesen).
Az alsó 4 bitet átteszed egy harmadikba, a (kod) értékét 4-szer jobbra lépteted (balról mindig 0 értéket lépteted be). Az eredmény az egész fok az első két byte -ban, a harmadik alsó négy bitjén a tört fok. Előjelet pedig eltároltad már.”


Ha ezt a képletet használom akkor megkapom a hömérsékletet celsiusba?? de a minuaszt vagy a + hogy??
(#) attika válasza Hp41C hozzászólására (») Dec 17, 2016 /
 
Nekem fogalmam nincs mert csak bemásoltam azt amit ő írt, így nem tudhatom ,hogy ő mit használ.
(#) Hp41C válasza kriszrap hozzászólására (») Dec 17, 2016 /
 
Idézet:
„float Homerseklet = (float)(kod)/16.0;”

  1. int kod;
  2. // beolvassuk a DS -ből
  3. // kod = ......
  4. float Homerseklet = (float)(kod)/16.0;

Mivel a kod változó előjeles, a float változó is előjeles értéket kap.
Idézet:
„Ha assembly -ben programozol:”

A laírtakban szerepel, hogy eltároljuk az előjelet.
(#) don_peter válasza szuperman hozzászólására (») Dec 18, 2016 /
 
Említette korábban Hp41C is, hogy hiányozik néhány fontosabb regiszter beállítása.
Nem vagyok XC-s, de talán ebből ki tudsz idúlni..
  1. CMCON = 7;                              // Comparator kikapcsolva
  2. CCP1CON = 0;                    // Capt/Comp/PWM kikapcsolva   
  3. INTCON = 0;                             // Összes interrupt láb kikapcsolva
(#) kriszrap válasza Hp41C hozzászólására (») Dec 18, 2016 /
 
mikroC be
Nem szeretnék tizedeseket akkor igy nézne ki a kód:
  1. Ow_Reset(&PORTE, 2);
  2. int adat= Ow_Read(&PORTE, 2);
  3. if(adat => 0x8000) //minusz jel kirakása
  4. int Homerseklet = adat/16;

Valahogy igy képzeltem el
Jól gondolkodom???
(#) cross51 válasza kriszrap hozzászólására (») Dec 18, 2016 /
 
Nem követtem végig a 1Wire témát, nem tudom, hogy így kell-e olvasni, de ha signed int-et kapsz vissza akkor nem egyszerűbb megkérdezni, hogy kisebb-e mint 0?
Valószínűleg a mikroC int alatt 16 bit signed-et ért, de adódhatnak fordítók amik 32 bitet értenek alatta és akkor mindig szerkesztgetni kell, ha a 0-nál kisebb nagyobb dolgot csinálod akkor nem lesz ilyen probléma.
  1. if (adat < 0) // minusz jel kirakása
A hozzászólás módosítva: Dec 18, 2016
(#) kriszrap válasza cross51 hozzászólására (») Dec 18, 2016 /
 
Akkor kérdéseim)))
Ow_Read(&PORTE, 2); milyen számot kapok
decimalisan Ha + érték ha - érték??
A hozzászólás módosítva: Dec 18, 2016
(#) Hp41C válasza kriszrap hozzászólására (») Dec 18, 2016 /
 
Meg kell nézni az eljárás deklarációját a OneWire Library oldalán:
Idézet:
„unsigned short Ow_Read(unsigned short *port, unsigned short pin);”

Azaz 16 bites előjel nélküli egész.
A DS18B20+ adatlapjából:
+125 --- 0000 0111 1101 0000 --- 07D0h
-55 ---- 1111 1100 1001 0000 --- FC90h
Csak egy konverziót kell felhasználni:
int kod = (int) Ow_Read(&PORTE, 2);
A kod máris előjeles szám lesz.
kod /= 16;
pedig az egész fokokat adja előjelesen:
-55 --- 0xC9
-2 --- 0xFE
-1 --- 0xFF
0 --- 0x00
1 --- 0x01
125 - 0x7D
A hozzászólás módosítva: Dec 18, 2016
(#) kriszrap válasza Hp41C hozzászólására (») Dec 18, 2016 /
 
Vagy is akkor bekérem az adatott osztom 16 al és ott a hömérséklet eredménye mint anno írt képleted??? Ennyi?? amit írtam kód az jó lenne?
(#) Hp41C válasza kriszrap hozzászólására (») Dec 18, 2016 /
 
  1. Ow_Reset(&PORTE, 2); // Reset
  2. 0w_Write(&PORTE, 2,0xCC);  // Skip ROM
  3. 0w_Write(&PORTE, 2,0x44);  // Convert_T
  4. wait();
  5. 0w_Write(&PORTE, 2,0xBE);  // Read Scratchpad
  6. unsigned int kod = Ow_Read(&PORTE, 2); // Byte 0: Temperature  7..0
  7. kod |= Ow_Read(&PORTE, 2) << 8; // Byte 1: Temperature  15..8
  8. int Homerseklet= (int) kod / 16;
(#) kriszrap válasza Hp41C hozzászólására (») Dec 18, 2016 /
 
Sorrol sorra mit csinál???
Wait beépített függvény ?
A hozzászólás módosítva: Dec 18, 2016
(#) Hp41C válasza kriszrap hozzászólására (») Dec 18, 2016 /
 
Most tényleg le kell írnom még egyszer, amikor ott a megjegyzés minden sorban?
1. 1-Wire reset pulzus kiadása.
2. ROM azonosítás kihagyása - csak egy DS van a buszon.
3. A hőmérséklet konvertálásának indítása.
Ha parazita táplálással megy, ezek után a vonalra "erős" tápot kell kiadni.
4. Meg kell várni a konverzió végét: kb 750ms. Ebben a formában nem beépített függvény. Nem használom a micro C -t.... Neked kellene utánajárni, milyen eljárás ven rá...
5. 1-Wire reset pulzus kiadása.
6. ROM azonosítás kihagyása - csak egy DS van a buszon.
7. Kiolvasás indítása. 9 byte -ot (vagy kevesebbet lehet olvasni).
8. Alsó byte beolvasása a kod 7..0 bitjeire.
9. Felső byte beolvasása a kod 15..8 bitjeire.
10. egész fokra konvertálás - előjelesen.
Jobban megnézve a kiolvasás előtt Újra reset / Skip_rom kellhet.

  1. Ow_Reset(&PORTE, 2); // Reset
  2.     Ow_Write(&PORTE, 2,0xCC);  // Skip ROM
  3.     Ow_Write(&PORTE, 2,0x44);  // Convert_T
  4.     wait();
  5.     Ow_Reset(&PORTE, 2); // Reset
  6.     Ow_Write(&PORTE, 2,0xCC);  // Skip ROM
  7.     Ow_Write(&PORTE, 2,0xBE);  // Read Scratchpad
  8.     unsigned int kod = Ow_Read(&PORTE, 2); // Byte 0: Temperature  7..0
  9.     kod |= Ow_Read(&PORTE, 2) << 8; // Byte 1: Temperature  15..8
  10.     int Homerseklet= (int) kod / 16;
A hozzászólás módosítva: Dec 18, 2016
(#) Elektro.on válasza kriszrap hozzászólására (») Dec 19, 2016 /
 
Ne haragudj, de nem értelek. Ott a működő kód a súgóban. Még te linkelted be korábban.
Egyébként MikroC ben nincs wait(). MiroC ben Delay(). van. De nem illik mindenhova beszúrni, mert megtelik a pic. De ezt is el kell olvasnod miért.
(#) kriszrap válasza Elektro.on hozzászólására (») Dec 19, 2016 /
 
Tudom elkultem a kodt de nem birtam kibogaraszni a kodrengetekbol. Mi a delayel? Ossz vissz 3 db van a picbe.
A hozzászólás módosítva: Dec 19, 2016
(#) Elektro.on válasza kriszrap hozzászólására (») Dec 19, 2016 /
 
A pontos formátuma pl: " Delay_ms(750) " ez 750 milisecundum késleltetést eredményez.
És azért nem szabad túl sokat használni belőle , mert mindenhol ahová beírod, egy méretes asm kódot berak a programodba. Ezért ha mondjok kell 100ms késletetés a programodban 88 helyen, akkor csinálsz egy függvényt amiben benne van a Delay utasításod. És ezt hívogatod meg minden szükséges alkalommal.
Következő: »»   886 / 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