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:
Amit korábban javasoltam, miszerint 6 szoros ciklusba érdemes tenni az hibás. Később jöttem rá. Pedig a helyes megoldás szerinti módszert, ami a program helpjében van, már használtam.
Ebből két dolgot érdemes megszívlelni. 1, "while true do" ciklus a megszakítás kezelés miatt 2, Lehetőleg egy olvasás utasítást használj pont a megszakítás kezelés miatt. Javaslom hogy nézd meg a program helpjében lévő UART példát is ne csak az USART-ot.
Sziasztok
I2C kommunikációt szeretnék megoldani 2db PIC16f877 között, néztem a netet de sok példát nem találtam rá mikropascalba. Gondolom hasonló módon kell mint egy eeprom írás olvasása. adat küldés I2C_Init(100000); // Initialise I2c at a clock speed of 100 Khz, only to be done once! ....... I2C_Start(); // Issue I2C start signal I2c_Wr($A0); // Send I2c Write Slave Address I2c_Wr(adat1); // write first byte I2c_Wr(adat2); // write second byte I2c_Wr(adat3); // write third byte I2C_Stop(); adat fogadás másik PIC-be: I2C_Init(100000); // Initialise I2c at a clock speed of 100 Khz, only to be done once! ........ I2C_Start(); // Issue I2C start signal adat1 := I2c_Rd(true); // read first byte and give acknowledge adat2 := I2c_Rd(true); // read second byte and give acknowledge adat3 := I2c_Rd(false); // read last byte and give no acknowledge ! I2C_Stop(); Az adási rész szerintem jó lehet, de a vételnél nem vagyok biztos hogy így jó. Úgy gondoltam hogy egy while ciklusba rakom a vételt és ha jön adat azt leveszi, esetleg vizsgálom hogy az I2C busz foglalt-e, ha igen akkor jön adat, mivel csak 1 master és 1 slave van. Segítséget előre is köszönöm!
Alapvetően az a probléma, hogy a gyári függvények csak a master módot támogatják. A slave-nek szánt programod szerinted miből tudhatná, hogy ő most slave, azaz kívülről kapja az órajelet? Ahhoz más beállítás kell, tehát meg kell írni a slave módot támogató függvényeket. Egy megvalósítást a MikroElektronika fórumán is találsz. Bővebben: Link
sziasztok
Egy ideje már küzdök 2db PIC16F877 közti I2C kétirányú kommunikációján amivel 2-3 byte-ot akarok átküldeni, de nem igazán akar összejönni. Ha valaki tudna nekem küldeni egy mikropascal-os működő mintaprogramot master-slave-re is, azt megköszönném (esetleg honorálnám is a fáradozásait) Előre is köszönöm a segítséget!
Sziasztok
Már tárgytalan a kérés, megoldódott a gondom!
Okulásul legalább válaszold meg a kérdésedet!
Sziasztok. Beélesítettem a MikroPascalban található USB Hid példaprogramot, működik rendesen.
Hogyan lehet kiküldeni egyszerre egynél több bájtot? Ha az usbdsc fájlban az 1 bájtot 64 bájtra átírom (ennyi a 18F4550 max. értéke(?)), megáll a tudomány, nem jön a mikrokontrollerből semmi: for i:=0 to 63 do userWR_buffer[i]:=i; HID_Write(@userWR_buffer,64)
Közben megoldódott. A descriptorban lévő méretnek és a kiküldött bájtok méretének meg kell egyezni.
Hello
Rendelt már valaki valamit a mikroElektronikától? Az oldalukon az írják hogy 25 dollár a kiszállítás DHL-lel. Lehetséges, hogy Szlovákiába vagy Magyarországra ez az összeg alacsonyabb? Egyáltalán rendelhetnek magánszemélyek (szóval nem cég)? Üdv.
Újabban a Chipcad is forgalmazza a Mikroelektronika termékeit. Érdemes náluk is szétnézni.
sziasztok
felrakom a 2 pic közti I2C kommunikációt ami nálam működik, biztos lehet szebbet jobbat írni, nálam ez bevált! Master oldal--------------------------------------------------------------------- I2C_Init(100000); // master I2C init 100kHz //Master adás slave-nek---------------------------- I2C_Start(); // start jel I2c_Wr($A0); // 7 bites cím küldése slave-nek+adás jelző bit 8.bit, decimális 80-as cím + 1 bite (0) adat írása jelzés I2c_Wr(adat1); // 1 byte küldés slave-nek I2c_Wr(adat2); // 2 byte küldés slave-nek I2c_Wr(adat3); // 3 byte küldés slave-nek I2C_Stop(); // stop jel delay_ms(50); vetel:=0; //vétel slave-től I2C-n keresztül I2C_Start(); I2c_Wr($A1); // 7 bites cim küldése slave-nek+vétel jelző bit 8. bit, decimális 80-as cím + 1 bite (1) adat olvasás jelzés vetel:=I2c_rd(0); // 1 byte vétele slave-től vetel változóba I2C_Stop(); Slave oldal--------------------------------------------------------------------- //I2C slave init------------------------------------------------------------------- intcon:=%11000000; TRISC.3:=1; TRISC.4:=1; SSPCON:=%0110 ; // I2C 7 bites módba állítás SETBIT(SSPCON,SSPEN) ; SETBIT (SSPCON,CKP ) ; SSPADD := %10100000; //Cím regiszter (SSPADD): Slave módban ez a regiszter tárolja a 7.bit-es címet hex cím A0 , decimális 80-as cím PIR1.SSPIF:=0; PIE1.SSPIE:=1; intcon.7:=1; //I2C INTERUPT ENEGDÉLYEZVE //I2C slave initvége ----------------------------------------------------------------- Procedure WaitForPIR1SSPIFset; begin wf:=0; repeat until (TestBit(PIR1, SSPIF) = 1); //vár amíg az adat nem jön le end; //I2C-n adat küldés masternak Procedure SendByteI2C(TByte: Byte); begin wf:=0; repeat until (TestBit(SSPSTAT, BF) = 0); //vár amig a I2C buffer üres lesz NOP; NOP; NOP; SSPBUF := TByte; //I2C buufferbe küldendő byte bemásolása NOP; NOP; NOP; SetBit(SSPCON, CKP); //Slave módban: órajel megnyújtása (1: CLK vonalat elengedi, 0: CLK vonal lehúzza (clock strech)) WaitForPIR1SSPIFset; ClearBit(PIR1, SSPIF); //Clear interrupt flag end; //I2C megszakítás (Slave) procedure interrupt; begin IF PIR1.SSPIF=1 THEN BEGIN intcon.7:=0; //megszakítás tiltása i2c_cim := SSPBUF; //CÍM OLVASÁSA I2C bufferből( első adat) CLEARBIT(PIR1,SSPIF); //vétel 7 bites cím (80 cím) + 1 bit (0) ami az mastertől jövő adást jelzi = decimális 160 if i2c_cim=160 then begin WaitForPIR1SSPIFset; i2c_adat1 := SSPBUF; //1. byte olvasása bufferből CLEARBIT(PIR1,SSPIF); WaitForPIR1SSPIFset; i2c_adat2 := SSPBUF; //2. byte olvasása bufferből CLEARBIT(PIR1,SSPIF); WaitForPIR1SSPIFset; i2c_adat3 := SSPBUF; //3. byte olvasása bufferből CLEARBIT(PIR1,SSPIF); end; //mastertől adás kérés, 7 bites cím (80 cím) + 1 bít (1) adás jelzés= decimális 161 if i2c_cim=161 then begin SendByteI2C(i2c_adas); //1 byte adása masternakk end; intcon.7:=1; //megszakítás engedélyezése end; end;
üdv.
noob lesz a kérdésem, előre szólok. ![]() szal. hogy tudnám leírni kóddal, hogy egy byte változóhoz (nevezzük i-nek) a portb.0-on található gomb megnyomására egyet hozzáadjon? én úgy próbálkoztam, h if PORTB.0=0 then i:=i+1 else i:=i; de erre addig folyamatosan hozzáadogat 1-et, amíg nyomva van a gomb. nekem az kéne, h a gomb megnyomásával egyet változzon. előre is kösz a válaszokat, UBi
Szia!
Vegyél fel egy temp változót, ami tárolja az gomb előzőciklusban felvett értékét. var temp:byte; //--------- init temp:=0; i:=0; //--------- main if (PORTB.0=1) and (temp=0) then i:=i+1; temp:=PORTB.0; //----------------- Így az if ág minden gombnyomásra csak egyszer teljesül. Üdv: T
Üdv Mindenkinek!
A capture üzemmódot szeretném beüzemelni impulzusszélesség-mérésére! A mérés indítása először a felfutó élnél kell ,hogy történjen, majd üzemmód váltással a lefutó élnél kellene detektálnom a változást! A problémám , hogy csak lefutó élnél indul el az ISR! A tesztelést Real Pic simulatorban végeztem! a pic 16f785, 10Mhz órajel, mérendő jel 2ms széles. Köszönöm a segítséget előre is! A program pedig: " program valami; var t_low,t_low1 : byte; var t_high,t_high1 : word; procedure init_1; begin trisa:=0; porta:=0; trisc :=%00100000; portc:=0; trisB:=0; portb:=0; ansel:=0; ansel1:=0; CM1CON0:=0; CM2Con0:=0; ccp1con:=%00000101; intcon:=%11000000; t1con:=%00000001; wpua:=0; ioca:=0; pir1:=0; pie1 :=%00100000; end; procedure interrupt; org 0x0004; begin if CCP1IF_bit=1 then begin if RC5_bit=1 then begin t_low:=ccpr1l; t_high:=ccpr1h; porta.0:=0; porta.1:=1; ccp1con:=%00000100; clearbit(pir1, ccp1if); end; if RC5_bit=0 then begin t_low1:=ccpr1l; t_high1:=ccpr1h; T1CON.0 :=1; porta.0:=1; porta.1:=0; ccp1con:=%00000101; clearbit(pir1, ccp1if); end; end; end; begin init_1; while true do begin porta.3:=0; Delay_1sec; porta.3:=1; Delay_1sec; end; end. "
Az elmúlt időben teszteltem az Mplab-ban is ( coff- file) de az eredmény ua! Ha átírom a programot a csak felfele élre történő isr indításra ,a probléma akkor is ugyan az . Az is mindegy ha növelem az imp hosszát.Sajnos elakadtam ebben az egyszerűnek látszó feladatban. Nem jöttem rá még a hiba okára !
Kérlek Benneteket -szánjatok meg Köszönettel.
A mikroelektronika mindenhova ennyiért szállít, két nap alatt meg is érkezik, csak a vámot számold hozzá.
Ha például komplett pic fejlesztőt akarsz még olcsóbban jössz ki mint chipcad, de ha csak egy egy dolog kell akkor érdemes kivárni míg behozzák. Chipcadtól megrendeléstől számítva 3 hétig vártam, mikroelektronika 4 nap vámmal....
Hello
Csak a vámot kell hozzászámolni, adót nem? Ha jól értem, akkor te már rendeltél tőlük? Kb. hány százalékkal lett több a fizetnivaló? Üdv.
Az ÁFÁ-t az esetek többségében ki kell fizetni, csak a kis értékek esetén tekintenek el tőle. Vámot, amennyiben jó vámtarifa csoportba helyezték a rendelést a vámprocedúra során, általában nem kell fizetni.
25% -ot kell rá fizetni, de DHL sz....kodott vele rengeteget, valami számítógépalkatrész lett végül.
Mindig hívogattak, hogy válaszoljak kérdésekre, pld: Az LCD kijelző 60cm-nél kisebb? A processzor több magos? Sajnos elég értetlen emberek vannak náluk, de miután felhívtam a németországi képviseletüket egyből meglett a besorolás. Rendelni csak akkor éri meg ha több minden kell, úgy eloszlik a szállítási költség. Esetleg ha licencet veszel, ahhoz meg nincs vám... Nemsoká nekem is esedékes lesz a dolog, Chipcad meg piszok lassan futtatja át a rendeléseket.
Sziasztok,
Próbálkozom én is a mP Pro Pic v4.6-al, meg egy chipcados 16x2-es LCD-vel. A szoftver helpje alapján megírtam első "programomat" LCD-re de nem akar működni.
Sokat próbálkoztam, nézegettem, majd arra jutottam, hogy az LCD_EN bit fordítva működik, mint amit az LCD várna. A program "1'-el küld parancsot, az LCD meg "0"-ra várja. Van ötletetek hogyan lehetne ezt megoldani? Nem szeretnék külső not kaput építeni egy mikroproci után.
Szerintem itt más gond van, légyszíves írd meg a PIC típusát.
A PIC 16F917 az LCD EW162G0GLY
Azért gondoltam erre a problémára, mert próbapanelon az LCD-t én is csak negatív impulzussal tudtam vezérelni (kapcsolókkal kipróbáltam, mivel nem működött) és itt a cikkek között is úgy van fent a kapcsolás, hogy 0-ra húz le a kapcsoló. LCD bekötés A mP belső debugjával meg látni, hogy alapértelmezésben az EN bit az 0, és egy-egy pillanatra vált 1-re. Ja az előbb nem írtam, hogy 4 biten szeretném használni, de gondolom az látszik a programból.
Én is ezt az LCD-t használom nem, volt gondom a Mikropascallal eddig. Az LCD kontrasztszabályozásával azonban igen. Volt, hogy már kb. 0.5v felett nem olvasható a kijelző.
Egy tranzisztor, es ket ellenallassal megoldhato, ha tenyleg csak ennyi a gond.
Hali ! Bár én csak kezdő vagyok a témában De: "a szoftver helpje alapján" írtad meg, azért elég sok mindent kihagytál belőle!
Talán ezzel kellene kezdeni,ill nem "mondtad meg" a programnak ,hogy mit szeretnél kiíratni vele ! (24 ill 25 sor)! Ha nem jól igazítottam ki akkor bocs! Az viszont tény : a help alapján működnie kellene! A pic adatlapját is át kell böngészni.....
Az Lcd adatlapját is (kompatibilitás szempontjából hd44780).....ezt elfelejtettem.....
Nálad magas vagy alacsony szinten működik az Enable?
Küldenél egy példaprogit pascalban ami nálad 4 biten működik? Hátha mégis én bénázok csak. Egyébként a 4.6-os verziót használom. Nem mértem a kontrasz feszt. Azt tudom, hogy egy potit kötöttem le a földre és kapcsolókkal bedrótozva működik, jól látható, de PIC-kel nem tudtam életre kelteni (csak pascalból próbáltam)
Ez nekem is eszembe jutott, de azért vicces, hogy egy uC után még kell egy tranyó, hogy jól működjön...
de már az is megfordult a fejemben, hogy átírom a lib rutint, felcserélek pár bcf és bsf-et és a helyére kerülnek a bitek, de ez elég macerás lehet, és nem tudom, hogy a következő kijelzőnél mi lesz a szitu...
Igazad van, kihagytam, hogy tologassa jobbra balra a szöveget, nekem elég ha kiírja.
Sőt nem is váltott két soros módba, tehát az init() rutint sem sikerült végrehajtani. 24,25 sor szerintem rendben, a help leírása: procedure Lcd_Out(row: byte; column: byte; var text: string); row: starting position row number column: starting position column number text: text to be written Példa: Lcd_Out(1, 3, "Hello!"); Szóval ez jónak tűnik és a fordító is megkajálta. |
Bejelentkezés
Hirdetés |





Köszönettel.




