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   89 / 1210
(#) Baxi hozzászólása Feb 4, 2011 /
 
Hi
Olyan kérdésem lenne, hogy amikor elindítom a debug-ot akkor van olyan ablak amiben nyomon lehetne követni a pl a timer0 működését? Tehát hogy az háttérben elkezd számolni? Pl mint a watch ablak
(#) vilmosd válasza Baxi hozzászólására (») Feb 4, 2011 /
 
View-> Special Function Registers. Minden regisztert megmutat.
(#) icserny válasza Baxi hozzászólására (») Feb 4, 2011 /
 
A Watch ablakban is megjelenítheted timer0 belső számlálóját. Sőt, az előszámlálóját is.
(#) Baxi válasza icserny hozzászólására (») Feb 4, 2011 /
 
Ok, köszönöm.
(#) Baxi hozzászólása Feb 5, 2011 /
 
Hi Mesterek, megint Én.
Azt szeretném megkérdezni hogy hogy célszerűbb két vagy több megszakítást használni?
Mert ugye ha jól tudom mindegyik megszakítás a 8 mem címre ugrik ha magas porításban van.
Szóval befut a 8 adik helyre akkor flag alapján megvizsgálni és úgy ugratni, vagy van valami más "elágazási" lehetőség is?
Remélem érthető volt a kérdésem.
(#) Hp41C válasza Baxi hozzászólására (») Feb 5, 2011 /
 
Szia!

Két lehetőséged van, amit kombinálni is lehet:
- Kétszintű megszakítás: Az okok egy részét a magas, a másik részét az alacsony megszakításhoz állítod be. Két ok esetén rendben is van minden.

- Mindet a magas/alacson szinthez állítod be.

Ha több, mit két okot kell kezelni, akkor a kombinált módszer a járható:
- A kiszolgáló rutinban a fontosság szerint megvizsgálod, hogy melyik eszköz kérte a megszakítást, ha kért, kiszolgálod, törlöd a kérést, ha nem, akkor a következő eszközt vizsgálod.
(#) trudnai válasza Baxi hozzászólására (») Feb 5, 2011 /
 
Ninc mas lehetoseg, a PIC-ben nincs vektorizalt megszakitas tabla. Egy trukkot csinalhatsz meg -- mivel sejtesem szerint 18F-rol beszelsz --, letezik ugye a magas prioritasu megszakitas. Azt a megszakitast amit gyorsabban kell lekezelned oda teszed es csak azt teszed oda, es akkor ott nem kell vizsgalat, hogy a lekezeld a megszakitast.

Amugy meg a lekerdezesi fat ugy kell ossze rakni, hogy azoknak a megszakitasok amik sokszor jonnek be minel hamarabb metalalhasd a kelezojet.
(#) Baxi válasza trudnai hozzászólására (») Feb 5, 2011 /
 
Ok, köszönöm. Akkor jól gondoltam.
(#) watt válasza trudnai hozzászólására (») Feb 5, 2011 /
 
Idézet:
„a PIC-ben nincs vektorizalt megszakitas tabla”

Legalább is a 18F-ig nincs, de a 24F után már van...
(#) fulee9999 hozzászólása Feb 5, 2011 /
 
Sziasztok!

Egy pic 18f4550-el legózok épp, a PWM-mel kapcsolatos dolgokat próbálgatom, de elakadtam. Az megy, hogy USB-n keresztül jön egy karakter és bekapcsol a LED. Egy másik USB-n keresztül érkező üzenetre kikapcsol a LED. Viszont, amikor PWM-el van szabályozva a LED fényereje, akkor nem tudom hogyan lehetne megszakítani a futást. Most úgy zajlik nálam az élet a főprogramban, hogy egy usb_cdc_getc() függvénnyel vár amíg nem jön karakter, utána kiértékeli a karaktert, és mondjuk ha 'c' jött, akkor a LED-et fél fényerőre kapcsolja. Ez nagyvonalakban kb így néz ki:

if(c =='8'){

while(1){
mLED_5_Toggle();
Delay100TCYx(120);
mLED_5_Toggle();
Delay100TCYx(120);
}
}

Mit lehetne a while után jövő 1 helyére rakni, hogy ha üzenet érkezik az USB-n keresztül akkor kilépjen a ciklusból? Gondolkoztam a usb_cdc_getc() függvényen, de az blokkoló típusú, úgyhogy nem jó

Valami ötlet?
(#) icserny válasza fulee9999 hozzászólására (») Feb 5, 2011 /
 
Használd az usb_cdc_kbhit() makrót!
  1. #define usb_cdc_kbhit() (Buffercp<numBytesRead)

Ez a feltétel akkor teljesül, ha van kiolvasatlan karakter az input buffer-ben.

Azt viszont nem értem, hogy miért teszel egy if törzsbe végtelen ciklust? Fordítva lenne logikus: a főprogram végtelen ciklusán belül kellene különféle feltételeket vizsgálni és a feltételeknek megfelelő átállításokat végezni. A végén pedig lehetne egy olyan ág, ami a LED villogtató vagy egyéb alaptevékenységet elvégzi. Természetesen ekkor nem lehet 100 ms-okat várakozni, hanem rövidebbre szabott késletetés után a ciklusokat kellene számlálni, s előírt számú ciklus után kapcsolni.

A PICCOLO projekt I/O portok c. fejezetében a LED vezérlése nyomógombb al II. nevű mintaprogram végén látható egy példa a visszaszámlálásra. A ~20 ms-os időszeletekből (ami a pergésmentesítéshez alkalmazkodó érték) 25 db-ot számolunk le a LED minden átkapcsolásáig.

  1. //-- Egyéb tevékenység (LED4 villogtatása életjelzőként)
  2.                 if(--c==0) {
  3.                         mLED_4_Toggle();                //LED1 állapotváltás
  4.                         c=25;                                   //Visszaszámláló beállítása
  5.                 }                                      
  6.         delay_ms(20);                           //pergésmentesítő késleltetés

A rákövetkező programban hasonlóan, de gyorsabb ütemben végezzük a LED villogtatását, ha a STATE_BLINK állapot aktív:
  1. case STATE_BLINK:
  2.         if(--c==0) {
  3.            mLED_1_Toggle();             //villogtatja a LED-et
  4.            c=10;                        //késleltetés = 10 * 20 ms
  5.         }
  6.         if (SW1_PRESSED()) e_mystate = STATE_WAIT_FOR_RELEASE3;
  7.         break;
(#) fulee9999 válasza icserny hozzászólására (») Feb 5, 2011 /
 
Az if rész már a végtelen cikluson belül van. Ez a részlet amit kimásoltam már ez:

  1. void main(void) {
  2.     InitializeSystem();
  3.     while (!usb_cdc_kbhit()) {
  4.         ProcessIO();
  5.     }
  6.        
  7.     while(usb_cdc_kbhit()){    
  8.    
  9.    while (1) {
  10.                
  11.    c=usb_cdc_getc();


után jön. Itt megvizsgálom, hogy mennyi a "c" értéke. Fentebb volt, hogy ha mondjuk 8 az értéke, akkor villogtassa a ledet folyamatosan. Azért volt a végtelen ciklus, mert nekem az kéne, hogy _folyamatosan_ villogjon a led, egészen addig, amíg nem jön más karakter. Tulajdonképpen az kéne, hogy a cdc_getc és a led villogtatás parallel fussanak.
(#) icserny válasza fulee9999 hozzászólására (») Feb 5, 2011 /
 
Valahogy így képzelem a szervezést:
  1. unsigned int szamlalo=5000;
  2.  
  3. while(1) {
  4.  if(usb_cdc_kbhit()) {
  5.     //bejövő karakter feldolgozása
  6.   }
  7.  
  8.   if(--szamlalo==0) {
  9.     mLED_4_Toggle();                //LED állapotváltás
  10.     c=5000;                        //Visszaszámláló beállítása
  11.   }
  12. }


Az 5000-es értéket csak találomra írtam, mindenesetre ha nincs külön késleltetés, akkor elég nagy szám kell ide.

A profi megoldás természetesen a timerek és interruptok használata volna.
(#) fulee9999 válasza icserny hozzászólására (») Feb 5, 2011 /
 
Szerintem elbeszélünk most egymás mellett, mert nekem az kéne, hogy a bejövő karakter hatására villogjon a led. Ne csak úgy a vakvilágba általánosan :no:
(#) fulee9999 válasza fulee9999 hozzászólására (») Feb 5, 2011 /
 
Ja igen, ami mégfontosabb:
ÉS ha egy másik karakter érkezik USB-ről, akkor ne villogjon tovább a LED.
(#) fulee9999 válasza fulee9999 hozzászólására (») Feb 6, 2011 /
 
Na, a moderátorok biztos nem fognak most szeretni, de megoldottam a dolgot. Most már ha 'a' jön az USB-re, akkor bekapcsol a LED, ha 'b' akkor kikapcsol, ha 'c' akkor meg halványan világít.

Yeah!

  1. #include "piccolo_all.h"
  2.  
  3. char c;
  4. int mLED_5_Lassu=0;
  5.  
  6. void main(void) {
  7.     InitializeSystem();
  8.         while (1) {
  9.  
  10.                 while (!usb_cdc_kbhit()) {
  11.                         ProcessIO();
  12.                        
  13.                         if(mLED_5_Lassu==1){
  14.                                 mLED_5_Toggle();
  15.                                 Delay100TCYx(120);
  16.                                 mLED_5_Toggle();
  17.                                 Delay100TCYx(120);     
  18.                                
  19.                         }
  20.                 }
  21.                
  22.                 while(usb_cdc_kbhit()){
  23.                         outString("===ScubaBot initiated!===\n");
  24.                         mLED_5_Lassu=0;
  25.                         c=usb_cdc_getc();
  26.                        
  27.                         if(c =='a'){
  28.                                 printf("Led 5 bekapcsolva!\n");
  29.                                 mLED_5_On();
  30.                         }
  31.                         if(c =='b'){
  32.                                 printf("Led 6 kikapcsolva!\n");
  33.                                 mLED_5_Off();
  34.                         }
  35.                         if(c =='c'){
  36.                                 printf("Led 6 fényereje 50%!\n");
  37.                                 mLED_5_Lassu=1;
  38.                         }
  39.                                                
  40.                 }
  41.         }
  42. }
(#) kutyu001 hozzászólása Feb 6, 2011 /
 
Sziasztok!

Segitségre lenne szükségem egy 16F675-be irandó program kapcsán.
Adott a lenti áramkör amiben tönkrement a PIC.
Ha valaki segitene a program megirásában, több 12F675-öt felajánlanék neki szeretettel.

A következő dolgot csinálta amig jó volt:

- a táp rákapcsolása után kigyújtotta az izzót 20mp-ig, aztán
1nap(24óra) múlva ismét kigyújtotta 20mp-ig és igy tovább a végtelenségig.

időzitő.jpg
    
(#) icserny válasza kutyu001 hozzászólására (») Feb 6, 2011 /
 
Bármelyik LED villogtató program megteszi, csak az időzítéseket kell beállítani úgy, hogy Ton = 20 s, Toff = 86380 s legyen. Az időzítések méretesében segít a PIC Delay Code Generator. Bővebben: Link

blink1.asm
    
(#) kutyu001 válasza icserny hozzászólására (») Feb 6, 2011 /
 
Szia!

Nagyon köszönöm!

El tudnád nekem küldeni pontosan
mit kéne beégetni(forrás), és(.hex) ?

Illetve mivel csinálom az .asm-ből a .hex-et?

Bocs, csak égetni tudok, programozásban abszolút 0 !!
(#) trudnai válasza kutyu001 hozzászólására (») Feb 6, 2011 /
 
Bocsanat, hogy kozbe kotyogok, de egy ilyen aramkort jobb lenne megtervezni alacsony fogyasztasura. Az a 7805 mar eleve tul sok energiat fog elmelengetni, azonkivul ha a PIC -nek valoban nincs mas feladata, akkor velemenyem szerint eleg nagy pazarlas aktivan varakozni. Vagy egy ora kaviccsal es timerrel kellene megoldani a kerdest, hogy kozben aludni tudjon a PIC, vagy ha nem baj ha nem teljesen pontos az a napi idozites, akkor a watchdog timerrel ahol szinten tud aludni az ideje nagy reszeben.
(#) icserny válasza kutyu001 hozzászólására (») Feb 6, 2011 /
 
Forrás az előző hozzászólásomban van, a Microchip honlapjárólletölthető MPLAB IDE MPASMWIN.EXE programja fordítja.

A HEX állományt is csatolom, ezt kell beégetni. Nem tudom, milyen égetőd van. Ha sipákol a formátum (32 bites címzés) miatt, akkor próbáld meg kitörölni a HEX állomány első sorát!

blink1.HEX
    
(#) kutyu001 válasza icserny hozzászólására (») Feb 6, 2011 /
 
Nagyon rendes vagy és köszönöm.

Már csak egy szimulátor progi kellene, ahol meg tudnám nézni hogyan villog a LED, és valóban azon a porton megy-e ahová én rajzolam.
PIC 5-ös lába!

Próbáltam a PIC SIMULATOR IDE-t de nem mutaja hogy villog a led, de a progi fut...
(#) szitko hozzászólása Feb 6, 2011 /
 
Sziasztok.
Próbáltam írni egy szervó működtető progit. A timer1 megszakítást használva (ahogy Foxi63 javasolta), de van egy kis gondom.
Nem tudom, hogy miért nem megy a progi, ha a főprogramban bekapcsolt prot azonos a megszakításban lévő portal. Ha pl. a megszakítás kimeneti portja PORTA,x és a főprogi is PORTA,x akkor nem megy, de ha valamelyik feladat más portra kerül (PORTB,x), akkor minden jó és szépen megy.

servo.asm
    
(#) Hp41C válasza kutyu001 hozzászólására (») Feb 6, 2011 /
 
Szia!

Töltsd le az egész MpLab programot. Telepítsd. Készíts egy projectet a Project Wizard segítségével. Állítsd be az MPLAB SIM -et debuggernek. A Debugger / Settings ablak Osc fülén állítsd be az órajelet. A View/ Simulator Logic Analyzer menüpont alatt add a listához a kimeneteket, amelyeknek a hullámformáját szeretnéd látni. Fordítsd le a forrást. Indítsd el a szimulációt. Simulator Logic Analyzer ablakában kirajzolja a listára felvett jelek idődiagramjait.
(#) trudnai válasza szitko hozzászólására (») Feb 6, 2011 /
 
Mi az ami megy es ami nem? Szimulatorban nalam tokeletesen megy -- idoziteseket es a program tobbi reszet nem neztem...
(#) kutyu001 válasza trudnai hozzászólására (») Feb 6, 2011 /
 
Van esetleg skype-os msn-es elérhetőséged?
Igy levelezve nagyon körülményes.....
Köszönöm.
(#) szitko válasza trudnai hozzászólására (») Feb 6, 2011 /
 
Ha mind a két kimenet (főprog.ki és a szervó) a PORTB-n van nem megy a megszakítás, de ha átrakom a PORTA, PORTC-re ott megy. Vagyis a PORTB-n nem megy a Timer1 megszakítás. Közben nézegetem a 16f882 adatlapot mert valami configurációs probléma van, csak nem tudom, hogy mi.
(#) trudnai válasza szitko hozzászólására (») Feb 6, 2011 /
 
Ja ertem mar -- a megszakitasod attol meg bejon, csak elfelejtetted az ANSELH-t is kinullazni az inicializalasnal...
(#) trudnai válasza kutyu001 hozzászólására (») Feb 6, 2011 /
 
Van SkyPe-om, ugyanaz a felhasznaloi nev -- de amugy a forumon azert jobb a kerdest feltenni, mert egyszerre tobben tudnk segiteni, tobb szemszogbol latjak at a problemadat.
(#) szitko válasza trudnai hozzászólására (») Feb 6, 2011 /
 
Köszönöm. Közben megtaláltam Én is. Még azt szeretném kérdezni, hogy ezt a megszakítást meg lehet csinálni ugyanígy a tmr2 vel is? A tmr1-et szeretném másra használni.
Következő: »»   89 / 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