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   1035 / 1203
(#) superuser válasza diginewl hozzászólására (») Jún 26, 2018 /
 
És mi a kérdés?
(#) diginewl válasza superuser hozzászólására (») Jún 26, 2018 /
 
Az, hogy az alap -amihez nem nyúltam- asm-hex-re fordítása után a 16f628-as pic, miért nem villogtat. Azaz miért nem működik? Azt nem értem, ha ennyire egyszerű a kód, akkor ez sem univárzális ezekre a hasonló PIC-ekre? Hogy lehetne a 16F628-ra átírni ezt a kódot?
(#) Pali79 válasza diginewl hozzászólására (») Jún 26, 2018 /
 
Legalább a CONFIG részt és a PIC típusát át kell írni a használni kívántra. Elképzelhető, hogy ezután fog működni 16F628A-n is, mert eléggé hasonlóak bár a komparátor kikapcsolása rész hiányzik belőle. Azért ha végig mazsolázod, látszik, hogy nem annyira "egyszerű" vagy inkább szerintem csak túl van bonyolítva. Mindent át lehet írni mindenre, az a kérdés, hogy megéri-e. Ha világos a feladat arra a picre megírni amit használni akarsz.
(#) diginewl válasza Pali79 hozzászólására (») Jún 26, 2018 /
 
Mindössze annyit szeretnék, hogy a 8 kimenetet egymás után 0,5-0,5 másodperces időközzel egymás után kapcsolja be, ha áramot kap a pic. Ha mind be van kapcsolva akkor tartsa meg ezt az állapotot a kikapcsolásig.
(#) Hp41C válasza diginewl hozzászólására (») Jún 26, 2018 / 1
 
Imigyen...
(#) diginewl hozzászólása Jún 26, 2018 /
 
Köszönöm!!!!
Működik. Át tudom írni az asm-et akkor máris mást csinál!
(#) diginewl válasza Hp41C hozzászólására (») Jún 26, 2018 /
 
Kedves Hp41C!

Kicsit átalakítottam az asm-et.
Most már majdnem azt csinálja amit szeretnék...
Szépen egymás után felkapcsolja a LED-eket, aztán törli az összest, és megint felkapcsolja. Ezt 7 szer teszi meg, aztán az összes led bekapcsolva marad.
Mit kell még kiszednem ebből a szerencsétlen kódból, hogy csak egyszer csinálja végig a műsort, ne hétszer??? (A műsor, ami egyébként nagyon jó, mert lehet szépen állítgatni a felkapcsolások sebességét is.)
Köszönettel: Newl
A hozzászólás módosítva: Jún 26, 2018

LedNewl.asm
    
(#) usane válasza diginewl hozzászólására (») Jún 26, 2018 /
 
Hát az átalakítás nem volt teljesen sikeres.
Mivel kivetted a minták meghívását az a Return a minta végén bekavar valószínűleg.
Oda inkább egy Goto -1 kellene például.
(#) pipi válasza diginewl hozzászólására (») Jún 26, 2018 /
 
a 16f84 és a 628 nagyon is nem azonos, ugyanaz a szoftver módosítás nélkül nem fut, a különböző perifériakészlet miatt, amit inicializálni kell
(#) diginewl válasza usane hozzászólására (») Jún 27, 2018 /
 
Beírtam, de így meg le se fordította hex-re. Ha kiveszem a return-t akkor is 7 szer játssza le a műsort, nem egyszer.
Őszinte leszek, nem gondoltam volna, hogy ez ennyire bonyolult... Örülnék, ha sikerülne, de így önerőből nem megy.
(#) Hp41C válasza usane hozzászólására (») Jún 27, 2018 /
 
Idézet:
„Goto -1 kellene”

goti $-1
(#) Hp41C válasza pipi hozzászólására (») Jún 27, 2018 /
 
A GPR kezdőcíme volt a legnagyobb gond (16F84 - 0x0C <-> 16F628 - 0x20) .
(#) Hp41C válasza diginewl hozzászólására (») Jún 27, 2018 / 2
 
Rendesen kell átírni. Cimke: goto Cimke

LedNewl.asm
    
(#) ktamas66 válasza diginewl hozzászólására (») Jún 27, 2018 /
 
Inkább valahogy így:
  1. movwf   PORTB           ;Output data
  2.             call   ptn0   ;minta ki
  3. ALLJ_MEG
  4.             goto ALLJ_MEG
  5.  
  6.  
  7. ;***********  Pattern 0 Output Subroutine ***************
  8. ptn0    movlw   p00             ;Set pattern data
  9.         movwf   PORTB           ;Output data
(#) diginewl válasza Hp41C hozzászólására (») Jún 27, 2018 /
 
Köszönöm ismételten!
Működik. Egyszer megy végig a sorba bekapcsolás, aztán úgy marad bekapcsolva. Ez így nekem tökéletes!!!
A mintázatot, és a bekapcsolások közötti sebességet pedig át tudom írni - kipróbáltam.
A goto parancssal tulajdonképpen egy végtelen visszaküldésbe kényszerítjük a PIC-et ugye? Ezért áll meg.

Köszönöm, hogy segítettetek ennek az outsider embernek!
(#) usane válasza Hp41C hozzászólására (») Jún 27, 2018 /
 
Igen az, de látom be is cimkézted neki
(#) diginewl válasza usane hozzászólására (») Jún 29, 2018 /
 
Rendes volt, mert hidd el, én ezt nem tudtam volna megírni.
Szeretném ismételten megköszönni! Nagy segítség volt ez így mert ezek után univerzálisan tudom használni a PIC időzítését 8 kimenetre. Akár futófény, akár lépcsőzetes bekapcsolás, minden szóba jöhet. Majd még kipróbálom külső kristály nélkül is, mit csinál akkor a PIC.
Köszönet!
(#) Akg hozzászólása Júl 2, 2018 /
 
Sziasztok!
Nem túl rég kezdtem elmélyedni a PIC témában. C-ben írom a programokat.
És a továbblépéshez felmerült egy kérdés. Azt írják mindenhol, hogy az XC8 gyári delay makró úgymond "dummy" utasítás, és komolyabb programoknál célszerű másképpen megoldani.
A kérdésem, hogy ez mennyire igaz, ill. ha igaz akkor hogyan cérszerű helyettesíteni?
Írtam egy minta programot három szerintem használható megoldással, amiből az első és a harmadik kb. ugyanaz csak máshol van az ellenőrzés.
Mennyire jó irány ez?
Szívesen fogadok minden észrevételt, kritikát.

  1. /*
  2.  * File:   delay_screwing.c
  3.  * Author:
  4.  *
  5.  * Created on 2018. július 2., 10:17
  6.  */
  7.  
  8.  
  9. // PIC16F887 Configuration Bit Settings
  10. // CONFIG1
  11. #pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
  12. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT enabled)
  13. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  14. #pragma config MCLRE = OFF      // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
  15. #pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
  16. #pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
  17. #pragma config BOREN = OFF      // Brown Out Reset Selection bits (BOR disabled)
  18. #pragma config IESO = OFF       // Internal External Switchover bit (Internal/External Switchover mode is disabled)
  19. #pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
  20. #pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
  21.  
  22. // CONFIG2
  23. #pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
  24. #pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)
  25.  
  26. #define _XTAL_FREQ 12000000  
  27.  
  28. #include <xc.h>
  29.  
  30. int _500ms = 0;
  31. int _500ms2 = 0;
  32. int _500ms3 = 0;
  33. int _1000ms = 0;
  34. int _1000ms3 = 0;
  35. char out = 0, out2 = 0, out3 = 0;
  36. void interrupt timer_isr()
  37. {  
  38.     if(T0IF==1) // Timer flag has been triggered due to timer overflow
  39.     {
  40.         TMR0 = 196;     //Load the timer Value
  41.         T0IF=0;         //Clear timer interrupt flag
  42.         _500ms++;       //1 increment is 40us
  43.         _500ms2++;
  44.         _500ms3++;
  45.         _1000ms++;
  46.         _1000ms3++;
  47.     }
  48.    
  49.     if (_500ms == 12500) //40us x 12500 = 500ms
  50.     {
  51.         _500ms = 0;
  52.         out2 = 1;
  53.     }
  54.    
  55.     if (_1000ms == 25000) //40us x 25000 = 1000ms
  56.     {
  57.         _1000ms = 0;
  58.         out3 = 1;
  59.     }
  60. }
  61.  
  62. void delay_500ms(void)
  63. {
  64.     _500ms2 = 0;
  65.     while(_500ms2 <= 12500) //500ms delay
  66.         {
  67.             NOP();
  68.         }
  69. }
  70.  
  71. void main(void)
  72. {
  73.     ANSEL = 0;
  74.     OPTION_REG = 0b00000000;    //Timer0 with external freq and 2 as prescalar; Also Enables PULL UPs
  75.     TMR0=196;                   //Load the time value for 40us; delayValue can be between 0-256 only
  76.     T0IE=1;                     //Enable timer interrupt bit in PIE1 register
  77.     GIE=1;                      //Enable Global Interrupt
  78.     PEIE=1;                     //Enable the Peripheral Interrupt
  79.     TRISE = 0;
  80.     PORTEbits.RE0 = 0;
  81.     PORTEbits.RE1 = 0;
  82.     unsigned x = 0;
  83.     while(1)
  84.     {
  85.         //Első variáció: TMR0 + flag
  86.         /*
  87.         if(out2 == 1)
  88.         {
  89.             PORTEbits.RE0 ^= 1;
  90.             out2 = 0;
  91.         }
  92.        
  93.         if(out3 == 1)    
  94.         {
  95.             PORTEbits.RE1 ^= 1;
  96.             out3 = 0;
  97.         }*/
  98.        
  99.         //Második variáció: TMR0 + függvény
  100.        /*
  101.         PORTEbits.RE0 ^= 1;
  102.         PORTEbits.RE1 ^= 1;
  103.         delay_500ms();
  104.         PORTEbits.RE0 ^= 1;
  105.         delay_500ms();
  106.         */
  107.        
  108.         //Harmadik variáció: TMR0 + változó érték figyelés
  109.         if(_500ms3 == 12500)
  110.         {
  111.             PORTEbits.RE0 ^= 1;
  112.             _500ms3 = 0;
  113.         }
  114.        
  115.         if(_1000ms3 == 25000)
  116.         {
  117.             PORTEbits.RE1 ^= 1;
  118.             _1000ms3 = 0;
  119.         }
  120.     }
  121. }
(#) superuser válasza Akg hozzászólására (») Júl 2, 2018 /
 
Én rövidebb időzítésekhez, ~10us-ig szoktam használni a gyári rutinokat.
Általában nem fogják meg a program futását delay utasításokkal, hanem flageket/változókat használnak, amiket az interrupt beállít/csökkent/növel.
pl. interruptban fogyó változóval (deklarációnál volatile BYTE tmr1ms; ):

tmr1ms=23;
while (1)
{
EgyebRutinok();
if (tmr1ms == 0)
IdozitesLetelesehezTartozoRutin();
}

Egyszerűbb alkalmazásoknál érdemes egy timert fixen beállítani 1 vagy 10 ms-re, és abban állítgatni a flageket.
pl.:
#define FLG_100_MS 0x80
#define FLG_1_SEC 0x40
...
timerben: bTmrFlags |= FLG_100_MS; //100ms elteltekor
timerben: bTmrFlags |= FLG_1_SEC; //1s elteltekor

foprogramban:
  1. void main (void)
  2. {
  3.   while(1)
  4.     {
  5.       if (bTmrFlags & FLG_100_MS)
  6.         {
  7.           bTmrFlags &= ~FLG_100_MS;
  8.          DoSomething();//
  9.         }
  10.     }
  11. }
(#) Akg válasza superuser hozzászólására (») Júl 2, 2018 /
 
Köszönöm!
Akkor azért nem voltam rossz nyomon.
Azért is kérdeztem, mert még csak épülget a programom, és nem mindegy, hogy mikor és milyen mértékű váktoztatást kell rajta végrehajtanom.
Mégegyszer köszönöm.
(#) pajti2 válasza Akg hozzászólására (») Júl 3, 2018 /
 
A kérdés szemléleti. Ha gondolkodásban rá tudsz állni, hogy ne sorfolytonos utasításokkal, hanem aszinkron állapotgéppel csinálj meg egy feladatot, jobb ötlet úgy csinálni. És kezdésnek gyakorolj olyan feladatokon is, amik egyébként nem igényelnék azt a bonyolultságot. Van, amihez edződni kell. Nem szokott elsőre könnyen menni.
(#) usane hozzászólása Júl 3, 2018 /
 
Üdv!
A 32MX-ekben nincs CLC? Ezek az MC-s keresők elég bénák. A parametrikusban meg nem is lehet kiválasztani.
(#) superuser válasza usane hozzászólására (») Júl 3, 2018 /
 
Egy kérdés a kezdőknek?
Utána kellett nézzek mi is az a CLC...
(#) usane válasza superuser hozzászólására (») Júl 3, 2018 /
 
Hát a haladóba sem akartam egy ilyen kérdést feltenni
(#) Akg válasza pajti2 hozzászólására (») Júl 3, 2018 /
 
Ez így elsőre olyan, mint amikor egy kínainak a teljes hasonulásról beszélsz.
De köszönöm a tippet, mert fogalmam sem volt erről, és így legalább van mit tanulmányoznom, hátha tudom alkalmazni is majd.
Eddig egy számomra is felfogható példa leírást találtam...
...Ha ismertek ilyeneket, linkeljtek be párat légy szíves!
Köszönöm.
(#) Hp41C válasza usane hozzászólására (») Júl 3, 2018 /
 
Csak a 32MM -ben látok CLC -t.
(#) usane válasza Hp41C hozzászólására (») Júl 3, 2018 /
 
Hát ez az.
Akkor nem csak én vagyok vak. Az MM sebessége meg elég alacsony.
Na mindegy. Majd lesz valami.
(#) usane hozzászólása Júl 4, 2018 /
 
Jól látom, hogy a kód konfigurátor nem veszi figyelembe a PLL-t?
(#) Akg válasza pajti2 hozzászólására (») Júl 4, 2018 /
 
Kicsit volt időm utána olvasni enek az állapotgépnek, és így már értem mire gondoltál. Nagyon jó ötlet és nem is olyan bonyolult. Az igazi nehézség számomra a megfelelő állapotok és feltételek kiötlése lesz, de "egy kis gyakorlással könnyen megtanulható" ez is.
Pár nap alatt is igen sokat tanultam. Köszönöm mindenkinek.
(#) pajti2 válasza Akg hozzászólására (») Júl 5, 2018 /
 
Amíg nincsen tényleges tétje annak, hogy valami szakmai kihíváshoz hozzá vagy-e edződve, vagy sem, addig nyilván fáj a hócipőd miatta Amire rámutatnék, hogy van, amihez az elején nem kicsi gyakorlás kell, hanem kicsit több Ha jó előre szeretnél tanulni, nagyon agyfacsaró micsodákkal kell bosszankodni olyankor, amikor még nem is érted, mi a fenére kellene az majd neked egyáltalán? Új dolgokat tanulni egyébként mindig olyan. Előre fizeted ki az árát vagy nem, és utólag fog kiderülni, jó ötlet volt-e neked úgy döntened vagy sem.
Következő: »»   1035 / 1203
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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