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   1087 / 1210
(#) szucsistvan123 válasza Tasznka hozzászólására (») Máj 18, 2019 /
 
Köszi mendkettőtöknek a választ!
(#) benjami válasza szucsistvan123 hozzászólására (») Máj 18, 2019 / 1
 
Én mindig úgy csináltam, hogy a memóriában csináltam egy akkora tömböt amibe pont belefér a teljes kijelző tartalma (nevezzük frame buffernek) és a programban csak ebbe a tömbbe írogattam a megjelenítendő szövegeket. A háttérben pedig megszakításból 1-2ms-ként mindig frissítettem 1db karaktert. Így nem kellett busy flag-ot figyelnem, és villogtatni is lehet bármelyik karaktert (akár az összeset is).
(#) Dress hozzászólása Máj 20, 2019 /
 
Szeretnék egy kis segítséget kérni.
Hogy kapcsolom be a belső felhúzó ellenállást 16f676-nál?
Mikroe C-ben próbálok programozni.
(#) Pali79 válasza Dress hozzászólására (») Máj 20, 2019 /
 
A WPUA regiszterben van erre lehetőség, de csak a PORTA 0,1,2,4,5 lábain. A C-hez nem értek, de gondol ha a 0,1 lábakon kell bekapcsolni valami ilyesmi lehet: WPUA = 0x03
(#) superuser válasza Dress hozzászólására (») Máj 20, 2019 /
 
OPTION_REG.RAPU = 0;

ha az elso nem mukodik, akkor a masodik:

OPTION.RAPU=0

ja, igen; és ezen kívül WPUA megfelelő bitjeit 1-be kell rakni
A hozzászólás módosítva: Máj 20, 2019
(#) Dress válasza Pali79 hozzászólására (») Máj 20, 2019 /
 
Ezek szerint a C porton nincs sőt az A porton is csak 0,1,2,4,5 ha jól értem.
De az egész lehetőséget engedélyezni kell az OPTION REG-ben
(#) Dress válasza superuser hozzászólására (») Máj 20, 2019 /
 
Ez lesz az. Próbálom
köszönöm nektek
(#) Pali79 válasza Dress hozzászólására (») Máj 20, 2019 /
 
Pontosan.
(#) Dress válasza superuser hozzászólására (») Máj 20, 2019 /
 
Ha az OPTION_REG.RAPU = 0; akkor van engedélyezve? Vagy ha =1;?
A hozzászólás módosítva: Máj 20, 2019
(#) superuser válasza Dress hozzászólására (») Máj 20, 2019 /
 
Igen, de ilyenkor érdemes beleolvasni a datasheetbe.
Idézet:

RAPU: PORTA Pull-up Enable bit
1 = PORTA pull-ups are disabled
0 = PORTA pull-ups are enabled by individual PORT latch values


http://ww1.microchip.com/downloads/en/devicedoc/40039f.pdf
A hozzászólás módosítva: Máj 20, 2019
(#) Dress hozzászólása Máj 20, 2019 /
 
Persze, hogy olvasom, kinézem már a szemem, de RAPU-t nem találok sehol,
csak ennyit:
"Note 1: Global RAPU must be enabled for individual pull-ups to be enabled"
2: The weak pull-up device is automatically disabled if the pin is in Output mode
(TRISA = 0).
(#) Dress hozzászólása Máj 20, 2019 /
 
Megvan!
Köszönöm!
Az OPTION_REG 7-es bitje
(#) Dress hozzászólása Máj 21, 2019 /
 
Sikerült, köszönöm.
16F676

OPTION_REG = 0b00000000; //a 7-es bit ha 0 akkor van felh.ell.
WPUA = 0b00110111; // csak az A porton van

hátha valaki hasonló cipőben...
(#) szucsistvan123 válasza benjami hozzászólására (») Máj 21, 2019 /
 
Ezt úgy érted, hogy a 2x16 harakternek, vagy a teljes DDRAM méretének megfelelő tömböt?
Köszi a választ!
(#) benjami válasza szucsistvan123 hozzászólására (») Máj 21, 2019 / 1
 
A 2x16-os esetén 2x16+1 (azaz 33 byte) méretű tömböt. A +1 byte csak azért, mert ha könyvtári függvényt használok a karaktertömb előállításakor előfordulhat, hogy az utolsó karakter után még egy lezáró #0-t is mögé rak. Az pedig ugye nem szerencsés, ha ezzel más változót felülír. A 2x16 karakteres esetén 32+2 = 34 megszakítás alatt lehet a teljes tömb tartalmát átvinni a kijelzőbe (a +2 a sor eleji DDRAM címzés miatt kell). Ha könyvtári függvényeket is használunk a kiírandó szöveg előállításához, érdemes a #0 kódú karaktereket szóközzel helyettesíteni a kijelző írása során, mert az itoa és társai függvények fognak #0 kódú karaktereket belerakni a "frame bufferbe".
(#) szucsistvan123 válasza benjami hozzászólására (») Máj 21, 2019 /
 
Köszi a választ!
(#) Hp41C válasza benjami hozzászólására (») Máj 21, 2019 /
 
Idézet:
„A 2x16 karakteres esetén 32+2 = 34 megszakítás alatt lehet a teljes tömb tartalmát átvinni a kijelzőbe (a +2 a sor eleji DDRAM címzés miatt kell).”

HD44780 @ 250kHz: DDRAM írás 37us + 4 us a cím frissítése. 32 karakter kivitele 32* 41 us = 1312 us = 1.312 ms. Ehhez még jön kétszer a cím beállítása azaz 40us. Az átvitel 1.352 ms -ig tart. Ha ezt megszakítási szinten végezné a kontroller, rengeteg dologról lemaradna. Meg kell vizsgálni, hogy a feladat megengedi az ilyen hosszan tartó megszakítás kiszolgálást.
Kettős pufferelést kellene csinálni, azaz az egyiket a program módosítja, a másikat egy timer megszakítás karakterenként (40 .. 50 us -enként 1 karakter) másolná át a kijelzőre. Így lehetősége lenne adatokat megjeleníteni 740 byte/sec (7396) sebességnél nagyobb sebességű UART kapcsolatról is.
A hozzászólás módosítva: Máj 21, 2019
(#) benjami válasza Hp41C hozzászólására (») Máj 21, 2019 /
 
Ha 1ms timer megszakítást használok, akkor 34ms alatt viszi át a teljes kijelzőtartalmat (mivel megszakításonként csak egyetlen parancsot vagy karaktert írok a kijelzőre így semmilyen us nagyságrendű várakoztatásra nincs szükség). Ez nagyjából 30fps-t jelent. Ennél többnek szerintem semmi értelme nincs mert a kijelző maga elég lomha. Ha már úgy is ott az 1ms megszakítás, fel lehet azt még használni egyéb tevékenységre is, pl. számláló léptetésre a ms vagy sec nagyságrendű időzítésekhez.
(#) Hp41C válasza benjami hozzászólására (») Máj 21, 2019 /
 
Ekkor még kellene egy állapotjelző, hogy a puffert a megszakítás olvassa vagy a főprogram módosítja.
(#) benjami válasza Hp41C hozzászólására (») Máj 21, 2019 /
 
A driveremben úgy csináltam meg, hogy olyan üzemmódot is be lehet állítani (#define-vel 5 féle üzemmód közül lehet választani). Ekkor a frame buffer feltöltése után szólni kell a drivernek, hogy új tartalom van->frissítsd a tartalmat. Viszont úgy nem lehet villogó karaktereket kirakni, csak ha folyamatosan frissítjük a kijelző tartalmát. Mindegyik üzemmódnak vannak előnyei és persze hátrányai is, a feladattól függ, melyiket érdemes használni.
(#) nagym6 hozzászólása Máj 22, 2019 /
 
Üdv. Mennyi a PIC18F46K22 SPI modul max. beolvasási sebessége? Nekem 20MHz kellene ennyit tud-e? Nem találok erről semmit az adatlapon.
Köszönöm.
(#) superuser válasza nagym6 hozzászólására (») Máj 22, 2019 / 1
 
60MHz max. órajel eleve kizárja.
Master módban max. Fosc/4
Slave módban
Idézet:
„external clock must meet the minimum high and low times
as specified in the electrical specifications”
(#) nagym6 válasza superuser hozzászólására (») Máj 22, 2019 /
 
Master mód kell, ezek szerint 64MHz a max. órajel PLL -el, tehát 16MHz lehetne? Az is jó lenne.
(#) superuser válasza nagym6 hozzászólására (») Máj 22, 2019 / 1
 
Az az elméleti maximum.
Nem tudom milyen feladatra akarod használni; én nem nagyon hiszek ezekben a maxon járatásokban. Ez ugyan egy HW blokk, de a kiszolgáló rutinoknak is le kell futniuk valamikor.
Persze kellő hozzáértéssel és odafigyeléssel nyilván ki lehet használni a proci maximumait, de ez értelemszerűen többlet munkát jelent a megvalósítás során.
(#) nagym6 válasza superuser hozzászólására (») Máj 22, 2019 /
 
LTC1864 A/D -hez, minél gyorsabb mintavételezési freki kell kb. 10 mintavételezésig, utána van idő. Ez 16 bites, 2 lépcső egy beolvasás, gondolom a 8 bites buffer egy kiolvasása után mehet a másik 8 bit. Csak szórakozás, elbíbelődgetek vele.
Köszi.
(#) lastewer hozzászólása Máj 22, 2019 /
 
Sziasztok!

PIC16f628a vezérlővel szeretnék UART-on adatokat olvasni, de nem sikerül ha azt akarom kiolvasni, hogy van e a válaszban ok szó.

Random kiírja , hogy rendben meg szétfagy ahogy küldök adatot neki.

  1. char *tmp[255];  //Ezt a változót hozom létre az olvasott adatoknak
  2.  
  3. ........
  4.  
  5. while (1)
  6. {
  7. if (UART1_Data_Ready() == 1)   // Ha van bejövő adat
  8. {
  9.     //tmp = UART1_Read(); // Get received byte
  10.     UART1_Read_Text(tmp, "ok", 10); // Kiírjuk a tmp változóba
  11.     if(strstr(tmp , "OK") == 0)
  12.       {
  13.         UART1_Write_Text("RENDBEN");
  14.       }
  15.       else
  16.       {
  17.         UART1_Write_Text("NINCS RENDBEN");
  18.       }
  19. }
  20. }
A hozzászólás módosítva: Máj 22, 2019
(#) Hp41C válasza lastewer hozzászólására (») Máj 22, 2019 / 2
 
Idézet:
„char *tmp[255]; //Ezt a változót hozom létre az olvasott adatoknak”

Error [1250] main.c; 2. could not find space (510 bytes) for variable _tmp
Ez a sor nem egy 255 elemű karakterre mutatókat tartalmazó tömböt hoz létre?
  1. char tmp[255];  //Ezt a változót hozom létre az olvasott adatoknak

Ez a sor valóban létrehozná a változót.
Van-e egyáltalán annyi RAM ebben a kontrollerben, amennyi ehhez a feladathoz kellene?
Nincs. Ld adatlap 224 bytes of RAM.
Ráadásul a RAM -o lapozva kezeli a hagyományos 16F család, így egy lapon max 80 byte kezelhető. A Common külön kezeli a fordító (XC1.33).
A hozzászólás módosítva: Máj 22, 2019
(#) superuser válasza lastewer hozzászólására (») Máj 22, 2019 / 1
 
Idézet:
„UART1_Read_Text(tmp, "ok", 10); // Kiírjuk a tmp változóba”

Nem látok bele az UART rutinjaidba, de ez az egy sor kétlem, hogy rendben lenne

A beérkezett bájtokat pufferelni kell és az "OK" stringet a pufferben kell keresni.
Persze ilyenkor felvetődik, hogy mikor töröld a puffert, vagy körforgóra hagyjad - de akkor hogyan keresel egy körforgó pufferben, stb.

Nem írnám meg a kódot helyetted, de kiindulásnak valami ilyesmi:

  1. #define PUFF_SIZE 20
  2. char puffer[PUFF_SIZE];
  3. char pp=0;
  4. while (1)
  5. {
  6. if (UART1_Data_Ready() == 1)   // Ha van bejövő adat
  7. {
  8.     if (pp < PUFF_SIZE)
  9.        puffer[pp++]= UART1_Read(); // Get received byte
  10.     if (pp >= PUFF_SIZE)
  11.       pp = 0;
  12.     if(strstr(puffer, "OK") == 0)
  13.       {
  14.         UART1_Write_Text("RENDBEN");
  15.       }
  16. }
  17. }
(#) lastewer válasza Hp41C hozzászólására (») Máj 22, 2019 /
 
Igazad van, bocsi , elírtam. Az ott így néz ki:
  1. char *tmp[10];
(#) lastewer válasza superuser hozzászólására (») Máj 22, 2019 /
 
Húha , ez a teljes kód:

  1. // Órajel beállítása (Kvarc)
  2. #define _XTAL_FREQ 16000000
  3. #define PUFF_SIZE 20
  4.  
  5. // Változók beállítása
  6.     char puffer[PUFF_SIZE];
  7.     char pp=0;
  8.  
  9. //Main -----------------------------------------------------------------
  10. void main()
  11. {
  12.    UART1_Init(4800);            // Initialize USART module
  13.    delay_ms(500);
  14.    UART1_Write_Text("PIC start");
  15.    UART1_Write(13);      // Start a new line
  16.  
  17.  
  18.   while (1)
  19.   {
  20.     if (UART1_Data_Ready() == 1)   // Ha van bejövő adat
  21.     {
  22.         if (pp < PUFF_SIZE)
  23.            puffer[pp++]= UART1_Read(); // Get received byte
  24.         if (pp >= PUFF_SIZE)
  25.           pp = 0;
  26.         if(strstr(puffer, "OK") == 0)
  27.           {
  28.             UART1_Write_Text("RENDBEN");
  29.           }
  30.     }
  31.  
  32.   }
  33. }


Minden adatra azt írja, hogy RENDBEN.

A library azt írja, hogy az "strstr" pont akkor ad 0 értéket vissza, ha nincs benne az a karakterlánc amit keresek.
A hozzászólás módosítva: Máj 22, 2019
Következő: »»   1087 / 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