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   734 / 1210
(#) sonajkniz válasza gazspe hozzászólására (») Dec 18, 2015 /
 
Szia!
Én a 18-as családot ajánlanám. Azon belül is kezdetnek a PIC18F14K22-est. Kellően nagy a tudása, és sehol nem kell bankváltással foglalkozni. Kezdőknek ideális.
Programozó tekintetében teljesen egyetértek Pali79-el.
(#) Hp41C válasza cross51 hozzászólására (») Dec 18, 2015 /
 
A megszakítás a 9. órajel lefutó éle után jön, és a CKP -t 0-ra állítja a modul, amivel várakozásra kényszeríti a mastert. Így a megszakítás kiolvashatja a SSPBUF tartalmát és feldolgozhatja azt. Ha címet vett, akkor saját cím esetén az ACKDT 0 szintre állításával fogadja el. Ha adatot vett, az ACKDT 0 szintre állításával jelezheti, hogy sikeresen vette. Ha beállította az ACK értékét, a CKP 1 -re állításával tovább engedheti a kommunikációt. A CKP engedélyezése utáni órajel felfutó élre a master beolvassa az ACK -szintet.
(#) Pali79 válasza sonajkniz hozzászólására (») Dec 18, 2015 /
 
Én ezzel nem teljesen értek egyet. Jobb valamit megtanulni és utána elhagyni ha nincs rá szükség, mint szívni vele ha rákényszerülsz. Gondolj a saját példádra, amikor PIC18 után PIC 12-öt használtál.
(#) sonajkniz válasza Pali79 hozzászólására (») Dec 18, 2015 /
 
Ebben igazad van. Viszont a gyengébb képesség, bonyolultabb programozással párosítva akadályoz a kreativitásban. Pl: RAM kezelés, RAM-on belüli munka.
(#) Pali79 válasza sonajkniz hozzászólására (») Dec 18, 2015 /
 
Olvastad, hogy mit szeretne? LED-eket kapcsolgatni, hidd el a RAM terület kezelésétől messze van mint Makó Jeruzsálemtől.
(#) sonajkniz válasza Pali79 hozzászólására (») Dec 18, 2015 /
 
Oké! 1-0 oda!
(#) SKY hozzászólása Dec 18, 2015 /
 
Sziasztok!
Tudnátok segíteni abban, hogy hogyan lehet adatot kiolvasni SPI-n az ADE7753 típusú IC-ből?
A MODE regisztert beállítottam az alábbiak szerint, hogy a feszültség minta legyen a waveform regiszterbe, mintavételt, stb.
A 24 bit kiolvasását így oldottam meg, de csak nullák jönnek:
  1. SPI1_Init();
  2.     LATA0_bit=0;                              //ch1 !cs kiválasztva
  3. //kommunikációs regiszterbe írás hogy írni fogunk a mode regiszterbe
  4.  
  5.     temp=0b10001001;        //communication reg: 7. bit=1=írás, lsb-től mode regiszter címe: 0x09
  6.     SPI1_Write(temp);          //írás a communication regiszterbe
  7.     temp=0b01111000;        //MODE-ba írás  először a felső bájt
  8.     SPI1_Write(temp);
  9.     temp=0b00001101;        //MODE-ba írás  alsó bájt
  10.     SPI1_Write(temp);
  11.     delay_us(2);
  12.     LATA0_bit=1;                  //!cs deakt.
  13.     delay_ms(10);
  14.  
  15. //WAVEFORM REGISZTER KIOLVASÁS
  16. while(1)
  17. {
  18.     delay_us(5);
  19.     LATA0_bit=0;                   //chip select aktív
  20.     delay_us(5);
  21.     temp=0b00000001;        //communication regiszterbe írás, hogywaveformból olvasunk
  22.     SPI1_Write(temp);          //temp short
  23.  
  24.     tmp=SPI_Read(0);          //először az MSBájt jön, a tmp 48 bites
  25.     tmp=tmp<<16;
  26.     ertek=tmp;
  27.     tmp=SPI_Read(0);
  28.     tmp=tmp<<8;
  29.     ertek=ertek+tmp;          
  30.     tmp=SPI_Read(0);
  31.     ertek=ertek+tmp;           //belekerült a 24 bites változó
  32.     delay_us(1);
  33. }

Vonalak felülről: SCK, !CS, SDO, SDI
(#) Prendick válasza SKY hozzászólására (») Dec 18, 2015 /
 
Ha a waveform-ból olvasol, a parancs és az olvasás között kell min. 4us szünet. (Doksi, 6. oldal, "t9 4μs (min) Minimum time between read command (i.e., a write to communication register) and data read.")
Ennek a hiánya okozhatja a nullákat.
(#) SKY válasza Prendick hozzászólására (») Dec 19, 2015 /
 
Nem ez volt a hiba, nem működik más SPI inicializálással sem. Azt hiszem nem kell mást konfigurálni a minimális működéshez, de tehettek volna egy inicializálási sorrendet az adatlapba...
(#) bbalazs_ hozzászólása Dec 19, 2015 /
 
Sziasztok!

Most valtottam 18F-rol 24HJ-re es az asm30 'szuper' assemblert hasznalom.
De nem tudok pint nevvel definialni. (sd_ss = LATA,#2)
Makroval meg tudom oldani a bset,bclr-t, de nem elegans.
A neten sokfele megoldast lattam, de az, hogy installald fel a c30-at es hasznald azt, szamomra elfogadhatatlan.
Tenyleg nem tudja az asm30 ezt? Elegge rohejesnek tunik...
(#) jocka0012 hozzászólása Dec 19, 2015 /
 
Üdv!Kezdő vagyok a pic-ek terén.Vettem egy boardot , amin egy 16F887a van.Szeretnék egy ds1307 rtc - vel kommunikálni i2c-n csak sajnos eddig nem jártam túl nagy sikerrel.Valaki nem tudna küldeni esetleg egy példaprogramot c-ben amin be van állítva az i2c kommunikáció illetve kiolvassa az adatokat az rtc-ből?
(#) Lamprologus válasza jocka0012 hozzászólására (») Dec 19, 2015 /
 
(#) gyoran hozzászólása Dec 21, 2015 /
 
Sziasztok
A következőkben kérném tapasztaltabbak segítségét. Adott egy 12F629, belső órajelről jár, de van egy külső órakvarc LP üzemmódban. Erről a belső 8-as előosztó és Timer 1 10 másodpercenként megszakítást generál és így gyakorlatilag végigszámol 24 órát. Az első négy órában csinál valamit a többi 20 ban SLEEP-ben van csak 10 mp-ként tér magához, amíg a 24 óra el nem telt, akkor megint ténykedik 4 órát és így tovább.
Ez általában jó is de néha siet fél - egy órákat. Látni csak persze akkor látom, amikor a 4 ill. a 20 óra letelik. Olyan, mintha sietne az órakvarc. Ezt csinálta a próbapanelen is, akkor másik kvarcot kapott, azzal jól ment. Most a végleges programmal megint teszi.
Órakvarc órából lett még régen kitermelve, a PIC adatlap szerinti 80pf kondenzátorokkal még inkább csinálta, most - az általában a kvarcokhoz ajánlott - 2x15 pf van benne, először ezzel jobbnak tűnt de most is megőrül néha. És vagy pontos, vagy siet, késni soha nem késik.
Szkóppal (x10) rálépve az OSC1 lábra, pár mp alatt lassan 30-40 %-ot nő a jel, mintha az oszcillátor jobban érezné magát a mérőfejtől.
Volt már valakinek ilyen tapasztalata? Ti mekkora kondenzátort tesztek rá?

Előre is köszönöm a válaszokat.
A hozzászólás módosítva: Dec 21, 2015
(#) zenetom válasza gyoran hozzászólására (») Dec 21, 2015 /
 
Szia!
32,768kHz-es kvarcot használsz? Csak mert 8-as osztóval az 16 másodpercre jön ki. Vagy előtöltöd a TMR1 regisztereket?
(#) Pali79 válasza zenetom hozzászólására (») Dec 21, 2015 /
 
Szerintem ha 0-val kezdi, akkor az 64 másodpercre jön ki.
(#) cross51 válasza Hp41C hozzászólására (») Dec 21, 2015 /
 
Ne haragudj, hogy le kellet írnod ezt a hosszas magyarázatot, nem ez volt a probléma az angol szöveget félreértelmeztem és azt értettem, ha a BF bit egy akkor nincs ACK, csak azt már elfelejtettem a végén, hogy akkor nincs ACK ha új bájt érkezik és a BF bit még mindig egy.

Valamint rosszul fogalmaztam meg a kérdést nem ismertettem az egészet. A probléma megoldódott, hogy a slave nem küld vissza ACK-ot.
Egy PPS-el rendelkező PIC-en volt ez a probléma és az SDA/SCL lábakat nem állítottam be kimenetnek is csak bemenetnek és így nem tudta az SDA vonalat az ACK-hoz lehúzni.
(#) icserny válasza bbalazs_ hozzászólására (») Dec 21, 2015 /
 
Idézet:
„De nem tudok pint nevvel definialni. (sd_ss = LATA,#2)”

Már definiálva vannak a nevek a megfelelő (például a p24HJ128GP502.inc) állományban.
Például a LATA,#2 az névvel írva: LATA,LATA2.
A hozzászólás módosítva: Dec 21, 2015
(#) gyoran válasza Pali79 hozzászólására (») Dec 21, 2015 /
 
Sziasztok,

igen 0x60 (96)-nal töltöm a TMR1H-t és 0-val a TMR1L-t
Innen 40960-at számol felfelé túlcsordulásig, x 8 az pont 327680 ciklus azaz 10 mp
Ilyenkor jön az Interrupt, megnövel egy tárhelyet (sec) 10-ze, ha eléri a 60-at nullázza és incrementálja a percet. Ha az eléri a 60-at inc óra és nullázza a percet. 24 óránál nullázza az órát.
Ennyi az INT, 4 MHZ mellett "nudli", hogy népiesen fejezzem ki magam.
A többi INT-en kívül van, speciel egy karácsonyi (miért pont most ????) ablakdísz LED-et hajt meg 50% Duty Cycle-val a négy órában kb 150 Hz-en. Aztán kikapcsol, és várja a következő estét.
Most egyébként átírtam a programot , 8-as osztót kivettem, és így fél óra alatt elvégzi a 4 órás LED-es ciklust. Megnöveltem a kondenzátorokat és tettem be csillapító ellenállást, így szebb az oszci jelalak, és most fél óra alatt három másodpercet sietett.
Reggel 15 pf-es kapacitásoknál ellenállás nélkül ez 1 mp volt. Nem értem. Második kvarc, sokadik kondi, CHIP nem szokott így meghalni....., ill. ritkán.
Most leviszem a kondikat 12 pF-re, benne hagyom az ellenállást és mérek. De ennek stabilabbnak kellene lennie
100 nF szűrés egyébként pont az IC hasa alatt van, az sem lehet.
(#) bbalazs_ válasza icserny hozzászólására (») Dec 21, 2015 /
 
Nem a bittel van problema, hanem a pinnel.
Amikor kiadom a bset LATA2 parancsot, kozli, hogy keves a parameter (varja a #valami-t).
Vagyis az elejen szeretnem EGYSZER definialni neki a megfelelo pint es utana ezzel a nevvel hivatkozni ra a program teljes teruleten.
De nem segit semmi, se define se egyenlosegjel, sem global, sem ilyesmi. Mas is kuzdott vele, mas sem tudta megoldani.
Csak ha atternek a c30-ra.
(#) foxi63 válasza gyoran hozzászólására (») Dec 21, 2015 /
 
Szia!
Bát nem tudom milyen PIC-et használsz, de 16bites módban elsőnek a H regisztert kell írni, aztán az L-t.
8 bitesben elsőnek nullázni kell az L regisztert, beírni a felső értéket, és ezután lehet írni az alsó regisztert.
Azonban pontatlanságot okozhat az, hogy állandóan újra és újra írni kell a timert. Megszakítás alatt, ha épp a tmr1-et is frissíteni kéne mindenképp hiba áll elő.Ezért kell olyan időzítőt készíteni,amit sose kell újra írni, és ez pedig a TMR2 . Van elő és utóosztója,szinte bármilyen kvarcnál be lehet állítani a pontos másodperc alapú megszakítást, de sosem kell beleírni. Az utóosztója 1-15 ig állítható. A periódus regisztert (PR2) eggyel kisebbre kell állítani (pl. 250 kell, akkor 249 re)i. Én mindenképp azt használnám. A megszakítás csak egy jelzőbitet billent be ,majd a főprogram ciklikusan figyeli ezt a jelzőt, ha 1 akkor nullázza és végrehajtja az adott feladatot.
Biztos programbeli probléma lehet nálad, mert kvarccal ekkora eltérés szerintem sok.
üdv. Foxi
A hozzászólás módosítva: Dec 21, 2015
(#) sonajkniz válasza gyoran hozzászólására (») Dec 21, 2015 /
 
Elárulnád, mi a jó abban, hogy így elbonyolítod azt ami amúgy egyszerű?
Töltögeted mindenféle értékekkel a Timert. Minek? Ha egyszer óraquarzot használsz, és békén hagyod a TIMER1-est, akkor az 2 másodpercenként vált ki egy megszakítást. A megszakításban törlöd a flag bitet, és semmi mást. A számlálódat növeled 1-el, és 30-nál lépsz. Én több órával vezérelt szerkezetet is készítettem már, de ezzel a hibával még nem találkoztam. Bár nem atomóra, de napi 1 sec eltérésnél többet még nem tapasztaltam. Igaz, bontott quartzal sem dolgoztam még. Kibírtam azt a 30 Ft-ot amibe kerül. Amúgy én 33 pF-es kondikat használok.
Eddig bevált. Az adatlap egyébként 27-et ír. Majd elfelejtettem. Előosztás sem kell. Amikor így írkálod, az előosztás is csúnyán bekavarhat.
A hozzászólás módosítva: Dec 21, 2015
(#) gyoran válasza foxi63 hozzászólására (») Dec 21, 2015 /
 
Szia,

köszönöm a választ

a 12 F629-ben sajnos nincsen TIMER2
a Timer1 viszont olyan lassan működik, hogy az Interruptban lévő CLRF TMR1L tulajdonképpen hatástala, úgyis 0 van benne, a TMR1H pedig alapvetően nem változik, még nagyon sokáig, hiszen az a TMR1L túlcsordulásakor lépne csak egyet. Tehát szerintem az L-ben és a H-ban is 0-van.
Az interrupt rutin max 40 ciklus ez 4 MHz-en ami 40 microsec. A 32kHz kristály egy órajele meg 30 usec, azaz a 8-as előosztó éppen egyet lép, mire kint vagyok az Interruptból az új timer értékekkel.
Most, hogy leszedtem a leírás szerinti 80 pf-et és 15 pF maradt, fél órán belül nem látható az eltérés.
Lemegyek 12 pF-re, meg szerzek egy új kvarcot, ezek már túléltek velem együtt vagy 30 évet a fiókban, hátha nyugdíjba mentek már.
Az OSC2 elég gnóm jelalakkal jön, annak pedig színusznak kellene lennie a MICROCHIP szerint.
Lehet, hogy mégis a PIC döglött?

Egyébként a kapcsolás célja az, hogy az elemes ablakdíszt ne kelljen kapcsolgatni, hanem az első bekapcsolást követően 4 órát világít (azt is 50% kitöltési tényezővel) a többit a 24-ból meg alussza.

Ha stabil lesz, és érdekel valakit, megoszthatom. Következő karácsonyra hátha valakit érint.
(#) gyoran válasza sonajkniz hozzászólására (») Dec 21, 2015 /
 
Köszi,

én azért csinálom ezt a macerát az osztóval, mert így van egy RTC-m az interruptból vezérelve, a főprogram meg csak az órát nézi, mikor mit kell tennie.
Nekem így tetszik, de gondolom mindkettő megoldás megy.
Kvarccal meg nem spórolok, csak macerás elmenni ebben a karácsonyi tömegben. Ha úgyis van itthon. Habár úgyis akarok venni pár alkatrészt (400 Ft parkolás + 100 Ft alkatrész )
(#) sonajkniz válasza gyoran hozzászólására (») Dec 21, 2015 /
 
Idézet:
„400 Ft parkolás + 100 Ft alkatrész”


Sajnos ez igaz. Meg odamenni sincs ingyen.
(#) gyoran válasza gyoran hozzászólására (») Dec 21, 2015 /
 
Másfél óra alatt nem látok eltérést
Megyk kvarcért. Csak azt szeretném tudni, hogy a 12f629 adatlapján MIÉRT 68-100 pF szerepel.
(#) zenetom válasza sonajkniz hozzászólására (») Dec 21, 2015 /
 
Köhömm...
Rossz adatlapot tetszett nézni!
(#) zenetom válasza gyoran hozzászólására (») Dec 21, 2015 / 1
 
Ha nem ragaszkodsz nagyon a 10 másodperces megszakításhoz, akkor én inkább a 16-ot ajánlanám, és akkor nem kell a Timer regiszterekhez nyúlni. Így lesz egy regiszter, amit 16 másodpercenként növelsz, ami 3600 másodperc alatt 225, vagyis simán elfér 8 biten. Onnan meg már használhatod a mostani eljárásodat.
(#) sonajkniz válasza zenetom hozzászólására (») Dec 21, 2015 /
 
Már az én válaszom után jött az ifó, a PIC típusáról.
Amúgy igazad van.
(#) gyoran válasza sonajkniz hozzászólására (») Dec 21, 2015 /
 
Sziasztok

Igen Zenetom tippje is egy jó és elegáns megoldás.
Amikor elkezdtem, mindenféle egyéb plusszokon járt az agyam, amihez egy RTC ideálisabb lett volna, de aztán rájöttem, hogy egy ablakdísz nem kíván hitec konfig menüt és hasonlót. De az RTC megmaradt
Most új kvarc és 12 pF valamint a raszter-nyák saját kapacitása van benn, így stabil eddig, de az órajel ugyanolyan gnóm, mint előtte. Majd játszom vele, karácsony után úgyis egy évig pihiben lesz.
A quartz házát földre kötitek?

Az elmélet kedvéért: tudtok valami rizikóról a TIMER1 írásánál azon kívül, ha pont az incrementtel együtt van az írás/olvasás? (Ez ugye nálam nincs, mert olyan messze van az első INC, hogy a szele sem ér a TIMER1-hez)

Üdv és köszönet mindenkinek a segítségért és Boldog Karácsonyt!
A hozzászólás módosítva: Dec 21, 2015
(#) Hp41C válasza gyoran hozzászólására (») Dec 22, 2015 / 1
 
Timer1 errata
A timer2 nem működik speel üzemmódban.
Következő: »»   734 / 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