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   42 / 1207
(#) icserny válasza pajti2 hozzászólására (») Jan 10, 2010 /
 
Idézet:
„Nem tudom másnak is feltűnik-e, de az nSS vezérlésnek nem szabadna visszaváltania addig, amíg a Master ki nem adta az utolsó clock falling edge-et is.”

A hiba a Microchip készülékében/mikrovezérlőjében van!

Itt található az Errata, olvasd el! A 3., 4., és 19. sorszámú hibák kapcsolódnak az SPI modulhoz, ebből a 4. szerintem irreleváns.

A 3. hiba szerint a TBF késve billen (egy)be, ezért mielőtt a megszűnését kezdenéd figyelni, meg kell várni a bebillenését.

A 19. hiba szerint TBF túl korán billen vissza, ezért a visszabillenés után még egy órajelperiódust ki kell várni. Ez összecseng a tapasztalataiddal, s több bájt küldése esetén még tragikusabbak volnának a következmények...

Alternatív megoldási javaslatok:
Alternatively, do one of the following:
a) Poll the RBF bit and wait for it to get set
before writing to the SPIxBUF register.
b) Poll the SPI interrupt flag and wait for it to
get set before writing to the SPIxBUF register.
c) Use an SPI Interrupt Service Routine.
d) Use DMA.

Tehát megvárhatod, amíg az SPI masternél a fogadás is befejeződik, vagy figyelheted az interrupt jelzőbitet, vagy használj programmegszakítást vagy DMA-t.

Csak a TBF-ben ne bízz, mert az semmire sem jó!
(#) madazg77 hozzászólása Jan 10, 2010 /
 
Sziasztok!

Miért adnak meg -VREF lábat a referencia feszültség bemenetnél?

Köszönöm.

Üdv.
(#) potyo válasza madazg77 hozzászólására (») Jan 10, 2010 /
 
Nem kellene?
(#) madazg77 válasza potyo hozzászólására (») Jan 10, 2010 /
 
Ha tudnám akkor nem kérdezném. Van elkébzelésem, csak nem vagyok benne biztos. Azért van hogy negatív is lehet az a/d konverzió eredménye? pl. hőmérönél
(#) potyo válasza madazg77 hozzászólására (») Jan 10, 2010 / 1
 
Alsó és felső referencia, nem negatív referencia. A két szélsőérték között mér az AD átalakító.
(#) madazg77 válasza potyo hozzászólására (») Jan 10, 2010 /
 
Értem. Köszönöm a gyors segítséget.

Üdv.
(#) Hp41C válasza (Felhasználó 15355) hozzászólására (») Jan 11, 2010 /
 
Szia!

A referencia feszültség kb. 2.5 V (ld. adatlap) szintjéig marad a 10 bit felbontás, de az alatt a pontosság romlik. Sem a referencia, sem a bemeneti feszültség nem mehet a tápfeszültség fölé. A nagyobb feszültségek méréséhez pontos (10 bit ~ 0.1%) előosztó kell, a bemenet túlfeszültség védelme ajánlott. Az osztó ellenállásainak forrása lehet egy bontott (gazdaságos) multiméter...

Szia
(#) icserny válasza (Felhasználó 15355) hozzászólására (») Jan 11, 2010 /
 
Idézet:
„Ha 2 ADC csatornát használok akkor csatornánként 50Ksample/s lesz?”

Durva közelítésben igen, a valóságban egy kicsit kevesebb, mivel a csatornaváltások miatt valamivel több várakozás kell, mint két mintavétel között.
(#) watt válasza (Felhasználó 15355) hozzászólására (») Jan 11, 2010 /
 
Hány voltig akarsz mérni? Kell a 10-es arány?
(#) pajti2 válasza (Felhasználó 15355) hozzászólására (») Jan 11, 2010 /
 
50V még nem a világ vége érintésvédelmi szempontból sem, de a törpefeszültség korlátja 24V, és azt már átlépted, ergo hálózati feszültség kategóriában vagy ígyis-úgyis. Akár kihasználod, akár nem.

Max arra ügyelhetnél, hogy a "bemenetek" vezeték távolsága ne 0.2mm legyen.

Brumm pedig egészen addig nincs, amíg valami össze nem szedi. Ebből a szempontból a mérőzsinórjaidat hibáztasd inkább, nem a pic lesz a fő bűnös. Tápszűrésre sem kellene sajnálni sem a 10µF tantált, sem a 100nF-al párhuzamos 6.8nF-ot.
(#) bodisjani hozzászólása Jan 13, 2010 /
 
Sziasztok!

Egy példaprogrammal kapcsolatban lenne kérdésem:
A 16F877A 4MHz-en megy. A TMR1H és L értékét hogyan lehet kiszámolni? Mondjuk 1 másodpercre?


  1. #include <pic.h>
  2.  
  3. /*Globális változó, futófény állapotát tárolja*/
  4. volatile unsigned char chLedek = 1;
  5.  
  6. void InitT1 ( void );             // Timer1 modult inicializáló függvény
  7. void InitInterrupt ( void );      // Megszakítások konfigurálása
  8.    
  9. main ( )                          // Főprogram kezdete
  10. {
  11.     InitT1();                     // Timer1 inicializálása
  12.     InitInterrupt ();             // Megszakítások konfigurálása
  13.     TRISD = 0xF0;                 // PORTC alsó négy bitje kimenet lesz.
  14.     PORTD = 0x00;                 // PORTC törlése
  15.    
  16.     while(1)                      // Végtelen ciklus
  17.     {
  18.         PORTD = chLedek;          // ledek változó értékét
  19.                                   // kitesszük a kimenetre        
  20.     }
  21. }
  22.  
  23. /* Timer1 modult inicializáló függvény */
  24. void InitT1 ( void )
  25. {
  26.     /* Belső oszcillátor (Fosc/4), 1:8 előosztó */
  27.     T1CON = 0b00110000;      
  28.     TMR1H = 0x85;            // Időzítési ciklus: 250ms
  29.     TMR1L = 0xEE;            // TMR1 = 65536 - 31250;
  30.     TMR1IF = 0;              // Timer1 megszakításbitjének törlése
  31.     TMR1ON = 1;              // Timer1 bekapcsolása
  32. }
  33.  
  34. /* Megszakítások konfigurálását végző függvény */
  35. void InitInterrupt ( void )
  36. {
  37.     TMR1IE = 1;              // Timer1 megszakításának engedélyezése
  38.     PEIE = 1;                // Perifériamegszakítások engedélyezése
  39.     GIE = 1;                 // Összes megszakítás engedélyezése
  40. }
  41.  
  42. /* Megszakításkezelő függvény */
  43. void interrupt InterruptHandler (void)
  44. {
  45.     if(TMR1IF)    /* Timer1 megszakítás */
  46.     {                             // Időzítési ciklus újbóli beállítása
  47.         TMR1H = 0x85;             // Időzítési ciklus: 250ms
  48.         TMR1L = 0xEE;             // TMR1 = 65536 - 31250;
  49.         /*chLedek változó alsó négy bitjén balra rotálás*/
  50.         chLedek = (chLedek&0x08) ? 1 : chLedek << 1;
  51.         TMR1IF = 0;               // Timer1 megszakításbitjének törlése
  52.     }
  53. }


(#) icserny válasza bodisjani hozzászólására (») Jan 13, 2010 / 1
 
A számláló bemenetére az Fosc/4-nek az 1/8-a jut, tehát a számláló

f = Fosc/4 * 1/8 = 4000000 Hz/4 * 0.125 = 125000 Hz

frekvenciával számol. A példaprogramban szereplő 250ms = 0.25 s idő alatt tehát 125000 Hz * 0.25 s = 31250 periódust számlál le a számláló (a Hz az 1/s, így s-mal szorozva mértékegység nélküli mennyiséget kapunk)

1 másodperces időzítést csak úgy tudsz csinálni, ha szoftveresen kiegészíted a számlálót (számlálod a túlcsordulásokat), ugyanis a 15 bites számláló 65535 után (2^16-1) túlcsordul, és ismét nulla lesz. Neked meg a fentiek alapján 125 000 eseményt kellene leszámolni.

Javaslat: hagyd a beállítást úgy, ahogy van, s akkor másodpercenként 4 db megszakítást kapsz. Növelj egy egybájtos változót minden Timer1 megszakításkor, s amikor elérte a 4-et, akkor nullázd, és hajtsd végre, amit a másodperc leteltével akartál!
(#) bodisjani válasza icserny hozzászólására (») Jan 13, 2010 /
 
Köszönöm az azonnali választ!

Sajnos egy 7000Ft-os könyvbe ez a levezetés nem fért bele...
Másik kérdésem az lenne, hogy T1-et külső órajelről üzemeltetném /32KHz/ akkor az egy másodpercet hogy számolom ki?
Bocs hogy ilyen alap dolgokkal fárasztalak, de egyszer már olvastam erről a fórumban, de most nem találom.
(#) vilmosd válasza bodisjani hozzászólására (») Jan 13, 2010 /
 
Hali

Egy egyszeru proggi az idozitesek szamitasara a PIC idozitojeihez: pictimercal.
Udv Vili
(#) bodisjani válasza icserny hozzászólására (») Jan 13, 2010 /
 
Uhh! Jó hülye vagyok.

Az lett volna amúgy a kérdésem, hogy:
TMR1H miért 0x85 és
TMR1L miért 0xEE?

A válasz pedig: hogy a 16bit=2*8bit.
Így már képben vagyok a számolást illetően!

Viszont akkor, ha az előosztót csökkentem, akkor meg lehet csinálni az egy másodpercet is. Ugye?
(#) icserny válasza bodisjani hozzászólására (») Jan 13, 2010 /
 
Gondolom, a Timer1 32 kHz-es saját oszcillátoráról van szó. Ekkor a bemenő frekvencia ~32768 Hz. Ha 1 másodperces időzítés kell, akkor az 1:1-es arányt célszerű használni.

A mintaprogramodban tehát a Timer1 inicializálását másképp kell csinálni (külső oszcillátor, 1:1-es számlálás), a számláló regiszterbe pedig 65536 - 31250 helyett most 65536 - 32768-at kell írni (2^16 - 2^15), vagyis
TMR1H = 0x80 és TMR1L = 0x00.

Ajánlott olvasmányok:
PIC - Miértek, hogyanok topikban "timer1" kulcsszó keresése
PIC - Mid-Range MCU Family Reference Manual (12. fejezet: Timer1)
Timer1 Errata (ez utóbbiról van szó az ajánlott PIC Miértek, Hogyanok topikban is)
(#) icserny válasza bodisjani hozzászólására (») Jan 13, 2010 /
 
Idézet:
„ha az előosztót csökkentem, akkor meg lehet csinálni az egy másodpercet is. Ugye?”

Pont fordítva: az előosztást növelni kellene. De már nincs hova...
(#) bodisjani válasza icserny hozzászólására (») Jan 13, 2010 /
 
Köszi!

Olvasgatok még kicsit a témában.
Egy utolsó kérdés. Ha lehet még.
Olyat hogy lehet, hogy feltételtől függően a számláló megáll, aztán ugyanonnan folytatódik?
(#) bodisjani válasza icserny hozzászólására (») Jan 13, 2010 /
 
Ja? Ja!
Nem vagyok a toppon...
(#) Stefan válasza bodisjani hozzászólására (») Jan 13, 2010 / 1
 
A TMRxON bitet kell törölni, akkor megáll. Ha megint 1 akkor onnan folytat.
Általában a legkisebb bit a TxCON regiszterben.
x: Az adott számláló "sorszáma".

ui: A számlálót és az időzítőt azért különböztessük meg egymástól. Akkor beszélünk számlálóról, ha egy külső esemény miatt nő a tartalma. Időzítő meg szabadon fut magától. Pongyola megfogalmazással.
(#) bodisjani válasza Stefan hozzászólására (») Jan 13, 2010 /
 
Köszi neked is!
Most kísérletezgetek meg olvasgatok még kicsit, aztán tovább!
Mégegyszer kösz mindenkinek!
(#) Stefan válasza bodisjani hozzászólására (») Jan 13, 2010 /
 
Kéredzz bátran, még akkor is ha hülyeségnek érzed, nem egyszerű témába vágtad a fejszéd :yes:
(#) pajti2 hozzászólása Jan 14, 2010 /
 
Kérdés gyakorlott kóderekhez:

Vegyes asm & C programban közös változókat (struktúra tömböket) kellene kezelni. A vonatkozó atomic folyamatokat megszervezem, meg a volatile-re is figyelek majd C-ben, de még mindig probléma a változók pontos helyének megállapítása. A tapasztalat arra kellene, hogy eldönthessem, hogyan fog végül pofásabban kinézni a program mindkét oldalon.

Callback-eket gyártsak C-ben, amiket visszahívok asm-ből és úgy kérdezzem le a változók címeit?

Init() folyamat gyanánt előre adjam át C-ből asm-nek a változók címeit, és tegyek minden pointert asm oldalon változóba?

Alapból asm-ben hozzam létre a változókat, és C-ben packed struktúra-ként érjem el pointereken keresztül - elég rendesen kezeli a fordító a packed-et egy ilyen manőverhez ?

Ha valakinek akadnak tapasztalatai, szívesen venném. Ha nem, feldobok egy dobókockát
(#) mdemcsik hozzászólása Jan 14, 2010 /
 
Hello mindenki!
Segítséget szeretnék kérni a következő kérdésben.
Van egy 0-5V négyszögjelem (szkóppal megnéztem) egy valószínűleg hall jeladós sebesség jeladóból. Szeretném a piccel mérni egy impulzus hosszát. De. Nem sikerül illesztenem a jelet mert mikor a picre engedem, a kilométeróra megvakul, mintha megenné a jelet a pic, nem megy tovább.
Próbáltam növelni az impedanciát 1Mós ellenállással, próbltam schmittet, tranyóval de sehogy nem jön össze. Ha meg épp jó lenne, akkor sem illenek a jelszintek a pichez szükséges magas = 0,8 Vdd, alacsony = 0,2 Vdd szintekhez.
Van valakinek valami ötlete?!
Annyira megköszönném...
(#) Sendi hozzászólása Jan 14, 2010 /
 
Üdv Mindenkinek.

Kezdőként a következő a kérdésem:
Itt egy program részlet, melyre a MPLAB az alábbi üzenetet adja minden sorra. (16F876A)

ORG H'1B00' ; START ADR OF CHAR.SET 256 BYTES

DE 0,0,0,0,0 ; ASCII DEC 00
.
.
.


DE 0,0,0,0,0 ; ACSII DEC 31
DE 0,0,0,0,0 ;SPC ASCII DEC 32
DE 0,0,95,0,0 ;!
DE 0,7,0,7,0 ;"
DE 20,127,20,127,20 ;#
DE 36,42,127,42,18 ;$
DE 35,19,8,100,98 ;%
DE 54,73,85,34,80 ;&
DE 0,0,3,0,0 ;'
DE 0,28,34,65,0 ;(
DE 0,65,34,28,0
DE 34,20,127,20,34 ;*
DE 8,8,62,8,8 ;+
DE 0,80,48,0,0 ;,
DE 8,8,8,8,8 ;-
DE 0,96,96,0,0 ;.
DE 32,16,8,4,2 ;/
DE 62,81,73,69,62 ;0
DE 68,66,127,64,64 ;1
DE 66,97,81,73,70 ;2
DE 34,65,73,73,54 ;3

Argument out of range. Least significant bits used.

Mi a hiba, és mit tudok tenni?

Köszönettel
(#) potyo válasza Sendi hozzászólására (») Jan 14, 2010 /
 
A DE az Data Eeprom, vagyis eeprom adatok elhelyezésére szolgál. Ha programmemóriaterületre akarod az adatokat elhelyezni, akkor DT kell szerintem. Ha pedig eeprom területre, akkor ORG 0x2100 után rakd, ne 0x1B00 után.
(#) Sendi válasza potyo hozzászólására (») Jan 14, 2010 /
 
Helló Potyo.

Köszönöm a gyors válaszodat.
Nem tudom, hogy mit "akarok".
Ez egy kész program.
Mellékelem az asm-t.
Megköszönném ha megnéznéd, mert a hardver már készen van.

Köszönettel

BUGFIX.ASM
    
(#) pajti2 válasza mdemcsik hozzászólására (») Jan 14, 2010 /
 
Talán dobhatnál egy kapcs rajzot mit és hogyan kötnél, mert gyanús, hogy valamit elkötöttél.

Jelet be egy soros ellenálláson keresztül tranzisztor bázisára, collectorra munkaellenállást küldeni a pic tápfeszre, és egy ellenállást kötni a pic bemenetre is. A legegyszerűbb szint illesztés külső áramkör és pic között, és még butaság biztos is. Épp csak invertál, de azt programból megoldod.

Simán működnie kell. Ha nem működik:
-A/D-t kapcsold ki a picen program starton, mert ha analógon hagyod, nem tudsz digitális bemenetet mérni.
-Ha van JTAG a picen, configban kapcsold ki, mert elszipkázza a bemeneti funkciót.
-Biztosan kap órajelet az a pic? Config bitekre odafigyelni.
-Watchdog kikapcs.
-Ha sikerült éppen az OSCIO2-es lábat kiválasztani a funkcióra, configban figyelj rá, hogy az is digit io-ra legyen kapcsolva.

Ha ezek után sem működik, kapcsrajz mellé egy programot is dobj.
(#) bodisjani hozzászólása Jan 14, 2010 /
 
Sziasztok!

Ismét lenne egy kérdésem:
Timer1 et 32KHz-es órakvarcról működtetem 22pF-os kondikkal, mert nincs más itthon. Ez mennyiben befolyásolja a működést, mert nekem úgy tűnik, egy kicsit siet...
(#) mdemcsik válasza pajti2 hozzászólására (») Jan 14, 2010 /
 
Minden frankón van kötve, azzal nincs gond. Most tettem egy BC337et kollektor 1kóval tápra, bázisra 61Kval hall jele és emitter a tápra. Kollektor a picbe.
Holnap kipróbálom. Két jel közti idő mérése CCPvel, jel az RC3ra, CCPR1 két mérés közötti különbségéből számolom az időt. PIC18f442@20hmz. Mostmár gondot csak a tranyó fog okozni, mert egy bizonyos freki felett nem fog kapcsolni...
Következő: »»   42 / 1207
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