Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Nézd meg a 1-wire rutinokat, lehet OW, stb. ( nem emlékszem már hogyan írják a mikroe függvényei! ), de emlékszem, hogy láttam, csak most nincs ezen a gépemen!
Steve
Hello!
Akadt egy kis problémám. PIC16F88-nak betelt a 4 kword-os memóriája, de nekem még nagyon kéne a hely. Arra gondoltam, hogy az eepromot úgysem használom, ezért valahogy fel lehetne használni, vagy tévedek? A segítséget előre is köszönöm!
Sziasztok.
Hamarosan Pic tanfolyamot indítunk, azonban érdekelne, szerintetek mit vegyünk bele a tematikába. Az alap már összeállt, ( most a kezdő csoportról beszélek ), de szívesen venném az ötleteiteket. Az biztos hogy az elején kis digitális elektro lesz, ismerkedés a kontrollerekkel, aztán Pickit2 és MpLAB használata, a hozzá való assemblyvel. Majd ha az alapok megvannak, esetleg C-ben a folytatás. Mindez mintaprogramokkal és demo panelekkel bőven illusztrálva. Ha van valami ami szerintetek hasznos lenne még, azt megköszönném ha megosztanátok velem. Előre is köszi
Szia!
Az adat eepromot fel helet használni a konstans táblázatok adatainak tárolására retlw utasítások helyett..
Ilyenkor érdemes egy kicsit átbogarászni a programot. Előfordulhat, hogy imitt amott egy banksel elhagyható, vagy más egyéb ötlettel javítható a kód tömörebbre. Például az ismétlődő részeket egy eljárásba áttenni és azt meghívni.
Én az SDCC-vel jártam úgy, hogy már majdnem betelt a programtár, amikor frissítettem a fordítót. Nem hittem a szememnek, hogy mennyit csökkent a kódméret ezután. Szóval érdemes lehet még annak is utánanézni, hogy a fordítódnak ( ha nem assemblyben csinálod ), van-e valami újabb változata. Talán még az is segíthet.
Sziasztok, már egy fél órája azon agyalok, hogy ha van egy érték. (pl. az AD értéke 0-1024) És ezt ki szeretném íratni egy sima kijelzőre, (amire már megírtam egy alap kis programot). Akkor, hogy döntsem el azt hogy a helyiértékeknek mennyi az értéke decimálisan? pl. D'255'
kiírva: - első helyiérték:5 - második helyiérték:5 - harmadik helyiérték: 2 Én bitenként vizsgálatokra gondoltam, de az elég komplikáltnak tűnik, biztos van rá valami egyszerű megoldás. ![]()
Találtam megoldást.
![]()
Köszönöm a válaszokat, próbálkozom.
Üdv. ![]()
Sziasztok!
Van egy olyan problémám amivel már hetek óta küzdök! Remélem tud valaki segíteni. Leírom mi a helyzet. Van egy attiny45 és ennek az egyik kimenete rá van kötve egy aurel tx-4msil adóra. A vevő részt egy pic16f690 végzi, a rx lábára van kötve a vevő rész ami egy aurel bc-nbk. A következő a problémám: az attiny45-el próbálok szoftveres uart-al adatot küldeni. A vevő részen pedig a beépített pic-c fordító függvényét használnám, (rs232). Itt beállítom a megfelelő pin-t. És már mindenhogy próbáltam, de nem tudom szinkronizálni valahogy őket. Látják egymást, tehát adatot küld az adó, a vevő meg vesz, de hiába, mert nem jót vesz a vevő. Gondolom az időzítéssel lesz a gond, de már szinte minden elképzelhetőt próbáltam. A baud 1200. Ennyivel küldöm és elvileg ennyivel venném is ha sikerülne. Itt a hobbin van egy cikk a szoftveres uartról, úgy oldottam meg az attiny45 kódjában. A vevő részt meg minden kódolás nélkül egyenlőre csak az rs232-vel oldanám meg, úgy hogy ha a kbhit true akkor lekérem egy változóba a stream értékét. Az adó oldalon úgy van megoldva, hogy van egy start bit meg van egy stop bit, plusz közötte van az adat. A másik kérdés - ami még eszembe jutott, hogy esetleg lehet probléma - hogy a pic -c függvényében (így van beállítva: #use rs232(baud=1200, rcv=PIN_C7, stream=radio) ) esetleg az lehet, hogy a függvény nem a 10 bites formát várja (1start+1stop+8adatbit). Ha valakinek van valami ötlete, hogy mi lehet a gond, legyen szíves segítsen, mert tényleg már nagyon régóta próbálkozok vele (már a sulimba is bevittem az egyik tanáromnak, de nem tudott vele mit kezdeni) Előre is köszönöm a segítségeteket! Üdv, smithwebster
Szia!
Miért erőlködsz a szoftveres uart -tal a 16F690 -nel, amikor beépített uart egysége is van (az Rx kivezetés ugyan az RB5)?
RF-en keresztül jelet simán nem nagyon lehe átvinni. A 8 nulla nem fér át, és a 8 egy sem. Erre találták ki a manchester kódolást, ahol a jelfolyam elektromos középértéke állandó, nem csúszik el az átvitt adattól függően. Itt is találsz erről infót: Bővebben: Link
Köszönöm a válaszokat! Amúgy próbáltam már mindent. Az Rc7-en, azért van mert jelenleg egy pic16f887-el tesztelek (de majd később egy pic16f690-el fog menni). Plusz a manchester kódolással is próbálkoztam már.
Tudom, hogy nem lehet csak 0 átvinni vezetéknélkül, mert a változásokra reagál, de gondolom azért van a start bit. Ugye van ez a AGC benne, burst megy, és utána elvileg start, ilyenkor ugye változik a jelszint, ezt érzékelnie kéne a vevő oldalon, és a megfelelő időközönként mintavételeznie kellene (így tehát akár átmehet 8 db nulla is)... Legalábbis én ezt vettem ki a dolgokból... Bár most találtam valamit, ami lehet, hogy probléma... Elméletileg a vevő oldalon pic-c-ben a delay + oszci hatással lehet a dologra. Mármint hogyha nem ugyanarra vannak állítva. Na, majd még próbálkozok. Ha valakinek eszébe jut valami legyen szíves ne tartsa magában. ![]() Üdv, smithwebster
Szia!
A 16F887 -ben is van uart - az RC6 a vételi kivezetés, az RxD... A vétel megvalósítása bonyolultabb, mint az adásé. Az RxD lefutó éle után először 1.5 bit idő múlva kell mintát venni, azután 8-szor 1 bitidő múlva. A végén ellenőrizhető 1 bitidő múlva a stopbit. Mindezt feladatot az uart illesztő megcsinálná...
Szia!
Köszönöm a válaszodat! Az adatlap azt írja, hogy az rx láb az rc7. Én is úgy gondoltam, hogy az alap beépített függvénnyel oldom meg, de azzal nem megy. A szoftveres rész az adóhoz kell (mivel az attiny45-ön nincs rx/tx láb), a vevő meg normálisan. Sajnos így se ment valamiért (mármint úgy hogy a küldés szoftveres, a vétel meg a beépített dolgokkal). Már próbáltam sokféleképpen. Biztos valami elkerülte a figyelmemet, de még kezdő vagyok, próbálkozok, sajnos nem mindig jön össze. Üdv, smithwebster
Ha a rádiós adó és vevő nélkül direktben kötöd össze, akkor átmegy normálisan? Csak mert előbb úgy kellene beüzemelni, és akkor utána lehet a helyzetet rontani az adóvevővel.
Sziasztok írtam egy kis progit, aminek az lenne a célja, hogy a PORTA,0-ás analóg értékét kiírja egy 4db közös anódos kijelzőre. (Amelyeknek az anódjai 7db párhuzamosan vannak kötve.) A proginak ez a része működik, ami az értéket kiírja, de az A/D megszakítás lekezelése szerintem valamit elront. És nem bírok rájönni, hogy mi a hibás. A kiírandó érték az EREDMÉNY nevű regiszterbe kerül. Légyszíves segítsen valaki a hiba megtalálásában. Elég csak az elejét a START címkéig nézni, mert szerintem abban a részben lesz a hiba.
![]()
Szia!
- A mentésnél/ visszaállításnál kimaradt a STATUS regiszter. - Nem kell állítani az INCON,GIE bitet. ld. Cikk.
Szia!
- Valóban elírtam, az RC7 a RxD láb. Elnézést... - Mivel programozod a pic-ek? Talán PICKit2 -vel? Az egyben egy TTL szintekkel rendelkező USB - uart is. Próbáld meg a következőt: Írj egy teszt programot, ami a vett karaktereket visszaküldi az uart -tal. Csatlakoztasd a PICKit2-t az USB porthoz, indítsd el a PICKit2 kezelő programját, Tools/Uart tool, csatlakoztasd a GND, Vdd, adási és vételi vonalakat a 16F887 -hez. Indítsd el a pic-et. A PICKit2 programban állítsd be a Baudrate -t, Connect, az uart kezelő ablakjában alul levő sorokba írj üzenetet, nyomd meg a mellette levő Send gombot... A középső nagy mezőben meg kell jelenjen a vett karakter/üzenet. A Vdd vonalon feszültséget kell érzékeljen a PICKit2 vagy a PICKit2 lássa el táppal a kontrollert. Az utóbbi esetben a Connect előtt a Vdd -t be kell kapcsolni.
Sziasztok!
Segítségre lenne szükségem, problémám a következő: Fordulatszámot szeretnék majd kiírni Grafikus LCD kijelzőre, Capture + Timer1-el, belső OSC-vel. Jelenleg próbaképp csak időt szeretnék mérni két gombnyomás között, ami eleinte jól is megy, de X gombnyomás után nem frissíti a kijelzést. A kódban lehet látni, hogy hőmérsékletet is mér. Azt a "lefagyás" után tökéletesen frissíti és jól mutatja, csak a gombnyomások közötti időt az istennek sem akarja. A PIC memóriája nincs betelve, tehát ez nem lehet a probléma. Ezt úgy kell elképzelni, hogy kb. 30-szor megnyomom a gombot(nincs pergésmentesítve) 1 másodperces időközökkel 15-öt mutat mindig, mert annyit is kell (timer2 túlcsordulásainak száma). de kb. 30 gombnyomás után nem frissít tovább. Valamikor ez hamarabb következik be, valamikor később. Jelgenerátorral is próbáltam, ott is néhányat kijelzett utána se kép se hang. A pontosítás után rákötöttem a CCP1-et egy jelgenerátorra, hogy pontos 1HZ-s jelet kapjon a PIC, és a túlcsordulás száma pontosnak mondható, de a TMR1 értéke nem áll be pl. egy 500Hz-s értéknél fix értékre. 15 Hz-es freki után 0-t kell kijeleznie és ez megy is, de az említett probléma miatt csak rövid ideig. Mondom, hőmérsékletet frissíti a hiba beállta után is. Íme a kódrészlet:
-PIC16F887, 4MHz, mikroC compiler, -A kristály frekvenciáját, illetve a PIC egy két alapbeállítását a program menüjéből lehet állítani. Kérlek segítsetek, mert nem tudom hol lehet a hiba. Előre is köszönöm!
Köszönöm a segítségeket!
Huh, PicKit2-vel programozok, de nem is tudtam, hogy ilyen lehetőség van benne! Nagyon jó, hogy ezt elmondtad, köszönöm szépen! Most is úgy működik, hogy a tesztpanel táplálja a vevő részt. Potyo-nak is köszönöm, igazából igazad van, úgy lett volna célszerűbb először, ki fogom úgy is próbálni. Remélhetőleg össze fog jönni, ha sikerül megosztom mi volt a probléma, hátha másnak is lesz/van hasonló gondja. Üdv, smithwebster
Köszönöm, már az a rész is működik. De a probléma a következő mivel folyamatosan megy az AD, így nem marad ideje a kijelzésre. Ezt hogy szokták megoldani? Úgy hogy pl. 1 sec.-ban pl. csak 5-ször nézi meg az A/D-t?
(Mivel jelenleg a kijelzőre egy sima 3-ast ír.) És megcsináltam azt hogy a fő programban növeltem a regiszter értékét, de erre sem reagált. (Vagyis az A/D folyamatosan sokkal gyorsabban felülírja. És olyan gyakran jön a megszakítás, hogy még a kiírásra sem marad elég idő.) ![]()
Nagyon buta vagyok, végig rossz hexet égettem a PIC-be, azért írt ki hülyeséget a kijelzőre. (Mert az még a korábbi teszt volt.) Már jól működik.
![]()
Sziasztok!
Abban kérném a segítségeteket, hogy pickit 2-vel, hogy tudok kiolvasni egy 16C72A-típust? (olvasgattam már ezügyben, de nem találtam olyan device file-t) Köszi.
Szia!
A PICKit2 nem tud elegendő áramot adni a Vpp vonalon a 16C sorozat egyszer programozható tagjainak. (A 16C83 és a 16C84 többször programozható.)
Szia!
Na, teszteltem adó/vevő nélkül! Simán átmegy. Ha ugyanezt adóval + vevővel próbálom össze vissza küld. Valaki ötlet? Üdv, smithwebster
Értelemszerűen olyan adatokat küldök át, amit normálisan el tud küldeni az adó, pl 0x55
De az se megy át. Üdv, smithwebster
Azt hogy lehet megvalósítani, hogy az AD konverzió után az ADRESH és ADRESL értéke 2 külön porton megjelenjen. (Nekem uyganaz jelenik meg mindig.) 16F877-es kontrollerrel játszom. Íme a részlet amivel játszok:
INIT BANK1 MOVLW 0xFF MOVWF TRISA CLRF TRISB CLRF TRISD MOVLW b'00000111' ; TMR0 1:256 MOVWF OPTION_REG MOVLW b'11100000' ; GIE,PIE,TMR0IE MOVWF INTCON MOVLW B'10000010' MOVWF ADCON1 BANK0 MOVLW b'01000000' ; MOVWF ADCON0 GOTO START ;**************************************************************************** INT_SERV BCF INTCON,T0IF BSF ADCON0,ADON MOVLW 0x19 MOVWF KESLELTET DECFSZ KESLELTET GOTO $-1 BSF ADCON0,2 BTFSC ADCON0,2 GOTO $-1 BCF ADCON0,ADON MOVFW ADRESL MOVWF PORTB MOVFW ADRESH MOVWF PORTD RETFIE ;**************************************************************************** START GOTO START END
Más bank -ban vannak, a címeik alsó 7 bitje egyezik...
(((banksel makro))) |
Bejelentkezés
Hirdetés |