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   680 / 1210
(#) Pali79 válasza Lamboo hozzászólására (») Jún 19, 2015 /
 
Az nem ellenállás, hanem kondenzátor! És nem sorosan, hanem a kvarc és a föld közé! Általában 22 pF jó szokott lenni.
(#) Pali79 válasza nyekk hozzászólására (») Jún 19, 2015 /
 
Ha ennyi az egész program amit ide leírtál akkor ez nagyon kevés.
(#) Lamboo válasza Pali79 hozzászólására (») Jún 19, 2015 /
 
Rs-re gondolok a mellékelt ábrán.

oszc01.gif
    
(#) usane válasza Lamboo hozzászólására (») Jún 19, 2015 / 1
 
Általában nincs rá szükség, csak ha a kvarc igényli.
Kérdés milyen kvarcokat forrasztgattál ki, de szerintem nagyon ritka amelyikhez kellhet.
(#) don_peter válasza nyekk hozzászólására (») Jún 19, 2015 /
 
Kellene még pár dolog, hogy jó legyen.
Analóg portok digitálisra állítása, PIC alap setup beállítások...ilyesmik..
Valami ilyesmi kellene minimum:
  1. void init_setup(void){
  2.         CMCON = 7;                              // Comparator kikapcsolva
  3.         CCP1CON = 0;                    // Capt/Comp/PWM kikapcsolva   
  4.         INTCON = 0;                             // összes interrupt láb kikapcsolva
  5.         TRISA = 0;  // kimeneten
  6.         TRISB = 0; // kimeneten
  7. }

És kellene egy beállítás a PIC alap beállításokhoz is: (4MHz-es kristállyal használva)
  1. __CONFIG(UNPROTECT & UNPROTECT & LVPDIS & BORDIS & MCLRDIS & PWRTEN & WDTDIS & XT);
  2. #define _XTAL_FREQ 4000000
A hozzászólás módosítva: Jún 19, 2015
(#) usane válasza nyekk hozzászólására (») Jún 19, 2015 /
 
Nem csak a 16F628-as. Az összes PIC-nek vannnak alap konfigurációs beállításai.
Ajánlom figyelmedbe az adatlapot. 97-98. oldal, CONFIGURATION BITS.
Elsődlegesen oszcillátor beállítás, watcdog kikapcs, MCLR beállítás, ezek a lényegesebbek, esetleg LVP, a többi az csak hab a tortán, de ha már úgyis állítod a konfigot, akkor az összes bitet a neked megfelelően beállíthatod.
Ezenkívül amit Don_Peter kolléga javasolt, (bár itt nem kell, mert B porton nincs analóg) az analóg funkciókat kikapcsolni, mert alapbeállításként amelyik porton van analóg opció azzal indul. Kezdésnek ennyi. Aztán ha ezt hardverra akarod tölteni, annak is vannak alap követelményei, lásd fenn a sárga mezőben.

Szerk: Látom közben Péter kolléga a konfigra is adott példát.
A hozzászólás módosítva: Jún 19, 2015
(#) nyekk hozzászólása Jún 19, 2015 /
 
Értem, You Tubon találtam egy videó sorozatot,de ott erre nem tér ki a szerző.Ő 16F877- el" birkózik".Esetleg ha megkérlek benneteket egy akármilyen kis códot ami 628-hoz íródott, ha bemásolnátok,számomra átláthatóbb volna,melyik utasításnak hova is kell kerülnie.
Köszönöm!
(#) don_peter válasza nyekk hozzászólására (») Jún 19, 2015 /
 
Már bemásoltam, azt csak használnod kell.
A __config() rész megy legfelülre, aztán mehet void init_setup(void) függvény, és utána jöhetnek az alapok amik neked is megvannak.
  1. // ide jönnek az include fájlok
  2.  
  3. __CONFIG(UNPROTECT & UNPROTECT & LVPDIS & BORDIS & MCLRDIS & PWRTEN & WDTDIS & XT);
  4. #define _XTAL_FREQ 4000000
  5.  
  6. //Ide jöhetnek a függvények, vagy akár a main() alá is, ha itt zavaró lenne, de mindenképp készíts prototípust, hogy fórdító tudja milyen típusokkal dolgozol.
  7. void init_setup(void){
  8.         CMCON = 7;               // Comparator kikapcsolva
  9.         CCP1CON = 0;            // Capt/Comp/PWM kikapcsolva      
  10.         INTCON = 0;              // összes interrupt láb kikapcsolva
  11.         TRISA = 0;  // kimeneten
  12.         TRISB = 0; // kimeneten
  13. }
  14. //prototípus
  15. void init_setup(void);
  16.  
  17. //Aztán jöhet a main szekció
  18. void main(void){
  19.  
  20. init_setup(); // itt meghívod a függvény tartamát, de ide ömlesztve is kiírhatod amit  a függvény tartalmaz
  21.  
  22. //while ciklus
  23. while(1){
  24. //a te kódjaid...
  25. }
  26.  
  27. }
  28. // akár ide is jöhetnek a függvények, rutinok, de a prototípus az mindig main()-on felül kell lennie..
A hozzászólás módosítva: Jún 19, 2015
(#) icserny válasza Lamboo hozzászólására (») Jún 19, 2015 /
 
Én még sohasem használtam soros ellenállást a kvarchoz.
(#) dokidoki válasza icserny hozzászólására (») Jún 19, 2015 /
 
Pedig sokat javul a stabilitása, és a zavarsugárzása is, ha kellő teljesítménnyel van hajtva ezt állítaná be az ellenállás. Nekem egy frekvenciamérőben nem csak soros ellenállás,hanem 2.2uH tekercs is van, mert romlik a stabilitás, és rezgés képe, ha közvetlenül kapcsolódik a kvarc mindkét oldalára kondenzátor. Soros tekercsel javult a trimmelhetőség is, ami a kalibrációhoz meg szükséges.
(#) makait1 hozzászólása Jún 19, 2015 /
 
Sziasztok
Segítségeteket kérném az alábbi problémámmal kapcsolatban.
Építettem egy 18F4620-as PIC-el, egy locsolórendszer vezérlőt. A szoftver gyönyörűen működik, lefut a locsolóprogram, kapcsolgatja a reléket, de csak akkor ha nem kötöm rá a relék érintkezőire a 24V AC-t, ami a szelepeket működteti. Nem minden kapcsolásnál, csak néha, de rendszerint amikor kikapcsol valamelyik relé, reseteli a PIC-et. A 24V AC és a vezérlő elektronika tápja között semmilyen galvanikus kapcsolat nincs, de ugyanarról a transzformátorról csak külön tekercsről táplálkoznak. A PIC táplábai között ott a 100n, az mclr láb felhúzva. Mi okozhatja ezt a hibát, hogy tudnám kiszűrni.
(#) eSDi válasza makait1 hozzászólására (») Jún 19, 2015 /
 
Üdv!

Ezt a pár alkatrészt építsd a MCLR köré. Bővebben: Link Régebben nekem is volt gondom a random újraindulás, ez oldotta meg.
(#) nÁnÁ hozzászólása Jún 19, 2015 /
 
Sziasztok!

Segítséget szeretnék kérni, PIC16f628A időzítő programozással van gondom. Bármit próbálok, a TMR1IF bit kb. 64,6 ms-onként vált logikai 1 re. A TMR1H és TMR1L bitnek hiába adok értéket, a frekvencia ez marad. Ez a legutolsó programom, de ez sem hozott eredményt:
  1. #include <xc.h>
  2.  
  3. // #pragma config statements should precede project file includes.
  4. // Use project enums instead of #define for ON and OFF.
  5.  
  6. // CONFIG
  7. #pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
  8. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
  9. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  10. #pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
  11. #pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
  12. #pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
  13. #pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
  14. #pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
  15.  
  16.  
  17. void InitT1 (void)
  18. {
  19.     T1CON = 0b00000001;
  20.     TMR1 = 0;
  21.     TMR1H = 250;
  22.     TMR1L = 300;
  23.     TMR1IF = 0;
  24. }
  25.  
  26.  
  27. int main() {
  28.  
  29.     TRISB = 0;
  30.     CMCON = 7;
  31.    
  32.     InitT1 ();
  33.    
  34.    
  35.    
  36.     while(1)
  37.     {
  38.         RB4 = 0;
  39.         while(!TMR1IF); TMR1IF = 0;
  40.         while(!TMR1IF); TMR1IF = 0;
  41.         RB4 = 1;
  42.         while(!TMR1IF); TMR1IF = 0;
  43.     }
  44. }


MPLAB X v3.00 ban programzok, XC 8-as compiler melett. Pickit2 a programozó eszközöm. Van valakinek ötlete mi lehet a hiba, vagy mit rontok el?

Előre is köszönöm, Balázs
(#) zenetom válasza nÁnÁ hozzászólására (») Jún 19, 2015 /
 
Szia!
Ha a Timer számlálóregiszterével (TMR1H:TMR1L) akarod belőni a sebességet, akkor minden egyes túlcsordulásnál (amikor a TMR1IF 1-be vált) ugyanúgy be kell tölteni a kívánt értéket.
Tehát a
  1. TMR1H = 250;
  2.     TMR1L = 300;

részt a "TMR1IF = 1" rész elé is be kell írni, a főcikluson belül. Különben csak az első indulásnál fog nem nulláról indulni, utána ugyanúgy nulláról indul (tehát végigszámolja a 65536-ot). További probléma, hogy a TMR1L (és TMR1H) értéke max. csak 255 lehet, tehát mikor 300-at írsz be, akkor az valószínűleg csak 44 lesz (300-256).
(#) nÁnÁ válasza zenetom hozzászólására (») Jún 19, 2015 /
 
Szia!

Köszönöm a választ, el sem hiszed, mennyit segítettél.
(#) makait1 válasza eSDi hozzászólására (») Jún 19, 2015 /
 
Köszönöm az ötletet, de sajnos ez sem segít. Sőt azt vettem észre hogy az RTC-t is bezavarja, mert néha megáll.
Ez is csak akkor ha terhelést kapcsol a relé, és csak kikapcsolásnál. --?????
(#) zenetom válasza makait1 hozzászólására (») Jún 19, 2015 /
 
Szia!
Diódát raktál a relé tekercsre?
Valahogy így: Bővebben: Link.
(#) makait1 válasza zenetom hozzászólására (») Jún 19, 2015 /
 
Persze, ennyire kezdő nem vagyok. De mint mint írtam csak akkor jelentkezik a hiba, ha az érintkező kapcsol is valamit.
Ha nincs rákötve semmi, csak a relé kattog magában, akkor semmi baja.
A hozzászólás módosítva: Jún 19, 2015
(#) zenetom válasza makait1 hozzászólására (») Jún 19, 2015 /
 
Volt szó az MCLR-ről. Visszatérve rá, azt kikapcsolva (konfignál) is jelentkezik a probléma?
(#) Bakman válasza makait1 hozzászólására (») Jún 19, 2015 /
 
A relé azon a NYÁK-on van, amelyiken a kontroller is? Ha igen, akkor a nyitáskor keletkező szikra (+ elektromágneses sugárzás) zavarhatja meg. A szelepek 24 V DC-ről is üzemelnek? Mert ha igen, ki lehet váltani a reléket egyszerűen tranzisztorokra, vagy ha mindenképpen AC kell, akkor kis teljesítményű szilárdtest relékre. Oszcilloszkóppal tudod nézni a PIC tápfeszültségét? Lehet, hogy az nem elég stabil.

Reléket a lehető legtávolabbra a kontrollertől. A relék tekercseire inkább Shottky diódát (1N4148 -at egyébként is kevesellném nyelődiódaként) tegyél.
(#) makait1 válasza zenetom hozzászólására (») Jún 19, 2015 /
 
Igen, már az MCLR-t is kikapcsoltam. 2 db gyári relépanel van nyák csatlakozóval illesztva a PIC paneljére. A relépanelon rajta vannak a diódák, de csak 1N4148-nak nézem.
(#) sonajkniz válasza makait1 hozzászólására (») Jún 19, 2015 /
 
Szia!
Én nagyobb teljesítményű gép vezérlőjénél szenvedtem ezzel a problémával.
Három lépcsőben sikerült csak kiküszöbölnöm.
Az MCLR-t átállítottam bemenetnek, a tápra a stabilizátor elé a + - közé nagyfrekis visszacsatoló diódát, és vele párhuzamosan 100n-s kondit tettem.
Ez már majdnem megoldotta, de még így is előfordult néha a resetelődés. Ekkor szoftveres megoldást alkalmaztam. Mivel az újraindulástól a ramok nem törlődnek, így közvetlen a PIC paraméterezése, de még a változók beállítása előtt ellenörzöm az egyik fix értékű változó tartalmát. Első beindításnál az még nincs meg, tehát az inicializáció lefut. Ha már megvan, elugrik a program a kontrol sorra. A program a futása során, minden részfeladat végrehajtásakor beállít egy bitet. A kontrol program megkeresi az utoljára beállított bitet, és az annak megfelelő sorra ugrik.
(#) makait1 válasza sonajkniz hozzászólására (») Jún 20, 2015 /
 
Köszi, ez a szoftveres megoldás elgondolkoztató, de még mindig ott az RTC megállása, vagy lefagyása. Igaz annak a táplábai közül kihagytam a 100n kondit, de nem messze tőle van a PIC kondija. Azért majd pótolom.
(#) patrik81 hozzászólása Jún 20, 2015 /
 
Sziasztok!
Van ötletetek,hogy mit ronttottam el?A kommunikáció műküdik a nyomógomb lenyomásakor,de amikor átteszem a pickit2-t a kommunikációs jamperekre,akkor már nem reagál az infra.

mentes.txt
    
(#) csabi975 hozzászólása Jún 20, 2015 /
 
Sziasztok.
Szeretnék egy kis segítséget kérni.
A lenti programot megcsináltam lehet amatőr módon, de nekem úgy kellene működnie, hogy:
- kezd, érték megy, mikor igaz átugrik a "led1" de közben a ciklus megy, mikor átlép tudnom, kellene az "i" mennyi volt hisz utána annyival kevesebbet kellene lépnie a led1 -ben. tehát a led1 "i" -nél azt le kellene vonni.
Lehet amatőr, amit csináltam, de próbálkoztam és az is lehet teljesen rossz.
pic16f84a picbasic
Előre is köszönöm a segítséget
  1. Define CLOCK_FREQUENCY = 20
  2. Dim i As Byte
  3. Dim j As Byte
  4. Dim x As Byte
  5. j = 12
  6. x = 1
  7. kezd:
  8. For i = j To 0 Step -x
  9. WaitUs 300
  10. If PORTA.4 = 0 Then Goto led1
  11. WaitUs 150
  12. Next i
  13. Goto kezd
  14. led1:
  15. For i = j To 0 Step -x
  16. High PORTB.4
  17. WaitUs 300
  18. Low PORTB.4
  19. Next i
  20. Goto kezd
A hozzászólás módosítva: Jún 20, 2015
(#) Bell válasza csabi975 hozzászólására (») Jún 20, 2015 /
 
LED1-ben vedd figyelembe i értékét, például így:
  1. led1:
  2. y=i
  3. For i = y To 0 Step -x
(#) lastewer hozzászólása Jún 20, 2015 /
 
Sziasztok!

Van egy 18f4520-as mikrovezérlőm amivel megszakítással kapcsolok be egy ledet és nem tudom hogy lehetne megadni neki másodpercben , hogy hány mp. múlva kapcsoljon be.
Olyasmi kellene hogy pl : változó = 30 ; és ez 30 másodpercet jelentene.

8Mhz-s órajelen megy a vezérlőm.

Itt lenne a kódom:
  1. void interrupt(void){
  2.      if (PIR1.TMR1IF){               //Let me use this even if no other interrupts are enabled
  3.      PORTB.F7 = ~PORTB.F7;           // B lábak villogtatása
  4.  
  5.       PIR1.TMR1IF = 0;              //reset timer1 flag
  6.       T1CON.TMR1ON = 0;             // Megszakítás kikapcsolása
  7.      }
  8. }
  9.  
  10. void main() {
  11.  
  12.         portb = 0x00;
  13.         trisb = 0x00;
  14.  
  15.         T1CON.TMR1CS = 0;                    // Fosc / 4
  16.         T1CON.T1CKPS1 = 1;                   // Setting prescale value to 1:8
  17.         T1CON.T1CKPS0 = 1;                                "
  18.  
  19.        TMR1L = 255;                             //TMR1 start time
  20.        TMR1H = 0;
  21.  
  22.        PIE1.TMR1IE = 1;
  23.        INTCON.PEIE = 1;
  24.        INTCON.GIE = 1;
  25.  
  26.        T1CON.TMR1ON = 1;                    //turn on timer1
  27.  
  28.        while(1){
  29.        }
  30. }


Köszönöm.
A hozzászólás módosítva: Jún 20, 2015
(#) don_peter válasza lastewer hozzászólására (») Jún 20, 2015 /
 
Szerintem elsőnek csinálj egy 1mp-es megszakítást és utána azt lehet már szabályozni számolva a megszakításokat egy változó implementálásával.
(#) lastewer válasza don_peter hozzászólására (») Jún 20, 2015 /
 
Na igen , de ezzel is bajban vagyok . Delay-t nem szeretnék használni , mivel az befolyásolná a webszerver do packet-jét .
A hozzászólás módosítva: Jún 20, 2015
(#) foxi63 válasza lastewer hozzászólására (») Jún 20, 2015 /
 
Szia!
Timer2 vel kell pontos másodperc alapú időzítőt csinálni. Amikor megszakítást generál , megnéz egy változót, ha értéke nulla tovább lép nem foglalkozik vele. Ha valamilyen értékű, akkor csökkenti.Ha csökkentéssel éri el a nullát, akkor bebillent egy bitet, amit majd a főprogram lekezel.(pl. led villogtatás) ezzel a módszerrel a megszakítás minimális időt használ, és több újra indítható időzítőt is tud kezelni.Ráadásul rugalmas időintervallumokat lehet megadni.Ha nem adsz az egyes időzítőknek értéket, nem történik semmi.
üdv.: Foxi
Következő: »»   680 / 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