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:
Lapozás: OK   16 / 29
(#) bbatka válasza bbatka hozzászólására (») Márc 11, 2011 /
 
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.
(#) 925 hozzászólása Márc 30, 2011 /
 
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!
(#) icserny válasza 925 hozzászólására (») Márc 30, 2011 /
 
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
(#) 925 hozzászólása Ápr 9, 2011 /
 
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!
(#) 925 válasza 925 hozzászólására (») Ápr 11, 2011 /
 
Sziasztok
Már tárgytalan a kérés, megoldódott a gondom!
(#) icserny válasza 925 hozzászólására (») Ápr 11, 2011 /
 
Okulásul legalább válaszold meg a kérdésedet!
(#) gthomas hozzászólása Ápr 13, 2011 /
 
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)
(#) gthomas válasza gthomas hozzászólására (») Ápr 13, 2011 /
 
Közben megoldódott. A descriptorban lévő méretnek és a kiküldött bájtok méretének meg kell egyezni.
(#) m.joco hozzászólása Máj 5, 2011 /
 
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.
(#) icserny válasza m.joco hozzászólására (») Máj 5, 2011 /
 
Újabban a Chipcad is forgalmazza a Mikroelektronika termékeit. Érdemes náluk is szétnézni.
(#) 925 válasza icserny hozzászólására (») Máj 6, 2011 /
 
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;
(#) UBi hozzászólása Máj 13, 2011 /
 
ü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
(#) gthomas válasza UBi hozzászólására (») Máj 13, 2011 / 1
 
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
(#) UBi válasza gthomas hozzászólására (») Máj 13, 2011 /
 
úúúúúú.köszi.works.
(#) bibiq hozzászólása Máj 23, 2011 /
 
Ü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.
"
(#) bibiq válasza bibiq hozzászólására (») Máj 29, 2011 /
 
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.
(#) Zozi85 válasza m.joco hozzászólására (») Máj 29, 2011 /
 
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....
(#) m.joco válasza Zozi85 hozzászólására (») Máj 29, 2011 /
 
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.
(#) gozi válasza m.joco hozzászólására (») Máj 29, 2011 /
 
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.
(#) Zozi85 válasza m.joco hozzászólására (») Máj 29, 2011 /
 
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.
(#) Szpidi hozzászólása Máj 30, 2011 /
 
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.
  1. program LCD;
  2. // LCD module connections
  3. var LCD_RS : sbit at RC2_bit;
  4. var LCD_EN : sbit at RC3_bit;
  5. var LCD_D4 : sbit at RC4_bit;
  6. var LCD_D5 : sbit at RC5_bit;
  7. var LCD_D6 : sbit at RC6_bit;
  8. var LCD_D7 : sbit at RC7_bit;
  9.  
  10. var LCD_RS_Direction : sbit at TRISC2_bit;
  11. var LCD_EN_Direction : sbit at TRISC3_bit;
  12. var LCD_D4_Direction : sbit at TRISC4_bit;
  13. var LCD_D5_Direction : sbit at TRISC5_bit;
  14. var LCD_D6_Direction : sbit at TRISC6_bit;
  15. var LCD_D7_Direction : sbit at TRISC7_bit;
  16. // End LCD module connections
  17.  
  18.   begin
  19.     TRISC := 0x00;
  20.     PORTC := 0xFF;
  21.     ANSEL  := 0;                        // Configure AN pins as digital I/O
  22.     Lcd_Init();                        // Initialize LCD
  23.       Lcd_Cmd(_LCD_CLEAR);
  24.       Lcd_Out(1,3,'1st row');
  25.       Lcd_Out(2,2,'2nd row');
  26. end.


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.
(#) gozi válasza Szpidi hozzászólására (») Máj 30, 2011 /
 
Szerintem itt más gond van, légyszíves írd meg a PIC típusát.
(#) Szpidi válasza gozi hozzászólására (») Máj 30, 2011 /
 
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.
(#) ha1drp válasza Szpidi hozzászólására (») Máj 30, 2011 /
 
É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ő.
(#) Ktulu válasza Szpidi hozzászólására (») Máj 30, 2011 /
 
Egy tranzisztor, es ket ellenallassal megoldhato, ha tenyleg csak ennyi a gond.
(#) bibiq válasza Szpidi hozzászólására (») Máj 30, 2011 /
 
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.....
(#) bibiq válasza bibiq hozzászólására (») Máj 30, 2011 /
 
Az Lcd adatlapját is (kompatibilitás szempontjából hd44780).....ezt elfelejtettem.....
(#) Szpidi válasza ha1drp hozzászólására (») Máj 30, 2011 /
 
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)
(#) Szpidi válasza Ktulu hozzászólására (») Máj 30, 2011 /
 
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...
(#) Szpidi válasza bibiq hozzászólására (») Máj 30, 2011 /
 
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.
Következő: »»   16 / 29
Bejelentkezés

Belépés

Hirdetés
XDT.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