Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   882 / 1320
(#) watt válasza erdoszoli hozzászólására (») Jan 10, 2011 /
 
Ha nem akarsz kézfogásos kommunikációt, akkor tegyél egy-egy RS485 drivert a tx és az rx vonalra, akkor full duplex lesz. Van erre RS422 driver is, de szerintem drágább mint a két(4) 75176.
Ha ez a verzió nem tetszik, akkor neked kell vezérelned az adatirányokat az IC engedélyező lábaival és mindig tudnod kell, hogy melyik irányba van kiválasztva a vonal. PIC-PIC között ez jól működik, PC között akkor, ha te írod a PC programot is, de ha valami gyári programot akarsz használni, az tuti nincs erre felkészítve. Arról nem beszélve, hogy ha USB átalakítód van, akkor a DTR, RST lábakat nem biztos, hogy jól tudod vezérelni, így az irányokat nem tudod kiválasztani.
(#) erdoszoli válasza Hp41C hozzászólására (») Jan 10, 2011 /
 
Szia.
igen erről van szó. Magyarán a fogadás legyen aktiv szinte mindig, és csak arra az időre kapcsoljam át amig küldök valamilyen választ. Ez így megoldható akkor is ha egy terminálon keresztül szöveg kiírás és gépelés a válasz? Rs232 vonalon megvan ez a megoldás, magyarán tudom esetleg "kalibrálni" a PIC-et, utána már tényleg csak arrol lenne szó hogy egy adatcsomag ki kerül a vonalra és a kalibrálás szerint egyik feldolgozza a többi nem. Ez így ki is probálom , hátha
Köszi
(#) Hp41C válasza erdoszoli hozzászólására (») Jan 10, 2011 /
 
Szia!

Vannak olyan terminál programok, amikkel előre beírt üzenet(eket) lehet elküldeni. Ezekkel meg lehet valósítani a RS485 -ön való üzenet küldést is. Előre meg lehet szerkeszteni a táviratot, majd egy gombnyomásra el lehet küldeni. Az RS232 - RS485 konvertert úgy kell beállítani, hogy az adás közben ne kapcsolja ki a meghajtóit. A válasz vételével már nem lesz gond.
(#) Sanyi806 válasza Ideiglenes hozzászólására (») Jan 10, 2011 /
 
Sziasztok!

A függvény mint a neve is mutatja (Convert_To_Volts) ADC adatot konvertál stringé két tizedes jegy pontosságal, mégpedig a gyári CCS lib MCP4922.C -ben található függvény. Konvertálna...ha menne...és lehet vannak ügyesebb megoldások, de minek megírni, ha valaki(CCS) már megírta, csak sz*rul, vagy én vagyok ennyire kezdő csíra...mert most ismerkedem az LCD és ADC vel egy 400 szor égetett PIC16F84A -val, és tudom, nincs benne ADC, de a függvényeket/konverziókat lehet szimulálni, bár már haldoklik szegény.
Hiába a 10 -1 nem jó...
próbáltam már a sima kijelzőm "osztóját" is, átírva is, de nem...
  1. Data = (Data * 5) / 4095;// ADC * 5V /4095 (12bit)
  2.     ADC_Var.Volt[0] = Data%10;
  3.  If((Data / 100) > 0){ADC_Var.Volt[1] = (Data % 100) / 10;}
  4.  Else ADC_Var.Volt[1] = Data / 10;
  5.     ADC_Var.Volt[2] = Data / 100;

bele -tem, és mára feladom...
A segítségeket természetesen köszönöm!
(#) Ideiglenes válasza Sanyi806 hozzászólására (») Jan 10, 2011 /
 
Ebben a megoldásban mindjárt a 2-es sorban elvesztesz 9 bit információt. A muvelet eredmenye 0,1,2,3,4 vagy 5. Ebből már nehezen fogod előszedni a többi számjegyet.
Ha a CCS már megírta a függvényt, akkor te miért akarod "jobbítani"?

A feladatot átgondolva- ha jól értem -, a kijelződőn azt szeretnéd, hogy a 0.00 és 5.00 közé eső számok jelenjenek meg. Ez kilenc bit információ.
Továbbá azt szeretnéd, hogy a 0 bemeneti értéknél a kijelzőn 0.00 és a 4095 értéknél a kijelzőn 5.00 legyen látható. Mivel a 12 bitbe a 9 bit szépen belefér, ezért 16 bites számolásnál nagyobbra nem lehet szükség. Én most a tizedespontra vak leszek:
eredmeny = ( 500 * bemenet ) / 4095
!!! nem összetévesztendő ezzel:
eredmeny = ( 500 / 4095 ) * bemenet
Fontos tehát, hogy először a szorzás műveletet kell elvégezni, különben fontos információk vesznek el az osztáskor. Program oldalról ez azt jelenti, hogy 9bit szorozva 12 bittel = 21 bit. Ha 16 bitben szeretnénk maradni ( és miért ne? ), akkor a 21 az 5 bittel több, mint lehetne. Legalább 5 bittel tehát egyszerűsíteni kell a képletet ( 5 bit => 31 ). Több lehet, kevesebb nem, de sokkal többet sem érdemes választani, nehogy 12 bit alá szaladjunk.
A számolási képlet így alakul:
eredmény = ( 16 * bemenet ) / 132

16 / 132 = 0,121212 és 500/4095 = 0,122100, az eltérés elég kicsi 0,0008, szóval a módosítással nagy hibát nem vétünk és a számolással benne maradunk 16 bitben 16*4095 = 65520 < 65535
Remélem, tudtam segíteni. Mivel a CCS nem szabad szoftver, ahogy látom a weblapját, ezért ahhoz nem tudok mit szólni.

Majdnem elfelejtettem. Az eredmény 0 és 500 közé fog esni és egy 16 bites változót igényel. 16 bites bináris szám BCD kóddá alakítására a neten nagyon sok megoldást lehet találni, de legyen itt egy példa:
16bites bináris szám BCD kóddá alakítása C mintapélda
(#) Hp41C válasza Sanyi806 hozzászólására (») Jan 10, 2011 /
 
Szia!

Az előbb írtam, hogy 500 -ra számold át a 5V-ot:

  1. Void Convert_To_Volts(Long Int Data){
  2.   Long Int Temp; // Remélem 32 bites...
  3.   Byte I;
  4.   Temp = (Data * 500) / 4095;
  5.   ADC_Var.Volt[4] = '\0';
  6.   for(I = 3; I >=0; I--)
  7.    {
  8.      if (I==1)
  9.        ADC_Var.Volt[I] = '.'
  10.      else
  11.         {
  12.           ADC_Var.Volt[I] = (BYTE)(Temp %10) + '0';
  13.           Temp /= 10;
  14.         }
  15.    }


De van gyors, egyszerű és osztás, moduló nélküli kód is, ami tetszüleges szóhosszúságra megvalósítható..
(#) Ideiglenes válasza Hp41C hozzászólására (») Jan 10, 2011 /
 
Ebből se fog tanulni, mivel ez hibátlan.
(#) Sanyi806 válasza Ideiglenes hozzászólására (») Jan 10, 2011 /
 
Szia(sztok)!

Köszönöm a javaslatokat! A CCS Drivers könyvtárban van egy MCP3208.C -nevű file (ez egy 8 csatornás 12bit-es SPI A/D chip), melyből az utolsó függvényt kimásolom ide:
  1. void convert_to_volts( long int data, char volts[6]) {
  2.    BYTE i, d, div_h, div_l;
  3.    long int temp,div;
  4.  
  5.    div=0x3330;
  6.  
  7.    for(i=0;i<=4;i++) {
  8.      temp=data/div;
  9.      volts[i]=(BYTE)temp+'0';
  10.      if(i==0) {
  11.        volts[1]='.';
  12.        i++;
  13.      }
  14.      temp=div*(BYTE)temp;
  15.      data=data-temp;
  16.      div=div/10;
  17.    }
  18.    volts[i]='\0';
  19. }

Ugyanaz a chip csak 4 csatornával (MCP3204.C)
  1. void convert_to_volts( long int data, char volts[6]) {
  2.    BYTE i, d, div_h, div_l;
  3.    long int temp,div;
  4.    
  5.    div=4095/5;
  6.  
  7.    if(data>=4090)
  8.       data=4095;
  9.  
  10.    for(i=0;i<=4;i++) {
  11.      temp=data/div;
  12.    
  13.      volts[i]=(BYTE)temp+'0';
  14.  
  15.      if(i==0) {
  16.        volts[1]='.';
  17.        i++;
  18.      }
  19.      temp=div*(BYTE)temp;
  20.      data=data-temp;
  21.      div=div/10;
  22.    }
  23.    volts[i]='\0';
  24. }

Egész más...a két függvény! Vélemény?!
Én nem akarom jobbítani, csak a visszatérő string változót kívülre raktam, mert úgy nekem könnyebb vele dolgozni; de épp az a probléma, hogy a legfelső függvényt akartam használni, de nem jó! A probléma még mindig:
"A beadott adatokat 0..814-ig jól kezeli, de 815...818 között értelmetlen adatot ad a 0.00 formátum helyett 0.:0 és 0.:1 -ad vissza. 819-től a következő egyes helyiérték váltásáig megint jó de 1.99 -nél megint a feni hiba, 2.99 - 3.99 - 4.99 megint. Honnan szedi a kettőspontot?!" Magyarul az ad chip küld 817 -es adatot, beküldöm a függvénybe(MCP3208.C) és ezt kapom: 0.:8Volt nem ezt: 0.98Volt. Miért?!
Az MCP3208.C-ben a div miért 0x3330 ?! mikor az MCP3204.C-ben div=4095/5; és szerintem ez a jobb!
Mert Volt = ADC_Value * 5V / 4095(12bit)
A 4095/5 = 819; a 0x3330 = 13104 <- ez hol 12bit? - a 0x333 na az az 819 azaz 12bit. Rosszak a függvények ezért kértem segítséget, de a rossz div -re (0x3330) rájöttem, javítottam, de még mindig rossz, hisz, hogy osszam meg az LCD-n a használójával, hogy most éppen 0.98Volt van az egyes bemeneten, mikor nem bírom kiírni neki csak azt, hogy 0.:8Volt.
De írtam azt is, hogy átírva is próbáltam a 7 segmeses "drivert". Amúgy szerintem is az osztást kellene később, de látod, a gyári CCS (MCP3204.C) -nál először oszt a div -nél. Most akkor mi a helyes. Ide nekem már kevés a szamárvezető, valami durvább kellene...
Valaki legyen szíves egy alapot összedobni kommentel, mert megvadulok. Komolyan úgy érzem, csak nekem nem mennek ezek az alapok, másnál elsőre megy egy kazánvezérlő is, nálam meg...na mindegy.
Szívesen fogadok és köszönök minden segítséget!
Sanya
(#) Sanyi806 válasza Hp41C hozzászólására (») Jan 10, 2011 /
 
Bocsi, csak összekeveredtem, mert elkezdted írni a hszt, de közbe el kellett mennem, és megírtam, elküldtem, csak nem néztem, hogy közben írtatok -e.
Elnézést kérek és köszönöm a példát!

500 = 4095*5=20475 /4095 = 5 *100
adat= ((adc*5)/4095)*100; így is próbáltam, de nem megy...nem tudom...
(#) Sanyi806 válasza Hp41C hozzászólására (») Jan 10, 2011 /
 
Szia!

Köszönöm a segítő szándékú kódot, de rossz.
A szintax hibák javítása után már csak a fordító jelzi:
Warning 203 "main.c" Line 211(1,1): Condition always TRUE

Line 211: for(I = 3; I >=0; I--){
Javítva: for(I = 3; I >0; I--){

de nem megy, valszeg meghalt a 84A, hétvégére veszek újat. Csak a két tizedes számol 00-tól 15 ig, és utána megint 00 jön, az egész meg se mozdul.
Köszönöm a linket is, de még a C sem megy, nem,hogy az asm. A kódod a fő loop-ba került, mert kevés volt a memória:
  1. #include "C:\Pic_Proba\main.h"
  2. #include "C:\Pic_Proba\Lcd_1x16.c"
  3. #ZERO_RAM
  4.  
  5. Struct ADC_Record {
  6.  Byte Volt[5];
  7. }ADC_Var;
  8. int16 r; byte i; int16 Temp;
  9.  
  10. void main(){
  11. SET_TRIS_B(0b00000000);
  12. SET_TRIS_A(0b00000000);
  13. enable_interrupts(GLOBAL);
  14.    
  15. lcd_init();  lcd_putc("\f1234567890123456\n"); delay_ms(2000); lcd_putc("\f");
  16.  
  17.  do{
  18.   r++;
  19.  Temp = (r * 500) / 4095; ADC_Var.Volt[4] = '\0';
  20.  for(I = 3; I > 0; I--){
  21.  if (I==1) ADC_Var.Volt[I] = '.';
  22.  else{ADC_Var.Volt[I] = (BYTE)(Temp %10) + '0'; Temp /= 10;}
  23.  }
  24.  lcd_putc("\f"); lcd_gotoxy(1, 1);
  25.  printf(LCD_PUTC, " %s; %Ld;", ADC_Var.Volt, r);
  26.  
  27.  if(50==r)delay_ms(8000);
  28.  
  29.  delay_ms(50);
  30.  
  31.  } while (TRUE);
  32. }

Köszönöm mindenkinek!
Sanya
(#) Ideiglenes válasza Sanyi806 hozzászólására (») Jan 10, 2011 /
 
Sanya!

Rossz hírem van. A megvásárolandó picnek is ugyanez lesz a baja. A hiba a szoftverben van és emlékszem is, hogy hasonló helyzetben hogyan oldottam meg a problémát, de azt most nem fogom leírni.
A javaslatom továbbra is az, hogy hagyd ezt a gyári függvényt, mondhatnám szakadj le róla, mert nem jó. Mellékelek hozzá képet is, hogy lehessen látni mi a hiba. A kettőspont ugyebár azért jön elő, mert az adott helyiértékre 10 jön ki eredményül, ha a kiindulási érték 815. Miért is? Mivel ezt 4095/5-tel, azaz 819-el akarod osztani, ennek eredménye nulla. Az adat megy tovább a következő ciklusba, de az osztó már nem. Ott történik egy tizes osztás és elvész 4 bit. Túl sok információ. 815 / 81 = 10,... , de 815 / 81,9 = 9,...
A program egészekkel számol. Átírhatod 820-ra a div-et, de akkor annyi történik, hogy egy másik értéknél a következő helyiértéknél jelentkezik a probléma.

Szóval amint írtam a mért értéket átalakítod 0-500 közé eső számra, ez az előzőekben leírt 16 bites változókat igénylő egysoros feladat.
A következő lépés pedig ennek a számnak BCD kóddá történő alakítása a mellékelt oldalon található ejárással. Javasolom a másodikat, nekem eddig hibátlanul működött. Igaz, nem azt használom, mert lassú, de ha hiba volt, azt vettem elő.
Az ott közölt eljárás 5db számjegyet állít elő, ezek közé ékelsz be egy olyan sort, ami kiírja a tizedespontot, illetve nem íratod ki azokat a jegyeket, amiket nem akasz, hogy megjelenjenek.
Ezt a gyári függvényt meg hagyd a csudába!
(#) Hp41C válasza Sanyi806 hozzászólására (») Jan 10, 2011 /
 
Szia!

A hibák többsége a függvényt lezáró "}" hiánya okozhatta, kimaradt a másolásból.
A
  1. for(I = 3; I >=0; I--)
sornak nem az a baja, amit írtál, hanem az, hogy a BYTE előjel nélküli, az I sort intnek kellene lennie....

Szia
(#) lalca válasza Sanyi806 hozzászólására (») Jan 10, 2011 /
 
Ha lehet egy javaslatom.Én 20 voltos méréshatárra akartam 10 bites AD-val feszt mérni.A megoldásom:20.46V-ra kalibráltam az osztót.Azaz,ekkor oszt 5V-ra,eredmény=1023.Csak 2-vel szorozni,vagy ami még jobb,2 mérés eredményét összeadni,és megvan az eredmény.12 biteshez értelemszerűen 40.95,20.48,10.24.A mérés pontosságát nem befolyásolja.Természetesen,amennyiben megfelelnek ezek az értékek.Bár lefele ez nem feltétlenül igaz.
(#) nemgyuri válasza Ideiglenes hozzászólására (») Jan 10, 2011 /
 
Nagyon köszönöm az észrevételeidet. Első olvasatban nem is értettem miért írod, de ahogy újra megnéztem, a rutinomat rájöttem, hogy így bizony hibásan futhat. (PCLATH, CALL, bank!!!) Most ugyan jól megy, de ha bármit változtatok rajta, csak szívás lenne. Mégegyszer köszönöm!
A JDM-et én sem javasoltam, csak megemlitettem, hogy régebben nekem működött.
(#) Sanyi806 válasza Hp41C hozzászólására (») Jan 11, 2011 /
 
Sziasztok!

Köszönöm, hogy nem írtatok le teljesen, tudom, hogy pokoli nehéz a h... kezdőkkel.
Hp41C: signed int i; OK, megy a függvény. Kimenet: 0.00 ... 0.15 -> 0.00 ... 0.15 ezt ismétli. Akármit is mondasz, nálam ezt teszi; sajnos.
lalca: igen jó a megoldás, ideig óráig. mondjuk vezérlőt akarok a kazánhoz, ami 0..5Volt között szabályozza a fürdővíz hőfokot már csal, bár ez csak egy ostoba példa, de lehet szolár vezérlő, meg ezer más, de én szeretem, ha pontos és precíz amit "kiadok a kezemből".
Ideiglenes: értem. Nehezen fog menni, de leszakadok.
Ha sikerült minimális segítséggel (vilmosd válasza Sanyi806 hozzászólására (#883031)
Hali
Csak ugy halkan megkerdezem, hogy a RA4 rendelkezik felhuzo ellenallattal?
Mivel ez OD kimenet.." sikerült egy 3x7segmenses kijelzőt 2db 74HC595 ic-vel megírni akkor talán ez sem fog ki rajtam. Itt én is belefutottam "valamibe" és így orvosoltam:
If((Data / 100) > 0){Display_Var.Display_Digit[1] = (Data % 100) / 10;}
Else Display_Var.Display_Digit[1] = Data / 10;

Várjuk...ha lemegyek 0..500 közé nem lesz pontatlanabb? Úgy érzem sokkal pontatlanabb lesz. Jogos amit írsz a 0..500 -al és fel is fogom, csak pontatlan. Vezéreljünk egy 12bites D/A ic-t 0..500 -al a 0..4095 helyett?! Kb. 10 szer akkorák a lépések. Még a 0..2047 talán. Holnap leülök és kitalálok valami erre, mert bosszant, és ne a pic & ccs vigye már a puskát.

Pár órával később...
Megvan, működik az, csak:
" A "convert_to_volts" ugyanis csak a nyereség = 1 és unipoláris üzemmódban, a helyes eredmény.
Viele Grüße Üdvözlettel Bernd Bernd"
Bővebben: Link
Tehát szívok tovább.
Jó éjt!
(#) trudnai válasza Sanyi806 hozzászólására (») Jan 11, 2011 /
 
quote]ha lemegyek 0..500 közé nem lesz pontatlanabb?[/quote]

Mit szeretnel merni? 5V eseten az mar 10mV pontossag il felbontas. Van homerseklet es paratartalom kompenzalt 10mV-on beluli pontossagu feszultseg referenciad? Es precizios ellenallasok ha osztot allitasz be hozza?

Amugy pedig ugy ertelmeztem, hogy kazanhoz kellene. Ha 0..250 celsiusig mersz, akkor is az 500mV (0.5 fok) pontossag, csak elegendo az mar, vagy nem?
(#) Sanyi806 válasza trudnai hozzászólására (») Jan 11, 2011 /
 
Szia!

Minek vegyek olyan karórát, ami egyik nap siet 30mp-et, a másik nap meg késik, akkor már kicsit többet szánok rá, és veszek egy jót! Nem?! Vagy most úgy kellene gondolkoznom, hogy Á,jó az a parasztnak...
Azt hiszem, senki nem csinál magának sz*rt, már amennyire teheti, én viszont most tanulgatok/építgetek ráérek, és próbálkozom, közben idegesítelek benneteket, de főleg próbálok tőletek némi tudást szerezni. Ha mindenhol csalok ennyit, a mondjuk project végére már az a 10mV 2Volt lesz?!
A kazán és egyebek csak példa volt.
Tele van a net ilyenekkel:
  1. float convert_to_volts(long data){ return ((float)data*5.0/0xfff); }

De itt ez se megy, van olyan is ,hogy az 5.0 helyén csak 2.5 van; a referencia. Valami nagy turpisság van itt. Viszont csak int módba tudom kiíratni az adatokat, mert a pic ROM=100% RAM = 65 - 83% tehát lehet, hogy ez jó. Tényleg kell egy nagyobb pic.
Mennyivel másabb adatot ad vissza az MPC3208/04 unipoláris üzemmódban, mint single módban; erre holnap ma rákeresek.
Jó éjt!
(#) trudnai válasza Sanyi806 hozzászólására (») Jan 11, 2011 /
 
Persze, vegyel egy jot... de a 'jo karora' nem azt jelenti, hogy ra van irva 'Rolex'... tudod az csak egy felirat amit a Kinaiak is rairnak az oraikra...

Csupan arra akartalak ravezetni, hogy hiaba probalsz meg nagyobb felbontasban beolvasni, ha a referencia pontod annyira pontatlan, hogy az also 3-4 bit allandoan ugral. Hiaba allitasz be 2.45V-ot vagy mennyit ha 5-10%-os pontossagu ellenallasokkal probalod meg azt megtenni... Kb az adtal a sz*nak egy pofont effektust ered el csak ezekkel... A hasonlatodhoz megegyszer visszaterve: Veszel kutya dragan egy karorat amin nincs ido allitasi lehetoseg (mert nincs kalibralasi lehetoseged), egyik nap siet masik nap kesik ahogy mondtad (mert nem jo a referenciad), viszont cserebe marha szep rubintokkal, zafirtokkal es rozsaszin gyemantokkal van kirakva...

Na mindegy, nem szolok bele, csak figyelek, mert latom, hogy nem szivesen veszed a segito szandekot.

Amugy csak halkan jegyzem meg ebben a temaban a PICekkel szoktunk foglalkozni nem pedig a CCS C-vel, tehat az, hogy a CCS hogy konvertal vagy hogy nem es, mikent osztasz beagyazott C-ben, valamint, hogy mi modon lehet printf-el ezeket kiiratni az elegge offos itt.
(#) Sanyi806 válasza trudnai hozzászólására (») Jan 11, 2011 /
 
Szia!
Azért mondod, hogy nem szívesen veszem a segítő szándékot, mert nem fogadok el azonnal egy lehetőséget? Én magam írtam le, hogy jó a függvény csak nem single módban. Viszont találtam olyat is ami single módú, csak nálam nem megy.
Még lehet kapni 10%-os ellenállást?!
Mindegy, még véletlenül sincs kedvem vitatkozni, főleg, mert első szóra nem nyugszom bele valamibe, mert ha mindenki azt tenné, nem fejlődne a világ. Még ma keresgélek, és ha nincs eredménye, akkor "csalunk". (Ez kicsit ló nincs szamár is jó effektusnak tűnhet, pedig még véletlenül sem annak szántam) Hálás vagyok minden segítségért és kritikáért! A buta ember(én) a saját kárán tanul, de amit a szenvedése alatt megtanult, azt nem felejti el egykönnyen (PIC - CCS-re gondolok).
Mégegyszer köszönöm a segítségeteket!
Sanya
(#) icserny válasza Sanyi806 hozzászólására (») Jan 11, 2011 /
 
Nyilvánvaló pazarlás a float aritmetika és a printf függvény használata. Erre találták ki a fixpontos aritmetikát. Ha a kiíráshoz megkívánt pontossággal számolsz, kisebb egységekben (pl. V helyett , mV-ban, fok helyett tized-, vagy századfokban) akkor a számolás megoldható egészaritmetikával, a kiírás pedig úgy, hogy a megfelelő helyen odabiggyeszted a tizedespontot (vagy vesszőt).

A kiírást én így csinálom (ez C18 fordítóhoz készült, s _user_putc() az egy karaktert kiíró függvény):
  1. void outdec(long data, unsigned int ndigits) {
  2.  static char sign, s[12];
  3.  unsigned int i;
  4.      i=0; sign='+';
  5.      if(data<0) { sign='-'; data = -data;}
  6.      do {
  7.          s[i]=data%10 + '0';
  8.          data=data/10;
  9.          i++;
  10.          if(i==ndigits) {s[i]='.'; i++;}
  11.      } while(data>0);
  12.      _user_putc(sign);
  13.      do{
  14.          _user_putc(s[--i]);
  15.     } while(i);
  16.  }


A lebegőpontos aritmetikához egy megjegyzés:
  1. return ((float)data*5.0/0xfff)

Ilyeneket akkor csinálj, ha le tudod ellenőrizni a fordító által gyártott kódot! Nem biztos, hogy az általad kívánt sorrendben és számábrázolással végzi a műveleteket.
(#) Hp41C válasza Sanyi806 hozzászólására (») Jan 11, 2011 /
 
Szia!

A CCS oldaláról letölthető az MpLab Plugin, amivel az MpLab szimulátorában látható, nyomonkövethető a számítás...

RA4 -en nincs belső felhúzó ellenállás a 16F84(A) -ban...
(#) trudnai válasza Sanyi806 hozzászólására (») Jan 11, 2011 /
 
Nem az a baj, hogy nem nyugszol bele valamibe, hanem, hogy nem vagy hajlando elgondolkodni. Raaasul eleg urcsa stilusban irod meg a ketelyeidet: Mindenfele valos ervek nelkul erzelmi alapon irkalsz. Ez itt egy szakmai forum, igy itt szakmai ervek szoktak gyozni nem pedig hozongesek es beszolasok. A vilagot pedig nem az fogja elorebb vinni, hogy a meglevo tudast teljesen elutasitod, hanem, hogy a meglevot elsajatitod es hozza teszel vagy kitalalsz meg azokhoz ujabbakat. De ameddig nem ismered mit lehet tudni egy anyagrol, addig max a spanyol viaszkot fogod feltalalni - az is szep dolog csak ne legy azokra annyira buszke.

Ha pl. mar tudod, hogy mihez kell az A/D (mert ugye most azt irod a kazan csak peldanak volt megemlitve), akkor azt is ki fogod tudni szamolni mekkora felbontas kell neked (nem pedig vegyunk egy szuper-felbontasu analog-digital atalakitot mer' az milyen jo).
(#) szkrep hozzászólása Jan 11, 2011 /
 
Modell szervo vezérléséhez szeretnék 50Hz PWM jelet előállítani. Timeres megszakítással szokták előállítani, mert a hardveres pwm nem tud ilyen alacsonyra lemenni. Azért lenne nekem problémás a timerrel csinálni, mert kell egy megszakítás uart beérkező adatra is, az pedig megbolygatná az 50Hz-et úgyis.
Nem lenne megoldható, hogy a hardveres pwm jel frekvenciáját külső alkatrésszel leosztom? Elvileg ha kb 12,8kHz-re állítom, annak az 1/256 része pont 50Hz. Olvastam valahol hogy számláló IC-vel vannak ilyen dolgok; tudtok konkrét típust mondani?
(#) messer válasza szkrep hozzászólására (») Jan 11, 2011 /
 
Megcsinálhatód nyugodtan úgy hogy egy másik timert használsz a pwm.hezt és a pwm-hez használt timer megszakításának magasabb prioritást adsz mint a soroshoz használt timernek. Így nem lesz pontatlan a jel. De ha külső alkatrészt akarsz használni akkor a helyedben egy pici lábszámú olcsó pic ben megírnám az 50Hz-et a másik pic-ben meg a többi dolgot. Mivel másik pic csinálja az 50hz-et így még akár össze is tudod hozni a 2db pic-et mivel vannak ki és bemenetek.
(#) trudnai válasza szkrep hozzászólására (») Jan 11, 2011 /
 
A modell szervo nem erzekeny a pontos frekvenciara, csak az impulzus szelessegere. Eleg tag ido keretekkel dolgozhatsz, gyakorlatilag 16ms - akar 32ms-ig, csak mikor az impulzus szelesseget elkezded kiadni akkor arra ugyelj, hogy az pontos legyen. Ezt meg lehet ugy is oldani, hogy kritikus szekciot hozol letre, tehat arra az 1-2ms-nyi idore a PIC nem foglalkozik massal, nem fogad (mas) intterruptokat sem.

Amugy a hardware-es PWM-el az a gond igazandibol, hogy a modell szervonal mindig 5-10% kozott van a munka fazis. Tehat ha 10 bit felbontasu a PWM-ed, akkor a 20ms ugye ugye 1024 lepesben irhato le, de az 5%-os tartomany ami neked valojaban kellene az igy csupan 51 lepeskozt enged meg. Ez ugye azt jelenti, hogy ha 100 fokos szogelfordulast tesz meg a szervo karja akkor neked 2 fokos lepeskozeid vannak. Gyakorlatban akar 120-140 fok is lehet 1-2ms kozott, tehat 2.5 fokos lepeskoz valoszinusitheto ezzel a modszerrel. Ez legtobb modellezo es robot alkalmazashoz mar nem kielegito.
(#) szkrep válasza trudnai hozzászólására (») Jan 11, 2011 /
 
Végül is az is lehet hogy elég lesz főprogramban kiadni a frekit, és ha az uart megszakítást ad, addig alacsonyra húzom a szervót vezérlő lábat, hogy ne rángassa meg a szervót. (Távirányítás autó lesz a dolog vége, lényegében csak a fogatott számokat beírom a hajtómotor sebességének HW pwm-be, meg a kormány szervo helyzetébe). Ha lesz időm tényleg nekikezdeni, szerintem menni fog.
(#) Kisvé hozzászólása Jan 11, 2011 /
 
Helló!
Egy olyan problémám lenne, hogy 3 zsír új 16F877 közül egyet sem tud égetni a PIC KIT3.
PICkit 3 detected
Connecting to PICkit 3...
Firmware Suite Version...... 01.26.05
Firmware type......................Midrange
PICkit 3 Connected.
Device ID Revision = 00000006

Ezt kiírja úgy, mint eddig.
Majd ha bármit is próbálok csinálni vele ezt írja:
Programming...
Programming failed

Reading...
Read failed

Verifying...
Verify failed

Erasing...
Failed to erase device

Blank Checking...
The following memory regions failed blank check:
Program Memory
Address: 000000c0 Expected Value: 00003fff Received Value: 00000000
Blank check failed

Egész eddig 877Aval simán ment minden, de a 877 nem tetszik neki.
Van valami ötlet?
Előre is köszi.
(#) watt válasza Kisvé hozzászólására (») Jan 11, 2011 /
 
Ugyanabban az áramkörben? Ha van olyan menüpontod, hogy Fast Programming, akkor azt kapcsold ki.
(#) Kisvé válasza watt hozzászólására (») Jan 11, 2011 /
 
Igen, ugyanabban az áramkörben.
Hol kellene találnom ilyen menüpontot az MPLAB-on belül?
A programozó beállításainál nem látok ilyet.
(#) Kisvé válasza watt hozzászólására (») Jan 11, 2011 /
 
Ebben a pillanatban annyira sikerült jutni, azzal, hogy nem a PICKIT -ről, hanem külsőleg kap tápot, hogy majdnem mindent tud, csak programozni nem
Kb egy perc "Programming..." után kiírja, hogy:
The following memory regions failed to program correctly:
Program Memory
Address: 00000097 Expected Value: 0000113b Received Value: 00000000
Programming failed
A cím tetszőlegesen vátozhat
Következő: »»   882 / 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