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   19 / 29
(#) bbb válasza Rasiel hozzászólására (») Nov 22, 2011 /
 
Szia!

Ugyan nem mikropascal, de pont most találtam egy cikket a hackaday oldalon, ami ezzel a kérdéssel foglalkozik.
(#) Szpidi válasza gapati hozzászólására (») Nov 23, 2011 /
 
Szia,
Én hónapokkal ezelőtt nézegettem, de akkor belső Vref-et használtam és nem érdekelt. Ha jól emlékszem, akkor van egy javított A/D könyvtár, amivel lehet külső referenciát használni. De most nem találom, pedig nekem is kellene...
(#) gthomas hozzászólása Nov 27, 2011 /
 
Sziasztok! Egy rádiós hőmérőt építek, TX-4MSIL adóval és BC-NBK vevővel. Az adó és vevő nélkül az adó out-ját a vevő in -jével összekötve tökéletesen működik a kapcsolás. Ha berakom az adót és a vevőt, nem jönnek a korrekt adatok. Szerintem a szinkronizálással lehet a baj. Készített már valaki ilyet? Esetleg egy példa program nincs nektek? Régebben már készítettem egy ilyet, akkor csak próbapanelen. Akkor a man_synchro -t kellett addig hívogatni, amíg egy megfelelő értékkel tér vissza. Ez akkor 62 volt. De most az akkor írt program sem működik. Beszúrom ide:[code=c] begin
ErrorCount := 0;
ANSEL := 0; // Configure AN pins as digital I/O
ANSELH := 0;
C1ON_bit := 0; // Disable comparators
C2ON_bit := 0;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD display
Lcd_Out(1,1,'Start');
delay_ms(200);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);

sync:=5;
Man_Receive_Init();


while TRUE do // Endless loop
begin

Lcd_Cmd(_LCD_FIRST_ROW); // Move cursor to the 1st row

while sync<>62 do
begin
delay_ms(200);
sync:=man_synchro;
bytetostr(sync,st);
lcd_out(1,1,st); // Initialize Receiver
end;
Lcd_Cmd(_LCD_CLEAR);


while TRUE do // Wait for the "start" byte
begin
temp := Man_Receive(error); // Attempt byte receive
if (temp = 0x0B) then // "Start" byte, see Transmitter example
break; // We got the starting sequence
//if (error <> 0) then // Exit so we do not loop forever
// break;
end;

repeat
begin
temp := Man_Receive(error); // Attempt byte receive
if (error <> 0) then // If error occured
begin
Lcd_Chr_CP('?'); // Write question mark on LCD
Inc(ErrorCount); // Update error counter
if (ErrorCount > 20) then // In case of multiple errors
begin
while temp<>62 do
temp := Man_Synchro(); // Try to synchronize again
//Man_Receive_Init(); // Alternative, try to Initialize Receiver again
ErrorCount := 0; // Reset error counter
end;
end
else // No error occured
begin
if (temp <> 0x0E) then // If "End" byte was received(see Transmitter example)
Lcd_Chr_CP(temp); // do not write received byte on LCD
end;
Delay_ms(10);
end;
until ( temp = 0x0E );






end; // If "End" byte was received exit do loop
end.

--------------------------------------------------------------
MI lehet a gond?
(#) proli007 válasza gthomas hozzászólására (») Nov 28, 2011 /
 
  1. begin
  2.   ErrorCount := 0;
  3.   ANSEL := 0; // Configure AN pins as digital I/O
  4.   ANSELH := 0;
  5.   C1ON_bit := 0; // Disable comparators
  6.   C2ON_bit := 0;
  7.   Lcd_Init(); // Initialize LCD
  8.   Lcd_Cmd(_LCD_CLEAR); // Clear LCD display
  9.   Lcd_Out(1,1,'Start');
  10.   delay_ms(200);
  11.   Lcd_Cmd(_LCD_CLEAR);
  12.   Lcd_Cmd(_LCD_CURSOR_OFF);
  13.  
  14.   sync:=5;
  15.  
  16.   Man_Receive_Init();
  17.  
  18.   while TRUE do // Endless loop
  19.   begin
  20.     Lcd_Cmd(_LCD_FIRST_ROW); // Move cursor to the 1st row
  21.   while sync<>62 do
  22.  
  23.   begin
  24.     delay_ms(200);
  25.     sync:=man_synchro;
  26.     bytetostr(sync,st);
  27.     lcd_out(1,1,st); // Initialize Receiver
  28.   end;
  29.  
  30.   Lcd_Cmd(_LCD_CLEAR);
  31.  
  32.   while TRUE do // Wait for the "start" byte
  33.   begin
  34.     temp := Man_Receive(error); // Attempt byte receive
  35.     if (temp = 0x0B) then // "Start" byte, see Transmitter example
  36.     break; // We got the starting sequence
  37.     //if (error <> 0) then // Exit so we do not loop forever
  38.     // break;
  39.   end;
  40.  
  41.   repeat
  42.     begin
  43.        temp := Man_Receive(error); // Attempt byte receive
  44.        if (error <> 0) then // If error occured
  45.        begin
  46.          Lcd_Chr_CP('?'); // Write question mark on LCD
  47.          Inc(ErrorCount); // Update error counter
  48.          if (ErrorCount > 20) then // In case of multiple errors
  49.          begin
  50.            while temp<>62 do
  51.            temp := Man_Synchro(); // Try to synchronize again
  52.            //Man_Receive_Init(); // Alternative, try to Initialize Receiver again
  53.            ErrorCount := 0; // Reset error counter
  54.          end;
  55.       end
  56.       else // No error occured
  57.       begin
  58.         if (temp <> 0x0E) then // If "End" byte was received(see Transmitter example)
  59.         Lcd_Chr_CP(temp); // do not write received byte on LCD
  60.      end;
  61.      Delay_ms(10);
  62.    end;
  63.    until ( temp = 0x0E );
  64.    end; // If "End" byte was received exit do loop
  65. end.


Valahogy így nem?
(#) gthomas válasza proli007 hozzászólására (») Nov 30, 2011 /
 
Így már sokkal jobb, de a lényegen mit sem változtat!
(#) proli007 válasza gthomas hozzászólására (») Dec 1, 2011 /
 
Hello!
Így igaz. De ha olvashatatlan a program formátuma, akkor kevésbé lesz valaki lelkes, ha segíteni akar..
üdv! proli007
(#) zsoltee0001 hozzászólása Jan 22, 2012 /
 
sziasztok

Ha nyomógombként deklarálom az egyik bemenetet
  1. nyomogomb : sbit at Gpio.2;

Viszont a nyomógomb pont minuszt kapcsol, hogy tudnám a programmal megértetni, hogy a Low érték tulajdonképpen az 1?
Üdv
(#) vilmosd válasza zsoltee0001 hozzászólására (») Jan 22, 2012 /
 
A programodban beolvasod a portbitet, es negalod a beolvasott bit erteket. Es maris ott az "1" ertek, ha a bemenet "0".
(#) zsoltee0001 válasza vilmosd hozzászólására (») Jan 22, 2012 /
 
ok, de ez hogy néz ki a gyakorlatba?
(#) zsoltee0001 válasza zsoltee0001 hozzászólására (») Jan 22, 2012 /
 
próbálkoztam mindennel.
nyomogomb := not(nyomogomb);
de nem segít, az a gáz, hogy erre a problémára még csak rá se tudok guglizni, holott szerintem egy pofonegyszerű dolog (annak aki csinált ilyet)
(#) vilmosd válasza zsoltee0001 hozzászólására (») Jan 22, 2012 /
 
Nem vagyok pascalos, de esetleg a mintapeldakbol leshetnel egy kicsit. C-ben igy csinalom
  1. inbit=~nyomogomb;
Persze a pascalnal nem tudom hogy jelzik a negalast.
Esetleg a telepitett mintapeldakba kellene belelesni, vagy a Mikroe oldalon szetnezni a nem keves irodalomban. A C-re pl van egy igen komoly leiras, gondolom basicra, es pascalra szinten irtak valami par soros ismertetot (par szaz oldal).
(#) zsoltee0001 válasza vilmosd hozzászólására (») Jan 22, 2012 /
 
sajnos ez uPascalba nem működik, már próbáltam.
(#) vilmosd válasza zsoltee0001 hozzászólására (») Jan 22, 2012 /
 
Szoval....
1.: Ha elkezdesz egy programnyelvvel programozni eloszor is meg kell ismerni a sajatossagai, operatorait, adattipusait, es ugy altalanosan mindent. E-nelkul ez nem programozas, hanem kinlodas, es a tobbiek molesztalasa.
2.:A MikroE oldalan talalhato egy 586 oldalas "User Manual" , kb 2.5 MB mintapeldat. Ezek letoltese es reszletes tanulmanyozasa nagyban fog segiteni az elorehaladasban.
(#) m.joco válasza zsoltee0001 hozzászólására (») Jan 22, 2012 /
 
Hello
Valahol a programodban nyilván vizsgálod a nyomogomb változó értékét. Nem értem, hogy miért gond a nyomogomb nullás értékét venni "megnyomott" állapotnak:
pl. if nyomogomb = 0 then ...
Egyébként a nyomogomb változót nem tudod invertálni, mert az egy bemenet (macro). Ha viszont neked mégis fontos, hogy 1 legyen a gomb állapotát jelző változó értéke megnyomáskor, akkor ezt tudom elképzelni megoldásnak: gomb:= not nyomogomb;
A gomb pedig egy bit típusú változó, és a programban ennek az értékét vizsgáld.
Üdv.
(#) zsoltee0001 válasza m.joco hozzászólására (») Jan 24, 2012 /
 
Szia
Nem rossz módszer, csak az a gond, hogy a ciklus elején meg kell értetni , hogy gomb:= not nyomogomb.
Én meg pont ezt akartam elkerülni, de azért köszi.
Üdv
(#) Ktulu válasza zsoltee0001 hozzászólására (») Jan 24, 2012 /
 
Szia.
Miért nem használod a beépített "Button" függvényt?
  1. if Button(GPIO, 2, 1, 0) then ...

Az oldalamon találsz rá példát.
(#) zsoltee0001 válasza Ktulu hozzászólására (») Jan 24, 2012 /
 
Szia
Szoktam használni, úgy tudom csak pergésmentesítésre használatos, ráadásul ennél nem lehet elnevezni a portot, csakis a gpio-val lehet rá hivatkozni.

Apropó, olyan függvényt nem tudsz véletlen, ami ennek gyakorlatilag az ellentettje, szóval x időn belül érkezik-e jel?
Üdv
(#) zsoltee0001 hozzászólása Feb 23, 2012 /
 
Sziasztok
Sípoltatni akarok piezzot. Valami jobb megoldás kellene, mert ez:
  1. Sound_Init(PORTD, 3);
  2.   Sound_Play(880, 5000);

Brutálisan nyeli a memóriát.
Üdv
(#) Dave87 hozzászólása Márc 3, 2012 /
 
Sziasztok!

3x4-es (matrix) keypad kezelésében tudna valaki segíteni? Egész pontosan a lenyomott gombot kéne kideríteni, de sajnos a mP beépített library-je nem jó, mert az külön porton lévő oszlop/sort nem kezeli, nekem meg a PORTC-n és D-n vannak Mellékeltem egy képet a bekötésről is, remélem tudtok segíteni, mert én sajnos nem vagyok elég tapasztalt ehhez :pirul:

keypad1.png
    
(#) zsoltee0001 válasza Dave87 hozzászólására (») Márc 3, 2012 /
 
Szia
Valami hasonló módszer létezhet, mint az lcd lábkiosztásának deklarációjánál, bár példát én se láttam
rá.
Próbálgatni kell
  1. var keypadPort : sbit at rb1_bit;
(#) Dave87 válasza zsoltee0001 hozzászólására (») Márc 3, 2012 /
 
a keypadport magának a keypad-nek a portját adja meg, ahová a sorok és oszlopok lábai vannak kötve, külön külön nem lehet megadni, hogy 1-es sor RB.3, 2-es sor RB.5.. Már próbálkoztam saját rutint kitalálni, de elvesztem a sok 1 és 0 közt
(#) m.joco válasza Dave87 hozzászólására (») Márc 3, 2012 /
 
Hello
Szerintem muszáj lesz saját keypad-szkennelő rutint írnod.
A dolog úgy működik, hogy ha keypad-en pl. megnyomod a 7-es gombot, akkor keypad összeköti az 1-es és C lábát. Nos, a PIC 28:30 lábának bemenetnek kell lennie jelen esetben, a 23:26 -nak pedig kimenetnek.
A PIC 23:26 lábait 0-ra állítod. Ezután a keypad A lábára magasat kapcsolsz és megnézed, hogy a keypad 1, 2, 3 lába közül melyik van alacsony, vagy magas szinten. Amelyik magas szinten van, ott az a gomb van megnyomva. Így megtudod, hogy az első sorban melyik gombok vannak megnyomva. Ezután ugyanígy végigmész az összes soron. Ha már érzékeled, hogy meg van nyomva az egyik gomb, akkor a függvényed adja vissza az annak a gombnak megfelelő számot. Ilyen keypad-del csak egyszerre egy gomb lehet megnyomva.
Egyébként megkérdezhetem, hogy milyen programmal rajzoltad ezt a kapcsolási rajzot?
Üdv.
(#) Dave87 válasza m.joco hozzászólására (») Márc 3, 2012 /
 
Szia!

Köszönöm, én is kb ez alapján a logika alapján próbáltam megírni, a szkennelő rutint, csak nem sikerült, de neki esek mindjárt megpróbálom újból. A rajzot a "ISIS Professional" programmal csináltam, ezzel kompletten le lehet szimulálni a pic-be égetett program működését is.
(#) m.joco válasza Dave87 hozzászólására (») Márc 3, 2012 /
 
Ha nem működne, akkor tedd fel ide a kódot és meglesem.
Üdv.
(#) Dave87 válasza m.joco hozzászólására (») Márc 3, 2012 /
 
Szia!

Nos sikerült végül nagy nehezen megcsinálni, de a kód az gusztustalan lett, mindenesetre megosztom veled/veletek. Egyelőre ez így működik, de ha valaki le tudná ezt egyszerűsíteni, nagyon hálás lennék érte!

Tehát íme a kód:
  1. function read : char;
  2. var sor, portn: byte;
  3. label done;
  4. begin
  5.  result := 0;
  6.  
  7.  PORTC := PORTC xor %10000000; //RC.7 bekapcs
  8.  for portn := 4 to 6 do
  9.   begin
  10.    if PORTD.portn = 1 then
  11.     begin
  12.      result := chrs[portn-4];
  13.      goto done;
  14.     end;
  15.   end;
  16.  
  17.  if result<>0 then exit;
  18.  
  19.   PORTC := PORTC xor %11000000; //RC.7 kikapcs 6 be
  20.    for portn := 4 to 6 do
  21.     begin
  22.      if PORTD.portn = 1 then
  23.       begin
  24.        result := chrs[portn-1];
  25.        PORTC := PORTC xor %11000000;
  26.        goto done;
  27.       end;
  28.     end;
  29.  
  30.  if result<>0 then exit;
  31.   PORTC := PORTC xor %01100000; //RC.6 kikapcs 5 be
  32.    for portn := 4 to 6 do
  33.     begin
  34.      if PORTD.portn = 1 then
  35.       begin
  36.        result := chrs[portn+2];
  37.        goto done;
  38.       end;
  39.     end;
  40.  
  41.  if result<>0 then exit;
  42.   PORTC := PORTC xor %00110000; //RC.5 kikapcs 4 be
  43.    for portn := 4 to 6 do
  44.     begin
  45.      if PORTD.portn = 1 then
  46.       begin
  47.        result := chrs[portn+5];
  48.        goto done;
  49.       end;
  50.     end;
  51.  
  52. done:
  53.  PORTC.7 := 0;
  54.  PORTC.6 := 0;
  55.  PORTC.5 := 0;
  56.  PORTC.4 := 0;
  57. end;
(#) Dave87 válasza Dave87 hozzászólására (») Márc 4, 2012 /
 
Kis változás: Szimulációban működött jól, a valóságban csak az első oszlop (1,4,7,*) működik...
(#) progee hozzászólása Ápr 1, 2012 /
 
sziasztok!

16f pic után elkezdtem foglalkozni 12f675 pic-vel.
sajnos nem sikerült sok próbálkozás után sem megoldani egy darab led villogtatását gpio-n keresztül.
így próbálkoztam:

  1. TRISIO := 0;
  2.  
  3. while true do
  4.   begin
  5.       GPIO.2 := 1;
  6.       delay_ms(100);
  7.       GPIO.2 := 0;
  8.       delay_ms(100);
  9.    end;


korábbi hozzászólásokban olvastam, hogy a CMCON:=7; sorral még ki kell egészítenem az elején, de sajnos azzal sem működik.

tudnátok segíteni?
(#) Dave87 válasza progee hozzászólására (») Ápr 1, 2012 /
 
Ha jól látom, a lábak nincsenek átállítva digit. I/O-ba.
  1. ANSEL := 0;
(#) progee válasza Dave87 hozzászólására (») Ápr 1, 2012 /
 
már ezt is próbáltam. trisio elé és után is.
sajnos nem segített.

  1. TRISIO := 0;
  2.    CMCON:=7;
  3.    ANSEL := 0;


érdekesség, hogy a 3-as lábára rakott led, folyamatosan világít, bármilyen kódot is írok a pic-re.
nem tudom ezt mi okozhatja.
(#) zsoltee0001 válasza progee hozzászólására (») Ápr 1, 2012 / 1
 
3. láb világítása miatt, mi van beállítva oszcillátorként?
A project/edit menüpontban:
Internal rc no clock legyen beállítva oszcillátornak.
Üdv
Következő: »»   19 / 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