Fórum témák
» Több friss téma |
Fórum » MikroPascal kérdések
Témaindító: bozsokiandras, idő: Máj 15, 2006
Témakörök:
Először is kellemes ünnepeket mindenkinek!
DS1621 próbálnék szólongatni szoftveres i2c-n, de mindig 255 a visszatérési érték: Soft_I2C_Start(); Soft_I2C_Write(0xEE); // indítok egy konverziót Soft_I2C_Stop(); Delay_ms(1000); Soft_I2C_Start(); Soft_I2C_Write(0xAA); // kérek 2 bájtot Soft_I2C_Stop(); Soft_I2C_Start(); Temp1 := Soft_I2C_Read(1); // itt jön az első Temp_1 := Soft_I2C_Read(0); // itt a második Delay_ms(100); Soft_I2C_Stop(); Delay_ms(100); Temp1, és Temp_1 egyaránt 255. Mit csinálok rosszul?
Nem ismerem a DS1621 lelkivilágát, de ez a sorrend így biztosan nem jó. I2C esetén Start után tudtommal egy parancsnak kell jönnie, ami érvényes címet és R/~W=1 bitet tartalmaz.
Szia!
Én készítettem mikropascallal, AVR el és DS1621el hőmérőt.
Ez a procedure arra jó hogy a hőmérő mérést végezzen. A címzési lábak A0,A1,A3 a földre vannak húzva.
Ez a procedure pedig a mért hőmérséklet kiolvasása az ICből. A TWI helyett értelemszerűen mindenhova Soft I2C kell. Ha pontosabban akarod olvasni akkor a második bájtot is ki kell olvasni és akkor a 10. sorban lévő TWI_read(0) helyett változó := TWI_read(0) kell. Üdv!
Szervusz gthomas !
Én DS1820+ -t használok. Elsőre nekem sem működött. Elfelejtettem az I2C - portját digitálisra állítani . PIC16F877 - nél alapból analóg I/O. Nálam az adcon1:=$06; segített. Üdv / BUÉK ! Qka
Köszi a válaszokat, csak elindult a kommunikáció.
Annyi a bajom, hogy a kijelző 28 °C-ot mutat, a falon levő termosztát pedig 21,5-öt, biztos ennek van igaza. Hőforrás nincs a közelben, a 1621 a próbapanel jó messze van mindentől. Lehet ezzel valamit kezdeni, vagy rossz lenne a 1621? Üdv!
Ha túl gyakran olvasod ki, akkor belülről fűtöd a hőmérődet.
Most kb. fél percenként olvasom ki, mégis 29°C
![]()
Mikropascalban van 1wire unit direkt ds1820-hoz. Én azzal működésre tudtam bírni a hőmérő ic-t.
Üdv.
Sziasztok!
Vettem egy 16F628-at. RB0-on egy ledet akarok villogtatni. (hello world) Szerintetek miért nem megy? program ado1; { Declarations section } var i:byte; procedure init; begin CMCON:=$07; trisb:=0; portb:=0; i:=0; end; begin { Main program } while true do begin i:=1-i; portb.0:=i; delay_ms(1000); end; end.
Hello
Nem kell eljárás a programba, szóval ezeket az utasításokat: CMCON:=$07; trisb:=0; portb:=0; i:=0; a főprogram elejébe írd. Üdv.
Jaaj bocs, egy so kimaradt, ami meghívja az eljárást:
program ado1; { Declarations section } var i:byte; procedure init; begin CMCON:=$07; trisb:=0; portb:=0; i:=0; end; begin { Main program } init; while true do begin i:=1-i; portb.0:=i; delay_ms(1000); end; end. Szóval így nem működik, pedig szerintemm kellene. Belső oscillátort a projekt létrehozásakor 4 MHz-re állítottam. A configurációs regiszterek: CONFIG :$2007 : 0x3D6A
Oké, megtaláltam oscillátor -> INTRC CLKOUT !! ezzel megy! Köszi !
Szia m.joco!
Olvastam a listán, hogy Te is foglalkoztál a manchester kódolással történő RF adatátvitellel. Most állítottam össze két pic-et, hogy kipróbáljam, hőmérő lesz a végén. Szóval először - mint Neked is ajánlották - összekötöttem a két pic-et direktben rf nélkül. Nekem a példa program tökéletesen működik. Viszont ha berakom az adót és a vevőt a kijelzőt teleírja '?' karakterekkel. A vevőm az adó kikapcsolása ellenére is vesz valamit, gondolom a házban működhet valamilyen eszköz ezen a frekvencián és innen veszi a zavarjelet. Hogyan lehet kiküszöbölni ezt és elérni hogy csak az én adóm által küldött adatot vegye? Te mire jutottál?
Hello
Nos, több mint egy év után végre sikerült működésre bírni a mikropascal manchester unitját. Rájöttem, hogy az unit igazából egész jó. A lényeg a helyes szinkronizálás. Ugye a manchester libraryban szerepel a man_receive_init és a man_synchro függvény. Az elsőt meghívjuk, aminek hatására próbál szinkronizálni a vevő az adóval - próbálja megállapítani a vétel bitjének hosszúságát/sebességét. Tehát fontos, hogy eközben az adó sugározzon. Csakhogy az is megtörténhet, hogy a rf vevőmodul által vett "szemét" miatt rosszul szinkronizálódik a vevő. Viszont hiába ad vissza a man_receive_init 0-s értéket (ami azt jelenti, hogy a szinkr. sikeres volt), nem biztos, hogy az adó által sugárzott jelre szinkronizált rá. Itt jött nekem a képbe a man_synchro függvény. Sokáig nem értettem, hogy mire is jó igazából. A Help szerint ez gyakorlatilag ugyanazt csinálja mint a man_receive_init, csak a visszatérő érték sikeres szinkronizálás esetén a manchester bit hosszának a fele 10us-s felbontásban. A Helpben benne van, hogy bithossz 2ms (ezért is 500bps sebességű ez a man. unit), most ha jól számolok, akkor: (2ms/2)/10us = 100. Tehát sikeres man_synchro után ennek a függvénynek 100-as értéket kéne visszaadni, és a vevőnek rá kéne szinkronizálódnia az adóra. Ezért úgy kezdtem kísérletezni, hogy a vevő pic programjában meghívtam a man_receive_init -et (mert muszály), majd ezután ezt az utasítást adtam: while sync <> 100 do sync := man_synchro(); A sync változó byte típusú, kezdeti értéke 0. Ez így addig hívja meg a man_synchro -t, amíg nem lesz sikeres a szinkronizálás. Sajnos ez sem működött, pedig a próbakor sugárzott az adó is. Ezután már kezdett felmenni bennem a pumpa ![]() while sync <> 44 do sync := man_synchro(); Az eredmény - tökéletes :yes: A vevő végtelen ciklusban a man_receive -ot futassa, az adó által minden kisugárzott bájt megjön. Szóval a lényeg a jó szinkronizálás. Kár hogy nem lehetséges a megadni előre, hogy a man_synchro rögtön a 44-re álljon be. A 44 -nek pedig szerintem igazából 50-nek kéne lennie (a mikropascalos fiúk valószínűleg annak a 2ms-nak a felének a felét értik). És hogy miért 44 50 helyett? Szerintem függ ez attól, hogy a vevő pic 4MHz-en teker, az adó pedig 10MHz-en, illetve az rf modulok is lehet, hogy nem pontosan addig sugároznak, amíg magas a bemenetük. További érdekesség: az adót úgy programoztam be, hogy bekapcsolás után folyamatosan küldje a 255-es byte-ot kb. 1ms - 500ms időközönként (több időt is végigpróbáltam), ekkor kapcsolnám be a vevőt, de amikor a vevő több mint 2 méterre volt az adótól, akkor már nem szinkronizált be. :eek2: Viszont ha még ennél messzebb is van a vevő, és gombnyomásra küld az adó csak egy-két bájtot, akkor a szinkronizálás sikeres volt. Ezt máig se értem. Elég hosszúra sikeredett, de szerintem így érthető. Azt ajánlom neked, hogy te is használd a man_synchro utasítást, próbáld valahogy meghatározni, hogy neked mi a jó visszatérő érték. Persze ilyenkor is vesz a vevő szemetet, de nekem adáskor nem zavart ez be - gondolom maga az adás erősebb. Egy bájt elküldése nekem a köv.: először elmegy 5 db 255-ös bájt, ezután egy 101-es bájt (ez nekem a start jel), majd az ADAT bájt, majd egy ellenőrző bájt, ami az adat bájtnak 255-el történő xor-olása( pl. adat 10010111, akkor az ell. bájt: 01101000). A vevő a 101-es bájt utáni vételt veszi, majd az utána levőt, ha az ellenőrző bájt megfelelő, akkor a vétel helyes. Nekem ez így jól működik. Az egyes elküldött bájtok között persze vannak pár ms-nyi szünetek. Sok sikert! Üdv.
Köszi a részletes leírást, akkor kísérletezek! Üdv!
Sziasztok!
Próbálkozok a pic-kel. És a Pascalozás elején elakadtam. Nem tudom miért nem működik a mellékelt kód, bekötés, hasonlók renben, mert asm-ben villog a led. A proci:18f4550, 20MHz kvarccal. Érdekelne, milyen hibát követtem el. A válaszokat előre is köszönöm!
Így első blikkre a konfigurációs biteket nem tudjuk, hogy hogyan állnak. Illetve az ADCON1 regisztert biztos nullára kell állítani? - bár ez jelen esetben épp nem zavarná a led villogását.
Sajna nagyon kezdő vagyok a micropascalban, nem tudom a biteket állítgatni, megnézni, bár kerestem. Viszont WinPic ezt mutatja.
Van ott az az Oscillator Selection rész, ott keress olyasmit, hogy Divide by 5 (20MHz input). Vagy a másik lehetőség, hogy az Oscillator alatt keress olyasmit, hogy HS oscillator, PLL disabled. Ezekre állítva égesd be újra és meglátjuk, hogy mi lesz.
Pascalban úgy egyébként mennyire vagy kezdő. Mert ha azt is most tanulnád, akkor inkább tanulj helyette C-t.
Ezt az oszcis részt nem nagyon tudom megoldani, mert nem a WinPicet használom, hanem pk2-őt.
Csak a 2550 beégetéséhez kellett, mert volt egy jdm-em, és véletlen működött egyszer ![]() A micropascalban nem lehet állítani a config biteket? Sajnos a súgója ebben nem igen segítőkész.
A VREGEN-t is be kellene billenteni, s a VUSB láb és a földközé egy 470 nF kondenzátor kell.
A config biteket csak akkor lehet állítani, ha projektet hozol létre. Ez esetben a Project menüben az Edit project alatt lehet a konfigurációs biteket beállítani. A 20 megás kvarchoz, ha jól emlékszem, "Oscillator HS: USB-HS" beállítás szükséges, az összes többi bitre elvileg megfelelő a Default.
Pickit2-ben nem lehet állítani a konfig biteket? Illetve ahogy megnyitottad a winpic800-al, úgy ott átállítani és lementeni vele hex-be, majd azt beégetni a pickit2-vel?
Ha a pascal valamennyire megy, akkor mondjuk egyelőre jó, de ne várj tőle túl sokat. Kevesen használják, így kevés a tapasztalat és a segítség vele. Nem olyan nehéz belejönni a C-be, és utána a pascal elég "maradinak" fog tűnni. Én épp vasárnap vettem elő a Delphit 3-4 év után, mert PC programozáshoz még csak azt használtam komolyabban és most nem volt idő elmélyedni másban, de azt kell mondjam, hogy a C jobban kézreáll. Persze ebben közrejátszik az is, hogy azóta csak C stílusú nyelvekben programozok: kontrollereknél C, munkaidőben pedig PHP és Javascript. Nem véletlen lett szinte minden újabb programozási nyelv alapszintaxisa a C
Valóban, bár ennek a bitnek csak az USB kapcsolat használata esetén van jelentősége.
Köszönöm szépen a segítséget mindenkinek! Azt tettem, hogy winpicben lementettem módosítva, ahogy Potyó írta, és villog
![]() A cvel az a bajom, hogy nem nagyon tudom hol kezdjem, bár a javat és a phpt azt használom én is munkaidőm egy részében, viszont a pic c-t nagyon nem értem, az elejét legalább is, de most az jön. A másik bajom az, hogy nem tudok könyvből tanulni, csak ha elmondják szépen szájbarágósan, és csinálom is közben. Még egyszer köszi!
Mikropascal debuggerevel lehet olyant csinalni mint az mplabbal, hogy atugrok bizonyos sorokat? (Set PC to cursor)
Kesz orulet hogy milyen lassu, nem beszelve, ha beragad egy feltetelbe ami nem teljesul. (hogy aztan regisztereket kelljen piszkalni)
Nem nagy tragédia, ha arra készteti a programozót, hogy máskor jobban gondolja át a programot.
![]()
Hello
Mikropascal SPI Ethernet ENC28J60 unitjával szórakozok mostanában. A példaprogram szuperül működik. Írtam egy saját programot, http kérés esetén megjelenít egy weboldalt, ahol kiírja kérő ip címét, és a weboldal letöltések számát. Ez is jól működik, viszont pár perc után már nem jön be a weboldal. A ENC28J60 ic kissé melegszik, de a példaprogramnál fél óra után is jól bejön a weboldal. Az én kódom kisebb is, mint a példaprogram, nem tudom mi lehet a baj. Így viszont kár rá fejleszteni, ha 10 perc után már nem lehet elérni a weboldalt. Csatolom a kódomat, én csak a tcp kezelő rutin módosította, az udp maradt. Itt-ott benne maradtak a példa program megjegyzései a kódban, mivel én ezt írtam át. Üdv.
Sziasztok
Adott egy bemenet (12F629, GP4-ös láb); Hogy tudom leprogramozni azt, hogy ezen 1 másodpercig volt -e jel? Tehát minimum 1 másodpercig le volt-e nyomva egy gomb. köszi.
If button(GPIO,4,1000)=255 then ...
vagy: Function jelteszt:boolean; Var counter:word; Begin Counter:=0; If GPIO.4=1 then Repeat inc(counter); delay_ms(1); Until (GPIO.4=0) or (counter=1000); If Counter=1000 then result:=1 else result:=0; end; |
Bejelentkezés
Hirdetés |