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
(#) 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.
(#) zoleexl válasza gozi hozzászólására (») Feb 22, 2013 /
 
Ez a kod mukodik:

  1. program test_pas1;
  2.                                            
  3. var uart_rd        : byte;
  4.     st             :string[7];
  5.  
  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.         UART1_Write_Text(st);
  19.         end;
  20.     end.


Felfuzi a szamjegyeket es kiirja a vegen magat a szamot. Egyelore csak 1 erteket kuldok at simulink-bol, ezert eleg az
Idézet:
„if (UART1_Data_Ready() <> 0) then”
feltetel. Ez a bit mutatja hogy van-e meg atkuldendo adat. Persze tudnek irni egy ilyet is:

  1. {...}
  2.  while (TRUE) do
  3.     begin
  4.     st:='';
  5. if (UART1_Data_Ready() = 1) then           // if data is received
  6.        begin  
  7.          UART1_Read_Text(output, '/r', 10); // reads text until CR character is found
  8.          st:=st+output;
  9.        end;
  10.  
  11.   UART1_Write(13);    
  12.   UART1_Write_Text(st);
  13.   UART1_Write(10);
  14.         end;


De itt most azon van a hangsuly hogy meghal a dolog ha a karakterlancot atalakitom szamma, a szammal vegzek muveletet, visszaalakitom stringbe es kuldom vissza. A visszakuldes ugy mukodik hogy a Mikropascal atirja ascii kodba az ertekeket es nekem a simulinkbe van egy ASCII decoder blokkom amire rakotok egy kijelzot hogy lassam az erteket.
(#) gozi válasza zoleexl hozzászólására (») Feb 26, 2013 / 1
 
Ha még aktuális, ez a kód tökéletesen működik:
  1. program Tst_01;
  2.  
  3. { Declarations section }
  4. var uart_rd        : word;
  5.     st             : string[5];
  6.     output         : word;
  7.    
  8. begin
  9.   { Main program }
  10.  
  11.   UART1_Init(9600);
  12.   Delay_ms(100);
  13.  
  14.   while (TRUE) do
  15.     begin
  16.       if (UART1_Data_Ready() <> 0) then
  17.         begin
  18.           uart_rd := UART1_Read();
  19.           st:='';          
  20.           st:=st+chr(uart_rd);
  21.           output:=StrToWord(st);
  22.           // output:=output*2;
  23.           inc(output);
  24.           WordToStr(output,st);
  25.           UART1_Write_Text(st);
  26.         end;
  27.     end;
  28. end.

A fenti kód az ASCII-ban kapott számot 1-el megnövelve, ASCII-ban visszaküldi. A kód jellegéből adódóan csak egy számjegy feldolgozására alkalmas (a küldött adatra ez nem vonatkozik).
(#) gapati hozzászólása Márc 4, 2013 /
 
Sziasztok!

Segítséget szeretnék kéni Tőletek, mégpedig abban, hogy hogyan tudnék meglévő ASM kódot beilleszteni a mikropascal programba.(vannak már működő, korábban megírt rutinjaim, amiket szeretnék használni)
Kétféle képen próbáltam:
1. :
asm
begin
btfsc STATUS, Z
goto $+3
incf mperc, F
stb....
end;

2.:
asm {
btfsc STATUS, Z
goto $+3
incf mperc, F
sb....
}
A fordító kiakad syntax errorral.
40 304 Syntax error: Expected "." but "asm" found ORA_Int.mpas


Köszönette: gapati
(#) Ktulu válasza gapati hozzászólására (») Márc 4, 2013 /
 
A help-ben olvasd el az "asm Statement" részt.
  1. asm
  2.    block of assembly instructions
  3. end;
(#) gapati válasza Ktulu hozzászólására (») Márc 4, 2013 /
 
Szia!

Nem értem, elkerüli valami a figyelmem?
Én is ott láttam, hogy így kellene, de a fordító syntax errorral megáll.
61 304 Syntax error: Expected "." but "asm" found ORA_Int.mpas



asm
Time
incf mperc, W ;Másodperc
andlw 0x0F
xorlw 0x0a
btfsc STATUS, Z
goto $+3

stb.......
end;


Üdv: gapati
(#) bbatka válasza gapati hozzászólására (») Márc 4, 2013 /
 
Pedig írja pontot vár és asm talált. A kód előző része végét nézd meg.
(#) gapati válasza bbatka hozzászólására (») Márc 4, 2013 /
 
Ha kiveszem az asm blokkot, akkor lefordul a program. Nem kell valami direktívát bekapcsolni neki az asm miatt?

Üdv: gapati
(#) gapati válasza gapati hozzászólására (») Márc 4, 2013 /
 
pedig más fórumon is azt mondják, hogy menni kéne. Nem lehet hogy csak a fullos verzióban működik rendesen?

http://www.mikroe.com/forum/viewtopic.php?f=76&t=49042

Üdv:gapati
(#) gapati válasza gapati hozzászólására (») Márc 5, 2013 /
 
Kitettem az asm...end; blokkot egy eljárás begin...end; blokkjába és így működik. De sok olyan asm direktíva van amit a Microchip formátumban nem ismer meg. A mikropascalban használható asm parancsok szintaktikáját hol lehet megtalálni?

Köszönettel: gapati
(#) ha1drp válasza gapati hozzászólására (») Márc 5, 2013 /
 
Az asm utasítás után a "Time" az mi akar lenni? Szerintem az nem assembly utasítás.
Ha cimke akkor deklarálni kell (label), vagy kettőspont kell a végére.
(#) gapati válasza ha1drp hozzászólására (») Márc 5, 2013 /
 
Szia!
Igen cimke. Kettősponttal megy is. Köszönet érte!

Megtaláltam az asm utasítások szintaktikáját: http://www.mikroe.com/chapters/view/10/chapter-9-instruction-set/

A globális változóimra hivatkoztam még rosszul. A help-ben azt látom, hogy egy aláhúzás kell a változó nevek elé. Így már lefordult a program.

Köszönöm a segítséget mindenkinek!
További szép napot!
Üdv: gapati
(#) gapati hozzászólása Márc 9, 2013 /
 
Sziasztok!

Szeretném megkérdezni használ-e valaki Mikropascal Pro for PIC 5.8.0. fullos verziót?
Köszönettel:gapati
(#) Stubiflex hozzászólása Márc 26, 2013 /
 
Pár soros program. Mégsem akar működni megfelelően.
Mindig újraindul a PIC. Hol a hiba szerintetek?

program Usart_Test;

var
txt, delim : string[10];

begin


TRISB := %11111110;
PORTB := %00000001;
Usart_Init(4800);
delay_ms(100);
delim := 'OK';

while TRUE do

begin

if Usart_Data_Ready() = 1 then

begin
Usart_Read_Text(txt, delim);

if (txt[0] = 'K') and (txt[1] = 'B') and (txt[2] = 'e') and (txt[3] = ' ') then

begin
Usart_Write_Text('Kazan Be');
SetBit(PORTB, 0);
end;
if (txt[0] = 'K') and (txt[1] = 'K') and (txt[2] = 'i') and (txt[3] = ' ') then

begin
Usart_Write_Text('Kazan Ki');
ClearBit(PORTB, 0);
end;

if (txt[0] = 'H') and (txt[1] = 'M') and (txt[2] = '?') and (txt[3] = ' ') then
Usart_Write_Text('Homerseklet');
end;
end;

end.

Lehet, hogy a 16F877A-n nem működik az Usart_Read_Text?
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