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   1206 / 1206
(#) Bakman válasza sonajkniz hozzászólására (») Jún 6, 2024 /
 
PWM üzemmód.
(#) kisgy válasza Bakman hozzászólására (») Jún 6, 2024 /
 
Kiszedtem belőle amit írtál +
Át írtam egyszerűbbre az egészet, a pwm megy, a timer rész nem

ezek
  1. #define VIL_IDO         5000
  2. #define HALV_IDO        3000
  3. #define BIZ_IDO         15000
  4.  
  5. #define HA_IDO          ((HALV_IDO/255)*255-1)  // pwm


Konkrétan úgy működik, hogy kinyitom az ajtót, bekapcsol a led.
Ha kinyitva hagyom, akkor a 15mp után is világít a mindörökségig.
Ha bezárom, akkor kellene 5mp-ig világítani + 3mp pwm, erre csak simán a pwm fut le

Jelenleg erre írtam át:
  1. //---------------------------BV_AJTÓ-------------------------------------
  2.  
  3.         if (bv_ajto==0)          // ha nyitva az ajtó
  4.             {
  5.                      szamlalo = BIZ_IDO;        // biztonsági idő
  6.             }
  7.            else
  8.            {
  9.                if (gyujtas==1)      // ha gyujtás van
  10.                {
  11.                   szamlalo = HA_IDO;       // elhalványul
  12.                }
  13.                else      // ha bezárt az ajtó
  14.                {
  15.                    if (szamlalo > HA_IDO)      // ha nem halványult
  16.                    {
  17.                       szamlalo = VIL_IDO+HA_IDO;     //akkor újra indul
  18.                    }
  19.                }
  20.            }
  21.       }
A hozzászólás módosítva: Jún 6, 2024
(#) Bakman válasza kisgy hozzászólására (») Jún 6, 2024 /
 
Ha jól látom, Timer2-t használod időzítésre is, miközben az a PWM generálásához van rendelve. Megy egyáltalán a kettő egyszerre? Dereng valami, hogy annó próbáltam valamilyen PIC-en de nagyon nem volt jó. Lehet, hogy keverem valamivel, már nem emlékszem. Próbaképpen időzítésre használd a Timer1-et vagy a Timer0-át.
(#) KoblogPerGyok válasza kisgy hozzászólására (») Jún 9, 2024 /
 
Szia!

Feltennéd a jelenlegi teljes kódod?
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Jún 9, 2024 /
 
Ebben sok gond lehet szerintem.

Első:
Nem tudom, hogy interruptban, vagy miben változik a szamlalo. Tuti kell ide a static? Ezt nem tudom, kérdezem.


Ez miért ilyen?
#define HA_IDO ((HALV_IDO/255)*255-1)

Osztod is, meg szorzod is ugyanannyival.

Szerintem a feltétel rendszered is hibás, de nem látom át egyelőre, kellene minden kód.
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Jún 9, 2024 /
 
A kódod most nehezen átlátható, jobb lenne kiszervezni pár kis függvényt, és azokat meghívni a megfelelő if-ben. Úgy átláthatóbb lenne.

A jelenlegi if feltételekben a szamlalo NEM kap értéket, ha ki van nyitva és van gyújtás ÉS ha a szamlalo < HA_IDO kisebb!

Bontsd kiesebb részegységekre például:
  1. //Függvény prototipusok a megfelelő helyre
  2. void Ajto_nyitva(void);
  3. void Ajto_csukva(void);
  4. //És a függvények:
  5. void Ajto_nyitva(void)
  6. {
  7.   //Ha gyújtás van akkor mi legyen, ha nincs akkor mi legyen stb.
  8. }
  9. void Ajto_csukva(void)
  10. {
  11. //Ha gyújtás van mi legyen, ha nincs mi legyen stb.
  12. }
  13.  
  14.  
  15. //---------------------------BV_AJTÓ-------------------------------------
  16.  
  17.         if (bv_ajto==0)          // ha nyitva az ajtó
  18.             {
  19.                   Ajto_nyitva();  
  20.             }
  21.            else
  22.            {
  23.                   Ajto_csukva();
  24.             }


Több helyen is lehetne szerintem ilyenekkel egyszerűbbé tenni a kódod, de ahhoz kellene a teljes, hogy lássam.
A hozzászólás módosítva: Jún 9, 2024
(#) KoblogPerGyok válasza kisgy hozzászólására (») Jún 9, 2024 /
 
Ez a kód nekem nem tetszik.
Most fejből írom mindezt, lehet másképp van. Nem használ interrupot, kikapcsolja mind a Timer2 mind a globális interruptot. Akkor hogy lesz az interrupt flag 1, amire hivatkozik a for(; után rögtön?
A for helyett is lehetne While();

PIE1=0; Egy egész regiszter értéke nulla. Ebben a regiszterben kellene bekapcsolni a timer2 interruptot is:

16. oldal

DE nem teszi, így a flag soha nem lesz 1. (szerintem)

Ok, lehet én is sokat hibázok, mert felületesen nézem a kódod, de így nem lesz jó. Látom, hogy ennél a PIC-nél a timer2 másképp van, mint ahogy nálam volt. Lépésről lépésre kell haladni, főleg a PIC-nél, az nem olyan mint az Arduino.
Érdemes például Timer0, Timer1 stb. függvényeket írni, ahol van init, stop, start függvény. Ezeket ki kell szervezni .c és .h fájlokba, és include-olni. Ezeket tesztelni kell keményen. Utána lehet PWM-et is előállítani ugyanígy, például PWM_init, PWM_Satart, PWM_stop függvényekkel, mert akkor a kitöltési tényezőt lehet változtatni például egy Timer0-ban is....
Ez jó lehet például az oszcillátor init-re is, amit szintén nem látok, hogy hol miképp van beállítva.

Szerintem túl sok így a hibalehetőség, persze lehet nem ez a hiba, de mintha tényleg ki lenne kapcsolva a global interrupt, ami miatt nincs flag, de tévedhetek. Illetve a PIC amit használtam külön interrupt függvényeket ad az ilyen esetekre, azaz a for(,,)-ban nem kell várni, mire oda jut a processzor. (mi ez a for(,,) pontosan?)

Hát még valami:

  1. PORTA=0b00001001;  
  2.      TRISA=0b00110111;


Fordítva kellene. Így azt gondolom jobb lenne az elejéről írni a kódot, mert lehet sok a hiba. Ha kell segítség szólj, lépésről lépésre össze lehet ezt hozni.
(#) Hp41C válasza KoblogPerGyok hozzászólására (») Jún 9, 2024 / 1
 
Az a tiszta víz a pohárba:
1. Timer2 és a TMR2IF állapotbit kérdése.
A TMR2IF bit működése és a megszakítás engedélyezése két külön dolog (ld. adatlap). Ha a TMR2 reriszter átfordul és az utóosztója is átfordul a TMR2IF bit 1 -re áll. Programból kell törölni. Akkor lesz belőle megszakítás, ha a TMR2IE és a PEIE valamint a GIE bitek is 1 értékűek. Ha ezek közül egy is 0, nem lesz megszakítás.
2. #define HA_IDO ((HALV_IDO/255)*255-1) kérdése.
A műveleteket a fordítók a saját alapbeállításuk szerinti típussal végzik, mivel nincs megadva a változók típusa. A Hi-Tech C 32 bites egész típussal számol. Az osztás is egyész osztás. Így a sor egy kerekítési művelet.
A Micro C a számítást az értékhez igazodó típussal végzi. Meg kellelne nézni, hogy mit számol ki.
3. PORTA - TRISA kérdés.
Mindegy milyen sorrendben írjuk. A kérdés inkább az, hogy mi történjen, ha a kontrolleren a táp már megvan, de még nem indul el (Power On Reset Timer). Ha fontos, hogy a kimenet ilyenkor ne legyen aktív, gondoskodni kell kölső ellenállásssal az inaktív szintre való beállításról.
(#) KoblogPerGyok válasza Hp41C hozzászólására (») Jún 9, 2024 /
 
Én azt hittem, hogy timer2-nek nincs átfordulásra interrupt.

TMR2IF: Timer2 to PR2 Match Interrupt Flag bit
1 = Timer2 to PR2 match occurred (must be cleared in software)
0 = Timer2 to PR2 match has not occurred

A Timer2-nek van overflow interruptja? Nem csak egyezésre? Az adatlapot nem néztem olyan mélyen át, nekem úgy tűnt, hogy ennél a típusnál nincs a timer2-nek, a timer1-nek és a timer0-nak van. Ezért írtam hogy más, mint amivel találkoztam eddig. A PR2-vel való egyezésre ad interuptot, ha jól értem. (most lehet keverem, mert épp Arduino Timer1 ComparA, ComparB, és overflow interrupt van a fejemben)

A kódot felületesen olvasva egyik interrupt sincs engedélyezve, nincs erre függvény felhúzva, ebben az esetben lesz egyezés? Mikor?

Idézet:

2. #define HA_IDO ((HALV_IDO/255)*255-1) kérdése.
A műveleteket a fordítók a saját alapbeállításuk szerinti típussal végzik, mivel nincs megadva a változók típusa. A Hi-Tech C 32 bites egész típussal számol. Az osztás is egyész osztás. Így a sor egy kerekítési művelet.


Ezt nem tudtam, köszi!

De épp az ilyenek adják az okát, hogy ki legyen szervezve minden és tesztelve legyen rendesen minden, akár csak egy blink-kóddal is, amivel a timer-t ellenőrizni lehet könnyedén.

Megnézem milyen van nekem itthon, azt tudom, hogy 16F, de nem tuti, hogy 648-as.
A hozzászólás módosítva: Jún 9, 2024
(#) KoblogPerGyok válasza Hp41C hozzászólására (») Jún 9, 2024 /
 
Idézet:

3. PORTA - TRISA kérdés.
Mindegy milyen sorrendben írjuk. A kérdés inkább az, hogy mi történjen, ha a kontrolleren a táp már megvan, de még nem indul el (Power On Reset Timer). Ha fontos, hogy a kimenet ilyenkor ne legyen aktív, gondoskodni kell kölső ellenállásssal az inaktív szintre való beállításról.


Utána olvastam, azt mondták tényleg jobb bizonyos esetekben, hogy előbb az érték és utána a típusa. Azt írták, hogy ilyenkor tuti tudja előre mi lesz a kimeneten, mielőtt változtatna a port ki vagy bemenet típusán.
Én előbb beállítottam minden esetben a Tris biteket, utána a Port-okat, bár futás közben soha nem változtattam a port lábain.

Megpróbálom fejbe tartani.
(#) Bakman válasza KoblogPerGyok hozzászólására (») Jún 9, 2024 / 1
 
Induláskor minden láb bemenet, amíg meg nem változtatod.
Idézet:
„Én előbb beállítottam minden esetben a Tris biteket, utána a Port-okat”

Ez így teljesen rendben is van.
Idézet:
„futás közben soha nem változtattam a port lábain.”

Pl. 1-Wire használata esetén ha a kontroller nem ismeri a nyitott kollektoros kimeneti üzemmódot (többnyire ODCONx regiszter az újabb kontrollereken), akkor nincs más opciód.
(#) KoblogPerGyok válasza Bakman hozzászólására (») Jún 9, 2024 /
 
Azt nem használtam dsPIC-ben soha, jó tudni ezt, legközelebb remélem eszembe is jut, hogy így is lehet, sőt pár esetben kell is.
De a témafelvető nem reagál, már kezdtem azt hinni lesz egy kis programozási feladat.
(#) Zsora válasza KoblogPerGyok hozzászólására (») Jún 9, 2024 / 1
 
Idézet:
„Utána olvastam”

Én előtte szoktam utánaolvasni.
A hozzászólás módosítva: Jún 9, 2024
(#) kisgy válasza KoblogPerGyok hozzászólására (») Jún 9, 2024 /
 
Üdv!

Gépkocsimba szeretnék belső világítás vezérlést kreálni.
Az eredei kódot nem én írtam, itt az oldalon találtam egy hasonlót amit mintaként szerettem volna némi átalakítással felhasználni.
Az eredetit potyo készítette 2008-ban. Itt a linkben megtalálod. A 3. oldalon leírja miért ilyen a kód, az 5. oldalon fent van a hex. és c. is.
Ő úgy oldotta meg, hogy nem használ interruptot.
Én csak egy táki-máki ember vagyok, aki "talán" sejti hogy hogyan is kell ilyet csinálni.
Azért csak a kód első részletét raktam fel, mert a delay és a pwm is benne van.
A pwm megy, a számláló viszont sem timer2 vel, sem timer1-el nem működik.

Idézet:

Ez miért ilyen?
#define HA_IDO ((HALV_IDO/255)*255-1)

Nem tudom miért ilyen, de ez működik.


Nem tudom, hogy ennek pl működnie kellene, de ez sem működik és nem értem miért:
  1. if (bv_ajto == 0)              // ha kinyílt az ajtó
  2.            {
  3.               PORTC.RC5 = 1;                   // bekapcsol a led
  4.               szamlalo= 3000;                  // késleltet
  5.               PORTC.RC5 = 0;                   // kikapcsol
  6.             }


Idézet:

De a témafelvető nem reagál, már kezdtem azt hinni lesz egy kis programozási feladat.


Ha gondolod leírom miről is szólna ez az egész, de gondoltam kilogikázom én, bár jelenleg úgy látszik túlnő rajtam
(#) KoblogPerGyok válasza kisgy hozzászólására (») Jún 10, 2024 / 1
 
Ok, már értem, elolvastam a cikket is. Megpróbálok összedobni valamit ma és esetleg holnap. Nekem MPLAB-X, és Proteus van, azokban meg is írhatom és le is modellezhetem.

Jelentkezem, mikor van némi eredmény.
(#) kisgy válasza KoblogPerGyok hozzászólására (») Jún 10, 2024 /
 
Nem sürgős, ha megvan majd megosztod.
Én sem nagyon leszek, a tegnapi vihar kicsapta a net modemet...

Köszi!
A hozzászólás módosítva: Jún 10, 2024
(#) otvenkilenc válasza kisgy hozzászólására (») Jún 12, 2024 /
 
Időzítést meglehetoldani timer használata nélkül is. Én sem hsználtam a timer-t .Sima szoftveres alkalmazást használtam amikor megnyomtak egy menügombot. Abba beléoett ha nyugtázta az indítást elondittta PWM-t adottértékkel és ha bizonyos idő után nem történt újabb gomblenyomás (mert nem állította más értékre a PWm-t vagy nem nyugtázta az indtást akkor visszalépet a főmenübe és nullázta a PWM-t
(#) otvenkilenc válasza KoblogPerGyok hozzászólására (») Jún 12, 2024 /
 
Nem tudom ez melyik program nyelv de ezzel szamlalo= 3000; csak értéket adtál kell egy késleltető ciklus
(#) KoblogPerGyok válasza kisgy hozzászólására (») Jún 13, 2024 /
 
Szia!

Még dolgozok rajta, nincs kész, de már vannak fejlemények. Sajnos nem tudtam foglalkozni vele az elmúlt napokban, de ma már haladtam is vele. Még a fő logika hiányzik, minden egyéb kész. Megpróbálom darabokra szedni a logikát is, hogy minél könnyebben átlátható legyen az is. Pár függvényt már kiszerveztem .c és .h fájlokba is, mint például a Timer1, PWM, és a PIN_setup-ot is. Ezek jól működnek, így a fő programban csak meg kell hívni őket 1x, ezáltal a fő program sokkal átláthatóbb lesz szerintem.

Jelentkezem mihamarabb, és bocs a késlekedésért!
(#) kisgy válasza KoblogPerGyok hozzászólására (») Jún 13, 2024 /
 
Üdv!

Nem számít, mint mondtam, ráér.
Csináld ahogy jónak látod, én csak tanulni fogok belőle bármilyen is lesz.

Köszi!
(#) KoblogPerGyok válasza kisgy hozzászólására (») Jún 15, 2024 /
 
Szia!

Írtam privát üzenetet, találtam egy sokkal szebb megoldást, a jelenlegi kód is sokkal jobb lenne vele, mert pár if lenne az egész. Gondoltam itt jelzek, mert én is sokszor úgy nézem az oldalt, hogy nem jelentkezek be és nem látom, hogy van üzenet, vagy sem.
(#) Bakman válasza KoblogPerGyok hozzászólására (») Jún 15, 2024 /
 
Nyílvános? Hátha mást is érdekel, ha már fórum.
(#) KoblogPerGyok válasza Bakman hozzászólására (») Jún 15, 2024 /
 
Még nem, mert nem biztos a megoldás, de valójában működnie kell, azonban át kell írnom a jelenlegi kódot, ki lehet dobni belőle jó pár sort ha működik.
Majd ha tényleg beválik akkor. (ne legyen túl nagy blama!
A hozzászólás módosítva: Jún 15, 2024
(#) Gombszem hozzászólása Jún 16, 2024 /
 
Tudna valaki segíteni?

Egy kis telefonközpontban (PX-4) villámlás miatt meghibásodott a 64 lábú vezérlő IC.
Típus: uPD75106 (nincs foglalatban, be van forrasztva)
Az 57. láb (P82) nem él. Csak a csere nem segít, mert programozni kellene. Erre semmit sem találtam a NET-en.
Van esély arra, hogy valahogy valaki kiolvassa, és visszaírja? Én csak a ki/beépítést tudnám megcsinálni talán. Bár ekkora IC-t még sosem szedtem ki sérülésmentesen.
(#) Hp41C válasza Gombszem hozzászólására (») Jún 18, 2024 /
 
Szia!
Az alábbi táblázat szerint nincs rá mód. A uPD75106 adatlapja szerint a program memória ROM - azaz a tartalma a gyártás során alkalmazott maszk szerinti lesz (ld. adatlap).
(#) Gombszem válasza Hp41C hozzászólására (») Jún 18, 2024 /
 
Köszi szépen.

Akkor kuka az egész központ. Nagyon sajnálom, korrekt szerkezet volt.
Az a baj, hogy nem tudok már ilyet szerezni sehol sem, se pénzért, se ingyen Mindenhol kerestem, itt is. Ez van.
(#) tandem hozzászólása Júl 1, 2024 /
 
Sziasztok! Most kezdtem el foglalkozni PIC programozással.
Évek óta hobbi szinten c# programozással foglalkozok pic-et csak led villogtatásig jutottam el.

Szeretnék segítséget kérni hogy c nyelvben hogyan tudok visszaszámláló időzítőt készíteni 12F675-el?
Nagyon egyszerű számláló kellene mondjuk 5-perctől. Semmilyen visszajelzés nem kell csak a kimenetet kapcsolja le.
Köszönöm előre is válaszotokat.
Üdv Gábor.
(#) Taki33 válasza tandem hozzászólására (») Júl 1, 2024 / 1
 
Szia.

Összedobtam egy példát, ami a timer0-át használja, kb. 5 perc múlva kikapcsolja a GP0 lábat, Proteusba teszteltem.

  1. /*
  2.  * File:   main.c
  3.  * Author: taki
  4.  *
  5.  * CPU: PIC 12F675
  6.  * FREQ: 4 MHz belső
  7.  * Compiler: XC8
  8.  * IDE: MPLAB X v4.10
  9.  *
  10.  *                        PIC 12F675
  11.  *                    ------------------
  12.  *                 --|VDD            VSS|--
  13.  *                 --|GP5            GP0|-- LED+
  14.  *                 --|GP4            GP1|--
  15.  *                 --|GP3            GP2|--
  16.  *                    ------------------
  17.  * 5 perces időzítő példa, ami a timer0-át használja
  18.  * kb 5. perc múlva kikapcsolja GP0-án a LED-et.
  19.  *
  20.  * Created on 2024. július 1.
  21.  */
  22.  
  23.  
  24. #include <xc.h>
  25.  
  26. #pragma config FOSC = INTRCIO     // INTOSC oszcillátor; GP4 - GP5 láb I/O
  27. #pragma config WDTE = OFF         // Watchdog Timer Letiltva
  28. #pragma config PWRTE = OFF        // Power-Up Timer Letiltva
  29. #pragma config MCLRE = OFF        // GP3/MCLR láb digitális I/O, MCLR belsőleg VDD-re kötve)
  30. #pragma config BOREN = OFF        // Brown-out Detect Letiltva
  31. #pragma config CP = OFF           // A programmemória kódvédelme kikapcsolva
  32. #pragma config CPD = OFF          // Az adatmemória kódvédelme kikapcsolva
  33.  
  34. #define IDO 29856                 // 5 perc = 300000ms tehát kb. 300000/10.048 = 29856 megszakítás
  35.  
  36. unsigned int time = 0;
  37.  
  38. //Megszakítások
  39.  
  40. void interrupt isr(void)
  41. {
  42.   if (T0IF == 1)                // Timer0 megszakítás 10.048ms-kor
  43.   {
  44.     TMR0 = 99;                  // TMR0 regiszter feltöltése
  45.     T0IF = 0;                   // A TM0 jelzőbit törlése
  46.  
  47.     if (time > 0)               // Ha time értéke nagyobb mint 0 akkor
  48.     {
  49.       time--;                   // eggyel csökkentjük az értékét      
  50.     } else                      // Ha már nem nagyobb akkor kikapcsoljuk a GPIO0 lábat
  51.     {
  52.       GPIO0 = 0;                // GP0 láb alacsony
  53.     }
  54.   }
  55. }
  56.  
  57. //Főprogram
  58.  
  59. void main(void)
  60. {
  61.   VRCON = 0x00;                    // Voltage reference Letiltva
  62.   CMCON = 0b00000111;              // Comparator Letiltva
  63.   ANSEL = 0x00;                    // A/D Letiltva
  64.   GPIO = 0;                        // GPIO Törlése
  65.   TRISIO = 0b00000000;             // összes láb kimenet
  66.   WPU = 0;                         // Felhúzó ellenállások letiltva
  67.   INTCON = 0b10100000;             // Globális Megszakítások Engedélyezve, TMR0 Megszakítás Engedélyezve
  68.   TMR0 = 99;                       // TMR0 regiszter feltöltése, megszakítás minden 10.048ms-kor
  69.   OPTION_REG = 0b00000101;         // Timer0 Indítása, 1:64 előosztó beállítása
  70.   time = IDO;                      // Az time változó feltöltése
  71.   GPIO0  = 1;                      // GP0 láb magas    
  72.  
  73.   while (1)
  74.   {
  75.     //Egyéb utasítások
  76.   }
  77. }
(#) tandem válasza Taki33 hozzászólására (») Júl 1, 2024 /
 
Jujj de jó. Nagyon szépen köszönöm. Holnap le is tesztelem...
Következő: »»   1206 / 1206
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