Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1261 / 1318
(#) icserny válasza tomi52 hozzászólására (») Jún 27, 2017 /
 
Fordítsd "konfliktuskezelés"-nek! A konfliktushelyzet akkor jön létre, ha egyszerre többen versengenek a busz birtoklásáért.
(#) rolandgw válasza Wezuv hozzászólására (») Jún 27, 2017 /
 
Ha nem akarsz járművekbe, biztonsági rendszerekbe fejleszteni akkor semmi gond Egyébként elfogadott, szigorú alaptétel. Lásd: MISRA C.
(#) Wezuv válasza rolandgw hozzászólására (») Jún 28, 2017 /
 
Mi lenne a gond ebben? A program végül így is, úgy is pontosan azt fogja csinálni, amit kell.
(#) rolandgw válasza Wezuv hozzászólására (») Jún 29, 2017 /
 
A fordító megengedi a váltást a szabványos és nem szabványos C között. Konkrétan az integer promotions szabályokról van szó, amit killbill is említett.
Bővebben: Link
(#) Wezuv válasza rolandgw hozzászólására (») Jún 30, 2017 /
 
Szerintem itt elbeszélünk egymás mellett. Túl van ez tárgyalva...
(#) sszasza válasza Kovidivi hozzászólására (») Júl 3, 2017 /
 
Köszönöm a jó szándékot, anno én is végignéztem minden tipuskonverziós trükköt, de sajnos ilyenkor pl a bájtokból intet csinál, és két intet szoroz össze, 1 intté. Általában szigorú feladataim vannak, nincs erre gépidő. Mondom, mindezt úgy, hogy a lib-ben lévő szorzó rutin tökéletes, de azt "elrontja" a fordító. Egyébként úgy szoktam becsapni hogy a*b. Semmi egyenlőség. Aztán az access mező regisztereiből, ahova a rutin lerakja az eredményt, kiveszem. Tökéletes, de nem szép.
(#) Wezuv válasza sszasza hozzászólására (») Júl 4, 2017 /
 
Idézet:
„Tökéletes, de nem szép.”
Viszont ügyes!
(#) pajti2 válasza sszasza hozzászólására (») Júl 4, 2017 /
 
Írhatsz magadnak asm-ben saját szorzó rutint, és csinálhatsz belőle függvényt / makrót.
(#) sszasza válasza pajti2 hozzászólására (») Júl 6, 2017 /
 
Sokáig valóban saját rutinnal szoroztam, de a C18-as rutinok is elég jól meg vannak írva. Néhány utasításidő különbség volt csak.
A makróval viszont igazad van ! Egyszer régen már elvetettem, mert volt egy bizonyos probléma vele,de most rájöttem hogyan kerüljem meg ! Köszi!
(#) sszasza válasza Wezuv hozzászólására (») Júl 6, 2017 /
 
Ha az embernek meg kell küzdeni minden usec-ért, kénytelen kitalálni valamit
(#) Wezuv válasza sszasza hozzászólására (») Júl 6, 2017 /
 
Ilyenkor érdemesebb nagyobb teljesítményű PIC-et választani.
(#) killbill válasza sszasza hozzászólására (») Júl 6, 2017 /
 
Csak azt magyarazd el nekem, hogy az egyenloseg hianyatol miert fog kimaradni az 'a' es 'b' valtozok int-re konvertalasa. Mert, ahogy te is irod, elobb a byte-okbol intet kell csinalni, azatn szorozni. Es ez teljesen fuggetlen attol, hogy a szorzattal mit csinalsz.
(#) sszasza válasza Wezuv hozzászólására (») Júl 8, 2017 /
 
Mérőrendszereket tervezek, 18f46k80-nal dolgozom. Ez a tipus az egyetlen amiben szimmetrikus bemenetű 12bites AD konverter van, azaz megspórolok egy csomó alkatrészt általa(kivonó erősítők, szintillesztő, referencia kiegyenlítés, a nyákon speciális vezetékezések a zajcsökkentésre stb). Amikor egy éve néztem, már volt ilyen AD-vel valamilyen dsPICs is, de olyan új, hogy még nem működik az AD-je, hosszabb az erratája mint a karom
(#) sszasza válasza killbill hozzászólására (») Júl 8, 2017 /
 
Ha tudnám a választ erre, nem kellett volna kérdeznem. Számomra irtózatosan illogikus, mert matematikailag tisztán az történik, hogy 8bx8b=16b, 16x8=24, 16x16=32. A math könyvtárban meg lehet nézni a rutinokat, mit csinálnak. A disassemblyben meg azt, hogy hogyan nem használja ezeket, vagy ha igen, akkor hogyan rontja el...
Az a*b-nél érdekes mód minden oké, csak a hülye __aargbx neveket kell megszokni, meg hogy nem a 0 az LSB(ez is milyen már...)
Még valami: osztásnál a maradék a __rembx-ben egyből előáll, erre is nagy szükség szokott lenni. Nem kell kétszer, / és % is.
Én még assemblyben kezdtem, 8085-ön és 8051-en, oda ezt mind meg kellett írni. Most meg körülírni kell. Hát, ezért ez is valami fejlődés... .
(#) pajti2 válasza sszasza hozzászólására (») Júl 9, 2017 /
 
Tényleg furcsa, hogy a 32 bitesekben is csak 10 bites AD van, de mintha anno valami olyasmivel indokolták egy blogban, hogy a 10 bit már egyébként is ezrelékes pontosságú (0.1%). Amennyi szórása szokott lenni egy átlag pic-es áramkörnek, a gyakorlatban annál pontosabbra számítanod nem különösebben érdemes. Már a 0.1% is inkább csak elmélet lesz, mint gyakorlat. Mászkálni fognak a bitek a pic és egyéb alkatrészek saját hibájából (gyártási szórás, hőfokfüggés, fehérzaj), és az egyéb gyakorlati környezeti tényezők is ott lesznek rábrummogni a vonalakra. Leméred ugyan azt az értéket laborban 10 különböző egységgel, és 10 különböző értéket kapsz már 10 biten is. Én 6-7 bitre akarnék számítani a gyakorlatban egy nagyon jó esetben, annál többre biztosan nem. Mindezzel csak arra akarok kilyukadni, hogy ha a matematikai számolással időszűkében vagy, és az sokat nyom a latban, nyugodtan hagyhatod éppen azt a pic-et a fenébe, és használhatsz valami 32 bites cuccot nagyobb órajelen, a gyakorlati mérési pontosságod ugyan az fog maradni.
A hozzászólás módosítva: Júl 9, 2017
(#) Hp41C válasza pajti2 hozzászólására (») Júl 9, 2017 / 1
 
Sajnos a PIC32 errata -k tele vannak A/D -ra vonatkozó bejegyzésekkel.
A rendszeres hibák ellen kalibrálással (pl. ofszet kompenzálással) a véletlen hibák ellen több mérési eredmény átlagolásával lehet védekezni.
(#) Wezuv válasza sszasza hozzászólására (») Júl 10, 2017 / 2
 
Lehet, hogy meglepő, de nem használom a PIC-ek AD-it. Külső AD-kkel mindig megbízható eredményt kapok, míg a PIC-ekkel csak a szívás van a táp miatti és a belső zavarok miatt. Én a könnyebb, de kicsivel drágább megoldást választom. Nem állítom, hogy nem lehet PIC-el is megmérni valamit, de pl. hőelemhez már nem alkalmas, de már 4-20mA távadókhoz sem szívesen használom...
(#) sszasza hozzászólása Júl 14, 2017 /
 
Nyilván jobb egy külső AD, de azért nekem a PIC-ek AD-i is szépen működnek. Az említett 46k80-é különösen. Persze jó nyák(földvezetékezés) kell a zavarok ellen, és jó helyeken hidegítőkondik. A belső referenciafeszültségeket el kell felejteni, a hőfüggésük vicc. Külső ref kell, a ref bemeneten RC taggal (100R-2u2).
A hozzászólás módosítva: Júl 14, 2017
(#) pipi válasza sszasza hozzászólására (») Júl 14, 2017 /
 
Hali!
nálunk 16f1789 szériában bukott ki, hogy egyes(nem is kevés) darabok AD-je nem az igazi,
potméter van rajta, és a potit nullára letekerve, vagy akár rövidrezárva a bemenetet, az AD nem nullát ad vissza, ha nem (felső)8bites-ként nézve kb 7-8-at ad, nem zajos, mindig ugyanannyit.
(#) Bakman válasza pipi hozzászólására (») Júl 15, 2017 /
 
Sok PIC errata dosijában le van írva ez a hiba, mint offset hiba. A megoldás a kalibrálás. Lábat GND-re és amit ad az ADC, az az offset, ezt minden mérés eredményéből ki kell vonni.
(#) cross51 hozzászólása Júl 16, 2017 /
 
Nem feltétlen haladó, de 32MZ-hez kell nem akartam kezdőbe

Sziasztok!

Gombokról lenne a kérdés. Ha a maximális gomb PIC távolság 2m maradhat még a belső pull-up?
Csak hogy a belső pull-up a "pic nyakában" van, de a "hosszabb" vezeték miatt nem szed össze jobban zavart egy külső 10k ellenállással szemben?

Vagy csal túlságosan aggódok?
(#) dokidoki válasza cross51 hozzászólására (») Júl 16, 2017 /
 
Ennek majdnem a PIC-hez sincs köze... Adott a kérdés hogy két méter hosszú lebegő vezetéken mi a jobb a zavarvédelem szempontjából: egy nagyobb vagy kisebb impedancia? költőinek tűnik. Szerintem az sem mindegy, melyik végén alkalmazod a felhúzást. Mellette kellhet soros ellenállás, és kondi zavarszűrés, és a felhúzó egyszer a belső, és a vezeték másik végén a gombnál a másik felhúzó, az meg inkább 4,7k vagy kisebb.
(#) cross51 válasza dokidoki hozzászólására (») Júl 16, 2017 /
 
A kondi gondolom a gomb "nyakába" a 4,7k elég lesz szerintem a 2m az a nagyon rossz közelítéssel a leghosszabb vezeték szerintem ilyen 60-80 cm között fog mozogni (csak nem a nyákon).
Az előtét 100 Ohmos vagy kilós nagyságrend? És a gomb és gnd közé vagy gomb és PIC közé tegyem?
(#) Kovidivi válasza cross51 hozzászólására (») Júl 16, 2017 /
 
Ha teheted, tegyél 1k-t mint felhúzó ellenállás, 5V-on 5mA folyik, de ez csak amikor megnyomod a gombot. Ez már megfelelően zavarvédett szerintem.
Én elosztanám, a vezeték mindkét végére raknék 2k2-t. A kondit a pic-hez, hogy a nyák tartsa. Vagy azt is elosztod. Bajt nem okoz. Én 2x10nF-2x100nF-ot használnék.
A hozzászólás módosítva: Júl 16, 2017
(#) cross51 válasza cross51 hozzászólására (») Júl 16, 2017 /
 
Találtam egy digikey-es leírást ami mindent leír ami nekem kell (Bővebben: Link)

Köszi a segítséget!
(#) Bakman válasza cross51 hozzászólására (») Júl 16, 2017 /
 
Ha nagyon tutira akarsz menni, használhatsz még MAX6816, MAX6817 illetve MAX6818 -as pergésmentesítő IC-t is. Igaz, ekkora távon szerintem Kovidivi javaslata bőven elég, hosszabb vezetékekkel, viszonylag zavarral tűzdelt helyen elég volt 1 kOhm felhúzás.
(#) pajti2 válasza cross51 hozzászólására (») Júl 16, 2017 /
 
Részemről 2m vezeték miatt még nem aggódnék. A sztatikus terhelés az igazi gond, ha messzire viszel valamit, nem a távolság maga. A távolságot illetően 20 méterrel sincsen semmi gond. Azzal van gond, hogy műszálas pulcsiban fészeklődsz a gumi szőnyegen tartott poliészter ülésen egy órát, ami teljesen másik sztatikus feltöltődésekkel teli környezet, mint ahol a pic van, és akkor nyomod meg a gombot (egyáltalán hozzáérsz), ami elvezeti majd azt a töltés löketet is a pic felé.
(#) tomi52 hozzászólása Júl 19, 2017 /
 
Üdv Mindenkinek!
Kérnék egy kis segítséget. PIC32MX170F256B procival játszadozom, most végre sikerült működésre bírnom a Microchip oldaláról letöltött I2C-EEPROM mintaprogramot. Volt benne hiba, a plib.h doksijából kinézett - már újabb (?) függvényekkel írt mintaprogram - alapján kitotóztam, mi hiányzott a régebbi mintából. Viszont felmerült néhány kérdésem, amiket ugyan itt-ott talált minták alapján megoldottam, de azért rákérdezek, hogy jól okoskodtam-e? Az angollal nem állok túl jól, és nyugdíjasként (67,5) ez már nem nagyon fog változni, ezért kérek választ a hozzáértőktől.

- Találtam a neten leírást, mit hogyan állítsak, hogy az órajel a processoromnak megfelelő 40 MHz legyen. Hogy aztán tényleg annyi-e... lehet ezt ellenőrizni valahogy? Akár annyi, akár nem, a továbbiakban a program a (mintákban látott) következő sor alapján számol:
  1. #define GetSystemClock()  (40000000ul)
  2. .....
  3. SYSTEMConfig(GetSystemClock(), SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);

- Azt sikerült kiokoskodnom, hogy a periféria busz a "systemClock" felével illik hogy menjen, korrekt ez így? Minden órajel mellett érvényes ez az állítás?

- Az I2C frekvencia beállításra ez volt a mintaprogramban:
  1. #define GetPeripheralClock()    (GetSystemClock()/2)
  2. #define I2C_CLOCK_FREQ          5000
  3. actualClock = I2CSetFrequency(I2C1, GetPeripheralClock(), I2C_CLOCK_FREQ);
  4.     if ((actualClock-I2C_CLOCK_FREQ) > I2C_CLOCK_FREQ/10)
  5.     {
  6.         DBPRINTF("Error: I2C1 clock frequency (%u) error exceeds 10%%.", (unsigned)actualClock);
  7.     }
("DBPRINTF" nekem nincs, ez ha jól értettem, egy adott fejlesztő panelhez tartozik. Karakteres LCD-re írogattam.)
Ezzel kapcsolatban két kérdésem lenne:
- Különböző sebességgel elérhető "perifériáknál" lehet-e ezt menet közben változtatni, illetve ha lehet, érdemes-e?
- Valójában mit ellenőriz a beállítás utáni vizsgálat?

És egy technikai kérdés: itt a "code"-on belüli szövegben lehet-e úgy új sorba kerülni, hogy ne tegyen be üres sort?
(#) pajti2 válasza tomi52 hozzászólására (») Júl 19, 2017 /
 
Szia!

Ha az angol nem megy, valójában sokkal több problémád is lesz, nem csak a mostani, és fogalmam sincs, hogyan fogod mindet megoldani. Az órajellel persze ki tudunk segíteni.

Az a bizonyos "GetSystemClock()" egy mezei define, amit _te_ állítasz be olyan értékre, hogy az egyezzen a tényleges órajellel. Azt az értéket a többi define használja olyan esetekben, amikor pld adva van egy felülről korlátos érték némelyik perifériának, és a periféria órajelből azt automatikusan számolja ki a program modul, ami beconfigolja a perifériát. Annak az első define-nak semmi köze nincsen a tényleges órajel beállításhoz.

A perifériák órajelét átállíthatod működés közben is, adva vannak hozzá a szabályok (pld kikapcsolod előbb a perifériát, és újraconfigolod), jellemzően nem szokás olyat tenni, a lehetőség persze adott.

A tényleges rendszer órajelet úgy állítod be, hogy van egy bemeneti órajeled (kristály? belső rc? kellene egy kapcsrajz!), azt beküldöd egy osztóba, és leosztod annyival, hogy a szorzó bemenetére végül 4..5 Mhz kerüljön. Az osztási érték configolható. Utána felszorzod tetszés szerint. A szorzási érték configolható. A szorzó kimenetét még újra leoszthatod annyival, hogy a végső érték az elfogadható korlátok közé kerüljön. Az osztási érték configolható. A rendszer órajelből a periféria órajelet osztó állítja elő. Az osztási érték configolható.

Hogy 50 Mhz-es példányt vettél-e, azt neked kell tudnod (van az a leírt típusjel egy kicsit tovább is), ha nem, a rendszer órajeled max 40 Mhz lehet. A periféria órajelet beállíthatod a rendszer órajeleddel azonosra is, de azt jellemzően nem szokás, hatékonynak sem hatékony. Ha 1:1 osztó van beállítva, csomó esetben külön wait ciklusok lesznek beiktatva, és néhány periféria vezérlésnél extra megszorítások is vannak, amire a program vezérlésben is oda kell figyelni (az egyes perifériáknál az adatlap külön kitér rá). Az alapértelmezett osztó 8-as, és nem véletlenül. Csak akkor érdemes kisebbre venni, ha nagyon muszáj pld 20 Mhz-es SPI-t használni, és egyébként a nyák is olyan, hogy vinni tudja a 20 Mhz-et (nem szokás mx1/2-vel olyat csinálni, de éppenséggel lehet).

Emlékeztető: kellene a kapcsrajz, vagy legalább írd le, hogyan van az órajel elsődleges forrása kitalálva.
A hozzászólás módosítva: Júl 19, 2017
(#) Attila86 hozzászólása Júl 19, 2017 /
 
Sziasztok!
Hogyan szokás megoldani az ilyesmit?

Van egy Debug(char* str); függvényem, melynek egyetlen bemeneti paramétere egy karakterlánc. A függvény annyit csinál hogy a paraméterében megkapott sztringet kiküldi UART-on. A dolog tökéletesen működik, míg a függvényt a main-ben hívom meg. Azonban szükség lenne arra, hogy a megszakításból is meg legyen hívogatva. Ha viszont meghívom a megszakításból, akkor a PIC újraindul! Valószínűsítem hogy a probléma forrása ott lehet, hogy akkor történik a megszakításban a függvényhívás amikor egyébként a főprogram is épp ugyan ebben a függvényben van. Lehet hogy ilyenkor összezavarodik a verem?

Azért van egyébként szükség hogy a megszakításban is meg legyen hívva a küldő függvény, mert a PIC-kel a soros porton lehet beszélgetni. Azaz egyrészt ha küldünk neki valamit akkor azt echo-ként visszaküldi rögtön, másrészt ha az üzenet végén sortörést észlel akkor feldolgozza az üzenetet és ha abban értelmes parancs van akkor azt végrehajtja, majd a végén visszaküld egy nyugtázó üzenetet. A karakterek vétele nyilvánvalóan az UART periféria vételi megszakításában történik, ezért az üzenetvégi sortörés ellenőrzése, majd a parancs feldolgozása és rá a nyugta elküldése is szükségszerűen mind a megszakításban megy végbe. A főprogram végtelen ciklusa másodpercenként küld ki diagnosztikai üzeneteket folyamatosan, ezért gondolom hogy „összeakad” a főprogram és a megszakítás, és ez okozza a mikrovezérlő újraindulását.

Létrehozhatok egy szemafort amit a megszakításban meghívott küldő függvény belépéskor 1-be állít, kilépés előtt pedig vissza nullába, a főprogramban való meghíváskor pedig ugyan ez a szemafor figyelése történne, amíg ezt a megszakításban meghívott függvény vissza nem állítja, addig egy Nop()-on pöröghet a főprogram. A gond csak az hogy fordítva ez nem működhet, azaz ha a főprogram hívja meg előbb a függvényt, a megszakítás nem várakozhat…
Következő: »»   1261 / 1318
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