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   23 / 29
(#) 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?
(#) glaci hozzászólása Ápr 15, 2013 /
 
Sziasztok!Nem tudom találkozott e valaki olyan problémával, hogy a mikropascal egy pic-ben levő regisztert nem tud kezelni? A szóban forgó pic, 16f628. Szeretném egy port lábán, történetesen az RB0-án, feszültség élváltozás állapotát figyelni és megszakítást felhasználva jelzést produkálni. Az option regiszterben az intedg biten lehetne állítani, hogy milyen élre történjen megszakítás. Beírva
option.6:=1;-> option aláhúzva, Fordításkor

"12 303 Identifier "option" was not declared", vagyis ezt a regisztert nem lehet használni.

Tud valaki magyarázatot adni?
(#) Hp41C válasza glaci hozzászólására (») Ápr 15, 2013 /
 
Szia!
Régen a PIC -eknek volt egy option utasításuk, amivel az option regisztert lehetett beállítani bankváltás nélkül. A névütközést elkerülendő az option regisztert OPTION_REG -nek definiálta a Microchip.
(#) glaci válasza Hp41C hozzászólására (») Ápr 15, 2013 /
 
Hp41C köszönöm! Tényleg elmúlt a, hibajelzés.
A dolog így mindjárt másképp néz ki és most öröm van.
Az adatlapok ezt miért nem közlik? Ennek ellenére örülök, hogy ezt Te tudtad és megosztottad velem, illetve velünk. Remélem kikerültem a zsákutcából.
(#) gapati válasza glaci hozzászólására (») Ápr 16, 2013 /
 
Szia!

Ez a fajta élváltozás "figyelése" csak az RB4-RB7 lábakon működik.

Üdv: gapati
(#) Hp41C válasza glaci hozzászólására (») Ápr 16, 2013 /
 
Szia!
Örülök, hogy megoldódott a probléma.
Igen itt van egy kis kavarodás. A 16F627-628 adatlapjában (DS40300C) a memória kiosztásnál OPTION, a regiszter leírásánál OPTION REGISTER, a 16F627A628A-648A (DS4044F) a memória kiosztásnál OPTION, a regiszter leírásánál OPTION_REG szerepel...
(#) mikroferi hozzászólása Máj 12, 2013 /
 
Sziasztok!
Valaki tudna nekem segíteni abban ,hogy hogyan kell megoldani azt hogy egy 16f84a pic, figyelje a porta.1 et, és jel alapján egy fordulatszámmérőt kéne építsek.Tudom hogy már van ebből ezer mindenhol,de én saját programot szeretnék csak nem tudom hogy kell az időzítő részt megírni,az megvan hogy figyeli a portot, csak az idő méréssel és számolással vannak a problémák.Nagyon köszönöm a segítségeteket!!!
(#) glaci válasza mikroferi hozzászólására (») Máj 12, 2013 /
 
Szia! Ha mikropaskal-ban írod a programot, Találsz egy ikont az interrupt-ra. Az előállít neked egy megszakítási procedúrát és azt feltöltöd a saját adataiddal, amihez tudni kell a proci frekvenciájá és be kell állítani az előosztást. Be kell állítani a megszakítás engedélyezését. Tanulmányozd az option_reg regiszter bitjeit. Be kell állítani hogy a tmr0 mettől számoljon, hogy a tmr0 regiszter feltöltése utáni átbillenés milyen időközönként történjen. Ezt az átbillenést számlálod meg egy regiszterrel és ha megvan a kívánt 1 sec-es idő, akkor a másodperc rgiszter értékét növeled 1-el. 16f628 esetén így néz ki
  1. // Timer0 Registers:
  2. // Prescaler=1:128; TMR0 Preset=156; Freq=78,125Hz; Period=0,0128 s
  3.       OPTION_REG.T0CS :=0;// bit 5 TMR0 Clock Source Select bit:0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
  4.       OPTION_REG.T0SE := 0;// bit 4 TMR0 Source Edge Select bit: 0=low/high / 1=high/low
  5.       OPTION_REG.PSA  := 0;// bit 3 Prescaler Assignment bit: 0=Prescaler is assigned to the Timer0
  6.       OPTION_REG.PS2  := 1;// bits 2-0  PS2S0: Prescaler Rate Select bits
  7.       OPTION_REG.PS1  := 1;
  8.       OPTION_REG.PS0  := 0;
  9.       TMR0 := 156;           // preset for timer register
  10. // ezt kell számoltatni egy regiszterrel. A regiszter kezdőértéke 178, tehát megszámol
  11. //78 megszakítást az lesz 1 másodperc. a hiba -0,0016 másodperc. 625 másodperc alatt késik 1 másodpercet.
  12. //tehát 10 perc és 25 másodperc után a másoperc értékéhez hozzá kell adni 1-et.
  13.        szamlalo:=178;
Ez a pic_init része, majd maga a megszakítás
  1. // 1 sec megszakítás
  2. procedure interrupt1(); iv 0x0004; ics ICS_AUTO;
  3. begin
  4.    if INTCON.T0IF=1 then
  5.    begin
  6.       INTCON.T0IF:=0;
  7.       szamlalo := szamlalo + 1;
  8.       TMR0 := 156;
  9.       if szamlalo=78 then
  10.       begin
  11.          szamlalo:=0;
  12.          mp:=mp+1;
  13.         // if portb.7=0 then portb.7:=1 else portb.7:=0;
  14.         if mp1=1 then mp1:=0 else mp1:=1;
  15.       end;
  16.       if mp=60 then
  17.       begin
  18.          perc:=perc+1;
  19.          mpkorr:=mpkorr+1;
  20.          mp:=0;
  21.          if perc=60 then
  22.          begin
  23.             ora:=ora+1;
  24.             perc:=0;
  25.          end;
  26.          if ora=24 then
  27.          begin
  28.             ora:=0;
  29.             nap:=nap+1;
  30.          end;
  31.          if nap=7 then nap:=0;
  32.          if (mpkorr=10) and (mp=25)then  //a megszakítás késése miatti sec korrekció
  33.          begin
  34.             mp:=mp+1;
  35.             mpkorr:=0;
  36.          end;
  37.       end;
  38.    end;


Remélem tudtam segíteni.

Van több segítség is a neten a timer0-ás megszakítás számolására.
(#) gthomas hozzászólása Máj 21, 2013 /
 
Sziasztok!
Készítettem egy termosztátot, 16F690 -el és egy ds16s20. Szépen működik, csak a fogyasztással van problémám. Három db AAA elemmel működik, de egy hétvége alatt lemerítette az elemeket.
Most rendeltem egy 16LF1829-es alacsony fogyasztású procit, ezzel szeretném kiváltani a 16F690-et. (sleep módban 20nA!) Viszont ez a PIC 1,8-3,6 V-ról működik, tehát 2 db AA elem elég lenne, csakhogy a ds18s20 min 3V-ról működik. Milyen hőmérséklet érzékelőt használjak, hogy az egy tizedes pontosság meg legyen, és a ilyen kis feszültségen is működjön?
(#) zsoltee0001 válasza gthomas hozzászólására (») Máj 21, 2013 /
 
Szia
DS620
1.7V to 3.5V
resolution is User-Selectable to 10-, 11-, 12-, or
13-Bits (0.5°C, 0.25°C, 0.125°C, and 0.0625°C

Üdv
(#) gthomas válasza zsoltee0001 hozzászólására (») Máj 21, 2013 /
 
Köszi, nézem!
Hol lehet kapni?
A hozzászólás módosítva: Máj 21, 2013
(#) gapati hozzászólása Máj 26, 2013 /
 
Sziasztok!

Tud Valaki megoldást a nagyobb programok fordítására? Sajnos nekem nem akarja lefordítani, mivel túllépné a "határt".....

Köszönettel: gapati
(#) FPeter hozzászólása Júl 3, 2013 /
 
sziasztok!

valaki foglalkozott már itt I2C slave móddal? egy openwrt-s gpio bitbang i2c master buszra lenne rádugva egy PIC, és az OS kérdezgetne tőle - pár változót kellene tudnia átadnia a masternek

eddig jutottam, ez már némi életjelet ad, de még mindig zavaros:

(PIC12F1840)

  1. program I2C_Slave;
  2.  
  3. procedure Interrupt();
  4. var tmp : char;
  5. begin
  6.   if(SSP1IF_bit) then
  7.   begin
  8.     SSP1IF_bit := 0;
  9.     tmp := SSP1BUF;
  10.  
  11.     if (R_NOT_W_bit) then
  12.       SSP1BUF:=tmp;
  13.  
  14.     CKP_bit := 1;
  15.   end;
  16. end;
  17.  
  18. begin
  19.  
  20.   IRCF3_bit := 1; IRCF2_bit := 1; IRCF1_bit := 1; IRCF0_bit := 1      ;
  21.   ANSELA := 0;                       // Configure pins as digial
  22.  
  23.   SSP1IF_bit := 0;                   // Reset I2C Interrupt flag
  24.   PEIE_bit   := 1;                   // Peripheral Interrupt Enable
  25.   SSP1IE_bit := 1;                   // MSSP1 Interrupt Enable
  26.   GIE_bit    := 1;                   // Global Interrupt Enable
  27.   SSP1MSK    := 0xF0;                // Define Mask for address
  28.                                      //   (ingnore lower nible of address)
  29.   SSP1ADD  := 0xE0;
  30.   SSP1CON1 := 0x36;                  // Configure I2C in Slave mode
  31.   PCIE_bit := 1;
  32.   SEN_bit := 1;
  33.  
  34.   while(TRUE) do
  35.   begin
  36.  
  37.   end;
  38.  
  39. end.


saját értelmezésem szerint ilyenkor a lekérdezett regiszter számát kéne visszadobnia a buszra, de nem az történik, hanem egy a regiszterrel párhuzamos értéket ad vissza. viszont nem csak az E0-on reagál, hanem az E0-tól EF-ig dobál vissza a címzett regisztertől független, a címmel párhuzamos értékeket, amiben logikát se tudtam felfedezni

sajnos eddig nem találtam olyan példaprogramot amitől megvilágosodtam volna, tudna valaki segíteni hogy hogyan faragjam tovább a programot?
(#) progee hozzászólása Okt 11, 2013 /
 
Sziasztok!

Segítségre lenne szükségem!
A lányaimnak tönkrement egy éjszakai fény játéka: alvo-pluss-teknos-ejszakai-feny-csillagkepek
Egy 16F628A pic-vel szeretném megjavítani.
A program megírásánál viszont van pár dolog amit nem tudok megoldani.
A játék 3, különböző színű ledet tartalmaz, és 4 nyomógombot.
A gombok funkciói:
- 1. gomb: ki-bekapcsolja a játékot (sleep), és az első ledet bekapcsolja.
- 2. gomb: második ledet bekapcsolja
- 3. gomb: harmadik ledet bekapcsolja
- 4. gomb: a három ledet felváltva kapcsolja be 5 másodpercenként (halványítással)

Az alábbi kódot állítottam eddig össze:

  1. program Teknos;
  2.  
  3. var oldstate : byte;
  4.  
  5. begin
  6.   oldstate := 0;
  7.   CMCON := 0x07;
  8.  
  9.   TRISA := 0xFF;        // A lábak legyenek bemenetek
  10.   PORTA := 0;           // A lábak kikapcsolt állapotban legyenek
  11.   TRISB := 0;           // B lábak legyenek kimenetek
  12.   PORTB := 0;           // B lábak kikapcsolása
  13.  
  14.   while TRUE do
  15.   begin
  16.     if porta.ra0 = 1 then oldstate := 0;
  17.     if porta.ra1 = 1 then oldstate := 1;
  18.     if porta.ra2 = 1 then oldstate := 2;
  19.     if porta.ra3 = 1 then oldstate := 3;
  20.  
  21.     portb := 0;
  22.     case oldstate of
  23.       0: portb.rb0 := 1;
  24.       1: portb.rb1 := 1;
  25.       2: portb.rb2 := 1;
  26.       3: begin
  27.            portb.rb0 := 1;
  28.            delay_ms(5000);
  29.            portb.rb0 := 0;
  30.            portb.rb1 := 1;
  31.            delay_ms(5000);
  32.            portb.rb1 := 0;
  33.            portb.rb2 := 1;
  34.            delay_ms(5000);
  35.          end;
  36.     end;
  37.   end;
  38. end.



Amiket nem sikerül megoldanom:

- Ugyanazzal a gombbal ki és be is kapcsoljon a készülék. Sleep-módba sikerül tenni, de ugyanazzal fel is éleszteni már nem megy. Próbáltam a 6-os lábra (INT) tenni egy nyomógombot, és annak megfelelően átkötni és átprogramozni, de nem működött.
Reset-el sikerül feléleszteni, csak az ugye már egy ötödik gomb lenne...

- Ha a színeket elkezdi átváltani, akkor nem sikerül a ciklusból kiléptetnem, csak ha folyamatosan nyomom a kettes, vagy hármas gombot. A működő játéknál alapból bármikor lehetett váltani, hogy folyamatos világítást kérek, vagy a színváltást.

Remélem túl tud lendíteni valaki a problémákon!
A hozzászólás módosítva: Okt 11, 2013
(#) gapati hozzászólása Okt 13, 2013 /
 
Sziasztok!

PIC16F689-es pic-nek szeretném kimenetként használni a RA portját. Valamit nem jól konfigurálok, de nem tudom hogy mit. Tudna valaki segíteni?
  1. OSCCON  := %01100000;              //4 MHz, internal clock
  2.  
  3.   ANSEL   := 0;                      // Configure AN pins as digital I/O
  4.   ANSELH  := 0;
  5.   C1ON_bit := 0;                     // Disable comparators
  6.   C2ON_bit := 0;
  7.  
  8.  
  9.   TRISA  := %00001000;               // Set RA0 pin as Output.
  10.  
  11.   TRISB  := %10100000;               //
  12.   TRISC  := %11000000;
  13.  
  14. //  SetBit(PORTA, 4);
  15. //  SetBit(PORTA, 5);


Valami még kellene, mert nem kapcsolja be az RA4-RA5-öt.
Köszönettel: gapati
(#) progee válasza gapati hozzászólására (») Okt 13, 2013 /
 
  1. TRISA := 0; //minden A-láb legyen bemenet
(#) progee válasza gapati hozzászólására (») Okt 13, 2013 /
 
hibás kommentet írtam. ha a trisa-t nullára állítod, akkor az összes A-láb kimenet lesz.
A hozzászólás módosítva: Okt 13, 2013
(#) gapati válasza progee hozzászólására (») Okt 13, 2013 /
 
Szia!

Ez még nem elég neki. a 9. sorban én is azt mondtam neki. (RA3 bemenet, a többi kimenet.)
Következő: »»   23 / 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