Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   806 / 1320
(#) sucuka válasza watt hozzászólására (») Szept 25, 2010 /
 
Ez így igaz, ha tőle vásároltam volna a WILLEM GQ-4X True USB programozómat, most 25.000 Ft-al rövidebb lennék. Ehelyett inkább megrendeltem Kanadából közvetlenül a gyártótól.
Herótom van az ilyen emberektől.
(#) cs_gabor válasza watt hozzászólására (») Szept 26, 2010 /
 
Nem tudom, hogy ki adja neki az ötlelet az árképzéshez, de elég nehezen tudom elképzelni, hogy ilyen árak mellett bármit is el tud adni...
Szóra sem érdemes... ahogyan az oldal sem...
(#) cs_gabor hozzászólása Szept 26, 2010 /
 
Egy termosztátot építek, amely SD kártyára rögzíti (percenként) a külső és a belső hőmérsékletet. A PIC 18F452 és mivel felénk nehezen beszerezhető és postaköltséggel meg nem éri meg nem akarok külső óra IC-t alkalmazni, az egyik időzítő segítségével szeretném megoldani a percszámlálást (másodpercre nincs szükségem), tehát elég ha 60mp-enként kapok egy megszakítást. Ezzel kapcsolatban szeretném megkérdezni, mert erre sajnos sehol nem találok információt, hogy milyen módon befolyásolja vagy befolyásolhatja a megszakítás, még ha csak nagyon rövid ASM kód is, amely egyetlen bájt értékét növeli, a hardveres SPI kommunikációt?
(#) Hp41C válasza cs_gabor hozzászólására (») Szept 26, 2010 /
 
Szia!

- A 18F452 helyett használj modernebb 18F4520 -at vagy 18F4620-at - még az utóbbi (64kb program memória és 3968 ram, 1k adat EEProm) is olcsóbb, mint a 18F452...

Timer1 felhasználásával 4 másodpercenkénti (8 és 16 mp-kénti is lehetséges, de a 60 nem osztható 8-cal ill. 16 -tal) megszakítás érhető el - ez működik sleep módban is. Ha a pic -nek nem kell sleep módben üzemelnie, akkor a timer2 és egy ccp felhasználásával lehet előállítani a timer1 órajelét, akár 16384 másodpercenkénti megszakítás kérés is lehetséges.
(#) szkrep hozzászólása Szept 26, 2010 /
 
Egy 16F877A 2db ADC lábán olvasok be 1-1 10k potmétert (0-5V).
Ha csak egyiket mozdítom meg, akkor is változik mind a két beolvasott érték. Rámértem, a feszültség állandó azon a lábon aminek nem mozdítom a potméterét, a pic mégis nagy mértékben változó értéket mond.
Mit csinálok rosszul? (A tápfesz stabil, próbáltam pickit2-ről, 7805-ről, labortápról, 100n a táplábaknál...)

CCSC-ben a kódom:
  1. #include <16F877A.h>
  2. #fuses HS,NOLVP,NOPROTECT,NOWDT,PUT,NOBROWNOUT  
  3. #use delay(clock = 20000000)
  4. #use rs232(baud=19200, UART1)
  5.  
  6. void main()
  7. {
  8.    int speed, dir, p_speed=0, p_dir=0;
  9.    
  10.    setup_adc_ports (ALL_ANALOG) ;
  11.    setup_adc (ADC_CLOCK_INTERNAL) ;
  12.  
  13.    while (1)
  14.    {
  15.       set_adc_channel (2) ;
  16.       speed=read_adc () ;
  17.       delay_ms (50) ;
  18.       set_adc_channel (3) ;
  19.       dir=read_adc () ;
  20.      
  21.       if ( (speed!=p_speed) || (dir!=p_dir))
  22.       {
  23.          printf ("%d<>%d\n\r", speed, dir) ;
  24.          p_speed=speed;
  25.          p_dir=dir;
  26.       }
  27.  
  28.    }
  29. }
(#) lidi válasza szkrep hozzászólására (») Szept 26, 2010 /
 
Csatorna váltás után is várakozz picit.
(#) watt válasza cs_gabor hozzászólására (») Szept 26, 2010 /
 
A feladat jellegétől és a felhasznált eszköz órajelétől függ, hogy megoldható-e két megszakítást okozó feladat kiszolgálása egymás mellett úgy, hogy ne zavarják egymást.
El kell dönteni, mi az ami halaszthatatlan, és azt kell megszakításban lekezelni, majd át kell adni a további műveletet megszakításon kívűlre. Ha a halaszthatatlan lekezelési rész hosszabb időt igényel, mint ami a másik megszakítást okozó esemény bekövetkeztéig eltelik, akkor a feladat nem oldható meg.
Ha a timer megszakítás(SD-re mentés) lekezelése elodázható, akkor 18F PIC esetében használható a prioritásos megszakítás kezelés. Alacsony szinten kezelődjön le a Timer és magason az SPI. A Magas megszakítás megszakíthatja az alacsonyat. Ekkor is törekedni kell, hogy csak a legfontosabb műveleteket szabad megszakításban lekezelni. Pl. növelsz egy változót(tipikus timer INT tevékenység), vagy egy jelzést beállítasz(eltelt az idő, megjött a csomag stb.), vagy eltárolod RAM-ba a pillanatnyi értékeket, de nem a megszakításban értékeled ki, mented SD-re, ha elodázható, hanem a fő ciklusodban. Ha ezt jól szervezed, akkor nagyon sok dolog megfér egymás mellett "egyidőben".
(#) vicsys válasza szkrep hozzászólására (») Szept 26, 2010 /
 
  1. if ( (speed!=p_speed) || (dir!=p_dir))

Talán ezt szeretnéd?:
if ( (speed!==p_speed) || (dir!==p_dir))
(#) Hp41C válasza vicsys hozzászólására (») Szept 26, 2010 /
 
Szia!

Az úgy jó volt ... A C -ben az egyenlő-e == , a nem egyenlő-e != ...
(#) vicsys válasza Hp41C hozzászólására (») Szept 26, 2010 /
 
Azt hittem, hogy egyenlőséget szeretne vizsgálni...
(#) potyo válasza vicsys hozzászólására (») Szept 26, 2010 /
 
Akkor miért írtál !== jelet? Amúgy ez sem hülyeség, PHP-ban van ilyen összehasonlítás is
(#) vicsys válasza potyo hozzászólására (») Szept 26, 2010 /
 
Azért, mert nem figyeltem a felkiáltó jelre, csak az egyenlőség jel lebegett a szemem előtt. Copy-paste és javítás. Kielégít a válaszom, vagy hivatkozzak még a rossz időre, fáradságra, kapkodásra, éhségre, pisilhetnékre, etc...?
(#) cs_gabor válasza Hp41C hozzászólására (») Szept 26, 2010 /
 
Köszönöm szépen a tanácsot.

A 18F452 már megvan, ezen (jelen helyzetben) nem tudok már változtatni, ráadásul 2db-ot vettem.. És tudom is miért, most meg akartam nézni a 18F4520-at ill. 18F4620-at, de egyik sem kapható a hqvideo.hu-n, ahonnan szoktam rendelni, azt hiszem most már dereng, miért maradtam a 452-esnél.

A 424-est is szeretem, igaz az egy mozdony

Időközben tudatosult az is, hogy a 8MHz-es kristály nem a legjobb ötlet volt... a legtöbb helyen ezzel vagy pl. 4MHz-el találkoztam, de ebből másodpercet, vagy akár 4mp-et, amellyel még osztható a 60 maradék nélkül, nem igen tudok létretrehozni :no:
(#) kissi válasza cs_gabor hozzászólására (») Szept 26, 2010 /
 
Azért ne csüggedj, meg lehet azzal is oldani!

Steve
(#) potyo válasza cs_gabor hozzászólására (») Szept 26, 2010 /
 
Idézet:
„a legtöbb helyen ezzel vagy pl. 4MHz-el találkoztam, de ebből másodpercet, vagy akár 4mp-et, amellyel még osztható a 60 maradék nélkül, nem igen tudok létretrehozni”


Pedig lehet, csak egy kicsit ügyeskedni kell. Ha Timer2-t használsz, akkor a PR2-t 250-re állítva máris a másodperc egész számú tört része lesz az az idő, amennyi időnként megszakítást ad a Timer2. Aztán ebből már nem nehéz további osztással másodpercet vagy még nagyobb időt kapni.
(#) cs_gabor válasza watt hozzászólására (») Szept 26, 2010 /
 
A kártyára írás nem gond, hiszen azt pont az 1 percenként bekövetkező megszakítás indítaná, és rövidebb ideig tart mint 1 perc. A gondom azzal van, hogy a PIC soros porton össze lesz (remélem) kötve a PC-vel, hogy grafikont és egyéb dolgokat tudjak rajzolgatni illetve fűtési időt, költséget stb. tudjak számítani, igazolván a család előtt a saját készítésű termosztát létjogosultságát
Itt már hosszabb idő is lehet az áttöltés, a rögzített adatok mennyiségétől függően.
Én arra gondoltam, hogy darabokban, pl. havi bontásban küldené a PIC az adatokat, majd várna a következő megszakításra, ekkor az új adatok rögzítését követően ha még van küldendő adat, akkor ismét egy hónapnyit áttöltene...

Azért a véleményetek meghallgatnám, szerintettek jó-e az elmélet, esetleg nagyon amatőr Én ezt látom a legegyszerűbbnek ugyanakkor biztonságosnak is. Tudom, így az adatlekérés több percet is igénybe vehet(ne) de csak elviekben, hiszen nagy valószínűséggel azért 1-2 havonta, márcsak a kíváncsiság miatt is letölteném "elemzésre" az összegyűlt információt.

A programozást illetve a fűtési programot is a PC-n készítem el és onnan kerül áttöltésre a PIC-re, de ez is viszonylag kevés adat, tehát az egy perces "időrésbe" belefér.
(#) cs_gabor válasza potyo hozzászólására (») Szept 26, 2010 /
 
kissi, potyo: Köszönöm az ötletet, kellemes hír :yes: ennek utánanézek.
(#) Hp41C válasza potyo hozzászólására (») Szept 26, 2010 /
 
Szia!

Legyen a kvarc frekvenciája 4MHz, ekkor az órajelé 1MHz.
A Timer2-vel osszuk el 1000 -rel (4 -es előosztás, PR2= 249), az egyik CCPM -mel PWM üzemmódban adjuk ki ezt az 1KHz -es jelet a timer1 bemenetére. Ha a timer1 átfordulásakor bekövetkező megszakítás a Timer1 regisztereit (65536-1000) -re állitja be, akkor a következő átfordulás 1 másodperc múlva lesz, ha (65536-60000) -re, akkor egy perc múlva.
(#) potyo válasza Hp41C hozzászólására (») Szept 26, 2010 /
 
Igaz, 249 kell a PR2-be, nem 250. Szimulátorban gyorsan kiderült volna.

Viszont felesleges bonyolítani még a Timer1-el is. Azt írja, 8MHz-es kvarc van kéznél, akkor kell 249 a PR2-be, kell 1:4 prescaler és 1:16 postscaler (vagy fordítva), és akkor másodpercenként 125-ször fog túlcsordulni.
(#) Hp41C válasza cs_gabor hozzászólására (») Szept 26, 2010 /
 
Szia!
Használj megszakításos soros adást és vételt, két alkalmas méretű körforgó bufferrrel. A vett karaktereket a megszakítás a vételi bufferbe írja be, az adási megszakítás az adó bufferből vegye ki a következő karaktert, ha van, és küldje el. A feldolgozó program a vételi bufferben levő parancsokat dekódolja, és hajtsa végre, az adatokat az adó bufferbe írja be.

Az adatok lekérdezését szervezd blokkosra, egy parancs egy blokkot kérjen le, akkorát, ami belefér az adó bufferbe.
(#) potyo válasza cs_gabor hozzászólására (») Szept 26, 2010 /
 
Ha nagy mennyiségű adatot akarsz mozgatni, és kicsit modernebb akarsz lenni, akkor lehet, hogy érdemes lenne az USB vagy az Ethernet felé is szétnézned.
(#) AZoli hozzászólása Szept 27, 2010 /
 
Sziasztok!

Ismét a véleményeteket kérem.. adott egy 18F6680 (autóban, erősen zavart ipari környezet).
RB1 lábra egy OC-s kimenetű HALL jeladó csatlakozik a következő képpen:
100n -> GND ; 1k -> +5V ; majd: soros 1k, és a pic lábánál még egy 100n ->GND .
A problémám az, hogy RB1 láb néha olyankor is megszakítást generál, amikor nem kellene, szkópon nézve nem látok semmi rendellenes tüskét. Kiegészítettem a progit:
INT1 ISR -ben megnézem hogy fel/le-futó élt vártunk(INTCON2,INTEDG1), ezt összehasonlítom PORTB,1 -el, ha különböző, akkor csak tüske(zavar) volt. Ezzel csak az a probléma, hogy a kondik miatt a fesz. "lassan" változik a lábon, és lefutó élnél előbb eljutok ISR -ig, minthogy PORTB változzon. (schmitt-trigger - TTL kaputás miatt)
A kondikat nem merem elhagyni, mit tegyek? 2 74HC14 kapu a PIC lába elé jó megoldás? Vagy inkább valami tranzisztoros szintillesztés?
(#) trudnai válasza cs_gabor hozzászólására (») Szept 27, 2010 /
 
Nem tudom mennyire kell pontosan neked ez a 60s idozites, de akar watchdog timerrel is meg lehet valositani kulso kvartz nelkul ha nem fontos a pontossag. Ha igen akkor vagy RTC aramkor vagy kulso 32768Hz kristaly javallott...

Soros port versus USB: Egyiket sem tudod tul messzire vinni de talan alacsony sebesseggel a soroson nagyobb az eselyed. Azonkivul az USB-hez nagy valoszinuseggel kell kulso kvartz, ha az a cel, hogy azt megsporoldd akkor nem biztos sikerul megvalositanod megbizhato modon...
(#) icserny válasza AZoli hozzászólására (») Szept 27, 2010 /
 
Ha úgyis OC kimenetről megy a meghajtás, akkor megpróbálkozhatsz egy optocsatolóval. Egy csavart érpáron vitt 10-20 mA-es áramhurok (ami az optocsatoló LED-jét hajtja) talán kevésbé lesz érzékeny a zavarokra.
(#) AZoli válasza icserny hozzászólására (») Szept 27, 2010 /
 
Most OC-s, de más autó gyári jeladójával is mennie kéne, amit nem szívesen terhelnék ekkora árammal.
De a csavart érárat így érdemes kipróbálnom, hogy nem szimmetrikus? ezt könnyen ki tudnám próbálni..
(#) icserny válasza AZoli hozzászólására (») Szept 27, 2010 /
 
Ha nem akarod terhelni a jelforrást, akkor tegyél utána valamit (egy tranzisztor, vagy egy OC kapu).
(#) watt válasza AZoli hozzászólására (») Szept 27, 2010 /
 
Megnézted, hogy ha lekötöd a jeladót a bemenetről, akkor is keletkezik megszakításnak tűnő esemény? Lehet, hogy nem is a jeladó felől érkezik a zavarjel!
(#) Hp41C válasza AZoli hozzászólására (») Szept 27, 2010 /
 
Szia!

- Az is előfordulhat, hogy más egység kéri a megszakítást, de a kiszolgáló rutin nem azonosítja őket rendesen. A megszakítás kérés okát jelző (PIRr.IFxx) bit lehet 1, azonban megszakítás csak akkor lesz belőle, ha a hozzá tartozó engedélyező (PIEr.IExx) bit értéke is 1.
  1. btfsc    PIE1,TXIE
  2.     btfss    PIR1,TXIF
  3.     bra      NotTxInt
  4. TxInt
(#) Poostmaster hozzászólása Szept 27, 2010 /
 
Sziasztok.
Most kezdenék PIC-ezni, de van egy hatalmas gondom. A sok példaprogramban olvasgatom a különféle változókat, amik sehol sincsenek definiálva. Én régebben Pascalban programoztam, és csak pislogni tudok.
Ilyenekre gondolok, mint: Delay_ms, PORTB és még egy csomó, ami hirtelen nem jut eszembe. Ahogy nézegettem a PIC adatlapját, arra jutottam, hogy a regiszterek neveire közvetlenül így hivatkozhatok. Jól gondolom?
Aztán meg ott vannak az ilyen hivatkozások, értékadások, mint pl. 0bx00 ezt hogyan kell értelmezni? Végül még annyi, hogy a konfigurácíós biteket hogyan állítom. Egy cikkben már olvastam, hogy #Fuses... de honnan veszem, hogy hogyan kell beállítani? A Watchdogot pl miért NOWDT, és miért nem WDT_off?
Nem tudom érthetően írtam-e?
Végül pedig egy fizika tanáromat idézném: "Hülye kérdés nincs, mert a kérdezőnek abban a pillanatban az a legfontosabb... Legfeljebb tükrözi a kérdező szellemi szinvonalát. "
(#) Norberto válasza Poostmaster hozzászólására (») Szept 27, 2010 /
 
Idézet:
„Ilyenekre gondolok, mint: Delay_ms, PORTB és még egy csomó”


Mindez az include vagy header fájlokban van definiálva.

A konfigurációs biteket 2 módon lehet alapvetően beállítani.

- egyenként bepötyögöd a megfelelő mnemonikokat (mint például PWRTE_ON)

- az MPLAB Tools menüjében nyomsz egyet a Configuration bits menüponton, és ott egy lenyíló menüs listahalmazból kiválasztod a neked megfelelő opciókat (ennél a módszernél a hex fájlba nem mentődnek el a beállítások, úgy tudom, szóval nem lesz 100 %-ban hordozható minőségű a gépi kód)
Következő: »»   806 / 1320
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