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   22 / 29
(#) mps válasza Rasiel 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.
(#) Rasiel válasza mps hozzászólására (») Feb 8, 2013 /
 
Köszi! megfelel persze.
(#) Rasiel válasza Rasiel hozzászólására (») Feb 13, 2013 /
 
Időközben megoldódott, úgy ahogy írtad nem lehet lekérdezni sajnos.
Viszont előjött egy másik érdekes probléma.... pár éve pascalozok, és ez egy olyan hiba(?) hogy az eszem megáll.

var
str1:string[255];

begin
If Str1='akarmi' then Uart1_write_text('akármi');
If Str1='barmi' then Uart1_write_text('bármi');
end;

Egyszerűen nem engedi lefordítani, pedig mindenhol működik (Delphi 5, Delphi7,TurboPascal, WinPascal) tényleg ennyire gaggyer ez a mikropascal, vagy valami nyelvi sajátosság?
A hozzászólás módosítva: Feb 13, 2013
(#) gozi válasza Rasiel 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.
(#) Rasiel válasza gozi hozzászólására (») Feb 13, 2013 /
 
Értem, köszi az infót, ez így akkor oké!
DE! találtam közben egy másik "érdekességet"

tegyük fel hogy egy String típusú változóból szeretnénk átmásolni egy másik string típusú változóba a tartalmat, karakterekként.

Ez nálam úgy nézne ki hogy
var
source,destination:string[50]
index:byte;

Begin
Index:=1;
repeat
Destination:=Source[Index];
Index:=Index+1;
Until Index=Length(Source);

namost, ez sem működik, ott kezd el nyávogni hogy (5.8.0-ás verzió) Source[Index]
a 4.8.0.0-ásnál semmi baj nem volt. Itt vajon mit gányoltak? Ez szerintem azért egy eléggé alap dolog a pascalban...
(#) gozi válasza Rasiel 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);
(#) Rasiel válasza gozi hozzászólására (») Feb 13, 2013 /
 
Profi vagy Gozi. Honnan szedted az értesüléseid ?
(#) Hp41C válasza Rasiel hozzászólására (») Feb 13, 2013 /
 
Gyanítom, hogy a pascal nyelv leírásából...
(#) Rasiel válasza Hp41C hozzászólására (») Feb 13, 2013 /
 
Lehet, de mint írtam, mindenhol máshol működik amit megírtam, csak itt nem, de köszönöm hogy hozzászóltál.
A hozzászólás módosítva: Feb 13, 2013
(#) Hp41C válasza Rasiel 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
(#) Rasiel válasza Hp41C hozzászólására (») Feb 13, 2013 /
 
Bármelyik Pascallal működik ami nálam van. Hibát nem ír sehol. Példának okáért a képeken a windows pascal 1991-92-es kiadás látható.
(#) 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
(#) ha1drp válasza zoleexl hozzászólására (») Feb 14, 2013 /
 
Konkrét megoldást a problémádra nem tudok adni, (mert csak azért sem mert nem vagyok biztos mit is küldesz a PIC felé és mit is vársz eredményként) csak néhány észrevétel:
- "number" változó típusa nincs definiálva általad
- "str2int" , "Float2Str" nem standard Mikropascal funkciók
A Mikropascal-nak egész jó szoftveres nyomkövetője van, érdemes használni biztosan rátalálsz a megoldásra.
(#) zoleexl válasza ha1drp hozzászólására (») Feb 14, 2013 /
 
1. A 'number' az real(elfelejtettem beírni, amúgy ez csak 1 variáns a sok program közül amit probáltam futtatni), de végülis mindegy, mert ha akár 1 byte típusut akarok átküldeni azzal se boldogul.
2. Libstock-ról töltöttem le ezeket a függvényeket,

ha debuggal nézem a változókat akkor mindent helyesen elvégez, ezért nem értem hogy 'élesben' miért nem működik...
A hozzászólás módosítva: Feb 14, 2013
(#) zoleexl válasza icserny hozzászólására (») Feb 14, 2013 /
 
Nem az a baj.
Például, így működik jól:

  1. a:=10;   {var a:byte}
  2. UART1_Write(a);


de ebben az esetben már nem 10-et ír ki UART-on
  1. b:=5; {var b:byte}
  2. a:=b*2;
  3. UART1_Write(a);
(#) zoleexl hozzászólása Feb 16, 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.           number,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.

A fenti csak 1 a sok probálkozás közül. Probáltam egyszerűbb, kisebb számokkal, úgyse megy.
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.
Például ezzel működik:
  1. a:=15; {var a:byte}
  2. UART1_Write(a);

De így már nem kapom vissza a 15-öt UART-on keresztül
  1. b:=5;                 {var a,b:byte}
  2. a:=3*b;
  3. UART1_Write(a);

Mi lehet a probléma?

Köszi a segítséget.
(#) gthomas hozzászólása Feb 18, 2013 /
 
Sziasztok!

Van egy kapcsolás, ami 3db ceruzaelemmel működik. Rajta egy 16f690-es pic végzi a dolgát. Hogyan tudom érzékelni (elsősorban kapcsolási rajz szinten) hogy merül az elem? Arra gondolok, hogy hogy ha 3V alá csökken a feszültség kapjon a pic egy jelzést, vagy addig kapjon amíg normál a feszültség.

Köszi, üdv: T.
(#) gozi válasza gthomas hozzászólására (») Feb 18, 2013 /
 
Kapcsolási rajzot hirtelen nem tudok, de három lehetséges megoldást tudok javasolni:

1. A 16F690-es PIC-ben van komparátor. Azt kell felhasználni úgy, hogy a komparátor neminvertáló bemenetére az elemfeszültség kerül (szükség szerint leosztva), az invertálóra pedig egy fix feszültségreferenciát/zener diódát kötsz. Így az elemfeszültség csökkenésekor akár megszakítást is tud generálni a belső komparátor.
2. Külső hardver felhasználásával is megoldható a dolog, pl: TC54 és társai...
3. Emlékeim szerint a 16f690-es széria WAKE-UP modulja is felhasználható erre a célra: AN879

+ 1 lehetséges megoldás:
Külső alkatrész nélkül is megoldható a feladat: de ehhez olyan PIC-et kell választani, ami támogatja a LVD (Low Voltage Detect) funkciót.
A hozzászólás módosítva: Feb 18, 2013
(#) gozi válasza zoleexl hozzászólására (») Feb 18, 2013 /
 
Sajnos nincs elegendő adat ahhoz, hogy a hibát mindent kizárva meg lehessen határozni, ugyanis se a konkrét PIC típus, se a használt fordító verziószáma se ismert. A hardverről nem is beszélve...

Pár tipp elsődlegesen: oszcillátor nem megfelelő beállítása, a soros adat útja során van valami gond, esetleg bekapcsolt/alapértelmezésben bekapcsolt MCU periféria okozhat hasonló gondot (esetleg ha van, akkor akár az usb-soros konverter is).

A következő kód biztosan működik (mikroPascal PRO for PIC v.5.8.0; 18F4550):
  1. program MyProject;
  2.  
  3. { Declarations section }
  4.  var x: byte;
  5.  var number: byte;
  6.  
  7. begin
  8.     uart1_init(9600);
  9.     number:=25;
  10.     x:=number*3;
  11.     UART1_Write(x);
  12. end.
(#) icserny válasza gozi hozzászólására (») Feb 18, 2013 /
 
Idézet:
„Ad 1. A 16F690-es PIC-ben van komparátor. Azt kell felhasználni úgy, hogy a komparátor neminvertáló bemenetére az elemfeszültség kerül (szükség szerint leosztva), az invertálóra pedig egy fix feszültségreferenciát/zener diódát kötsz. Így az elemfeszültség csökkenésekor akár megszakítást is tud generálni a belső komparátor.”
Van beépített fix referencia is!

4. lehetőség: ADC-vel VDD referenciával megmérhető a belső referencia (ami 0,6 V-os). Abból, hogy az ADC mennyinek méri vissza lehet számolni, az ADC ugyanis a Vref/VDD arányt adja
eredményül. Ez a módszer megszakításra nem alkalmas, de folyamatos ellenőrzésre annál inkább.
(#) gozi válasza icserny hozzászólására (») Feb 18, 2013 /
 
Hű, igazad van. El is felejtettem (16F szériát már ritkán használok), hogy ennél a szériánál is van fix referencia, ráadásul be is állítható a belső komparátorhoz, így gond nélkül megoldható a megszakítás is... Adatlap 8.4 fejezet.
A hozzászólás módosítva: Feb 18, 2013
(#) Hp41C válasza gozi hozzászólására (») Feb 18, 2013 /
 
Szia!
Az első 3 megoldással az a baj, hogy sokkal többet fogyasztanak, mint a sleep módban levő kontroller. Egy P-MOSFET és egy N-MOSFET felhasználásával nyugalmi áram nélkül lehet a telepre kapcsolni a mérőkört. A mérőkör bekapcsolása után megvárni a beállási időt, mérni, meghozni a döntést, jelezni, majd újra sleep egy ideig. Időzítő felébreszti a kontrollert és a műsor kezdődik előlről. Ha sokáig futó állapotban van, akkor időnként mér egyet...
A hozzászólás módosítva: Feb 18, 2013
(#) m.joco válasza zoleexl hozzászólására (») Feb 18, 2013 /
 
Hello

Idézet:
„st:=st+chr(uart_rd);”


A chr(); argumentuma csak konstans lehet, ha jól tudom, mert a mikrovezérlő nem ismeri az ASCI kódtáblát, tehát a fordítónak fordításkor ismernie kell az argumentumot.
Üdv.
(#) gthomas válasza icserny hozzászólására (») Feb 18, 2013 /
 
Köszi a válaszokat, ezt kipróbálom.
(#) zoleexl válasza m.joco hozzászólására (») Feb 22, 2013 /
 
Prototype: function Chr(code : byte) : char;

Returns: Returns a character associated with the specified character code.

Description: Function returns a character associated with the specified character code. Numbers from 0 to 31 are the standard non-printable ASCII codes.

This is an “inline” routine; the code is generated in the place of the call.

Requires: Nothing.

Example: c := Chr(10); // returns the linefeed character

Ezzel a fuggvennyel biztos nincs baj.
Ez a program mukodik:

  1. program ascii_in_out;
  2.  
  3. var uart_rd        : byte;
  4.     ww             : char;
  5.  
  6. begin
  7.   UART1_Init(9600);                         // Initialize UART module at 9600 bps
  8.   Delay_ms(100);                            // Wait for UART module to stabilize
  9.  
  10.   while (TRUE) do                           // Endless loop
  11.     begin
  12.       if (UART1_Data_Ready() <> 0) then     // If data is received,
  13.         begin
  14.           uart_rd := UART1_Read();
  15.           ww:=chr(uart_rd);          // read the received data,
  16.           UART1_Write(ww);             // and send data via UART
  17.         end;
  18.     end;
  19. end.
(#) zoleexl válasza gozi hozzászólására (») Feb 22, 2013 /
 
Adatok: mikroPascal PRO for PIC v.5.6.0; 18F8520; 10 MHZ osc;
USB-soros konvertert hasznalok
(#) zoleexl válasza zoleexl hozzászólására (») Feb 22, 2013 /
 
van 1 ilyen programom:

  1. program test_pas2;
  2.                                         {mindegy mit kap, mindig 252-t ad ki simulinkbe}
  3. var uart_rd        : byte;
  4.     st,st2         :string[7];
  5.     number         :byte;
  6. begin
  7.   UART1_Init(9600);
  8.   Delay_ms(100);
  9.  
  10.   while (TRUE) do
  11.     begin
  12.     st:='';
  13.       if (UART1_Data_Ready() <> 0) then
  14.         begin
  15.           uart_rd := UART1_Read();
  16.           st:=st+chr(uart_rd);
  17.           end;
  18.         number:=str2byte(st);
  19.        { inc(number); }                {0-t ad ki ha bent hagyom ezt a sort}
  20.         Byte2str(number,st2);
  21.         UART1_Write_Text(st2);
  22.  
  23.         end;
  24.     end.

Amint a kommentekbe irtam, mindegy milyen erteket kuldok neki az olvasoregiszterbe, mindig 252-t ad ki a Simulink-ban. Ha valamilyen muveletet akarok csinalni a szamma alakitott karaktersorral, akkor 0-at ad ki. ???
(#) Hp41C válasza zoleexl hozzászólására (») Feb 22, 2013 /
 
Minden uart adat kiolvasása előtt meg kell vizsgálni az RCSTAn regiszter FERR és OERR bitjeit.
A 16F88x adatlapjából:
Idézet:
„If the receive FIFO is overrun, no additional characters will be received until the overrun condition is cleared. See Section 12.1.2.5 “Receive Overrun Error” for more information on overrun errors.”

Idézet:
„12.1.2.5 Receive Overrun Error
The receive FIFO buffer can hold two characters. An overrun error will be generated If a third character, in its entirety, is received before the FIFO is accessed. When this happens the OERR bit of the RCSTA register is set. The characters already in the FIFO buffer can be read but no additional characters will be received until the error is cleared. The error must be cleared by either clearing the CREN bit of the RCSTA register or by resetting the EUSART by clearing the SPEN bit of the RCSTA register.”

Mág annyit hozzátennék, hogy a hibásan vett karaktert ki kell olvasni.
(#) gozi válasza zoleexl hozzászólására (») Feb 22, 2013 /
 
Ez a kód működésképtelen. Minden ciklusban lenullázod az "st" változó értékét... Ráadásul akkor is küldesz adatot, amikor nem is kaptál semmit... Azt sem látom, hogy hol van lekezelve, mikor van vége a kapott adatnak...

Ha stringet küldesz a soros vonalon, az szépen számjegyekre bontva kerül kiküldésre. Ezt neked egyenként le kell kérdezned a vételi pufferből, és ebben az esetben tudnod kell, hol van kezdete vagy vége az adatnak.
Egy példa: át kell küldeni az 0123456 karakterláncot.

Átküldésre kerül a mikrovezérlőbe (tehát ez az adat kerül az uart_rd regiszterbe) a következő, szépen egymás után:
48, 49, 50, 51, 52, 53, 54.

Ezzel még nem vagyunk készen, ugyanis ezt fel kell fűzni egy karakterlánccá, és tudni kell, hol kezdődik, vagy hol fejeződik be az adat. Nem tudom, hogy a simulink adatformátuma mennyire rugalmas, de egy határolóadat mindenféleképp javasolt. Az esetek többségében ez a CR+LF (kocsi vissza+soremelés; 0x0D (13) és 0x0A (10)) érték.
Következő: »»   22 / 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