Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   557 / 1318
(#) trudnai válasza szilva hozzászólására (») Aug 27, 2009 /
 
Vagy 3 szilicium dioda sorban (ha mar ganyolunk -- ehhez en ugyis ertek )
(#) gulasoft válasza trudnai hozzászólására (») Aug 27, 2009 /
 
Hát ha egy 3.3V-os stabilizátorhoz nincs 3 kondija, akkor valószínű hegyekben áll nála a zéner meg sziliciumdióda..
(#) szilva válasza gulasoft hozzászólására (») Aug 27, 2009 /
 
Idézet:
„Ha jól értettem, a stabilizátor típusával volt gond, de az nem feltétlenül jelenti azt, hogy alapvető alkatrészek nincsenek kéznél.”
(#) szilva válasza szilva hozzászólására (») Aug 27, 2009 /
 
Ehh, ez OFF akart lenni...
(#) menyus hozzászólása Aug 27, 2009 /
 
Sziasztok!

Kérdésem lenne hogy egymás után ASCII formátumban érkező számokat hogyan tudok egy számként kezelni? pl. egymás után jön 2 / 3 / 5 / 0 / 3 nekem ezt egybe kéne valahogy rakni, hogy 23503 legyen. Lehet hogy láma kérdés, de ezen elakadtam...

köszi
(#) kissi válasza menyus hozzászólására (») Aug 27, 2009 /
 
A megfelelő karakter alaki értékét megszorzod a helyiértékével és egy változóban összeadod...
Sajnos tudtommal csak ez a favágómódszer van

A változó byte számát a várható értéknek megfelelően kell megválasztani és az összeadás is több byte-os!

Steve
(#) menyus válasza kissi hozzászólására (») Aug 27, 2009 /
 
Köszi, akkor nekiállok ha nincs egyszerűbb módja..
(#) kissi válasza menyus hozzászólására (») Aug 27, 2009 /
 
Persze az a kérdés, hogy mire akarod használni? Például BCD kódban csak be kell pakolnod az ASCII-ből átalakított nibble-ket és BCD aritmetikával dolgozhatsz a számmal!

Steve
(#) menyus válasza kissi hozzászólására (») Aug 27, 2009 /
 
A következőt kéne összehoznom:

GPS modul soroson küldi a koordinátákat (NMEA GPRMC mondat) ASCII formátumban. A koordináta formátumát át kell számolnom, osztanom kell 60 al (6 al), de ehhez egyben kéne kezelni a sorosan jövő adatokat. Pl 47,23503. A megfelelő formátum kiszámolásához a tizedes utáni számot (23503) el kell osztanom 60 al, vagy 6 al ( a tizedest már oda teszem ahová akarom..) eredmény = 47,39171 Ezt az új koordináta formátumot pedig tovább kell küldenem egy GSM modullal. Minden működik csak a koordinátát kéne valahogy átszámolni, de ezen a dolgon nagyon elakadtam.
(#) lidi válasza kissi hozzászólására (») Aug 27, 2009 /
 
Vagy ha C ben programoz, akkor atoi -függvénnyel.
(#) kissi válasza menyus hozzászólására (») Aug 27, 2009 /
 
Nem tudom milyen PIC-et használsz, tudsz-e valamilyen nagyságrendben osztani és a rászánható időt sem ismerem. Én most azt csinálnám, hogy a tizedesvesszőt tolnám, hogy csak hattal kelljen osztani. A hattal osztás meg ciklikus kivonás. Eltolva 9999 a legnagyobb szám, ami hattal osztva 1666 ( és 0,5). A kivonások számát megszámolva tudod az eredmény néhány ms alatt! Én nem is alakítanám át, hanem helyiértékenként nézném ( H3 - H1 a helyiértékek!):

9171 ( a te példád) /6=
9-6=1 H3=1 marad 3<6 (a 3 a köv. helyiértéken 30! )
31-6=25 H2=1 marad 25>6
25-6=19 H2=2 marad 19>6
19-6=13 H2=3 marad 13>6
13-6=7 H2=4 marad 7>6
7-6 =1 H2=5 marad 1<6 ( az 1 10 a köv. helyiértéken!)
17-6=11 H1=1 marad 11>6
11-6 =5 H1=2 marad 5<6
51-6=45 H0=1 marad 45>6 ...
.
.
. H0=8 marad 3<6
Végeredmény: H3H2H1H0= 1528

Ez is járható út!

Steve
(#) kissi válasza lidi hozzászólására (») Aug 27, 2009 /
 
Nem hiszem, hogy C-ben ennyit kinlódna az osztással!

Steve
(#) lidi válasza kissi hozzászólására (») Aug 27, 2009 /
 
Hát ha asm -ben kínlódik lebegő pontos számokkal, meg sztringekkel akkor meg is érdemli (ez olyasmi hogy neki lehet állni egy szál baltával hajót építeni, de mennyivel egyszerűbb ha van egy hajógyárunk)
(#) menyus válasza kissi hozzászólására (») Aug 27, 2009 /
 
Sajnos asm. - ben kínlódom, a C vel nem próbálkoztam még sosem.. Az osztáshoz Watt oldalán találtam egy példát, azzal meg tudom oldani remélem. A PIC egy 16F628A.
(#) potyo válasza menyus hozzászólására (») Aug 27, 2009 /
 
Hattal osztás kivitelezhető úgy, hogy X/6=X/4-X/8+X/16-X/32+X/64-... Ezek pedig valójában egyszerű jobbrashiftelések és összeadás/kivonás. Talán ez a leggyorsabb módszer rá.
(#) kissi válasza menyus hozzászólására (») Aug 27, 2009 /
 
Az előző példám nem túl nehezen programozható le ( nem néztem Watt oldalát, ha az szerinted egyszerűbb, akkor azt csináld!)!

Steve
(#) menyus válasza kissi hozzászólására (») Aug 27, 2009 /
 
Nem, ez számomra lényegesebben egyszerűbb mint Watt osztás rutinja. Köszi, ezt megpróbálom. Első ránézésre nem is tűnik olyan vészesnek.
(#) kissi válasza potyo hozzászólására (») Aug 27, 2009 /
 
Ez pedig kimondottan jó, csak a számnak bináris formátumban kell rendelkezésre állnia!
( a hiba nagysága itt maximum az utolsó tag lehet, ha jól emlékszem!)

Steve
(#) kissi válasza menyus hozzászólására (») Aug 27, 2009 /
 
Azért vigyáz, mert a maradékot tízszerezni kell, de mivel az kisebb, mint hat, ezért egyszerűen megszorzod nyolccal és még hozzáadod a kétszeresét ( ezek itt tényleg shiftelések és nem lesz túlcsordulás !) vagy "csak" 10-szer összeadod!

Használd a szimulátort a megoldásod ellenőrzésére!

Steve
(#) menyus válasza potyo hozzászólására (») Aug 27, 2009 /
 
Ez még egyszerűbbnek tűnik.

Köszönöm mindenkinek a segítséget, innen már remélem elboldogulok valahogy! (ha mégsem akkor kérdezek.. )
(#) kissi válasza menyus hozzászólására (») Aug 27, 2009 /
 
Vigyázz vele, mert az osztás csak bináris számnál shiftelés, Neked jelenleg nem olyan a számod ( ezzel a módszerrel visszajutottunk a kiinduláshoz, azaz át kell alakítani ! ) !

Steve
(#) menyus válasza kissi hozzászólására (») Aug 27, 2009 /
 
Ezek szerint az ASCII formátumot binárisba kell konvertálnom. Ha jól tudom az ASCII felső nibble je (0 - 9 ig) azonos, az alsó négy bit hordozza a lényeget. Ezt meg csak megoldom valahogy.
(#) kissi válasza menyus hozzászólására (») Aug 27, 2009 /
 
Nem ennyi a feladat!!!

Az ASCII kódnál az alaki érték mellett a helyiértékekre is szükséged van, hogy egy sok byte-os bináris számot kapj ( nem csak egymás mellé kell tenned a nibble-ket!!) !
A sok byte-os számot is lehet shiftelgetni, de először az átalakítás, majd a helyiértékenkénti öszeadogatás a shifteléssel... Te tudod!


Ezt a bináris átalakítást írtam le legelőször!

Várom az eredményt!

Steve
(#) menyus válasza kissi hozzászólására (») Aug 27, 2009 /
 
Köszönöm az infókat, átgondolom és nekiülök próbálgatni. Nem lesz könnyű falat úgy érzem. :no:
(#) Hp41C válasza menyus hozzászólására (») Aug 27, 2009 /
 
Szia!

Itt is nézz körül....
(#) menyus válasza Hp41C hozzászólására (») Aug 28, 2009 /
 
Jó kis oldal..köszi! (Csak pont az nincs ami kéne, mint általában) De tényleg sok hasznos dolog van.
(#) zsoltee0001 válasza watt hozzászólására (») Aug 28, 2009 /
 
Azért nem oda tettem ezt a kérdést, mert nem először használtam hőlégfúvót alkatrészkiszedéshez, és eddig még soha semmi probléma nem volt.
Egyébként meg hőfokszabályzós hőlégfúvót használok, csak annyira állítom be amennyire épp szükséges a kiforrasztáshoz.
(#) zsoltee0001 válasza lidi hozzászólására (») Aug 28, 2009 /
 
Nem tudom, hogy elfelejtette-e, de, hogy tönkrement az biztos.
"miért forrasztottad ki ?" Egyszerűbbnek tartottam, úgy voltam vele, így tuti nem csinálok zárlatot valahol, meg nem kavar be a többi áramkör.
Először azt hittem valamit rosszul kötöttem be a próba során, de most néztem át 20-adjára és tuti mindent jó volt.
Vss : -
Vdd: +5V
Mclr: +12V
Rb7: Pgd
Rb6: Pgc
Az adatlapján fel van tüntetve a max. hőmérséklet, amit elvisel? Én nem találtam.
Az írás védelemmel úgy voltam, hogy egy próbát megér, hátha nincs rajta, ugyanis elég fontos lenne kinyerni belőle a HEX fájlt.
Úgy is fogalmazhatnék nem az izgat, hogy elszállt a PIC, ha meglenne a hex az nemkicsit kárpótolna.
üdv
(#) szilva válasza kissi hozzászólására (») Aug 28, 2009 /
 
Még kivonásokat sem kell alkalmazni, ha felírod az osztó konstans reciprokának "kettedestört" alakját, és ebből veszed a törtrész valamennyi értékes jegyét. Ahol ebben a sorozatban 1 van, ott hozzáadod az eredményhez az osztandót, ahol 0, ott meg nem. Persze a ciklusban az osztandót mindig léptetni kell jobbra a sorozatban lévő minden egyes következő jegy megvizsgálása előtt. Ez tulajdonképpen egy bináris szorzás.

1/6 ~= 0.001010101010101010 (2) 16 értékes jegyre, ezt úgy célszerű felhasználni, hogy a bal oldalon lévő nullákat elhagyjuk, tehát a "1110101011011011" sorozattal számolunk. A három nulla elhagyásával tulajdonképpen 8-szorosára növeljük a szorzót (amit az osztó reciprokából nyertünk), gyakorlatilag az eredeti szám 8/6 részét fogjuk így kiszámolni. A végeredmény igazítása majd egyszerű jobbra shiftelésekkel történik.

23503 = 0101101111001111 (2)

  1. Az osztás menete tehát:
  2.  
  3. osztó    osztandó                                  hányados
  4. aktuális léptetett                                 aktuális
  5. bitje    értéke                hozzáadandó         értéke
  6. 1        0101101111001111      0101101111001111    0101101111001111
  7. 0        0010110111100111      -                   0101101111001111
  8. 1        0001011011110011      0001011011110011    0111001011000010
  9. 0        0000101101111001      -                   0111001011000010
  10. 1        0000010110111100      0000010110111100    0111100001111110
  11. 0        0000001011011110      -                   0111100001111110
  12. 1        0000000101101111      0000000101101111    0111100111101101
  13. 0        0000000010110111      -                   0111100111101101
  14. 1        0000000001011011      0000000001011011    0111101001001000
  15. 0        0000000000101101      -                   0111101001001000
  16. 1        0000000000010110      0000000000010110    0111101001011110
  17. 0        0000000000001011      -                   0111101001011110
  18. 1        0000000000000101      0000000000000101    0111101001100011
  19. 0        0000000000000010      -                   0111101001100011
  20. 1        0000000000000001      0000000000000001    0111101001100100
  21. 0        0000000000000000      -                   0111101001100100 = 31332 (10)


Ha az utolsó sorban szereplő végeredményt 3-mal jobbra toljuk, akkor 0000111101001100 (2) lesz belőle, ami megfelel 3916-nak. 23503/6=3917.1666..., tehát egész jól sikerült kiszámolni, ha a jobbra shiftelésnél az utolsó kiléptett bitet hozzáadjuk az eredményhez (kerekítés), akkor a 3917 még pontosabb közelítés lesz.

Egyébként észrevehető, hogy az 1/6 speciális alakja miatt lehetne olyan ciklust szervezni, ami minden futáskor hozzáadja az eredményhez az osztandót, majd kettővel shifteli az osztandót jobbra. Ha csak konstans 6-tal való osztást kell alkalmazni a progiban, akkor én ezt csinálnám.

A számjegyekből bináris szám előállítása során szükség van egy 10-es szorzásra, ezt szintén tologatással és összeadással kell megvalósítani: egy érték eggyel balra tolt (2-szeres) és hárommal balra tolt (8-szoros) módosulatát összeadva megkapjuk az érték 10-szeresét.
(#) histu1985 hozzászólása Aug 28, 2009 /
 
Sziasztok

Van egy kis elektronikai kütyüm amin van egy PIC és többek között Sorosan is küldene ki adatot. C18-ban programozom és nem akar működni az adatküldés. Egy másik eszközzel kommunikál és a fogadás már összejött. Arra gondoltam hogy ti eltudnátok dönteni hogy a kóddal van a gond, vagy esetleg hardveres gond van, tehát a PIC lába egy mérés következtében rövidre lett zárva és tönkre ment az USART kimenete.

Bemásolom a kód ide eső részét ha láttok vmi hibát kérlek jelezzétek:

  1. void Init()
  2. {
  3. //Kezdő változók
  4.         int i;
  5.         char conf_dat[12];
  6.  
  7. //Oszcillátor beállítás
  8.         OSCCON = 0b11110111;
  9.         OSCTUNEbits.PLLEN = 1;
  10.  
  11. //Kimenetek bemenetek
  12.         TRISA = 0b11111000;
  13.         TRISB = 0b11110001;
  14.         TRISC = 0b10000111;
  15.         TRISD = 0b10000100;
  16.         TRISE = 0b11111111;
  17.         ANSEL = 0;
  18.         ANSELH = 0;
  19.         CONFIG_RXQ2 = 1;       
  20.  
  21. //RS232 engedélyezés 38400 bps
  22.         RCONbits.IPEN=1;
  23.         INTCONbits.GIEH=1;
  24.         OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE
  25.                 & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 25);
  26.  
  27. //Változó inicializálás, célcím, sajátcím, tx telj, adó vevő puffer (info: RXQ2 pdf)
  28.         conf_dat[0] = 0x00;
  29.         conf_dat[1] = 0x00;
  30.         conf_dat[2] = 0x00;
  31.         conf_dat[3] = 0x00;
  32.         conf_dat[4] = 0x11;
  33.         conf_dat[5] = 0x11;
  34.         conf_dat[6] = 0x11;
  35.         conf_dat[7] = 0x11;
  36.         conf_dat[8] = 0x6b;
  37.         conf_dat[9] = 0x00;
  38.         conf_dat[10] = 0x02;
  39.         conf_dat[11] = 0x02;
  40. //Config mód bekapcs
  41.         CONFIG_RXQ2 = 0;
  42. //Byteonként ki kell írni a konfig adatokat
  43.         for(i=0; i<12; i++)
  44.         {
  45.                 WriteUSART(conf_dat[i]);
  46. //Amíg a PIC küldi
  47.                 while(BusyUSART());
  48. //Amíg az RXQ2 nem jelez vissza hogy fogadta és készen áll további fogadásra
  49.                 while(RXQ2_CTS == 1);
  50.         }
  51. //Adás mód
  52.         CONFIG_RXQ2 = 1;       
  53. }


Ettől eltérő kódokat is kipróbáltam már, de eddig nem tudtam rávenni hogy küldjön ki adatot. Oszcilloszkóppal ellenőrzöm az adatkiküldést. Amennyiben a kódra azt mondjátok hogy nem láttok benne hibát akkor hardver gond van. Csak sajnos most nem tudok egy PIC cserét végrehajtani teszt céljából.

Köszi előre is a segítségeteket.

István
Következő: »»   557 / 1318
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