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 ![]()
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 |