Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1039 / 1320
(#) icserny válasza sgt hozzászólására (») Dec 3, 2011 /
 
Nekem nincs időm/kedvem alaposan átnézni az alkalmazási mintapéldát, de te nézd meg alaposabban, mert szerintem valamit félreérthettél benne! Én úgy láttam, hogy akkor törli a lapot, amikor lefoglalja, használatba veszi, nem pedig akkor, amikor abban hasznos adatot tárol.
(#) Dave87 hozzászólása Dec 5, 2011 /
 
Remélem valaki rákukkant erre a témára még... A következő kódnak a lényege az lenne, hogy ha cnt eléri a 200-at akkor RA.0-t LO-ba állítja. Na de. cnt-t a programon belül lenullázzom többször is, az elágazásban lévő feltétel
  1. if (cnt = 200) and (futes = true) then
mégis igaz értéket ad. Miért lehet ez?

Íme a teljes kód:

  1. program USART_RX;
  2. var             temp : string[20];
  3.     i, kapcs, cnt    : byte;
  4.     futes            : boolean;
  5.  
  6. procedure Main_Init;
  7. begin
  8.  CMCON  := %00000111;
  9.  VRCON  := 0x0;
  10.  
  11.  OPTION_REG := %10000100;
  12.  TMR0       :=  96;
  13.  cnt        :=   0;
  14.  INTCON     := %10100000;
  15.  
  16.  cnt:=0;
  17.  futes := false;
  18.  
  19.  TRISB := %00000010;
  20.  TRISA := %00000000;
  21.  
  22.  
  23.  PORTA.2 := 0;
  24.  PORTA.0 := 0;
  25.  
  26. // clrwdt;
  27.  USART_Init(2400);
  28. end;
  29.  
  30. procedure interrupt;
  31. begin
  32.    cnt := cnt + 1;   // increment value of brojac on every interrupt
  33.    TMR0   := 96;
  34.    INTCON := $20;          // set T0IE, claer T0IF
  35. end;
  36.  
  37. begin
  38. Main_Init;
  39.  
  40. kapcs:=10;
  41.  
  42. //PORTA.1 := 1;
  43. PORTA.2 := 1;
  44.  
  45. WHILE TRUE DO
  46.  BEGIN
  47. //  clrwdt;
  48.   temp := '';
  49.   i:=0;
  50.  
  51. if usart_data_ready() = 1 then
  52.   begin
  53.    Usart_Read_Text(temp,'OK');
  54.  
  55.    i:= Strstr(temp,'BEKAPCS');
  56.    if (i <> $FF) then
  57.      begin
  58.       inc(kapcs);
  59.       cnt := 0;
  60.      end else
  61.      begin
  62.       i:= Strstr(temp,'KIKAPCS');
  63.       if (i <> $FF) then
  64.        dec(kapcs);
  65.     end;
  66.  
  67.  
  68.    if (cnt=200) and (futes = true) then
  69.     begin
  70.       PORTA.0 := 0;
  71.       kapcs := 10;
  72.       futes := false;
  73.       cnt := 0;
  74.      end else cnt := 0;
  75.  
  76.    
  77.    if kapcs=15 then
  78.     begin
  79.     kapcs:=10;
  80.     PORTA.0 := 1;
  81.     futes := true;
  82.     end else
  83.    if kapcs=5 then
  84.     begin
  85.     kapcs:=10;
  86.     PORTA.0 := 0;
  87.     futes := false;
  88.     end;
  89.    end;
  90.  END;
  91. end.
(#) icserny válasza Hp41C hozzászólására (») Dec 6, 2011 /
 
Idézet:
„Microchip 20-40%-os év végi akció 2012.01.05 -ig...”
Leárazták a Microstick-et is, de meggondolandó, hogy azt érdemes-e választani, vagy az új Microstick II-t, ami több (állítólag minden 28 lábú PIC24, dsPIC33 és PIC32) típust támogat. Az indulókészletben négy mikrovezérlő található, melyek közül kettő (PIC24FJ64GB002, PIC32MX220F032) USB képes.

Ha valaki a kezébe kaparint, nézze már meg, hogy ennek a PC-hez csatlakoztatásakor csak egy HID eszköz jelenik meg, vagy ad virtuális soros portot is? (Fizikailag minden megvolt hozzá a Microstick I.-ben is, mégsem csinálták meg a lusta szoftveresek!).
(#) kissi válasza Dave87 hozzászólására (») Dec 7, 2011 /
 
Szia!

Idézet:
„(cnt = 200) and (futes = true) then”
Ezek ÉRTÉKADÁSOK, nem feltételek!!
Steve
(#) Hp41C válasza kissi hozzászólására (») Dec 7, 2011 /
 
A forrás pascal nem C...

C nem nincs :=, <>, procedure, begin, end, stb...
(#) trudnai válasza Dave87 hozzászólására (») Dec 7, 2011 /
 
Idézet:
„idézet:
?(cnt = 200) and (futes = true) then?
Ezek ÉRTÉKADÁSOK, nem feltételek!!”


Ez Pascal (vagy JAL?) , szoval itt az egyenloseg jel ('=') az 'if' feltetelben nem ertek adas, hanem ossze hasonlitas (ez C-ben lenne problema, nalad nem ez a baj szerintem).

Most csak igy feluletesen atnezve a programod: A 'cnt' egy timeout ertek szeretne lenni? Magyaran, hogyha nem erkezik meg valami a kommunikacios csatornan idoben, akkor tudjal valamit csinalni?

Nem tudom, hogy hogyan lehet megadni a Pascalnak (JAL-nak?), hogy a megszakitasod-ban hasznalt valtozok volatile-ok legyenek, azaz ne probalja meg kioptimalizalni a fordito? Ennek olvass utana elso korben szerintem.
(#) Hp41C válasza Dave87 hozzászólására (») Dec 7, 2011 /
 
Szia!

Biztos jó ez a sor?
  1. INTCON := $20;          // set T0IE, claer T0IF


Ez letörli a GIE bitet is...
(#) kurtyka hozzászólása Dec 7, 2011 /
 
Sziasztok!

A következő problémával fordulnék hozzátok:
4db dsPIC30F4012-t kellene együtt elindítani változó tápfeszültség felfutási idők mellett. Próbáltam simán delay-el, brown-out változtatásokkal, +64ms POR van jelenleg beállítva, de úgy tapasztaltam, van amelyik elindul, van amelyik nem és a fizikai reset sem különösképpen indítja el. Mintha letapadna, a dsPIC-ekkel csak most ismerkedem, remélem Ti már találkoztatok hasonló problémával. Esetleg valami tanácsot tudnátok adni?

Előre is köszönöm a válaszotok!

Üdvözlettel,
Balázs
(#) kissi válasza Hp41C hozzászólására (») Dec 7, 2011 /
 
Bocs, ezt elnéztem, előtte C-t nézegettem...

Steve
(#) Dave87 válasza Hp41C hozzászólására (») Dec 8, 2011 /
 
Sajnos nem értek még annyira a PIC programozáshoz. Sok hiba volt a programban amiket nagy nehezen meg tudtam oldani, rájöttem mit rontottam el, de itt egyszerűen nem tudom. Akárhogy nézem a pic adatlapját nem tudom mit rontok el. Már ott elszakad a cérna, hogy ha a cnt-nek 0 értéket adok, ez miért nem történik meg? A timer használatát azt a mikropascal példaprogramokból próbáltam összeollózni, de ezek szerint azokkal sem stimmel valami...
(#) Hp41C válasza Dave87 hozzászólására (») Dec 8, 2011 /
 
Szia!

Készíts egy projectet a kontrollerhez az MpLab programmal, töltsd be a lefordított hex -et. Állítsd be az MpSim -et debuggernek. Tegyél töréspontot a 4 címre (és oda ahova még szeretnél). Lépésenként tudod végrehajtani a kódodat, lehet futtatni is töréspontig. A Watch ablakban megtekintheted a változóidat - persze előbb ki kell deríteni melyik változó melyik címen van...

A net -ről letöltött programokat ne tekintsük biztosan működőknek - sok hajszálat kímélünk meg, ha átnézzük őket...
(#) Dave87 válasza Hp41C hozzászólására (») Dec 8, 2011 /
 
A mikropascal debuggerjében már megcsináltam ezt, ott "futes" értéke amikor kellett igaz volt, illetve hamis amikor azt az értéket adtam neki. A cnt értéke az "interrupt"-ban változik az a rész viszont nem fut le. de ha a főprogramban növelem az értékét akkor ez meg is történik illetve ha 0-ba állítom ez is teljesül. Azt nem értem miért van az, hogy egyszer belép a szóban forgó elágazásba, egyszer meg nem.

  1. if (cnt=200) and (futes = true) then



A mP példaprogramjai közt így néz ki a timer kezelése 16f628-ban:

(nekem 16f628a van, nem tudom ez jelent-e valamit ilyen szempontból)

  1. program Tmr0;
  2.  
  3. var brojac, a, b : byte;
  4.  
  5. procedure interrupt;
  6. begin
  7.    brojac := brojac + 1;   // increment value of brojac on every interrupt
  8.    TMR0   := 96;
  9.    INTCON := $20;          // set T0IE, claer T0IF
  10. end;
  11.  
  12. begin
  13.   a := 0;
  14.   b := 1;
  15.   OPTION_REG := $84;       // assign prescaler to TMR0
  16.   TRISB  :=   0;           // designate portb as output
  17.   PORTB  := $FF;           // initialize portb
  18.   brojac :=   0;           // initialize brojac
  19.   TMR0   :=  96;
  20.   INTCON := $A0;           // enable TMRO interrupt
  21.  
  22.   repeat
  23.     begin
  24.       if brojac = 200 then // if brojac is 200, then toggle portb leds and reset brojac
  25.          begin
  26.            PORTB  := not(PORTB);
  27.            brojac := 0;
  28.          end;
  29.       end;
  30.   until 0 = 1;
  31. end.


Ez alapján próbáltam a sajátomat is életre kelteni, de nem sikerült. "Bizonytalanul" működik ez a része.
(#) kurtyka válasza kurtyka hozzászólására (») Dec 8, 2011 /
 
Sziasztok!

Közben megoldódott a dolog. Hogy tanulságos legyen, az volt a baj, hogy a PLL nem működött 20MHz-es kristállyal. Kikapcsolva a PLL-t már működött szépen. Sajnos adatlap nem elolvasási hiba volt részemről. Ezenkívül ajánlatos a tápot rendesen szűrni és pufferelni a dsPIC-nek.

Jó munkát kívánok mindenkinek!
(#) Robotsyte hozzászólása Dec 11, 2011 /
 
Sziasztok
Egy olyan kérdésem lenne, hogy neten szinte minden kapcsolás forrás fájlját hex-ben teszik fel. Én mikroc-ben szoktam programozni. Meg lehet valahogy, hogy a hex fájlt átvigyem c++ környezetbe?
(#) edison14 hozzászólása Dec 11, 2011 /
 
Szevasztok!
LM335-ös hőérzékelővel készítek hőmérőt és elérkeztem egy olyan ponthoz amit nem nagyon tudok megcsinálni. A hőmérséklet negatív kijelzéséről lenne szó. Az alábbi programban látható hogy hogyan alakítom át a beolvasott értéket C fokra:
  1. procedure temp1;
  2. begin
  3.  
  4.   temp := A2D_Get(0);
  5.   temp := (temp * 5) - temp1_cal;
  6.   TXREG := 48+(((temp mod 1000) mod 100) div 10);
  7.   TXREG := 48+((temp mod 1000) div 100);
  8.   TXREG := 48+(temp div 1000);
  9.  
  10. end;


A temp1_cal értéke 2731 mivel a beolvasott ADC értéket szorzom öttel ekkor a hőmérsékletet Kelvinben kapom meg és ebből kivonom a 2731-et és megkapom a Celsius hőmérsékletet. Itt kéne valahogyan megoldani, hogy ha a beolvasott érték szorozva öttel kisebb lenne mint a 2731 akkor kitegyen egy negatív jelet a kijelzőre és számoljon tovább. Tehát ne mindenféle hibás karaktert kapjak hanem amint eléri a 0-át és átmenne negatívba vegye le az előjelet és a megkapott számot írja ki a kijelzőmre.
(#) p_istvan válasza Dave87 hozzászólására (») Dec 11, 2011 /
 
Szervusz!
Most nem igazán tudtam követni, hogy mikor megy és mikor nem. (debuggerben vagy nélküle)
De ha lehetséges az, hogy a megszakítás kétszer vagy többször is le tud futni mielőtt a cnt változó értékét vizsgálod, akkor az "IF (cnt=200)" nem mindig fog teljesülni, mert közben már 200-nál nagyobb lehet a cnt értéke.
Ha ez így van, akkor a feltétel vizsgálatban ne engedd 200 fölé nőni a cnt értékét...
(#) Hp41C válasza edison14 hozzászólására (») Dec 11, 2011 /
 
- Az 5. sor után írd be a következőket:
if (temp<0)
{
uart_send(ord("-"));
temp:=-temp;
}

- A TXREG nem írható akármikor, csak ha a PIR1.TXIF == 1. Ez a jelzőbit a TXREG íraás után automatikusan törlődik.

Máshová:

procedure uart_send(byte ch);
begin
while(TXIE) do:
TXREG := ch;
end;>
(#) icserny válasza Robotsyte hozzászólására (») Dec 11, 2011 /
 
Idézet:
„neten szinte minden kapcsolás forrás fájlját hex-ben teszik fel”
A helyzet az, hogy ez nem a forrásfájl, s ebből nem is állítható helyre a forráskód.
(#) Szpidi hozzászólása Dec 11, 2011 /
 
Van valakinek ötlete arra, hogy a 18FxxK80-as családot hogyan lehetne PK2-vel programozni? Nekem gyári van, de nem támogatott a K80.
(#) p_istvan válasza p_istvan hozzászólására (») Dec 11, 2011 /
 
Idézet:
„feltétel vizsgálatban”
helyesen a "megszakításban" ne engedd 200 fölé nőni a cnt értékét.
(#) Stefan válasza Szpidi hozzászólására (») Dec 11, 2011 /
 
Support List szerint PIC18F26K80 támogatva van, esetleg egy "device file" frissítés segíthet
(#) Szpidi válasza Stefan hozzászólására (») Dec 11, 2011 /
 
Szia!
Köszönöm a gyors választ, nem vettem észre. Sajnos nekem attól több láb kell, egész konkrétan a 18F46K80 programozására keresek megoldást. A vicc, hogy a chip már itthon van, nem is gondoltam volna, hogy gyári programozóval nem fogom tudni beírni a programot.
(#) Hp41C válasza Szpidi hozzászólására (») Dec 11, 2011 /
 
Sajnos firmware frissítés nélkül nem fog menni... Ugyanis a programozási leírásukban nem szerepel a teljes törlés (chip erase). A területeket egyedileg kell törölni, amihez tartozó batch nem fér el a PICKit2 egy batch számára fenntartott helyén.
Vegyünk PICKit3 -at, most év végi akció van...
(#) Szpidi válasza Hp41C hozzászólására (») Dec 11, 2011 /
 
Hol van év végi akció? A csipkednél néztem, ott nem láttam akciós árat PK3-ra.
(#) Hp41C válasza Szpidi hozzászólására (») Dec 11, 2011 /
 
Itt... PICkit 3 Debug Express @ 13.280 Ft+áfa
(#) Szpidi válasza Hp41C hozzászólására (») Dec 11, 2011 /
 
A PK3 Debug Express az egy programozó + egy demo board, nem? Nekem a kiegészítő panel csak plusz költség most. A programozó az 10700+ÁFA. De az nem akciós ár.
Azt jól gondolom, hogy a programozó az debug-olni is tud?
(#) Hp41C válasza Szpidi hozzászólására (») Dec 11, 2011 /
 
Igen.
(#) Szpidi válasza Hp41C hozzászólására (») Dec 11, 2011 /
 
Köszönöm. Akkor nekem csak programozó kell. Sajna az nem akciós.
(#) zsolti900 hozzászólása Dec 12, 2011 1 /
 
Sziasztok! Most kezdtem a PIC-el foglalkozni és az lenne a kérdésem hogy ha pl én egy PIC-es led vilogtatót akarok készíteni, akkor azt mivel tudom beprogramozn? Mi kellene hozzá? esetleg ehez van valamiféle kapcsolási rajz hogy megépíthessem?
(#) icserny válasza zsolti900 hozzászólására (») Dec 12, 2011 /
 
Idézet:
„Most kezdtem a PIC-el foglalkozni”
Akkor nem a haladólnak való topikot kellett volna választani!
Idézet:
„egy PIC-es led vilogtatót akarok készíteni, akkor azt mivel tudom beprogramozni?”
Bármivel, ami az adott PIC programozási (értsd: "programbeégetés") specifikációjának megfelel. JDM programozóval ne próbálkozz!
Idézet:
„esetleg ehhez van valamiféle kapcsolási rajz hogy megépíthessem?”
Mármint a programozóhoz? Igen, a "Kapcsolások" szekció PIC rovatában, pl. LPT mini két változatban.
Következő: »»   1039 / 1320
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