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   1182 / 1203
(#) Hp41C válasza patrik81 hozzászólására (») Nov 3, 2022 / 1
 
Használd az MpLab szimulátorát. Tegyél töréspontot a megszakítási rutin kezdetére, kövesd nyomon a működést. Az UART vizsgálatához stimulust kell készíteni.
(#) patrik81 válasza Hp41C hozzászólására (») Nov 3, 2022 /
 
Rákötöttem a GPS modul 3 darab lábát közvetlen a PICKIT3-ba, Vdd-t a 2.,GND-t a 3., GPS TX lábát a Pickit 4. lábára. De a szoftverben az Uart tool... csak szürkén világít, nem tudok rákattintani, nem tudom megnézni közvetlen a GPS-t. Nagyon zavaró. Ezt hogy lehetne megoldani?
(#) Hp41C válasza patrik81 hozzászólására (») Nov 4, 2022 /
 
A program a PICkit3 önálló kezelő programja? Ha jól emlékszem az uart tool nem működött benne. Használj PICkit2 -t vagy 3.3 V -os USB/SERIAL átalakítót.
A GPS valószínűleg működik. A vétel során a programban keletkezhetnek vételi hibák, azokat kellene lekezelni.
Van más megszakítás felhasználva? A kiszolgálásuknál a kérő azonosítása megtörténik? A kérést a kiszolgálás után törlöd? (TXIE nincs véletlenül engedélyezve?)
(#) patrik81 hozzászólása Nov 4, 2022 /
 
PICkit3 letöltőm van. Először elég volt csak az MPLAB letöltőjét használnom, most valahogy nem engedi csak lefordítani a programot, és a PICkit3 letöltőprogramjával letölteni a progit, de ez igazából nem jelent semmilyen gondot. Használok 3 különböző megszakítást, egy Timer0-t, egyet a kapcsolónak, egyet pedig az UART-nak.
  1. void interrupt isr()
  2. {
  3.     if (T0IE && T0IF)
  4.     {
  5.         T0IF=0;
  6.         percBeallito++;
  7.         if(percBeallito==116900)   //idö beállítás
  8.         {
  9.             perc++;
  10.             percBeallito=0;
  11.         }
  12.         if(perc==10)
  13.         {
  14.             perc=0;
  15.             a3++;
  16.         }
  17.         if(a3==6)
  18.         {
  19.             a3=0;
  20.             a2++;
  21.         }
  22.         if(a2==10)
  23.         {
  24.             a2=0;
  25.             a1++;
  26.         }
  27.         if(a1==2&&a2==4)
  28.         {
  29.             a1=0;
  30.             a2=0;
  31.         }
  32.     }
  33.     if (RCIE && RCIF)
  34.     {
  35.         getchar_active = false;
  36.         //RCIF=0;
  37.         RCREG;
  38.     }
  39.     if (RABIE && RABIF)
  40.     {
  41.         if(PORTBbits.RB4==1)
  42.             RA5=1;
  43.         else
  44.             RA5=0;
  45.         RABIF=0;
  46.     }
  47. }

az initben ez van írva:
  1. void Init()
  2. {
  3.     TRISC=TRISA=0;
  4.     TRISB4=1;                   //kapcsoló
  5.     //TRISB5=1;                 //GPS adat
  6.     TRISB6=0;                   //GPS vezérö
  7.     PORTBbits.RB6=1;
  8.     RA5=0;
  9.     ANSEL=0;
  10.     ANSELH=0;
  11.     //OSCCON=0b01110000;        //8MHz
  12.     OPTION_REG=0;
  13.     T0IE=IOCB4=RABIE=RCIE=PEIE=1;
  14.     SPBRG = 25;                 //9600 baud,PIC16F690,4MHz
  15.     TXEN = 1;
  16.     BRGH = 1;
  17.     RCSTA = 0x90;
  18.     GIE=1;
  19. }

Az RA5-re egy segéd ledet tettem. ezt tudom kapcsolgatni a teljes program futásakor a GPS keresése közben is, tehát nem fagy le a progi, de a GPS órákon keresztül is csak világít, a kijelző meg sötét.
(#) patrik81 hozzászólása Nov 4, 2022 /
 
Kiforrasztottam a GPS-t és így is sötét maradt a kijelző. Kivettem a GPSHivo() függvényt, a programból, és így már jó a kijelző csak épp a GPS nélkül, ami nagyon fontos.
  1. void main()
  2. {
  3.     Init();
  4.     //KezdoSzoveg();        //a nevem kiirasa
  5.     //KiirGPS();
  6.     //Kiir(10);
  7.     //PORTC=0;
  8.     //GPSHivo();
  9.     RB6=0;
  10.     while(1)
  11.     {
  12.         //GPSHivo();
  13.         for (int i=0;i<500;i++)    //idö beallitas
  14.         {
  15.             data=0;
  16.             OraAlap1();             //óra kiirasa
  17.             //Kiir(10);
  18.             //OraAlap2();
  19.             //KiirGPS();
  20.         }
  21.         //KiirGPS();
  22.         HonapNapHetnapja();
  23.     }
  24. }

  1. char ch,i;
  2. char gpstime[7];
  3. char gpsdate[7];
  4. char buffer[7];
  5. char gps_header[]="GPRMC,";
  6. bool getchar_active = false;
  7. char getch()
  8. {
  9.     getchar_active = true;
  10.     while (getchar_active)
  11.         continue;
  12.     return RCREG;
  13. }
  14. void GPSHivo()
  15. {
  16.     ch = getch();
  17.     if (ch == '$')    
  18.     {                  
  19.         for (i=0;i<6;i++)
  20.         {
  21.             ch = getch();
  22.             buffer[i] = ch;
  23.         }
  24.         if (strcmp(buffer, gps_header)==0)
  25.         {        
  26.             for (i=0;i<6;i++)
  27.             {
  28.                 ch = getch();
  29.                 gpstime[i] = ch;
  30.             }
  31.             for (i=0;i<12;i++)  
  32.                 ch = getch();
  33.             for (i=0;i<9;i++)  
  34.                 ch = getch();
  35.             for (i=0;i<3;i++)  
  36.                 ch = getch();
  37.             for (i=0;i<11;i++)  
  38.                 ch = getch();
  39.             for (i=0;i<12;i++)  
  40.                 ch = getch();  
  41.             for (i=0;i<6;i++)  
  42.             {
  43.                 ch = getch();
  44.                 gpsdate[i] = ch;
  45.             }
  46.         }
  47.     }
  48. }
(#) Bakman válasza patrik81 hozzászólására (») Nov 4, 2022 / 1
 
Milyen kijelzőről van szó? Hátha közelebb visz a megoldáshoz.
(#) icserny válasza patrik81 hozzászólására (») Nov 5, 2022 / 1
 
Nem egészséges dolog berakni a főhurokba egy olyan függvényhívást, ami tele van blokkoló várakozásokkal.

Talán bölcsebb lenne a beérkező karakterek fogadását külön választani az adatfeldolgozástól és gondolni kellene a hibalehetőségekre is (karakter ráfutás vagy keretezési hiba, hiányos vagy téves üzenetsor stb.)
(#) nedudgi válasza patrik81 hozzászólására (») Nov 5, 2022 / 1
 
Nem nézek utána, milyen GPS modult használsz, milyen beállításokkal.
Ha 1Hz a modul, és 4800 Bd adatátviteli sebességgel működik, első menetben az adott karakterek vételét kellene ellenőrizni. Ami bejön a PIC-be, gondolkodás nélkül írd ki a kijelzőre. Ha semmi nem jelenik meg, az adás/vétel vezetéket cseréld fel.
Folyt. köv.
(#) patrik81 válasza Bakman hozzászólására (») Nov 5, 2022 /
 
Egy led-mátrixos kijelzőt csináltam. 7 sor van és 24 oszlop, összesen 168 darab led. A sorokat a PORTC-re kötöttem. Az oszlopokat 3 kivezetéssel vezérlem 3 darab sorba kötött léptető regiszterrel. Úgy működik a kijelző mint egy TV, hogy előszőr az első oszlopot villantja fel, aztán lép a következő oszlopra, és így tovább.
(#) nedudgi válasza patrik81 hozzászólására (») Nov 5, 2022 / 1
 
Tudni kell, hogy a GPS nem vár, másodpercenként elküldi a tervezett NMEA mondatokat. Ebből kell kihámoznod a lényeget: "$" és "lf" (0x0A karakterek közötti részt. Az is feltétel, hogy egy másodpercen belül minden megérkezzen.
Valószínűleg több ilyen mondat is beérkezik, ebből kell kiválogatni a megfelelőt.
(#) patrik81 válasza nedudgi hozzászólására (») Nov 5, 2022 /
 
Potosan mit írjak be a progiba? Az a fura, hogy pár évvel ezelőtt amikor először csináltam az órát, akkor még működött a progi, azóta csak hardveres változást csináltam, és kisebb szoftvetres átalakítást is, semmi lényeges változást nem csináltam.
(#) nedudgi válasza patrik81 hozzászólására (») Nov 5, 2022 / 1
 
Ha csak hardver változtatás történt, akkor a programhoz ne nyúlj.
Egy LED, ellenálláson keresztül a PIC UART bemenetére (GPS adás kimenet) megmutatja, működik-e a bekötés.
(#) patrik81 válasza nedudgi hozzászólására (») Nov 5, 2022 /
 
Tettem oda ledet, szagatottan villog, akkor gondolom van adat (ahogy másodpercenként beérkezik az adatcsomag).
Muszáj volt hozzányúlnom a programhoz, mert csak töredékek maradtak meg az egészből (új számítógép. Amit feltettem internetre programot, az meg az én hibámból hiányos volt), ráadásul a hardver változás is megkövetel egy kis progi átalakítást, és még picit alakítottam is a progin, a kijelzés miatt.
(#) nedudgi válasza patrik81 hozzászólására (») Nov 5, 2022 / 1
 
Ebben a programnyelvben nem tudok segíteni.
(#) Bakman válasza patrik81 hozzászólására (») Nov 5, 2022 / 1
 
Igazábol azért nem kapsz tuti választ, mert konkrétan mi sem tudjuk, mi a gond, csak tippelgetünk.

Ha a mátrix kijelzőt megszakításból hajtod (nagy valószínűséggel igen), akkor az viszonylag sok erőforrást lefog, sokszor megy a kontroller abba a megszakításba. Könnyen lehet, hogy eközben veszik el a gyerek. Próbáld meg úgy kezelni a vett adatot, hogy azonnal mented egy változóba, még a megszakítási rutinban.

Vagy.

Mivel a GPS modulod GND lábán van egy kapcsolótranzisztor, lehet, hogy az UART kapcsolat 'L' szintje túl magas, a kontroller nem érzékeli azt 'L' szintnek. Ha a GPS modul kimenetén a 'H' szint csak 3.3 V, az is okozhat galibát.

Annyival tudsz magadnak segíteni, hogy elöröl kezded nulláról az egészet és szakaszonként teszteled a programot, ahogy készülget. Ha máshogy nem, egy szabad lábbal LED-et kapcsolgatsz, így láthatóvá válik, hol tart a program.
(#) Hp41C válasza patrik81 hozzászólására (») Nov 5, 2022 / 1
 
Idézet:
„if (RCIE && RCIF)
{
getchar_active = true;
//RCIF=0;
RCREG;
}”

helyett
  1. if (RCIE && RCIF)
  2.     {
  3.         if (RCSTA & 0x06)
  4.        {
  5.            SPEN = 0;
  6.            rch= RCREG;
  7.            SPEN = 1
  8.        }
  9.        else
  10.        {
  11.           rch= RCREG;
  12.           getchar_active = false;
  13.        }
  14.     }

Idézet:
„char getch()
{
getchar_active = true;
while (getchar_active)
continue;
return RCREG;
}”

helyett
  1. char rch;
  2. char getch()
  3. {
  4.     while (!getchar_active)
  5.         continue;
  6.     return rch;
  7. }
(#) patrik81 hozzászólása Nov 5, 2022 / 2
 
Köszönöm, nagyon jó ez a közösség, igazán segítőkész. Köszönöm a megírt programrészletet is. Sajnos még nem oldódott meg a problémám. Tényleg az lesz, hogy előlről kezdem a progit a nulláról. Itt az uartnál akadtam el. Ezt kell kiveséznem. Közben megtaláltam az eredeti programot is. Kicseréltem a Gps-t is. Átforrasztottam direkt földre, kihagyva a bc337-et. És még mindig semmi.
Amúgy nem megszakításból megy a kijelzőm, de azt is ki fogom forrasztani, csak egy led marad.
(#) patrik81 hozzászólása Nov 7, 2022 /
 
Nagyszerű!Most már működik a GPS a régi Timer0 megszakítás nélkül, most szeretném Timer0 megszakítással is vezérelni. Az első vett karaktert ( gpstime[0]-t ) akarom kiíratni vele, de csak egy nullát ír ki(pedig 2-esre vártam volna, mert már este van), és még egy végtelen ciklusba is tettem, hogy ha változna a vett karakter akkor is ki tudja írni.
(#) Bakman válasza patrik81 hozzászólására (») Nov 7, 2022 /
 
Remek! Tulajdonképpen mire kell a Timer0? Késik az RTC és időnként rádobsz egy-egy percet, ezzel kompenzálva az RTC pontatlanságát?
(#) patrik81 válasza Bakman hozzászólására (») Nov 8, 2022 /
 
Arra gondoltam, hogy könnyebben be lehet állítani a pontos másodpercet, ha időzítővel csinálom, és még hasznosan is programozhatok az időzítő alatt, de azért elgondolkozok, egy sima számláló növelése alatt is.
(#) Bakman válasza patrik81 hozzászólására (») Nov 8, 2022 /
 
Ne haragudj, de nem látom át a koncepciót.

A kijelző miatt gondolom nem elemről akarod járatni az órát. Ha már dugasztápról megy, nem lenne egyszerűbb RTC helyett a GPS vevőt használni, mint a pontos idő forrását? Nem kellene sem beállítani, sem időnként pontosítani. Teszel bele egy kapcsolót, amivel választhatsz a téli/nyári időszámítás között és készen is van. Igaz, lehet éppen most válik okafogyottá ezen opció...
(#) patrik81 válasza Bakman hozzászólására (») Nov 8, 2022 /
 
Pontosan mire gondolsz?Nekem egy neo-6m gps modulom van.
Eszembe jutott egy kérdés. Mondjuk deklarálok egy változót, pl char x, és növelem az x-et egyesével, pl x++.Van valami flag, ami jelzi a túlcsordulást, amit lekérdezhetek?
(#) Bakman válasza patrik81 hozzászólására (») Nov 8, 2022 /
 
A GPS modul másodpercenként küld adatot, kb. ilyet:
  1. $GPRMC,162254.00,A,3723.02837,N,12159.39853,W,0.820,188.36,110706,,,A*74
  2. $GPVTG,188.36,T,,M,0.820,N,1.519,K,A*3F
  3. $GPGGA,162254.00,3723.02837,N,12159.39853,W,1,03,2.36,525.6,M,-25.6,M,,*65
  4. $GPGSA,A,2,25,01,22,,,,,,,,,,2.56,2.36,1.00*02
  5. $GPGSV,4,1,14,25,15,175,30,14,80,041,,19,38,259,14,01,52,223,18*76
  6. $GPGSV,4,2,14,18,16,079,,11,19,312,,14,80,041,,21,04,135,25*7D
  7. $GPGSV,4,3,14,15,27,134,18,03,25,222,,22,51,057,16,09,07,036,*79
  8. $GPGSV,4,4,14,07,01,181,,15,25,135,*76
  9. $GPGLL,3723.02837,N,12159.39853,W,162254.00,A,A*7C

A GPRMC mondatban benne van a pontos idő és a dátum is.

Tudtommal nem lehet biztosan detektálni a túlcsordulást, legalábbis C nyelvben. Aztán ki tudja, lehet, hogy nem jól tudom.
(#) patrik81 hozzászólása Nov 8, 2022 /
 
Megtettszett a pic-programozás. Először egy olcsó, egyszerű faliórát szerettem volna csinálni anyunak, de aztán rájöttem, hogy annyira nem is olcsó, és elég sok energiát felemészt, de már nem tudom elengedni, befejezem, amit elkezdtem.
(#) Pali79 válasza patrik81 hozzászólására (») Nov 9, 2022 /
 
A faliórába szeretnéd a GPS-t?
(#) sonajkniz válasza patrik81 hozzászólására (») Nov 9, 2022 / 3
 
Idézet:
„Van valami flag, ami jelzi a túlcsordulást, amit lekérdezhetek?”

Hogyne lenne.
Minden egyes növelés végén lekérdezed a Status regiszter carry bitjét.
Ha 1, akkor túlcsordult.
(#) Bakman válasza sonajkniz hozzászólására (») Nov 9, 2022 /
 
Minden alapművelet esetén működik?
(#) sonajkniz válasza Bakman hozzászólására (») Nov 9, 2022 /
 
A carry bit csak összeadás - kivonás - decrementálás - incrementálás esetén működik.
Szerintem a kérdezőnek pont ezek kellenek.
(#) Bakman válasza sonajkniz hozzászólására (») Nov 9, 2022 /
 
Ott csak egy példa szerepel, de ha már lúd, legyen kövér. Szorzásnál nem működik?
  1. uint8_t a;
  2. a=50 * 50;
XC8 v2.40
(#) sonajkniz válasza Bakman hozzászólására (») Nov 9, 2022 /
 
Idézet:
„Ott csak egy példa szerepel”

Nem tudom, milyen példára gondolsz.
A C-hez fikarcnyit sem értek, a PIC18-ban pedig csak olyan szorzó rutin van, ami 2 byteot tud összeszorozni, aminek az eredménye PRODH-ba és PRODL-be kerül. Azaz 8bit x 8bit, ami sosem lesz több 16 bitnél, azaz túl sem csordul.
Következő: »»   1182 / 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