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   21 / 29
(#) michael67 válasza robing16 hozzászólására (») Máj 20, 2012 /
 
Szia. Lehet, hogy késő a válasz ,próbáld meg a package managert.
(#) glaci hozzászólása Nov 7, 2012 /
 
Delphi háttérrel most tanulom a mikropascal-t. Szeretnék a hozzáértőktől segítséget kérni.
Feszűlséget mérek az AN2-n és a mért értéket ki akarom írni egy kijelzőre és jelezni akarom azt is, hogy a változás emelkedő, vagy csökkenő, vagy stagnál. A beolvasott értékek word típusúak.
Ha nem változtatok a bemeneti értéken, akkor is változik a mért érték. Mivel lehet megoldani a helyzetet.

//---------------------------------Fesz mérés-------------------------------
Procedure fesz_meres;
Begin
adc_0 := ADC_read(2);
Delay_ms(100);
adc := ADC_read(2);
End;
Procedure fesz_kiir;
Begin
text2:='stagnal';
if (adc_0-adc)>20 then text2:='csokken';
if (adc-adc_0)>20 then text2:='no';

LCD_Out(1,1,' ');
LCD_Out(1,1,text2);

Ez a kérdéses kódrészlet.
Köszi a segítséget.
(#) glaci hozzászólása Nov 7, 2012 /
 
Másik kérdés.
Mi az abszolut érték számítás kódja mikropascalban?
(#) gthomas válasza glaci hozzászólására (») Nov 8, 2012 /
 
biztos van beépített függvény a math libben, de ha nincs:

function abs(ertek: integer): integer;
begin
result:=ertek;
if ertek<0 then result:=ertek*-1;
end;

>
A hozzászólás módosítva: Nov 8, 2012
(#) gabesz9920 hozzászólása Nov 9, 2012 /
 
Sziasztok!

Bináris órát csinálok PIC 16F877-essel.
Timer1 időzitőt szeretnék használni, ami másodpercenként megszakitja a főprogramot. Az RC0, RC1 lábon 32.768 KHz-es kristály. Ezt kéne 1 sec-re csökkenteni, csak az a gond,hogy ezt pic micro pascalban nem vágom,hogy hogyan is működik. Erre kérnék szépen valamiféle progirészletet, hogy hogyan kell konfigurálni a timer1 bitjeit, és egyáltalán hogy hozom bele a programba, mivel közben a proci Sleep üzemmódban lesz.
Köszi előre is,ha tudtok segiteni.

Üdv: F. Gábor
(#) glaci válasza gthomas hozzászólására (») Nov 12, 2012 /
 
Köszönöm.
(#) glaci hozzászólása Dec 8, 2012 /
 
Kedves Kollégák!
Adva van egy programrészlet, amit mikropascal pro-ban programoztam. LCD kijelzőre íratok ki szöveget és általam készített jeleket amik, bizonyos folyamatok jelzésére szolgának. Mondjuk a hőmérséklet emelkedik az előző méréshez képest. Mivel az LCD kijelző alapból nem tudja az ékezetes karaktereket, csináltam egy 'á' betűt is. Ha kiíratom az egyik jelző karaktert, akkor azok a jelző karakterek is átíródnak az új jelzésre, amik nem változnak, sőt az általam fabrikált 'á' betű is átíródik az új jelzésre.
Hogy lehet ezen javítani?
(#) zsoltee0001 válasza glaci hozzászólására (») Dec 8, 2012 /
 
Szia
Ismerős a probléma.
Szükséges a karakterek váltása közben frissíteni a kijelzőt?
Üdv
(#) glaci válasza zsoltee0001 hozzászólására (») Dec 8, 2012 /
 
Csak az adott karaktert írnám át.
(#) glaci hozzászólása Dec 8, 2012 /
 
Hogy kell használni a mikropascal Tools menü Lcd Custom Character, saját karakter készítőjét.
Ha elindítom, elkészítem a kívánt karaktert, csinálhatok egy kódot, aztán ezt hogy kell használni, mit kell vele tenni, hogy aztán a programban , az LCD-n kitudjam ezt a karaktert íratni?
(#) zsoltee0001 válasza glaci hozzászólására (») Dec 9, 2012 /
 
Szia
Elkészíted a kívánt karaktert, majd copy to clipoboard
Ezt a kódot bemásolod a programba.
A character nevű tömbbe kerül eltárolásra a karakter pontjai.
Ha jól sejtem, ahány egyedi karakter annyi tömb kell (eléggé zabálja a memóriát).
A számmal való hivatkozás se működik a kijelződön?
Pl:
  1. Lcd_Chr(1,10,223);

Ez a celsius utáni kis karika.
A kijelző adatlapját átnézted?
üdv

Most
(#) glaci válasza zsoltee0001 hozzászólására (») Dec 9, 2012 /
 
Nem, ezt még nem próbáltam, de du. megpróbálom.
Köszi!
(#) glaci hozzászólása Dec 9, 2012 /
 
Nem ez sem vezetett eredményre.
(#) vilmosd válasza glaci hozzászólására (») Dec 9, 2012 /
 
Nem tudom hogyan probalod, de ugy kellene, hogy megszerkeszted az user karaktereket, majd eloszor ezeket feltoltod a LCD CGRAM teruletere. Egyszerre 8 karaktert tudsz feltolteni. Utana a kikuldendo karakter cimet kell kikuldeni, amikor ki akarod iratni, vagyis nem a karaktert. Tehat pl a karakter az 'é' es Te a CGRAM 2. helyere irtad be akkor az 'é' helyett a 02 kodot kell kikuldeni a LCD-nek.
(#) glaci válasza vilmosd hozzászólására (») Dec 9, 2012 /
 
A kovetkezo keppen csinaltam: elkeszitem a karaktereket. Van bennuk 'á' betu ezt a CGRAM 0. helyere tettem a

procedure abetu_proc(pos_row, pos_char: Byte);
var i: Byte;
begin
Lcd_Cmd(64);
for i := 0 to 7 do Lcd_Chr_CP(abetu[i]);
Lcd_Cmd(_LCD_RETURN_HOME);
Lcd_Chr(pos_row, pos_char, 0);
end;
proceduraval
meg meeg harom masik jel.
az utolso

procedure nem_valt_proc(pos_row, pos_char: Byte);
var i:byte;
begin
Lcd_Cmd(64);
for i := 0 to 7 do Lcd_Chr_CP(nem_valt[i]);
Lcd_Cmd(_LCD_RETURN_HOME);
Lcd_Chr(pos_row, pos_char, 3);
end;
ezek a procedurak a pic_init-ben irjak a CGRAM-ot
majd a program egy helyen ki akarom iratni az 'á' betut a

LCD_chr(1,11,0);

utasitassal es nem 'a' betut ir, hanem az utolsonak bevitt karaktert, ami a CGRAM 3. helyen van.
A hozzászólás módosítva: Dec 9, 2012
(#) glaci válasza glaci hozzászólására (») Dec 9, 2012 /
 
mivel az elozo nem jol adta vissza, igy elkuldom kodban
  1. procedure abetu_proc(pos_row, pos_char: Byte);
  2. var i: Byte;
  3. begin
  4.   Lcd_Cmd(64);
  5.   for i := 0 to 7 do Lcd_Chr_CP(abetu[i]);
  6.   Lcd_Cmd(_LCD_RETURN_HOME);
  7.   Lcd_Chr(pos_row, pos_char, 0);
  8. end;
  9. procedure fel_proc(pos_row, pos_char: Byte);
  10. var i:byte;
  11. begin
  12.   Lcd_Cmd(64);
  13.   for i := 0 to 7 do Lcd_Chr_CP(fel[i]);
  14.   Lcd_Cmd(_LCD_RETURN_HOME);
  15.   Lcd_Chr(pos_row, pos_char, 1);
  16. end;
  17. procedure le_proc(pos_row, pos_char: Byte);
  18. var i:byte;
  19. begin
  20.   Lcd_Cmd(64);
  21.   for i := 0 to 7 do Lcd_Chr_CP(le[i]);
  22.   Lcd_Cmd(_LCD_RETURN_HOME);
  23.   Lcd_Chr(pos_row, pos_char, 2);
  24. end;
  25. procedure nem_valt_proc(pos_row, pos_char: Byte);
  26. var i:byte;
  27. begin
  28.   Lcd_Cmd(64);
  29.   for i := 0 to 7 do Lcd_Chr_CP(nem_valt[i]);
  30.   Lcd_Cmd(_LCD_RETURN_HOME);
  31.   Lcd_Chr(pos_row, pos_char, 3);
  32. end;


és a pic_init-ben igy lett inditva

  1. abetu_proc(1,1);
  2.   fel_proc(2,1);
  3.   le_proc(3,1);
  4.   nem_valt_proc(4,1);


A hozzászólás módosítva: Dec 9, 2012
(#) glaci hozzászólása Dec 12, 2012 /
 
A fentebb levő kérdésre se kaptam választ, de azért próbálkozok.
Van egy másik kérdés is. 2 db ds18b20 hőmérőt szeretnék1 vezetéken használni, a következő kóddal szeretném az azonosító adatokat a pic eeprom-jában tárolni, hogy ne kelljen minden pic induláskor a hőmérőket azonosítani. A baj az, hogy az eeprom-ba az azonosítók helyett csupa '00' van. segítsetek megjavítani a programot. Mikropaskalban van a kód, de a magyarázat lehet más nyelven is.
  1. //--------------------szenzorok élesztése----------
  2.         For i:=1 to 2 do                         //2 szenzor miatt 2 ciklus
  3.                                                  //(Inicializáló rutin)
  4.         begin
  5.              ByteToStr(i, lcd);                  //Az LCD függvény csak stringet
  6.                                                  //tud kiírni
  7.              Lcd_Out(1,1, 'Kerem a szenzort:');
  8.              Lcd_Out(2,7, lcd);
  9.  
  10.              For j:=6 to 7 do
  11.              begin
  12.                   repeat                         //Figyeljük a PORTB
  13.                   until TestBit(PORTB, j) = 0;   //Nála van a nyomógomb
  14.                   repeat
  15.                   until TestBit(PORTB, j) = 1;   //Azért van 2*, mert a Delay
  16.              end;                                //parancs nagyon eszi a
  17.                                                  //wordöket, így viszont delay
  18.                                                  //nélkül is pergésmentes...
  19.  
  20.              Ow_Reset(PORTC, 0);                 //A szenzorok azonosításához
  21.              Ow_Write(PORTC, 0, $33);            //szükséges egyenként kiolvasni
  22.                                                  //az egyedi azonosítót...
  23.  
  24.              For j := 1 to 8 do                  //Az azonosítók beolvasása
  25.              begin
  26.                   sensor[8 * i - 8 + j]:=Ow_Read(PORTC, 0);
  27.                   eeprom_write((8 * i - 8 + j),sensor[8 * i - 8 + j]);
  28.              end;
  29.         end;
  30.  //-----------------szenzorok élesztése eddig
A hozzászólás módosítva: Dec 12, 2012
(#) Ktulu válasza glaci hozzászólására (») Dec 12, 2012 /
 
Szia.
Először is a kód elejét nem értem. Mi haszna annak, hogy "bekérsz" valamit, majd egy gombnyomásra úgyis továbbmész? A pergésmentesítés így nem fog működni. Az első gombnyomással végigszalad mindkét teszten. Még ha működne is, a koncepció hibás, ugyanis addig várna, amíg egymás után lenyomod (és felengeded) mindkét gombot.
A szenzorral kapcsolatban van néhány követelmény. Ezeket betartottad?
Idézet:
„OneWire enabled devices should have open collector drivers (with single pull-up resistor) on the shared data line”

Idézet:
„Oscillator frequency Fosc needs to be at least 8MHz in order to use the routines with Dallas digital thermometers.”

Idézet:
„This library implements time-based activities, so interrupts need to be disabled when using OneWire library.”

Reszetnél nem ártana értelmezni a függvény által visszaadott értéket:
Idézet:
„0 if the device is present
1 if the device is not present”


Régen használtam már a BS18B20-at, de hirtelen az adatlapban ezt találtam:
Idézet:
„READ ROM [33h]
This command can only be used when there is one slave on the bus.”


esetleg nézz szét az oldalamon, van néhány MikroPascalos forráskód: Bővebben: Link

(#) glaci válasza glaci hozzászólására (») Dec 23, 2012 /
 
Megoldódott. A dolgot úgy kell csinálni, hogy a sajátkarakter készítő ablakban középtájon van egy CGRAM ablakocska, amiben a bevitelre szánt karakter sorszámát és hogy melyik szabad oszlopba kerüljön az általam készített karakter, be kell írni. A már gyárilag foglalt oszlop karakterét átírni nem lehet.
(#) glaci hozzászólása Dec 23, 2012 /
 
Most viszont van egy másik gond.
Az LCD kijelzőre, ki akarom íratni egy változó értékét, mondjuk egy hőmérsékletet. Az érték kiíratását egy "text" felhasználásával akartam megoldani. A hőmérséklet 2 számjegyű a "bytetostr" converter viszont 3 helyi értéken adja meg a konverziót, és így az első helyiérték értéktelen és nem tudom eltüntetni és ezért értékes helyet foglal el az LCD-n. Segítsetek megoldani, hogy az első értéktelen karaktertől megszabaduljak.
(#) glaci válasza glaci hozzászólására (») Dec 24, 2012 /
 
Ez is megoldódott. A kiírandó értéket a mod és a div műveletekkel helyiértékekre bontottam és a kapott karaktert az
Lcd_Chr(row: byte; column: byte;out_char: byte); paranccsal írtam ki.
(#) 925 hozzászólása Jan 10, 2013 /
 
Sziasztok!
van 2db PIC16F877-es ic-m összekötve I2C kommunikációval amíg össze vannak kötve I2C-n addig szépen megy minden, ha leveszem a slave-et a master lefagy amikor ráfut az I2C részre, mivel nincs válasz a slave-től, és WDT újraindítja állandóan. A felhúzó ellenállások benne vannak, az I2C lábakon. Ha a programból kiveszem az I2C kommunikációt akkor nincs gond, nem fagy le.
Valakinek van valami ötlete mi lehet a gond?


programrész:
I2C_Start;
I2c_Wr($A0);
I2c_Wr(adat1);
I2c_Wr(adat2);
I2c_Wr(adat3);
I2c_Wr(adat4);
I2C_Stop;

delay_ms(50);

I2C_Start;
I2c_Wr($A1);
vetel1:=I2c_rd(1);
vetel2:=I2c_rd(0);
I2C_Stop;
(#) gozi válasza 925 hozzászólására (») Jan 10, 2013 /
 
Szándékosan kérsz nyugtázást (ACK, acknowledge) az első adat beolvasásakor?

Első körben kipróbálnám így:
  1. vetel1:=I2c_rd(0); // No ACK
(#) 925 válasza gozi hozzászólására (») Jan 18, 2013 /
 
próbáltam, de így sem jó
(#) Rasiel hozzászólása Feb 7, 2013 /
 
Lehet hülyeséget kérdezek, de a Mikropascal AVR lehetőséget ad arra hogy a 8 bites port blockot egyszerre kezeld, például Porta:=0xFF; A kérdés az , hogy tudok ugyan ilyen módon olvasni?
(#) mps válasza Rasiel hozzászólására (») Feb 8, 2013 /
 
Szia!
AVR-t nem használok, de gondolom nincs ebben különbség a pichez.
Tehát fordítva is működik:
változó:= PortA;
(#) Rasiel válasza mps hozzászólására (») Feb 8, 2013 /
 
var
hexstr:String[6];

Begin

DDRB:=0x00;
PortB:=0x00;

Repeat
IntToStr(PortB,HexStr);
Lcd_Out(2,1,'Port B:'+HexStr);
Until True;
End;

folyamatosan 0 hiába van rátéve a jumper bármelyik B pin és a + vagy test közé.
Az LCD megfelelően le van kezelve, csak nem akartam feleslegesen bemásolni ide a sok sallangot.
(#) mps válasza Rasiel hozzászólására (») Feb 8, 2013 /
 
Mint írtam az AVR nem megy. Tehát én nem tudok többet segíteni sajnos
A súgót nézted, elég jó van neki, sőt! Biztosan lelsz benne példát.
(#) Rasiel válasza mps hozzászólására (») Feb 8, 2013 /
 
Azért köszönöm. Valaki más? Súgót megnézem hátha...
(#) Rasiel válasza mps hozzászólására (») Feb 8, 2013 /
 
MPS légyszíves próbálj már ki valamit nekem a pic-keden.

mondjuk az A jelzésű portok legyenek kimenetek, a B jelzésűek bemenetek.

a program pedig ennyi:

Begin
repeat
PortA:=PortB;
Until true;
End.

kíváncsi vagyok mi lesz a fejlemény.
köszi előre is.
Következő: »»   21 / 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