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   1090 / 1210
(#) superuser válasza lastewer hozzászólására (») Jún 3, 2019 /
 
Nem másoltam be az egész kódot, csak azt az ágat ami az
if (UART1_Data_Ready())
és azon belül. Szóval hagyd meg az eredeti részt, a while-t, meg mindent, csak az általam módosított részt írd felül azzal amit az előzőben csatoltam.
Remélem valamennyire érthető volt...
(#) lastewer válasza superuser hozzászólására (») Jún 3, 2019 /
 
Igen , így csináltam.

Ha jól látom, {} jelekkel összefogtad ezt a részt és ennyit módosítottál.

  1. if (pp < PUFF_SIZE)
  2.      {
  3.      puffer[pp++]= UART1_Read(); // Get received byte
  4.      puffer[pp] = 0;
  5.      }
A hozzászólás módosítva: Jún 3, 2019
(#) superuser válasza lastewer hozzászólására (») Jún 3, 2019 /
 
Másold inkább be az egészet, mert vagy három másikon átsiklottál

pl. if (UART1_Data_Ready())
helyett az volt, hogy
if (UART1_Data_Ready() == 1)
Ami nagyon nem mindegy, mert az eredeti vélhetően azt jelenti, hogy ha az UART-on egy bájt adat jött, a módosított pedig azt, hogy az UART-on jött adat (bármennyi).
Ha egyszer az UART pufferbe fel tud gyűlni 2 bájt adat, az eredeti feltétel soha többet nem fog teljesülni.
(#) Hp41C válasza lastewer hozzászólására (») Jún 3, 2019 /
 
A WatchDog ki van kapcsolva? Mi a helyzet a Brown-Out Reset -tel? Akkor írja ki a "PIC Start" -ot, amikor lecsökken valamitől a tápfeszültség?

A memset(puffer, 0, PUFF_SIZE); is elég időrabló lehet, elég helyette a pp = 0; puffer[0] = 0;
(#) lastewer válasza superuser hozzászólására (») Jún 3, 2019 /
 
Rendben
(#) lastewer válasza Hp41C hozzászólására (») Jún 3, 2019 /
 
Megnézem ezeket is, rámérek a tápra is
(#) lastewer válasza superuser hozzászólására (») Jún 3, 2019 /
 
Így is bugos. Mellékeltem egy képet. Adtam tápot a cuccnak és küldtem neki a parancsokat.

A kék színnel én küldtem , zöld a kapott adat.

A végén kezdődik az érdekesség, 2 kikapcs jön 1 off szóra.
A hozzászólás módosítva: Jún 3, 2019

test.jpg
    
(#) pipi válasza lastewer hozzászólására (») Jún 3, 2019 /
 
Hali!
Nem rágtam át magam rajta, De én a kommunikációt mindig egy kitüntetett karakterrel kezdem, ami a szükséges cuccokat ekkor alaphelyzetbe állítja.
Ha olvashatóan akarom akkor pl kettőspont...
De lehet ragozni, a kettőspont után jön a küldött szöveg hossza, az utolsó karakter után meg egy egyszerű összeadással képzett "checksum"...
Ez nálam jól működik évek óta, az esetleges hibás átvitel automatikusan kidobásra kerül.
(#) superuser válasza lastewer hozzászólására (») Jún 3, 2019 /
 
Ez nem direktben a csatolt kóddal függ össze.
Lehet kétszeresen deklarált változó, lehet túlcsordulás, lehet az UART rutin hibája is.
A kimenet azonos azzal, mintha a kiemelt kódrész ismételten lefutna.
  1. if (strstr(puffer, "off"))
  2.      {
  3.       UART1_Write_Text("Kikapcsolva");
  4.       memset(puffer, 0, PUFF_SIZE);
  5.       pp = 0;
  6.      }


Viszont a puffer ki van nullázva, a pp változó szintén.
Okozhatná pl. ha a puffer változó 2x lenne deklarálva, vagy az UART rutin ismételten kiadná a korábban beszedett bájtokat, vagy egy szimpla túlcsordulás amitől behülyül az egész. Ezen a ponton némi tapasztalatot igényelne a hibakeresés, debugger használatát, ilyesmit.
A hozzászólás módosítva: Jún 3, 2019
(#) superuser válasza lastewer hozzászólására (») Jún 3, 2019 /
 
Egyébként pont 30 fogadott karakter után akadt ki.
Reset után ha ugyanezt a tesztet ismétled, megint ugyanennyi adattól akad ki?
ps.: az UART.c-t csatolhatnád
A hozzászólás módosítva: Jún 3, 2019
(#) lastewer válasza superuser hozzászólására (») Jún 4, 2019 /
 
Nem ugyanennyitől. Ez változó. Azt hol találom?

Ez a teljes kód:
  1. // Órajel beállítása (Kvarc)
  2. #define _XTAL_FREQ 16000000
  3. #define PUFF_SIZE 20  //20 volt
  4.  
  5.  
  6. // Változók beállítása
  7.    unsigned int cnt;
  8.    char puffer[PUFF_SIZE];
  9.    char pp=0;
  10.    
  11. // Vezérlő parancsok beállítása
  12.    char off_cm[]      = "off";
  13.    char on_cm[]       = "on";
  14.    char status_cm[]   = "status";
  15.    char dev_id[]      = "ID: sh";
  16.    
  17. //---------------------------------------------------------------------------------------------------------
  18.    void initTimer()
  19.    {
  20.           T2CON = 0b00000100;         // TR2 postscale 1:1, TMR2 ON, prescale 1:1
  21.           TMR2  = 0;                  // Initialize Timer2 register
  22.           PR2 = 200;                  // itt miért 200-1 van? 200-1 akkor 0.0995 ms ha 200 akkor 0.1 ms a megszakítási idő
  23.           TMR2IE_bit = 1;             // Enable interupt
  24.           INTCON = 0b11000000;        // GIE = ON, PEIE = ON
  25.    }
  26.    void interrupt()
  27.    {
  28.       if (TMR2IF_bit)
  29.       {
  30.         cnt++;
  31.         TMR2 = 0;
  32.         TMR2IF_bit = 0;           //A TMR2IF_bit és a PIR1.TMR2IF ugyan azt a bit-et jelöli
  33.        
  34.  
  35.         if(PORTB.F0 == 1 )
  36.         {
  37.                 PORTB.F4 = 0;
  38.         }
  39.         if(PORTB.F0 == 0 )
  40.         {
  41.                 PORTB.F4 = 1;
  42.         }
  43.       }
  44.    }
  45.  
  46. //MAIN-----------------------------------------------------------------------------------------------------
  47. void main()
  48. {
  49.   cnt = 0;                    // Számláló kezdő értéke 0
  50.   initTimer();
  51.  
  52.  
  53.  
  54. // UART --------- ---
  55.  
  56.    UART1_Init(4800);            // Initialize USART module
  57.                                   // (8 bit, 19200 baud rate, no parity bit...)
  58.    delay_ms(500);
  59.    UART1_Write_Text(dev_id);
  60.    UART1_Write(13);     // Start a new line
  61.    UART1_Write(10);
  62.    
  63.    TRISB.F7= 0;  // RB7
  64.    TRISB.F3 = 0; // RB3 as láb villogtatása (status led)
  65.    TRISB.F4 = 0; // RB4 es láb állapot jelző a kézi kapcsolótól
  66.    TRISB.F0 = 1; // RA 1 láb bemenet
  67.    
  68.    PORTB.F7 = 0;
  69.  
  70.   while (1)
  71.   {
  72.  
  73.       if (cnt >= 5000)    // 10000 * 0.1 ms = 1 mp
  74.       {
  75.                 PORTB.F3 = ~PORTB.F3;   // B lábak villogtatása
  76.                 cnt = 0;                // Számláló reset
  77.       }
  78.  
  79.       if (UART1_Data_ready())
  80.         {
  81.             if (pp < PUFF_SIZE)
  82.             {
  83.                puffer[pp++]= UART1_Read(); // Get received byte
  84.                puffer[pp] = 0;
  85.             }
  86.             if (pp >= PUFF_SIZE)
  87.             {
  88.               pp = 0;
  89.             }
  90.               // Bekapcsolás
  91.               if(strstr(puffer, on_cm))
  92.               {
  93.                    UART1_Write(13);
  94.                    UART1_Write_text("Bekapcs.");
  95.                    UART1_Write(13);
  96.                    PORTB.F7 = 1;
  97.                    puffer[0] = 0;
  98.                    pp = 0;
  99.               }
  100.               //Kikapcsolás
  101.               if(strstr(puffer, off_cm))
  102.               {
  103.                  UART1_Write(13);
  104.                  UART1_Write_text("Kikapcs.");
  105.                  UART1_Write(13);
  106.                  PORTB.F7 = 0;
  107.  
  108.                  puffer[0] = 0;
  109.                  pp = 0;
  110.               }
  111.         }
  112.  
  113.   }
  114. }


Ezt lefuttatva , ilyen lesz a kimenet. Mellékeltem képet.
A hozzászólás módosítva: Jún 4, 2019

teszt.jpg
    
(#) lastewer válasza Hp41C hozzászólására (») Jún 4, 2019 /
 
brown - out engedélyezve van , watchdog pedig tiltva.
A hozzászólás módosítva: Jún 4, 2019

bwn.jpg
    
(#) NickE hozzászólása Jún 4, 2019 /
 
Az MPLAB Snap sokkal jobb debugolásra, mint a PICkit3?
(#) Vfr72 hozzászólása Jún 4, 2019 /
 
Sziasztok!
Az alábbi témában szeretném a segítségeteket kérni:
Az AD bemeneten mért 0-255 közötti értékkel szeretnék arányosan frekvenciát előállítani,
a bemeneti jel függvényében pl.:LED-et villogtatni.
Két megoldás jutott az eszembe:
1, IF szerkezet, de ez túl hosszú lenne, mert minden értékre meg kellene írni a feltételt
2, az AD értéket átadom a TIMER-nek, azaz a TIMER kezdeti értéke a bemeneti jel aktuális értéke.
Esetleg más megoldás? Vélemény?
ASM ötlet érdekelne.
Üdv.
VFR72
A hozzászólás módosítva: Jún 4, 2019
(#) lastewer válasza NickE hozzászólására (») Jún 4, 2019 /
 
Pickit3 -al hogy debugolsz?
(#) bbalazs_ válasza Vfr72 hozzászólására (») Jún 4, 2019 / 1
 
A megszakításban a timer lefutásakor váltasz állapotot a LED-nél és utána azonnal újra feltöltöd egy ideiglenes változóval. Ezt az ideiglenes változót töltöd fel a főprogramban kiolvasott AD-vel.
De ezt is lehet megszakításban, ekkor az "AD konverzió lefutott" megszakításakor kiolvasod az értéket, átírod az ideiglenes változóba, aztán új AD konverziót indítasz.
(#) Hp41C válasza NickE hozzászólására (») Jún 4, 2019 / 1
 
Lehet, hogy bizonyos típusoknál gyorsabb, de más típusokat egyáltalán nem fog kezelni. A Snap nem tud 5V -nál nagyobb feszültséget előállítani a Vpp számára.
(#) Hp41C válasza lastewer hozzászólására (») Jún 4, 2019 /
 
Kiválasztod nyomkövetőnek az Mplab / MpLabX felületen. Újrafordítod a kódot "Debug" módban. Máris indíthatod a nyomkövetést.
(#) superuser válasza lastewer hozzászólására (») Jún 4, 2019 /
 
Nem jó a kódod. Írtam neked egyet, ami akár jó is lehetett volna. Nem próbáltad le?
Minek töröm magam?
  1. if(strstr(puffer, off_cm))
  2.               {
  3.                  UART1_Write(13);
  4.                  UART1_Write_text("Kikapcs.");
  5.                  UART1_Write(13);
  6.                  PORTB.F7 = 0;
  7.  
  8.                  puffer[0] = 0;
  9.                  pp = 0;
  10.               }


Amikor a fenti kód lefut, a pufferben az "off" sztring van.
A kód lefutása után ".ff" lesz a pufferben; a '.' helyére 0x00-t képzelj, szándékosan nem használtam C szintaktikát.
Ezután bejön az "on"-ból az első karakter. Mi lesz a pufferben? "off". Meg is találja majd a program.
Utolsó hozzászólásom volt a témához.
(#) lastewer válasza superuser hozzászólására (») Jún 4, 2019 /
 
Én már teljesen nem értek semmit. Nem látom mi a különbség a te általad írt kód és a között , amit bemásoltam , leszámítva, hogy behelyettesítettem változóra az on és off szót.

Illetve amit hp41C mondott, hogy a pp = 0; puffer[0] = 0; legyen a memset helyett.

+ ezt a részt beletettem egy {} blokkba :
  1. if (pp >= PUFF_SIZE)
  2.          pp = 0;


Mindegyik if ágban benne van a :

  1. puffer[0] = 0;
  2. pp = 0;


Ez kinullázza nem? Tényleg nem értem .
A hozzászólás módosítva: Jún 4, 2019
(#) cross51 válasza NickE hozzászólására (») Jún 4, 2019 / 1
 
A szokásos mérnöki válasszal élnék a kérdésedre: Attól függ.

- Snap nem ad tápot, ha ez nem okoz problémát akkor pipa
- Ha 8 bithez akarod használni és 5V-os controller-el akkor meg kell nézni támogatja, de esélyes hogy nem fogod tudni a többséget programozni
- Viszont ha 3.3V-on dolgozol és 16/32 bites controller-ekhez használnád akkor megéri.
- 8 bithez ha ilyen 16-64k flash 4-32k RAM-ban mozogsz nem is feltétlen van értelme, mert adott esetben ki sem tudod használni emlékem szerint a PIC16F15xx-es controller-ek között volt olyan aminél nem tudtam hardware-s breakpointot be rakni.

A PICkit4 és a Snap a power és VPP gent leszámítva kb azonos->

A PICkit4 egy két bug-ot leszámítva nekem 32 biten (ott a 2MB-os flash-el és runtime breakpoint igénnyel szóba se jöhet a PICkit3) jobban szerepelt mint az ICD3 (amiben egy 16 bites PIC és egy FPGA megy a PIKkit4-ben nincs FPGA!!).
Szóval, ha combosabb controller-t programoznál akkor mindenképp a Snap.

Nem tudom milyen szinten vagy jártas a témában (kezdő,haladó,stb..), de ha kezdésnél vagy és mondjuk dev boardot akarsz használni és nem 8 biten akarsz indulni akkor a Curiosity board-ok egész jók viszont az onboard debugger egy rakás sz... (a schematic-on PK3-nak tűnik, de nem üti azt a szintet-se).
De ha mondjuk be ruházol egy board-ra és veszel mellé egy Snap-et akkor igazándiből semmivel nem kell törődnöd egyszerű blink, ADC, UART példák vannak és már tudod is csinálni (és mégsem arduino ).

Amire viszont figyelni kell:
Sem a PICkit3 sem a PICkit4 és a Snap-en sincsen komoly ki és bement védelem (valami van emlékeim szerint polyfuse 50mA-rel adott esetben semmit nem ér, tudom tapasztaltam)
Ha ezek fontosak lehetnek akkor nincs mit tenni ICD3/ICD4/Real ICE - ezekben már komoly védelem van.
(#) Tasznka válasza lastewer hozzászólására (») Jún 5, 2019 /
 
Szerintem ezzel(is) lehet a gond:
  1. #define PUFF_SIZE 20  //20 volt
  2. char puffer[PUFF_SIZE];
  3.  
  4. Ha ezt a részt nézzük:
  5.  if (pp < PUFF_SIZE)
  6.    { puffer[pp++]= UART1_Read(); // Get received byte
  7.    puffer[pp] = 0;
  8.     }

Mármost ha a végét nézzük,ami legyen 19,látható,hogy belép,és az utolsó helyre 19(0-19) beírja a vett adatot,utána léptet,de a gond,hogy a nem létező 20. helyet kinullázza,ami érdekes dolgokat tud okozni
Javaslom a char puffer[PUFF_SIZE+1]; -et,vagy még van pár lehetőség.
Ha így sem jó,akkor majd még jobban átnézzük .
(#) Hp41C válasza superuser hozzászólására (») Jún 5, 2019 /
 
Idézet:
„A kód lefutása után ".ff" lesz a pufferben; a '.' helyére 0x00-t képzelj, szándékosan nem használtam C szintaktikát. Ezután bejön az "on"-ból az első karakter. Mi lesz a pufferben? "off".”

Ha a pufferben (ahogy Te írtad) ".ff" van, akkor a bejövő "o" beleíródik a 0. pozícióba (p értéke 0) és a következő karaktert a következő sor null karakterre írja. Azaz a pufferben "o.f" lesz, ami stringként kezelve egyetlen "o" karakter hosszú string.
A hozzászólás módosítva: Jún 5, 2019
(#) superuser válasza Hp41C hozzászólására (») Jún 5, 2019 /
 
Igazad van. Ez van amikor többen írnak egy kódot
(#) NickE válasza Hp41C hozzászólására (») Jún 5, 2019 /
 
Ez így felejtős, nekem kell a Vpp.
(#) NickE válasza lastewer hozzászólására (») Jún 5, 2019 /
 
És is most vagyok túl egy kellemes hibakeresésen, szintén UART, de PIC24F.

Enabling the UART The UART module is enabled by setting the UARTEN (UxMODE<15>) bit and UTXEN (UxSTA<10>) bit. Once enabled, the UxTX and UxRX pins are configured as an output and an input, respectively, overriding the TRIS and PORT register bit settings for the corresponding I/O port pins. The UxTX pin is at logic 1 when no transmission is taking place.

Igen, beállítja a TRIS-t, a TX működik is, csak az RX nem, mert az alapból A/D és azt viszont nem írja felül. És erről az egész UART fejezetben nem tesz említést. Van egy szép 6 lépéses procedúra, hogyan kell konfigurálni a TX részt, van egy 5 lépéses procedúra az RX konfigurálásról, arról egy szót sem szólnak, hogy ja, az A/D-t kapcsold ki. Lehet mondani, hogy ez triviális, de hát számomra az tűnt triviálisnak, hogy ha bekapcsolom az UART-ot, akkor megfelelően beállítja az RX-t, ahogy azt a TX-el meg is tette.

Amúgy tetszik a 24-es család, bő 10+ évig PIC18-at programoztam, csak az fájdalmas, hogy túl sok a beállítási lehetőség, aztán ha valami nem jó, a hibakeresés is nehezebb.
(#) benjami válasza NickE hozzászólására (») Jún 5, 2019 / 1
 
Már egy párszor javasoltam, hogy a következő mondat kerüljön be a fenti sárga részbe, mert visszatérő téma:
- Ha analóg bemenetként is használható lábat digitális lábként szeretnéd használni, feltétlenül állítsd át digitálisra mert csak úgy fogod működésre bírni!
(#) lastewer válasza Tasznka hozzászólására (») Jún 5, 2019 /
 
Később tudom csak ezt kipróbálni. Ezek szerint az egész puffert ki kellene üríteni. Én azt hittem , hogy a

  1. puffer[0] = 0;
  2. pp = 0;


Váltózók kinullázzák. De akkor csak a puffer tömb 0. elemét nullázom ki vele ha jól értem.

Bár ha ez így van , akkor az is egy megoldás lehet, ha csak ennyi lenne a hiba, hogy az összes elemét kinullázom sorban, vagy tévedek?
A hozzászólás módosítva: Jún 5, 2019
(#) Tasznka válasza lastewer hozzászólására (») Jún 5, 2019 /
 
Igen a puffer[0] = 0; csak a 0. helyen lévőt nullázza ki.
Használhatod a memset-et is,de elég ide a kövi nullázása is,mert így is kizárja,hogy azonos legyen az előzőekkel,ahogy Hp41C is írta.Itt a gond az utolsó pp++ -nál van,mert kilép a tömbből,és az utána lévő címre ír be nullát.Javasolhatom:
  1. if (pp < PUFF_SIZE)
  2.    { puffer[pp++]= UART1_Read(); // Get received byte
  3. if (pp < 20){puffer[pp] = 0;}
  4.    }
(#) Hp41C válasza Tasznka hozzászólására (») Jún 5, 2019 /
 
Így meg nem lesz lezárva, ha pont az 1. sorra úgy jut el, hogy pp = PUFF_SIZE-1.

Már több napja megy itt a foltozgatás, amikor egy megszakításos, körforgós puffer -rell más rég működne...
A hozzászólás módosítva: Jún 5, 2019
Következő: »»   1090 / 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