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
(#) 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ó
(#) mps válasza (Felhasználó 4) 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;
(#) mps válasza (Felhasználó 4) 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.
(#) mps válasza (Felhasználó 4) hozzászólására (») Feb 8, 2013 /
 
Nincs felrakva, akkor próbálkoztam vele mikor kezdtem és kerestem a nekem tetsző nyelvet, de végül a c maradt.
De előkeresem és egy próba erejéig felpakolom, viszont csak holnap vagy vasárnap, most tényleg nem sok időm van kutakodni a cd-k között. Ha nem késő akkor.
(#) gozi válasza (Felhasználó 4) hozzászólására (») Feb 13, 2013 /
 
Nem írtál konkrét típust, de általánosságban igaz:
A közvetlen összehasonlítás "if" utasítással nem fog menni (hardver okokra visszavezethetően csak egyszerű típusok közvetlen összehasonlítása működik).

Két megoldás is elképzelhető:
1. Használod a string library "strcmp" nevű függvényét,
2. A stringet tömbként kezeled és karakterenként hivatkozol az elemeire str1[1] str1[2] stb.
Példa:
if (str1[2]='a') and (Str1[3]='b') then Uart1_write_text('akármi');
if (str1[4]='b') or (Str1[4]='c') then Uart1_write_text('bármi');

Amikor mikrovezérlőt programozol, mindig figyelembe kell venni, hogy ez nem egy PC. Mivel a hardver erőforrások ROM, RAM, CPU korlátozottak, emiatt sokszor egyszerűsíteni szükséges. Ráadásul minden fordítónak "saját" nyelvezete van, amit az adott architektúrához alakítanak/igazítanak. Emiatt a hardver korlátai megjelenhetnek a programfejlesztés során.

Érdemes mindig a Language Reference vagy Language Howto részt a dokumentációban átolvasni.
(#) gozi válasza (Felhasználó 4) hozzászólására (») Feb 13, 2013 / 1
 
Itt az hiányzik, hogy a "Destination" nevű változó esetén is meg kell mondani, hova kerüljön az adat. Így jó kell legyen a kód:

  1. Index:=1;
  2. repeat
  3. Destination[index]:=Source[index];
  4. Index:=Index+1;
  5. Until Index=Length(Source);
(#) Hp41C válasza (Felhasználó 4) hozzászólására (») Feb 13, 2013 /
 
Gyanítom, hogy a pascal nyelv leírásából...
(#) Hp41C válasza (Felhasználó 4) hozzászólására (») Feb 13, 2013 /
 
Lehet, hogy van olyan fordító (főleg a nagyobb processzorokra), ami lehetpvé teszi, de még nem találkoztam olyannal, mi nem jelzett volna hibát azokra, amit itt írtál a tömb indexelésre. Turbo Pascal 5.5, 6.0, 7.0, Delphi 1.0, 3.0, 5.0, 6.0; Z80 -ra való HiSoft Pascal, Real Pascal, stb.
A C nyelvjásaiban a tömb neve egyben a tömb 0. elemére mutató pointer is.
Az if (string1 = string2) -nek mennie kellene, lehet, hogy valamilyen utit -ot be kell szerkeszteni hozzá. (A strcmp.h megint C -hez való...)
A hozzászólás módosítva: Feb 13, 2013
(#) zoleexl hozzászólása Feb 14, 2013 /
 
Helló,
Simulink-ból küldök ki számokat RS232-ön keresztül MikroPascalba. Ott a számmal végzek pár alapműveletet, majd küldöm vissza Simulinkbe. PIC18-as mikrokontrollerem van. Így néz ki a program:

  1. program myproject6;
  2.  
  3. var uart_rd        : byte;
  4.     ww             : char;
  5.     st             : string[7];
  6.     aa             : string[17];
  7.     x              : real;
  8.  
  9. begin
  10.   UART1_Init(9600);                        
  11.   Delay_ms(100);                            
  12.  
  13.   while (TRUE) do                          
  14.  
  15.    begin
  16.    st:='';
  17.    
  18.    if (UART1_Data_Ready() <> 0) then    
  19.  
  20.         begin
  21.           uart_rd := UART1_Read();
  22.           st:=st+chr(uart_rd);           //számjegyenként kapom meg a számot, ezért fűzöm fel stringbe
  23.         end;
  24.  
  25.  number:=str2int(st);              
  26.  x:=number/2;
  27.  Float2Str(x,aa,5);
  28.  UART1_Write_Text(aa);
  29.  
  30.     end;
  31.  
  32. end.


Az a baj vele h random hülyeségeket ír ki minden olyan esetben ha művelet eredményét tartalmazó változót küldök ki UART_Write-tal. Pl. akkor is ha nem változtatom az értékét
  1. x:=number*1;
  2. UART1_Write(x);

Viszont ha x-nek beírok 1 akármilyen értéket(ami nem művelet eredmény) akkor kiadja jól.
Mi lehet a probléma?

Köszi a segítséget.
(#) icserny válasza zoleexl hozzászólására (») Feb 14, 2013 /
 
A leírás szerint az UARTx_Write_Text() eljárást kellene használni, mert az UART1_Write() csak egy bájtok/karaktert küld ki!Bővebben: Link, benne az UART_LIBRARY
A hozzászólás módosítva: Feb 14, 2013
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