Fórum témák

» Több friss téma
Fórum
Keresés
Lapozás: OK   2 / 29
(#) GPeti1977 válasza progee hozzászólására (») Jan 24, 2018
Kell hogy legyen, a back emf módszerrel a motor tekercseinek feszültsége leosztva komparátorokat kapcsolgat, ebből lehet tudni hol áll a forgórész és melyik tekercsre kell feszültséget kapcsolni.
(#) progee válasza GPeti1977 hozzászólására (») Jan 24, 2018
Nem forog. A hdd motorokon nincs visszacsatolás.

Csak átmásolom ide is a teljes leírást:

Idézet:
„4 kivezetéses HDD motort szeretnék beüzemelni.
Műszerrel kimértem a tekercsek közös pontját, majd egy ULN2003-as modulon keresztül próbálom meghajtani 16F628A PIC-el, melyen mikropascalban írt kód fut.

A kódot 4 tekercsesre módosítva, teszteltem a modulhoz kapott 4 tekercses léptetőmotoron, mely mind a valóságban, mind proteuson tesztelve működik (bár hozzáteszem eléggé lassan).
HDD motornál viszont csak lassú forgást, rángatódzást, ULN2003 melegedést sikerül elérnem.
A mikropascal kódot próbáltam sokféleképpen variálni, netes leírásokra támaszkodva.
(Egymás után léptetve a tekercseket, párosával léptetve a tekercseket, időzítéseken variálni, nyomógombbal csökkenteni az időközöket, ezzel gyorsítani folyamatában)

A motor lábainak bekötése úgy gondolom rendben van, mivel a közös pontot kimértem, 3 tekecsnél pedig nem lehet sorrendet téveszteni.
Vagy a modul gyenge a 12V-os motorhoz, vagy a kódban van a probléma...”


ULN2003 modul
A hozzászólás módosítva: Jan 24, 2018
(#) GPeti1977 válasza progee hozzászólására (») Jan 24, 2018
Miért mit nem csinál? Ha nincs visszacsatolás a motor pozícióról (HALL, back EMF, enkóder) nem biztos hogy forogni fog.
(#) progee hozzászólása Jan 24, 2018
Sziasztok!

HDD motor működtetésével kapcsolatban kértem segítséget az arra aktuális topicban, de mivel valószínűleg MikroPascal kód hiba állhat a sikertelenségem mögött, ezért ide is bemásolnál a topic hivatkozását:

HDD motor beüzemelése mikropascal kóddal

Az említett kód 16F628A PIC-hez, mely ULN2003-on keresztül vezérelné a motort:

  1. program HDD_motor;
  2. begin
  3.   delay_ms(100);
  4.   cmcon := 0x07;
  5.  
  6.   trisb := 0;       //B lábak kimenetek
  7.   portb := 0;       //Minden B láb kikapcsol
  8.  
  9.   while true do
  10.   begin
  11.     portb.1 := 1;  //1. tekercs be
  12.     portb.3 := 0;
  13.     delay_ms(100);
  14.    
  15.     portb.2 := 1;  //2.tekercs be
  16.     portb.1 := 0;
  17.     delay_ms(100);
  18.  
  19.     portb.3 := 1;  //3.tekercs be
  20.     portb.2 := 0;
  21.     delay_ms(100);        
  22.   end;
  23. end.
(#) 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
    
(#) 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.
(#) 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;
(#) Hp41C válasza glaci hozzászólására (») Szept 10, 2015
if (kerdes and 2)=0 then kerdes:=kerdes or 1;
(#) glaci válasza gthomas hozzászólására (») Szept 10, 2015
Köszi
(#) 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 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.
(#) 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
(#) egonka92 válasza zenetom hozzászólására (») Feb 1, 2015
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
(#) 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 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
(#) Prendick válasza zenetom hozzászólására (») Jan 7, 2015
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.
(#) 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
Maximálisan. Csak programkorlát van benne, egyébként full verzió.
(#) 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?
(#) glaci válasza progee hozzászólására (») Okt 12, 2014
Köszi tökéletes a megoldás.
(#) 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 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
(#) 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
(#) 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
(#) 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.
(#) 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
(#) 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.
(#) 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 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
(#) 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 .
Következő: »»   2 / 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