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   1157 / 1203
(#) Hp41C válasza kissi hozzászólására (») Ápr 9, 2021 /
 
Fordítva:
Leszoktam erről a módszerről. Amúgy két megadás kellett a bit sorszámához és a a bit pozíciójához.
Nem használom a pic_as -t.
(#) kissi válasza Hp41C hozzászólására (») Ápr 9, 2021 /
 
Szerintem nem értettem jól, amit írtál...
Arra gondoltam, hogy a #define LED PORTC,3 után ha a szimulátorba beteszem a Watch-ba, hogy LED, akkor azt nem ismeri, mint használható szimbólumot, nem látom mellette a bit értékét. A leírásod alapján úgy véltem, hogy most már lehet. Akkor most már megkérdezem "egyenesen": van arra mód, hogy a LED szimbólumot tegyem a watch-ba ?!
Idézet:
„Leszoktam erről a módszerről.”

Miről? A szimulációról vagy... ?!
(#) Hp41C válasza kissi hozzászólására (») Ápr 9, 2021 /
 
MpLab 8.92
  1. #define LED PORTC,3

Ennek a használatáról szoktam le.
Ha szimulációban a forrás ablakban a PORTC fölé vitted a kurzort, kiírta a PORTC aktuális értékét. A PORTC regisztert fel tudod venni a Watch listára.

Ha bsf LED sorban a LED fölé viszed a kurzort, nem történik semmi. Csak a PORTC regisztert tudod felvenni a Watch listára.

A 8.92 gyári telepítésnél a Watch ablakba nem vehető fel a WREG és a STKPTR. Miért?
Egyszerűen kitörölték a definíciójukat azokból az állományokból, amik olyan típusokat írtak le, amelyeken nem címezhetők
(#) Zsora válasza Hp41C hozzászólására (») Ápr 9, 2021 / 2
 
Az igaz, hogy korábban is működött a #define LED PORTC,3 parancs után az egyszerűsített bitmegadás (bsf LED), de alapból nem tartalmazta ezeket az .inc állomány.

A régi MPLAB-ra már nem emlékszek, de az X-ben a Watches/Variables ablakban megjeleníthetők bitek, ill. speciális regiszterek. Bár a mikrovezérlő fontos regiszterei (PC, SR, W, bank) egyébként is folyamatosan láthatók az ablak tetején.
A hozzászólás módosítva: Ápr 9, 2021

War.png
    
(#) kissi válasza Hp41C hozzászólására (») Ápr 9, 2021 /
 
Igen, ezt tudtam, azt hittem van lehetőség a LED bitként történő megjelenítésére, de ha jól értem, akkor Zsora Kolléga azt írja, hogy az X alatt már lehet, majd "megsasolom" !
A 8.92 alatt WREG-et simán tudom nézni, a veremmutatót meg így ( bár a proci konkrét típusáról nem beszéltünk...!) ! Köszi a tájékoztatást !
(#) Zsora válasza kissi hozzászólására (») Ápr 10, 2021 /
 
Nem lehet. Csak a Watches ablakban részletezik a regiszterek bitjeit.
(#) kissi válasza Zsora hozzászólására (») Ápr 10, 2021 /
 
Akkor korán örültem...Köszi!
(#) miki79 hozzászólása Ápr 11, 2021 /
 
Sziasztok!
Hogyan működik a pic-knél az órajelre léptetés?Nem igazán értem,hogy -vegyünk egy esetet- pl. óránként kell egy programban leptetni egy műveletet azt hogyan oldják meg?Programszámláló késleltetése lehetséges vagy a programon belül kell megírni,hogy várjon 1 órát?
(#) Bakman válasza miki79 hozzászólására (») Ápr 11, 2021 / 1
 
Fogsz egy változót ami kezdetben nulla. Ezt szabályos időközönként (több lehetőség is van) növeled. Ha a változó elérte a kívánt értéket, akkor egyrészt nullázod azt, másrészt végrehajtod a kívánt műveletet.

Pl.: PIC16F1825, 8 MHz-es órajel. Timer2: prescaler: 1:64, postscaler: 1:10, PR2: 124. Ezzekkel az adatokkal a Timer2 25 Hz-es megszakítást generál, tehát egy másodperc alatt 25-öt. Ha ezzel a tempóval növelsz egy változót, akkor 90 000-ig kell elszámolnod, hogy kapj egy órás időtartamot. 1 óra = 60 perc = 3600 másodperc = 90 000 Timer2 megszakítás.

szerk.:
Természetesen lehet várakoztatni is a kontrollert egy órán keresztül de akkor a kontroller csak vár, nem csinálhat semmi mást, mert tulajdonképpen a várakozás egy művelet. A várakozás megzavarható megszakítással, nem javasolt technika.
A hozzászólás módosítva: Ápr 11, 2021
(#) proli007 válasza miki79 hozzászólására (») Ápr 11, 2021 / 1
 
Hello! Egy mikrokontroller működését az órajele vezérli. Ez általában egy kvarc, vagy belső órajel generátor. A kontroller az órajel negyedével lépteti a programszámlálót. Azt nem lehet időzíteni, az mindig megtörténik, vagy is automatikusan inkrementálódik állandóan. Maximum "elugrasztani lehet, hogy máshol folytassa. De
Az időzítésre vannak belső Timer számlálók. Azok vagy az órajel negyedével, vagy külső órajelre tudnak lépkedni. A program végrehajtásának időzítéséhez két módszer ven.
Egyik, hogy hurokban léptetik a programszámlálót és közben számolod a lépéseket. A hurok végrehajtási idejével szorozva a hurok száma fogja adni az időzítés hosszát. De ekkor a kontroller csak ezzel van elfoglalva, mást nem tud tenni vagy vezérelni.
Másik, hogy a Timer számlálók osztását programozod fel, és amikor a számlánc átfordul, megszakítás képződik és azzal/akkor hajtod végre amit szeretnél. A Timer mindig működik a kontroller processzorától függetlenül, de közben a kontroller azt tesz amit akarsz. Tehát a program végrehajtása működhet, pld kijelzőt vezérelhet, vagy bár mit. Persze a Timer nem elég "hosszú" hogy órákat tudna számolni, de a megszakítás bejövetelekor léptethetsz egy szoftver számlálást és amikor az eléri az értéket, törlöd és működteted amit szeretnél..
(#) Pali79 válasza miki79 hozzászólására (») Ápr 11, 2021 / 1
 
Ha ilyen nagy időközönként kell bármit csinálnia, akkor szerintem a legegyszerűbb ha olyan PIC-et használsz aminél a Timer1-et lehet külön külső kvarcról hajtani. Ha erre teszel egy 32,764 kHz-es óra kvarcot akkor alapból 2 másodpercenként generál megszakítást. 2 másodperc rengeteg idő, közben csinálhat mást a PIC.
(#) miki79 hozzászólása Ápr 11, 2021 /
 
Tehát(csak az elmélete érdekel)lehet a timerrel variálni ,a programon belül ügyeskedni és ha mondjuk külső oszcillátort használok ami pl. 1Hz-es négyszög jel azzal is lehet léptetni?A sebbeség most nem fontos!
(#) Bakman válasza miki79 hozzászólására (») Ápr 11, 2021 /
 
A lehetőségeknek szinte csak a fantázia szab határt, a legegyszerűbbeket soroltuk fel eddig.
(#) nedudgi hozzászólása Ápr 11, 2021 /
 
Szerintem két külön dologról beszéltek. A mikrokontroller órajele, és az egy időközönként végrehajtandó utasítássorozat két dolog. At ifjú kolléga kérdése - értelmezésem szerint - arra vonatkozik, hogy a kontroller órajele, az fOSC lehet-e tetszőlegesen alacsony?
Tudtommal igen.
(#) Bakman válasza nedudgi hozzászólására (») Ápr 11, 2021 /
 
Szerintem az alapok keverésének/nem ismeretének esete áll fenn. Nem baj, valahol el kell kezdeni.
(#) Zsora válasza miki79 hozzászólására (») Ápr 11, 2021 /
 
Hát igen! Tudni kell kérdezni, alaposan, egyértelműen megfogalmazni a problémát.
Anélkül csak elbeszélünk egymás mellett.
Tehát: Mi a kérdés?
(#) miki79 válasza Bakman hozzászólására (») Ápr 11, 2021 /
 
Nagyon jól látod az eset súlyosságát Bakman.
Nedudgi köszönöm a kiigazítás,erre voltam kíváncsi.Most kezetem érdeklődi a mikrokontrollerek iránt.De nem akarnák túl mélyre ásni.Csak az egyszerű vezérlés érdekelne.Azon gondolkodám lehet e úgy futtatni egy progit,hogy előre a memóriaba betáplált bináris értékeket kiíratni a kontroller párhuzamos portjára-gondolom akkor több helyet foglal- és órajelre lépjen tovább?
(#) Bakman válasza miki79 hozzászólására (») Ápr 11, 2021 /
 
Még szép, hogy lehet ilyet csinálni vele.
(#) slimcolt hozzászólása Ápr 11, 2021 /
 
Sziasztok,

MPLAB X-et használok ( C-ben ) és egy olyan kérdésem lenne, hogy van lehetőség arra, hogy az I/O portokat egy struktúrában tudjam kezelni?

pl:

typedef struct
{
uint8_t *GPIO_0;
uint8_t *GPIO_1;
}gpio_struct;

gpio_struct GPIO =
{
GPIO_0 = &PORTBbits.RB4,
GPIO_1 = &PORTAbits.RA3,
};

Ez így menne? Van egy olyan sejtésem, hogy nem. Hogy lehet ezt megoldani?
(#) pipi válasza slimcolt hozzászólására (») Ápr 11, 2021 /
 
Hali! Nem világos mit szeretnél, gyárilag is struktúra...Nézd meg a megfelelő pic inlude-jában...
(a fórum letiltja az u n i o n szót, nyilván szóközök nélkül kell írni)

// bitfield definitions
typedef u n i o n {
struct {
unsigned RA0 :1;
unsigned RA1 :1;
unsigned RA2 :1;
unsigned RA3 :1;
unsigned RA4 :1;
unsigned RA5 :1;
};
} PORTAbits_t;
extern volatile PORTAbits_t PORTAbits __at(0x00C);
A hozzászólás módosítva: Ápr 11, 2021
(#) benjami válasza slimcolt hozzászólására (») Ápr 11, 2021 /
 
Először azt kellene eldöntened, hogy fordítási időben, vagy futásidőben szeretnéd eldönteni, hogy valami funkció melyik lábhoz legyen hozzárendelve?
A fordítási idejű összerendelés esetben javaslom, hogy #define használatával határozd meg, hogy az adott funkció melyik lábhoz legyen hozzárendelve.
A futásidejű hozzárendeléshez használhatod azt a módszert, mint amit az arduino-nál használnak, számozd meg a lábakat (legyen pl. 0..7-ig az RA0..RA7, 8..15 az RB0..RB7 stb.). És csinálhatsz hozzá szép kis függvényeket amik a láb azonosítója alapján működtetik az adott portot. Ez utóbbi mondjuk jó lassú lesz (mint ahogy az arduinonál is lassú), ráadásul egy mikrokontroller esetén én nem látom értelmét ennek. Akkor látnám csak értelmét, ha ugyanannak a binárisra lefordított programnak több eltérő hardveren is működnie kellene, és a konfigurációt valami háttértárból kellene betöltenie.
(#) slimcolt válasza pipi hozzászólására (») Ápr 12, 2021 /
 
Szia,

Tudom, hogy gyárilag is struktúra, viszont ha 32db I/O-t szeretnék használni, ami nyilván nem mind a LATA-n vagy a PORTA-n lesz, akkor több struktúrát kellene használnom, én ezeket szeretném egybe gyúrni.
nem szeretnék 32db #define makrót sem írni az adott lábaknak.

pl:
GPIO.GPIO_10 // ez mondjuk egy PORTAbits.RA15
GPIO.GPIO_11 // ez mondjuk egy LATBbits.RB4

stb...
(#) moltam hozzászólása Ápr 12, 2021 /
 
Helo.
Valaki el tudja magyarázni nekem hogy ez az osztó algoritmus hogyan is működik? Működik mert leszimuláltam de hülye vagyok hozzá hogy felfogjam mi is benne a mágia. Egy konstanst kéne elosszak periódusidő-fordulatszám átalakítás céljából. A legalsó.
(#) Hp41C válasza slimcolt hozzászólására (») Ápr 12, 2021 /
 
Ha, jól tudom, nincs rá módszer.
(#) icserny válasza moltam hozzászólására (») Ápr 12, 2021 / 1
 
Nézd meg itt! Bővebben: Link
(#) moltam válasza icserny hozzászólására (») Ápr 12, 2021 /
 
Köszönöm.
(#) benjami válasza slimcolt hozzászólására (») Ápr 12, 2021 /
 
Egyetlen #define-vel is megadhatod a 32db I/O hozzárendelést (ez ugye 64db. paraméter), csak akkor elég sok és hosszú makrót kell írni ami kimazsolázza a megfelelőt belőle.
(#) slimcolt válasza benjami hozzászólására (») Ápr 12, 2021 /
 
Ezt hogyan tudom összehozni? Egy példát tudnál írni nekem?
(#) benjami válasza slimcolt hozzászólására (») Ápr 12, 2021 / 1
 
A LEDS definícióban megadhatod a példában szereplő 3 LED és az egy kapcsoló lábhozzárendelését.
  1. #include <xc.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. /*                            LED1   LED2   LED3   SW1  */
  6. #define LEDS                  B, 0,  A, 2,  B, 2,  A, 4
  7.  
  8. #define TRIS_IN               1
  9. #define TRIS_OUT              0
  10.  
  11. #define LED1_TRIS_(p1,b1, p2,b2, p3,b3, p4,b4)  TRIS ## p1 ## bits.TRIS ## p1 ## b1
  12. #define LED1_PORT_(p1,b1, p2,b2, p3,b3, p4,b4)  PORT ## p1 ## bits.R ## p1 ## b1
  13. #define LED1_LAT_( p1,b1, p2,b2, p3,b3, p4,b4)  LAT ## p1 ## bits.LAT ## p1 ## b1
  14. #define LED1_TRIS(pb)   LED1_TRIS_(pb)
  15. #define LED1_PORT(pb)   LED1_PORT_(pb)
  16. #define LED1_LAT(pb)    LED1_LAT_(pb)
  17.  
  18. #define LED2_TRIS_(p1,b1, p2,b2, p3,b3, p4,b4)  TRIS ## p2 ## bits.TRIS ## p2 ## b2
  19. #define LED2_PORT_(p1,b1, p2,b2, p3,b3, p4,b4)  PORT ## p2 ## bits.R ## p2 ## b2
  20. #define LED2_LAT_( p1,b1, p2,b2, p3,b3, p4,b4)  LAT ## p2 ## bits.LAT ## p2 ## b2
  21. #define LED2_TRIS(pb)   LED2_TRIS_(pb)
  22. #define LED2_PORT(pb)   LED2_PORT_(pb)
  23. #define LED2_LAT(pb)    LED2_LAT_(pb)
  24.  
  25. #define LED3_TRIS_(p1,b1, p2,b2, p3,b3, p4,b4)  TRIS ## p3 ## bits.TRIS ## p3 ## b3
  26. #define LED3_PORT_(p1,b1, p2,b2, p3,b3, p4,b4)  PORT ## p3 ## bits.R ## p3 ## b3
  27. #define LED3_LAT_( p1,b1, p2,b2, p3,b3, p4,b4)  LAT ## p3 ## bits.LAT ## p3 ## b3
  28. #define LED3_TRIS(pb)   LED3_TRIS_(pb)
  29. #define LED3_PORT(pb)   LED3_PORT_(pb)
  30. #define LED3_LAT(pb)    LED3_LAT_(pb)
  31.  
  32. #define SW1_TRIS_(p1,b1, p2,b2, p3,b3, p4,b4)  TRIS ## p4 ## bits.TRIS ## p4 ## b4
  33. #define SW1_PORT_(p1,b1, p2,b2, p3,b3, p4,b4)  PORT ## p4 ## bits.R ## p4 ## b4
  34. #define SW1_LAT_( p1,b1, p2,b2, p3,b3, p4,b4)  LAT ## p4 ## bits.LAT ## p4 ## b4
  35. #define SW1_TRIS(pb)   SW1_TRIS_(pb)
  36. #define SW1_PORT(pb)   SW1_PORT_(pb)
  37. #define SW1_LAT(pb)    SW1_LAT_(pb)
  38.  
  39. //==============================================================================
  40. void main(void)
  41. {
  42.   LED1_TRIS(LEDS) = TRIS_OUT; LED1_LAT(LEDS) = 0;
  43.   LED2_TRIS(LEDS) = TRIS_OUT; LED2_LAT(LEDS) = 0;
  44.   LED3_TRIS(LEDS) = TRIS_OUT; LED3_LAT(LEDS) = 0;
  45.   SW1_TRIS(LEDS) = TRIS_IN;
  46.   while(1)
  47.   {
  48.     LED1_LAT(LEDS) = 1;
  49.     LED1_LAT(LEDS) = 0;
  50.     if(SW1_PORT(LEDS) == 0)
  51.       LED2_LAT(LEDS) = 1;
  52.     else
  53.       LED2_LAT(LEDS) = 0;
  54.   }
  55. }

Kicsit kacifántos a makrókkal történő tartalom kinyerése, de ha egyszer megcsinálod, akkor úgy módosítgathatod a lábkiosztást, ahogy jól esik.
(#) pipi válasza slimcolt hozzászólására (») Ápr 13, 2021 /
 
Pedig define-val a programod átláthatóbb lesz, csak normálisan kell elnevezni a lábakat...
Következő: »»   1157 / 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