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   27 / 29
(#) Hp41C válasza progee hozzászólására (») Ápr 7, 2014 /
 
Sleep módból a következők tudják felébreszteni a 16F88x -et:
Külső reset, watchdog, RB0 - INT bemenet, Timer1 átfordulás (aszinkron számláló), ECCP capture esemény, A/D konverzió vége, EEProm írás vége, komparátor kimenet változás, változás figyelő (IOC), Eusart break és I2C slave állapotváltás. Az teheti meg, amelyik működése engedélyezett és megszakítás engedélyező bitje is 1 értékű (kivéve watchdog és reset).
Lehet a timer1 -et használni sleep alatt: aszinkron szálmálóként letiltott megszakításkéréssel vagy a megszakítás kérésére újrainicializálva és űjra sleep állapotba küldeéssel. Az utóbbi esetben a főprogramnak meg kell különböztetni a timer1 átfordulást a tényleges felébresztéstől.
(#) janikukac hozzászólása Máj 10, 2014 /
 
Szép napot kedves fórumozók!
Van-e itt egy kedves társunk, aki programozó, és akad 10 perc szabadideje? Mert ha lenne egy ilyen kolléga, akkor kellene 1 kis segítség. Van egy program, amiben 1D tömb van, és nekem nehézséget okoz. Pascal-os program(mit tehetek, ezt tanítják), s ellenőrző lesz belőle, de sehogyan sem értem a működését az első ciklus után. Szóval kellene egy nagyon egyszerű nyelven fogalmazott magyarázat, hogy mi miért van, minek mi a szerepe, de jól érthetően!
A program szövege nagyon egyszerű:
Idézet:
„Beolvasni n elemét a tömbnek, sorbarendezni őket csökkenő sorrendben, s e rendezett elemeket kimutatni egy új sorban, elválasztva üres hellyel!”

Mellékeltem a Pascal filet, remélem mielőbb kapok segítséget. Sokatoknak ez rutinmunka, nekem életmentés! Üdv!

P44.PAS
    
(#) Hp41C válasza janikukac hozzászólására (») Máj 10, 2014 /
 
Szia!
Ez az un. buborék rendezés.
Működése röviden:
Kettős ciklussal a kisebb értékű elemet előrébb helyezzük. Ha lefut a kettő sciklus, az elemek nagyság szerint rendezett sorban lesznek a tömbben.
Részletesebben:
Egy ciklussal végigvizgáljuk a tömb elemeit a 0 indextól az (n-1) indexig (azért nem n -ig, mert a soron levő elem utáni elemeket is vizgáljuk). A belső ciklusban az első ciklus által kiválasztott elemet követő elemekre megvizsgáljuk, hogy kisebb-e, mint az első ciklus által kiválasztott elem. Ha kisebb az első ciklus által kiválasztott elemmel felcseréljük. Így a belső ciklus utolsó lefutása után a tömbben levő legkisebb értékű elem a tömb legelső indexű elemébe kerül. Ekkor a külső ciklus változóját növeljük - azaz a további feladat olyan, mintha az 1 indextől egy elemmel kisebb tömböt rendeznénk...
(#) janikukac válasza Hp41C hozzászólására (») Máj 11, 2014 /
 
Köszönöm, ez egy kicsit bonyolult még így is, de remélem meg fogom érteni...
(#) glaci hozzászólása Szept 10, 2014 /
 
Sziasztok!
18f4520-ra szeretnék több megszakítást csinálni. Az egyik a tmr0 1 sec megszakítással,ez adja az időzítéseknek a számlálandó impulzusokat. A másik, az ra5 és re0 lábakon levő nyomógombok együttes lenyomása adna egy megszakítást és belépne egy menübe, a harmadik az az rb0-rb1-rb2 lábakon létrejött szintváltozás adna megszakítást és attól függően, hogy melyik lábon történt változás (pl: zárlati esemény), az lcd-n megjelenik a kiváltó esemény.
A timer megszakítás működik, de a menübe lépés megszakítása még nem. Így azt úgy oldottam meg, hogy a timer megszakításba tettem az ra5 és re0 lábak figyelését és az esemény egy regiszter egy bitjét állítja át és ezt a bitet main programban vizsgálva tudok a menübe lépni, de úgy érzem ez nem elegáns, a zárlat figyelésről nem is beszélve .
(#) glaci válasza glaci hozzászólására (») Szept 10, 2014 /
 
itt az a progi ami nem működik




  1. section
  2.  
  3. var inter_flag:byte;
  4. .
  5. .
  6. .
  7. procedure pic_init()
  8. begin
  9. .
  10. .
  11. .
  12. .
  13.     intcon.rbie:=1; //rb port szintváltozás
  14.     inter_flag:=0;
  15.  
  16. end;
  17. procedure initTimer0();
  18. begin
  19.   T0CON         := 0x86;
  20.   TMR0H         := 0x48;
  21.   TMR0L         := 0xE5;
  22.   GIE_bit         := 1;
  23.   TMR0IE_bit         := 1;
  24. end;
  25.  
  26.  
  27. procedure interrupt_timer0(); iv 0x0008; ics ICS_AUTO;
  28. begin
  29.   if (TMR0IF_bit) then
  30.   begin
  31.     TMR0IF_bit := 0;
  32.     TMR0H         := 0x48;
  33.     TMR0L         := 0xE5;
  34.     //ide jön a programnak az a része ami a számlást végzi további felhasználásra
  35.     if portd.0=1 then portd.0:=0 else portd.0:=1;
  36.   end;
  37. end;
  38.  
  39. procedure Interrupt_menu_figyel(); iv 0x0018; ics ICS_AUTO;
  40. begin
  41.    if (rbIF_bit) then
  42.    begin
  43.       intcon.rbif:=0;
  44.       if (portb.5=0) and (portb.4=0) then
  45.       begin
  46.          inter_flag.0:=1;
  47.          intcon.rbie:=0;
  48.       end;
  49.    end;
  50. end;
  51.      
  52. begin
  53.   { Main program }
  54.   pic_init();
  55.   InitTimer0();
  56.   while (TRUE) do
  57.     begin
  58.       if inter_flag.0=1 then     //menübe lépés jelző bit vizsgálat
  59.       begin
  60.         inter_flag.0:=0;
  61.         intcon.rbie:=1;
  62.         menu();
  63.       end;
  64.  
  65.     end;
  66. end.
A hozzászólás módosítva: Szept 10, 2014
(#) vilmosd válasza glaci hozzászólására (») Szept 10, 2014 /
 
A port interrupt torleshez elobb egy port olvasast kell csinalni.
(#) glaci válasza vilmosd hozzászólására (») Szept 10, 2014 /
 
Szia!
Ezen pontosan mit ertsek? Mit olvasok és mit torlok?
Egy kis pelda jol jonne.
(#) gapati hozzászólása Szept 11, 2014 /
 
Sziasztok!

Szeretném megkérdezni, hogy foglalkozott-e már valaki grafikus kijelzővel. Valamiért nem sikerül használni az xGLCD unit függvényeit.

Köszönettel:gapati
(#) progee válasza glaci hozzászólására (») Szept 11, 2014 /
 
A nyomógombok állapotát ne az interrupt-ban vizsgáld, hanem a fő programrészben, pergésmentesítéssel.
Egyébként nem látok porta.5 és porte.0 lábakra hivatkozást a kódodban.
(#) vilmosd válasza glaci hozzászólására (») Szept 12, 2014 /
 
Azt kell erteni ezen, hogy mikor valtozas van a porton, es bebillen az IT flag (RBIF), elobb irni, vagy olvasni kell a portot, hogy torolhesd a flagot. mikropascal-ban nem programozok, tehat igy peldat sem tudok prezentalni. Viszont esetleg valami C forrast tudok feltenni holnap. Abbol lathato lesz hogyan is van ez. Talaltam egy peldat a mikroE oldalon:
  1. if (INTCON.RBIF == 1)
  2.      {
  3.        PORTD = 0xff;
  4.        delay_ms(500);
  5.        PORTD = 0x00;
  6.  
  7.        x = PORTB;
  8.        INTCON.RBIF = 0;
  9.        }
A lenyeg remelem lathato. Eloszor olvassuk a portot, majd toroljuk a flaget. Persze ezt at kell tenni pascalra, mivel ez C.
A hozzászólás módosítva: Szept 12, 2014
(#) gapati válasza vilmosd hozzászólására (») Szept 12, 2014 /
 
Sziasztok!

Én rögtön az elején törlöm, mivel ha fontos az időzítés, akkor így pontosan egyformák lesznek az idők. Aztán rutánna jöhet a többi tendő, persze az inerrupt a lehető legrövidebb legyen. (Bocs, hogy én nem a PORTB IT flag-re adok példát, de szerintem ott is mükszik.)


  1. procedure Interrupt();
  2.   begin
  3.     if (T0IF_bit) then              // rtcc interrupt?
  4.     begin
  5.       T0IF_bit := 0;               //  clr TMR0 int flag
  6.       TMR0     := 96;
  7.       //Enter your code here
  8.       if idb = 200 then               // 1 másodperc
  9.         begin
  10.           idb         := 0;
  11.           Time_Update := 1;
  12.           PORTA := PORTA Xor %00100000;                   //RA5
  13.           controllByte := controllByte xor %00001000;     //Villogó


A billentyü lekérdezést a főprogramba végezd:
  1. //Belépés az óra beállításba
  2.           if Button(PORTC, 2, 50, 1) then oldstate := 255;     //Óra gomb lenyomása
  3.           if oldstate and Button(PORTC, 2, 50, 0) then
  4.               begin
  5.                 if Gomb_set = 0 then
  6.                   begin
  7.                     //LED2 := 1;      //Zöld



Üdv:gapati
(#) glaci hozzászólása Okt 12, 2014 /
 
Sziasztok!
Szeretnék functiot írni, azzal a céllal, hogy a program különböző helyén keletkező szöveget, kiírassak lcd-re.

  1. function kiir(x:string[20];n1,n2:byte);
  2.    begin
  3.       lcd_out(n1,n2,x);
  4.    end;


fordításnál kiakad a fordító:

61 343 Complex type parameter must be passed by reference proba.mpas
61 304 Syntax error: Expected ")" but "n1" found proba.mpas
61 304 Syntax error: Expected ":" but "," found proba.mpas
61 337 Unknown type "n2" proba.mpas
61 304 Syntax error: Expected ";" but ":" found proba.mpas
61 304 Syntax error: Expected "begin" but "byte" found proba.mpas
61 373 Routine 'kiir' is missing implementation proba.mpas
61 304 Syntax error: Expected ";" but "byte" found proba.mpas
61 304 Syntax error: Expected "." but ")" found proba.mpas
0 102 Finished (with errors): 12 okt. 2014, 17:49:24 proba.mpppi

Hogy lehet ezt megoldani?
A hozzászólás módosítva: Okt 12, 2014
(#) progee válasza glaci hozzászólására (») Okt 12, 2014 /
 
A stringet külön deklaráld változóként, ill, ha értéket nem ad vissza a funkció, akkor egy procedure is elegendő;

  1. var x:string[20];
  2.  
  3. procedure kiir(var x:string[20]; n1,n2:byte);
  4.  begin
  5.    lcd_out(n1,n2,x);
  6.  end;
(#) glaci válasza progee hozzászólására (») Okt 12, 2014 /
 
Köszi tökéletes a megoldás.
(#) zenetom hozzászólása Jan 7, 2015 /
 
Hali!
Letöltöttem az ingyenes verziót, amiben 2k program korlát van. Mennyire optimalizál a fordítója?
(#) Prendick válasza zenetom hozzászólására (») Jan 7, 2015 /
 
Maximálisan. Csak programkorlát van benne, egyébként full verzió.
(#) zenetom válasza Prendick hozzászólására (») Jan 7, 2015 /
 
Köszi a választ!
És fordításnál készít teljes asm fájlt a fordító? Csak mert az előbb buildoltam egy példaprogramot, de csak egy része volt az asm fájlban, amiből hiányoztak még pl. a rutinok deklarálása. Viszont a fordításnál nem találtam "emészthető" include fájlokat..
(#) Prendick válasza zenetom hozzászólására (») Jan 7, 2015 / 1
 
Elég furcsán csinálja ezeket a dolgokat. Az asm-be csak az általad írt részt fordítja be, a teljes programot az lst fájlban lehet megnézni, de abban mindenféle más is van. Gondolom nem akartak újrafeldolgozható asm forrást. Az lst-ből azonban egy szövegszerkesztővel és némi rabszolgamunkával ki lehet csalni.
(#) egonka92 hozzászólása Feb 1, 2015 /
 
Helló Mindenkinek!

A következő probléma miatt szeretném a segítségetek kérni. Egy PIC16F886 és az alábbi szervo vezérlő IC Bővebben: Link között próbálok két napja I2C kommunikációt kialakítani, de az nem akar semmire sem reagálni. A dokumentációja alapján nem lenne bonyolult, hisz csak küldeni kell neki a megfelelő regiszterbe értékeket, de a leírtak alapján nem mozdulnak meg a szervo motorok.
Az alábbi kóddal próbálkozom:
  1. I2C1_Init(100000);                  
  2.  
  3. I2C1_Start();           // issue I2C start signal
  4. I2C1_Wr($50);          // szervo_cime 0-0 állásnál +W
  5. I2C1_Wr($3C);             // On/Off output kapcsoló On állás (60 as regiszter)
  6. I2C1_Wr($01);          // elozo erteke
  7. I2C1_Stop();            // issue I2C stop signal
  8.  
  9. I2C1_Start();           // issue I2C start signal
  10. I2C1_Wr($50);          // szervo_cime 0-0 állásnál +W
  11. I2C1_Wr($00);             // szervo cime
  12. I2C1_Wr($7F);          // szervo ciméhez tartozó érték
  13. I2C1_Stop();            // issue I2C stop signal
  14. delay_ms(2000);


Leírom pontosan, hogy is néz ki az egész, és hogy eddig mivel próbálkoztam. Az IC címlábait egy 10kOhm-os ellenállással a GND-re kötöttem, így a címe 40(0x28) lett. Próbálkoztam ezzel a címmel először, de aztán rájöttem, hogy ebben nincs benne az írásra utasító bit, ezért ezt még hozzátettem, így lett belőle 80(0x50). A konfiguráláskor egy belső regiszter, a 60 értékét kell 1-re állítani, hogy megjelenjenek a jelek a kimeneten. A szervok regiszterei 0-11 ig vannak, az erre küldött értékek jelennek meg a megfelelő számú szervora kötött kimeneten.
Végigpróbáltam ezeket a regisztereket, a 60-ra már küldtem 0x01 et, és 0xFF-et is, ennek a regiszter címét is megtoldottam már írásbittel, de semmi. Hiába foglalkoztam már egy iránytű modullal kapcsolatban ezzel a kommunikációval (és az könnyen, gyorsan, jól működött), itt nem tudom, mit ronthattam el, de az IC-re kötött szervók meg sem mozdulnak. Az IC valószínűleg működik, mert ha soros porton át, a PIC-en keresztül küldve a megfelelő bytokat bizonyos bytokat bizonyos sorrendbe bevesz, ha pedig nem a protokoll szerint járok el, akkor megáll a program a PIC-ben. A zavar ott van, hogy 40-es, és 80-as címen is beveszi ezeket a küldött értékeket. Egyszerűen tanácstalan vagyok, hogy hol a hiba.
Valakinek valami ötlet esetleg, vagy valaki találkozott már hasonlóval?
A válaszokat előre is köszönöm!

Üdvözlettel: Egon
(#) zenetom válasza egonka92 hozzászólására (») Feb 1, 2015 /
 
Szia!
Bár nincs tapasztalatom ennél a programnál de így biztosan jó az init?
Idézet:
„I2C1_Init(100000);”

Ott a zárójelben mit adsz meg? Ha bináris formában adod meg, azt nem kéne valahogy jelölni, illetve mind a 8 bitet kiírni (még ha a legfelső 2 bit 0, akkor is)?
(#) egonka92 válasza zenetom hozzászólására (») Feb 1, 2015 / 1
 
Helló!

Itt elvileg a zárójelben megadjuk az I2C kommunikáció sebességét frekvenciában (decimális számként), ami ebben az esetben 100kHz. Ez a már említett iránytűs programomban működött, szerintem máshol lesz a hiba.

Üdv: Egon
A hozzászólás módosítva: Feb 1, 2015
(#) egonka92 válasza egonka92 hozzászólására (») Feb 4, 2015 /
 
Helló Mindenkinek!

Végül sikerült megtalálni a hibát, ami csak részben volt szoftveres. A TRISC teljesen kimenetre volt állítva, miután erre rájöttem, a kommunikáció elindult a fent leírtak szerint. Azonban a szervók még mindig rángatóztak, nem akartak pontosan beállni, ráadásul a 0. kimenet nem is csinált semmit. Végül itt lett a másik hiba, ugyanis ez és a táp között egy szabad szemmel nem is látható rövidzárlat volt. Ez zavarta be az egész IC-t, miután megszüntettem, tökéletesen működik . Sőt, mivel kezelése egyszerű, ajánlom is az IC-t, ha valaki több szervót kíván egyszerre vezérelni.

Üdvözlettel: Egon
(#) glaci hozzászólása Szept 10, 2015 /
 
Sziasztok!
Régen programoztam mikropascalban, sokat felejtettem. Kérek egy kis segítséget!
Hivatkozhatok egy változó bitjére így pl:
.
.

var kerdes:byte;
kedes.0:=kerdes0;
kerdes.1:=kerdes1;
.
.
if kerdes1=0 then kerdes0:=1;

Vagyis, ha a kerdes nevű változó első bitje 0, akkor a kerdes nevű változó nulladik bitje legyen 1.
(#) gthomas válasza glaci hozzászólására (») Szept 10, 2015 /
 
A help-ből:

function TestBit(register, rbit : byte) : byte;

procedure SetBit(var register : byte; rbit : byte);

Üdv!
(#) glaci válasza gthomas hozzászólására (») Szept 10, 2015 /
 
Köszi
(#) Hp41C válasza glaci hozzászólására (») Szept 10, 2015 /
 
if (kerdes and 2)=0 then kerdes:=kerdes or 1;
(#) ha1drp válasza glaci hozzászólására (») Szept 10, 2015 /
 
var
kerdes : byte;
kerdes0 : sbit at kerdes.0;
kerdes1 : sbit at kerdes.1;

if kerdes1=0 then kerdes0:=1;

vagy ha nincs definiálva a bit:
if kerdes.1=0 then kerdes.0:=1;
(#) glaci válasza ha1drp hozzászólására (») Szept 10, 2015 /
 
Szia!
Köszi az infót. Ezt fogom alkalmazni, hogy ne kelljen megjegyezni, hogy melyik bitet milyen jelzésre állítottam be.
(#) glaci hozzászólása Máj 5, 2017 /
 
Sziasztok!
Segítséget szeretnék kérni LCD-n menü megjelenítésére, illetve a menüpontok kiválasztásával, almenü megjelenítésére, a legkevesebb memória felhasználásával.
Eddig úgy csináltam, hogy az egyes menüpontok között nyomógombokkal lépkedtem. Az aktuális menü pont pedig villogott. A megjelenítés while és case ciklussal történt, de zabálta a memóriát.
Tudna valaki egy memória kímélőbb módszert?
  1. procedure beallit_leptet();  //------------------excel 2. kép  Beállítás
  2. begin
  3.    Lcd_Cmd(_LCD_CLEAR);
  4.    LCD_Out(1,1,'Be ll t s');Char_aa(1,3); Char_ii(1,6);Char_aa(1,8);
  5.    j:=1;
  6.    while porta.5=1 do
  7.      begin
  8.        case j of
  9.        1:begin teszt_uzem_blink;datum_unblink;uzemiert_unblink;fuggveny_unblink; end;
  10.        2:begin teszt_uzem_unblink;datum_blink;uzemiert_unblink;fuggveny_unblink; end;
  11.        3:begin teszt_uzem_unblink;datum_unblink;uzemiert_blink;fuggveny_unblink; end;
  12.        4:begin teszt_uzem_unblink;datum_unblink;uzemiert_unblink;fuggveny_blink; end;
  13.        end;
  14.        if Button(PORTB, 5, 15, 0) then j:=j+1;    //beallítás fel
  15.        if j>4 then j:=1;
  16.        if Button(PORTB, 4, 15, 0) then j:=j-1;   //beállítás le
  17.        if j<1 then j:=4;
  18.        if button(portb,7,15,0) then  //---kiléps select
  19.        begin
  20.          case j of
  21.            1:teszt_uzem();
  22.            2:datum_be();
  23.            3:uzemi_ert();
  24.            4:fuggveny();
  25.          end;
  26.        end;
  27.      end;
  28. end;

LCD kép.jpg
    
Következő: »»   27 / 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