Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   241 / 1210
(#) kaqkk válasza Krisszes hozzászólására (») Ápr 19, 2012 /
 
A bcd-decimál átalakítót nyugodtan kösd rá közvetlenül
a pic lábaira . Ha decimális adat jön ki a picből (és jó a program) akkor nem lesz lebegő láb ..
(#) menyus válasza bkati hozzászólására (») Ápr 19, 2012 /
 
Köszönöm ez jó hír.. Nálam csak 4800 al megy a GPS és a GSM is, ezek szriont nem lehet gond. Valami szűrést tettél valamelyik oldalra? Soros induktivitás, valami kis értékű kondi a gnd felé...stb? Vagy nem kell? Hogy kéne ezt "jól csinálni"..?
(#) maestro hozzászólása Ápr 19, 2012 /
 
Üdv!
Van ez a kivonás:
Bővebben: Link
Az lenne a kérdés, hogy minek bele a
btfss STATUS,C
incfsz SourceH,W
sorok, elvégre ahogy tapasztaltam, hogy ha a kivonandó nagyobb mint a kivonó (az eredmény pozitív), akkor mindig 1-et ad a Carry bit, tehát átugorja az incfsz utasítást. Ha meg kisebb (az eredmény negatív szám lenne), akkor meg hülyeséget kapok eredményül.
Vagy milyen esetben lehet még 0 a Carry bit?
Pl.: 20760-36502=-15742, és ehelyett 49794-et ad. Holott azt várnám, hogy ugyanazt adja vissza, csak pozitívba, vagy ha belefér a tartományba, akkor jelezze a legfelső bittel az előjelet.
Mert ha kiveszem a két sort, akkor csak 256-tal kapok többet eredményül, mintha benne hagytam volna.
Valaki fel tudna világosítani?
(#) bkati válasza menyus hozzászólására (») Ápr 19, 2012 /
 
Igazad van, nekem is 4800-zal ment. Nem volt rajta semmi szűrés, simán ment a kábel az RX/TX lábra. (Persze a GPS-modulon belül valószínűleg volt szűrés gyárilag.) Egyébként én egy régi PMB-248-as GPS-szel csináltam.
(#) icserny válasza maestro hozzászólására (») Ápr 19, 2012 /
 
Idézet:
„akkor mindig 1-et ad a Carry bit, tehát átugorja az incfsz utasítást.”
Emlékeim szerint kivonáskor fordítva működik a dolog, tehát NEM ugorja át.
(#) maestro válasza icserny hozzászólására (») Ápr 19, 2012 /
 
Pedig szimulátor szerint átugorja.
Pl. 8-ból 2-t vonok ki akkor a Carry = 1, de ha 2-ből 8-at vonok ki, akkor a Carry 0.
(#) Hp41C válasza maestro hozzászólására (») Ápr 19, 2012 /
 
Idézet:
„Pl.: 20760-36502=-15742, és ehelyett 49794-et ad...”


Az eredmény teljesen jó, mivel a legfelső bitje 1, azaz negatív a szám és 65536 - 49794 = 15742.
(#) icserny válasza maestro hozzászólására (») Ápr 19, 2012 /
 
Idézet:
„Pl. 8-ból 2-t vonok ki akkor a Carry = 1, de ha 2-ből 8-at vonok ki, akkor a Carry 0.”
Akkor mi is a probléma? Akkor van áthozat, amikor a Carry bit 0, mert akkor nem ugorja át az inkrementáló utasítást.
(#) mhatalyak hozzászólása Ápr 19, 2012 /
 
Szép estét minden kedves fórumozónak!

Szeretnék építeni egy labortápot és nagyon meg tetszett egy PIC-es panelmérő, csak nincs hozzá HEX fájl)én legalábbis nem találom). Az lenne a kérdésem, hogy valakinek talán meg van-e? Nagyon jó lenne, mert egyszerű és nagyszerű! ITT VAN-NI

Köszönöm szépen előre is!
mhatyalyak
(#) maestro válasza Hp41C hozzászólására (») Ápr 20, 2012 /
 
Igazad van, közben már én is rájöttem, hogy a negatív számokat máshogy ábrázoljuk, nem csak kibiggyesztjük elé az 1-est (régen tanultam már a számábrázolást). Bár lehet az én esetemben pont nem ilyen megoldásra van szükség, mert csak két szám különbsége kellene előjel nélkül. De még át kell gondolnom.
(#) maestro válasza icserny hozzászólására (») Ápr 20, 2012 /
 
Már semmi, csak annyi volt a probléma, hogy fordítva írtad.
Én ezt írtam:
Idézet:
„ha a kivonandó nagyobb mint a kivonó (az eredmény pozitív), akkor mindig 1-et ad a Carry bit, tehát átugorja az incfsz utasítást.”

Te meg erre ezt:
Idézet:
„kivonáskor fordítva működik a dolog, tehát NEM ugorja át.”

Pedig átugorja. Kivéve negatív eredménynél.
(#) Hp41C válasza maestro hozzászólására (») Ápr 20, 2012 /
 
Szia!

Még egy byte- ot használni vagy az eredmény összes bitjét megálni és 1 -et hozzáadni, ha a legfelső bit 1.

  1. Abs16bit
  2.  btfss eredmenyH,7
  3.  return
  4.  comf eredmeny,f
  5.  comf eredmenyH,f
  6.  incf eredmeny,f
  7.  btfsc STATUS,Z
  8.  incf comf eredmenyH,f
  9.  return
(#) maestro válasza Hp41C hozzászólására (») Ápr 20, 2012 /
 
Köszi ezt észre sem vettem, hogy a kettes komplemens visszaadja az eredetit.
De ahogy feljebb írtad egyszerűbben is meg lehet csinálni kivonással (65536-eredmény):
  1. deklarálás a program elején:
  2. movlw d'255'
  3. movwf _255
  4. .
  5. .
  6. .
  7. btfss eredmenyH,7
  8. return
  9. decf eredmeny,W
  10. subwf _255,eredmeny
  11. movf eredmenyH,W
  12. subwf _255,eredmenyH
  13. return

Ez 2 utasítással kevesebb, ha minden igaz működnie kell, de még nem teszteltem le.
(#) maestro válasza maestro hozzászólására (») Ápr 20, 2012 /
 
Javítok: csak 1 utasítással kevesebb, de nálam most számít a sebesség.
(#) Hp41C válasza maestro hozzászólására (») Ápr 20, 2012 /
 
De nem kezeli a lehetséges átviteleket...
(#) maestro válasza Hp41C hozzászólására (») Ápr 20, 2012 /
 
És ezt hogy kell benne értelmezni?
incf comf eredmenyH,f

Ezt most csak elírtad, vagy lehet benne ilyet is csinálni?
Ez most 1 vagy 2 utasításnak számít?
Minek veszed még egyszer az eredmenyH negáltját, ha már előtte negáltad?

És milyen átvitelre gondolsz? Példát tudsz mondani amit rosszul fog kiszámolni?
(#) Hp41C válasza maestro hozzászólására (») Ápr 20, 2012 /
 
Elírtam... Abba a sorba nem kell a comf, csak
incf eredmenyH,f
(#) maestro válasza Hp41C hozzászólására (») Ápr 20, 2012 /
 
Ne baj, én is elírtam a subwf-et, mert nem lehet betenni közvetlenül az eredménybe, előbb ki kell rakni a W-be, tehát akkor meg már lassabb lesz.
(#) icserny válasza maestro hozzászólására (») Ápr 20, 2012 /
 
Idézet:
„Már semmi, csak annyi volt a probléma, hogy fordítva írtad.”
Valószínűleg csak félig olvastam el a mondatodat: "ha a kivonandó nagyobb...", s erre válaszoltam.

A félreértést tisztázandó, az "a - b" műveletben
b a "kivonandó"
a pedig a "kisebbítendő".

Szerintem ezért nem értettük egymást.
(#) Hp41C válasza maestro hozzászólására (») Ápr 20, 2012 /
 
Szia!
Idézet:
„Példát tudsz mondani amit rosszul fog kiszámolni?”


Ha az eredmeny változó 0xFF00 értékkel indul, akkor a decf eredmeny,W átvitelt generál. Ez itt inkább decf eredmeny,f akarna lenni, akkor 0xFFFF keletkezne az eredményben. Ha a magas és az alacsony byte -ból is levonunk 255 -öt, 0 -t kapunk, pedig a helyes eredmény 0x100 azaz 256.
(#) SKY válasza Hp41C hozzászólására (») Ápr 20, 2012 /
 
Szia!
Egy LCD-re szeretném egy regiszter értékét kiírni, de nem tudom pontosan hogyan kell osztani a számot a megfelelő helyi értékekhez.
A gondom a következő: ha mondjuk a tízes helyiérték kell, akkor el kell osztani 10-el, de ha a szám több mint kétjegyű volt, akkor az eredmény sem egyjegyű lesz... hogyan lehet az osztás eredményeként csak a legkisebb helyiértéket megtartani (mikro)C-ben?
(#) Hp41C válasza SKY hozzászólására (») Ápr 20, 2012 /
 
Szia!

Nem használon a mikro C -t. De C -ben van szöveggé konvertáló rutin (a printf ugyan szószátyár, de talán van itoa vagy hasonló).
Keress a topikban, feltöltöttek már jónéhányat...
Indulj hátulról. Vedd az eredeti számot és tedd egy másik változóba. Cilkus: Vedd a szám 10 -es modulóját. Jegyezd meg a számjegyet. Lépj a nagyobb helyiértékre. Oszd el a számot 10 -zel. Ha a szám még nem 0, menj a ciklus elejére.
A legnagyobb helyiértéktől kiindulva írd ki a számot...
(#) icserny válasza SKY hozzászólására (») Ápr 20, 2012 /
 
Ebben a hozzászólásomban ismertettem azt a függvényt, amit én használok. Nem MikroC, de ez most lényegtelen.
(#) trudnai válasza SKY hozzászólására (») Ápr 21, 2012 /
 
Idézet:
„A gondom a következő: ha mondjuk a tízes helyiérték kell, akkor el kell osztani 10-el, de ha a szám több mint kétjegyű volt, akkor az eredmény sem egyjegyű lesz... hogyan lehet az osztás eredményeként csak a legkisebb helyiértéket megtartani (mikro)C-ben?”


Maradek kepzessel szokas ezt csinalni, azaz a % jellel...
Tehat a "szamjegy = szam % 10;" 0-9 megadja neked a legutolso szamjegyet. Valami ilyesmi fuggvenyt tudsz irni, csak at kell alakitanod a sajat igenyeidnek megfeleloen (pl string buferbe helyezes helyett az LCD-re kozvetlen kiirod jobbrol-balra pozicionalgatassal)

  1. #define STRLEN 4
  2.  
  3. SzamKiiras( int szam )
  4. {
  5.     char str[STRLEN+1];
  6.     char *pStr = &str[STRLEN];
  7.  
  8.     for ( *pStr = '\0';
  9.           szam && ( pStr > str );
  10.           szam /= 10 )
  11.     {
  12.         *(--pStr) = (szam % 10) + '0';
  13.     }
  14.     puts(pStr);
  15. }


De amugy meg hasznald az itoa fuggvenyt vagy printf / sprintf, lehet azok jobban optimalizaltak, mint ez, es meg csak fel sem kell talalnod hozza a Spanyol viaszt...
(#) Krisszes válasza menyus hozzászólására (») Ápr 21, 2012 /
 
Köszönöm Szépen!
(#) Krisszes válasza kaqkk hozzászólására (») Ápr 21, 2012 /
 
köszönöm szépen!
(#) kezdo001 hozzászólása Ápr 21, 2012 /
 
Sziasztok.
Olyan problémám van, hogy van egy 4x7 szegmenses kijelzőm és azt szeretném úgy vezérelni hogy a programban soros vonalon kap egy számot a PIC majd azt kiírja a kijelzőre. Tehát a valós problémám az hogy a kapott számot hogy tudnám felbontani majd így egyesével a kijelzőre vinni.
Írtam már olyan programot, hogy gombnyomásra fel-le lépteti a számokat, de ott nem kellett különösebb trükk.
Tehát a kijelzéssel nem lesz problémám, csak maga a szám felbontása jelent problémát helyiértékekre.
Valaki tud ebben nekem segíteni? Vagy van valakinek egy forráskód részlete? (C nyelven programozok)
(#) SKY válasza trudnai hozzászólására (») Ápr 21, 2012 /
 
Szia!
Szóval ha osztás helyett a %-jelet használom, akkor írhatok, 10-et, 100-at, 1000-t is, az utolsó számjegyet fogom megkapni az osztásból, ami nekem kell? A kiírást pl így gondoltam: lcd_out(1,1,48+[a kiírandó érték]), vagyis lcd_out(1,1,48+változó % 10). Ha az egyesek kellenek, akkor ezt írjam: "változó % 1"?
Bocs, de még csak ismerkedek a programozással. Kösz a választ mindenkinek.
(#) Hp41C válasza SKY hozzászólására (») Ápr 21, 2012 /
 
Szia!
Idézet:
„"változó % 1"”
Ennek nincs sok értelme, minden egész szám osztható 1 -gyel, így az eredmény mindig 0.

Idézet:
„...szóval, ha osztás helyett a %-jelet használom, akkor írhatok, 10-et, 100-at, 1000-t is...”

Nem. A tizes számrendszerben a legutolsó helyiértéken mindig a szám % 10 érték áll. A tizesek helyén levőt nem a szám % 100 alakban kell felírni, hiszen ennek eredmény kétjegyű, hanem (szám /10) % 10 - egész osztást alkalmazva. Az százas helyiértékre (szám /100) % 10.

Szegény kontroller már megint csak oszt és oszt... Helyiértékek számának kétszerese -1 osztást végez el. Már többször linkeltem egy léptetős - korrigálós megoldást, ahol nincs egyetlen osztás sem...
(#) Hp41C válasza kezdo001 hozzászólására (») Ápr 21, 2012 /
 
Szia!

Pont erről írunk...
Következő: »»   241 / 1210
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