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   251 / 1210
(#) steev válasza Simon Kornél hozzászólására (») Máj 3, 2012 /
 
Szia

A pontatlanság sokmindenből adódhat. Ha jól látom tápfeszülség a z ADC referencája, azt nem tudom, hogy figyelembe vetted, hogy lehet hogy a tápfesz sem pontosan +5V.
És az sem mindegy, hogy milyen multimétert használsz, mert az 5eFtos kategóriától ne várj pontos mérést. Még két ugyanolyan multiméter sem mér ugyanúgy.
Nagy pontosságú referencia feszültséggel meg tudnád nézni, hogy mennyire pontos, de azok elég drága alkatrészek, 1000Ft tól indulnak.
(#) Hp41C válasza bankimajki hozzászólására (») Máj 3, 2012 /
 
Szia!
Valami nagy ötlet miatt a programozási specifikációjából hiányzik a Bulk Erase Program and Config Memory parancs, a funkcióját csak 6 - 7 másikkal lehet megvalósítani, ami nem fér el a PICKit2 skript memóriájában.
A Szilva féle klónhoz egy 3.3V -os adapter is kellene még.
A megoldás: PICKit3, ICD3.
(#) Hp41C válasza Simon Kornél hozzászólására (») Máj 3, 2012 /
 
Szia!

Átlagolj 4, 8 16 stb mérési eredményt.
(#) bankimajki válasza Hp41C hozzászólására (») Máj 3, 2012 /
 
Köszönöm, van 1 Watt féle klónom is. De ezek szerint nem kivitelezhető a dolog. (Azt hiszem most jött el a típusváltás ideje.)

Üdv.: Miki
(#) Hp41C válasza bankimajki hozzászólására (») Máj 3, 2012 /
 
Értem... a PIC18F25K80 helyett valami más...
(#) bankimajki válasza Hp41C hozzászólására (») Máj 3, 2012 /
 
Majd szétnézek, de 18F-ből nem sok olyan van, ami rendelkezik elég A/D csatornával és CAN perifériával. (Ha jól emlékszem 4 találat volt a múltkor a keresőben a szűréseim alapján.)
(#) Hp41C válasza bankimajki hozzászólására (») Máj 3, 2012 /
 
Esetleg létrehozni 3-4 típust hozzá a Pk2DeviceEditorral, az egyikkel lehetne programozni, a többivel törölni bizonyos területeket. A PICKit2 programjában kézi típusválasztással sorban kitörölgetni a területeket, amikor az egész törölt, az elsővel beprogramozni...
(#) maestro válasza Zsora hozzászólására (») Máj 3, 2012 /
 
Most az lényegtelen, hogy mire kell. A lényeg 3 előjeles számot úgy összeadni, hogy ne legyen túlcsordulás és ha mégis lenne átvitel akkor a legnagyobb/legkisebb számmal kellene helyettesíteni az eredményt. És azért kell összeadni őket mert ez van a pi algoritmus képletében. Viszont a kódrészletet amit közöltem lefogadom még senki sem nézte át nekem. Ha valaki arra azt mondaná, hogy jó akkor tudnám, hogy máshol kell keresnem a hibát.
(#) Zsora válasza maestro hozzászólására (») Máj 3, 2012 /
 
Mivel 3 szám összege nem lépheti át a határt, így a két szám részösszeadása utáni ellenőrzés szerintem nem jó. (Lehet hogy az 1. és 2. szám összegzésével túlcsordulás lép fel, de a 3. csökkent rajt annyit, hogy a határon belül lesz az eredmény.) Én három byte-on végezném az összegzést, így (a 3. szám hozzáadása után) a legfelső byte (ami később már nem kell) ellenőrzésével egyértelműen kiderül, hogy kell-e korrekció. Mégpedig: Ha ez a byte $01, akkor pozitív túlcsordulás történt, ha $FE, akkor negatív túlcsordulás. (Pozitív eredménynél ennek $00-nak, negatívnál $FF-nek kell lennie)
(#) Zsora válasza Zsora hozzászólására (») Máj 3, 2012 /
 
Ja. Egy kis kiegészítés:
Ha a legfelső byte $00 ill. $FF, még azt is ellenőrizni kell, hogy a 2. byte 7. bitje (előjel) ennek megfelelő-e, azaz 0 ill. 1. Ha nem, akkor is túlcsordulás történt, tehát korrigálni kell (A legfelső byte alapján).
(#) Hp41C válasza maestro hozzászólására (») Máj 3, 2012 /
 
A szimulátorban mindenre fény derül...
(#) Zsora válasza Zsora hozzászólására (») Máj 3, 2012 /
 
A 3-byteos összeadáshoz a számokat előjelhelyesen bővíteni kell; tehát ha az előjel 0 (pozitív), akkor a 3. (legfelső) byte $00, ha 1 (negatív), akkor pedig $FF.
( Bocsi a tizenhatos számrendszerért! )
(#) Zsora válasza Hp41C hozzászólására (») Máj 3, 2012 /
 
Idézet:
„Sajnos két előjeles ábrázolású pozitív szám összeadása után nem keletkezik átvitel a C jelzőbitbe, az eredmény mégis átfordulhat negatívba.”

Azért az érdekes hogy a PIC16 (és kisebb) mikrovezérlőknél az állapotregiszterben nincs Overflow bit, ami épp ennek jelzésére szolgálna. (Sőt... Negative bit sincs. Biztos egy ezressel megdobta volna az árat... )
(#) Hp41C válasza Zsora hozzászólására (») Máj 4, 2012 /
 
Szia!

Nem érdemes hosszasan sorolni, hogy mit nem tud egy kontroller család...
Midrange 16F család: addwfc, addlwc , subwfb, sublwb, overflow és negatív jelzőbit, az incf miért nem állítja a C bitet, stb...

Ha nem tetszik az egyik család lehetősége, választani kell egy másikat: PIC18F, AVR, TMS340, I8051, ADSP. Ha mégis egy adott típusnál maradunk, akkor a megkívánt műveleteket meg kell valósítani. Elvben mindegyiken létre lehet hozni egy virtuális kontrollert, aminek olyan utasításkészlete és jelzőbit rendszere van, ami nekünk tetszik...
(#) Zsora válasza Hp41C hozzászólására (») Máj 4, 2012 /
 
Idézet:
„Midrange 16F család: addwfc, addlwc , subwfb, sublwb, overflow és negatív jelzőbit, az incf miért nem állítja a C bitet, stb...”

Valószínűleg ezt a családot csak 8-bites adatok kezelésére szánták, emiatt nem kezeli a C (átvitel) bitet. Az enhanced mid-range viszont már tartalmazza a több-byteos műveletekhez szükséges utasításokat is. Az OV bit hiánya viszont akkor is furcsa, mivel előjeles számok kezeléséhez elengedhetetlen - hacsak nem úgy gondolták hogy PIC16-on nem fognak ilyen műveleteket végezni.
Idézet:
„Ha nem tetszik az egyik család lehetősége, választani kell egy másikat:”

Ez így igaz. Én pl. a PIC24-et választottam. 8-bites téren meg egyértelműen az Atmel AVR-t tartom jobbnak.
(#) Hp41C válasza Zsora hozzászólására (») Máj 4, 2012 /
 
Szia!
- Overflow jelzőbit nélkül azért megy az élet . Az I8080 -ban sem volt, csak a jóval később megjelent Z80 -ban hozták össze a Parity jelzőbittet... Azért az I8080 -nal is végeztek már előjel nélküli és előjeles műveleteket gond nélkül, nem várták meg azt a jónéhány évet, míg a Zilog előállt a Z80 -nal...
- Signum jelzőbit kérdése érdekesebb. Való igaz, a PIC10 ..16F nem tudja tesztelni egyszerűen a W legfelső bitjét, de bármelyik művelete elvégezhető a File regiszternek hívott belső RAM (96 .. 128 db egy lapon) egy rekeszében képződő eredménnyel, annak legfelső bitje tesztelhető. A 18F sorozat már tudja...
Ha hosszabb számokkal számolunk, akkor az I8080 és Z80 utasításai közül leginkább az átvitelt is figyelembe vevő összeaáds / kivonás és azok literális konstanssal való verziója hiányzik. A pic24F -ban már megvan.
Azért elég sok számolást megoldott a világ a 1/2 kszó memóriával rendelkező 16C84 -gyel annó, amikor nem volt még ilyen választék a piacon.
(#) maestro válasza Zsora hozzászólására (») Máj 4, 2012 /
 
Köszi! Megpróbáltam, de megint nem működik, kiakad egyből a max értéknél. Valamit biztos elszúrtam, majd utána számolok én is ha lesz időm. A kódot inkább most nem linkelem, mert úgy sem nézi meg senki, nekem meg most nincs agyam a szimulációnál 20 változót szemmel tartani.
(#) Hp41C válasza maestro hozzászólására (») Máj 4, 2012 /
 
Szia!

Nem lehet olyan bonyolult....

sat.asm
    
(#) maestro válasza Hp41C hozzászólására (») Máj 4, 2012 /
 
Nem is lenne az, de mégsem működött még egy megoldás sem.
És ez most komoly, hogy ilyen hosszú 3 szám összeadása? Vagy a sub-ok nem kellenek bele?
(#) Zsora válasza maestro hozzászólására (») Máj 4, 2012 /
 
Itt az én verzióm:
(Ha nem hibáztam, akkor működik )
  1. LIST    p=16F1824
  2. #include "P16F1824.INC"
  3.  
  4. CBLOCK  0x020; Szabad RAM terület kezdete
  5. a1; 1. változó
  6. a2
  7. a3
  8. b1; 2. változó
  9. b2
  10. b3
  11. c1; 3. változó
  12. c2
  13. c3
  14. d1; összeg
  15. d2
  16. d3
  17. ENDC
  18.  
  19. org   0
  20.  
  21. gotokezd
  22.  
  23. ;------------------- a bővítése
  24. kezd:clrfa3
  25. btfsca2,7
  26. comfa3
  27. ;------------------- b bővítése
  28. clrfb3
  29. btfscb2,7
  30. comfb3
  31. ;------------------- b bővítése
  32. clrfc3
  33. btfscc2,7
  34. comfc3
  35. ;------------------- a+b->d
  36. movfa1,w
  37. addwfb1,w
  38.         movwf   d1
  39. movfa2,w
  40. addwfcb2,w
  41.         movwf   d2
  42. movfa3,w
  43. addwfcb3,w
  44.         movwf   d3
  45. ;------------------- c+d->d
  46. movfc1,w
  47. addwfd1
  48. movfc2,w
  49. addwfcd2
  50. movfc3,w
  51. addwfcd3
  52. ;------------------- d<0 ?
  53. btfscd3,7
  54. braneg
  55. ;------------------- d>$007fff ?
  56. poz:btfscd3,0
  57. brapszat
  58. btfssd2,7
  59. bravege
  60. ;------------------- d=$007fff (7fff)
  61. pszat:movlw0xff
  62. movwfd1
  63. movlw0x7f
  64. movwfd2
  65. ;clrfd3
  66. bravege
  67. ;------------------- d<$ff8000
  68. neg:btfssd3,0
  69. branszat
  70. btfscd2,7
  71. bravege
  72. ;------------------- d=$ff8000 (8000)
  73. nszat:clrfd1
  74. movlw0x80
  75. movwfd2
  76. ;movlw0xff
  77. ;movwfd3
  78. ;-------------------
  79. vege:gotovege
  80. ;-------------------
  81.  
  82.      END

sat.asm
    
(#) Zsora válasza Zsora hozzászólására (») Máj 4, 2012 /
 
Ja de csúnyán illeszti be a kódot...

Mág annyi:
Minden változó 3-byteos, és az 1. a legalsó, míg a 3. a legfelső byte. (pl. a1; a2; a3)
De elég csak az alsó 2 byteot feltölteni, mert a program úgyis autómatikusan bővíti 3-byteosra.
(#) Zsora válasza Zsora hozzászólására (») Máj 4, 2012 /
 
Kicsit kipofoztam formailag, meg javítottam az elírásokat. Így már jobban olvasható és megérthető a logika.
(Megjegyzem hogy 3-nál több szám összeadásához már módosítani kell rajta, mert picit optimalizáltam.)

sat.asm
    
(#) maestro válasza Zsora hozzászólására (») Máj 4, 2012 /
 
Köszi szépen! Majd hétvégén megpróbálom.
(#) Zsora válasza maestro hozzászólására (») Máj 4, 2012 /
 
Egyébként milyen mikrovezérlőre lesz? Csak mert az általam írt kód PIC16 enhanced midrange-re van. Ha a tied kisebb, akkor pár utasítást ki kell hogy válts mással.
(#) Hp41C válasza maestro hozzászólására (») Máj 4, 2012 /
 
Olvasd már el a kódot, ha segítséget kértél...
A részletben benne van két 16 bites szám telítés nélküli és telítéses összeadása és kivonása:
Add16 - normál összeadás, Add16Sat - telítéses összeadás,
Sub16 - normál kivonás, Sub16Sat - telítéses kivonás.

Ezen kívül egy végtelen hurok két összeadás és két kivonás mindkét féle módon elvégezve, az egyik nem telítődik, a másik telítődik.
Elnézést a hexa számokért - valamiért kedvelem őket...
(#) maestro válasza Hp41C hozzászólására (») Máj 5, 2012 /
 
Én átnéztem felületesen mert nem volt időm, te viszont nem nézted át az enyémet holott ezt kértem.
És abból is látszik, hogy belenéztem, hogy megkérdeztem kell-e bele nekem a sub-os részek mivel én most csak összeadni szeretnék. (múltkor beszéltünk kivonással működő telítésről azt hittem ez is ilyesmi)
Normál összeadást, kivonást nem kértem, nem tudom minek tetted bele.
És most megint átfutottam, de most sem látok semmi magyarázó szöveget benne, ellenben Zsora kódjával, szóval felőlem lehetett volna az egész kódra is szükség. Minden esetre köszi a kódot majd megpróbálom értelmezni (a számok átírásával fogom kezdeni).
(#) maestro válasza Zsora hozzászólására (») Máj 5, 2012 /
 
Igen, az enyém csak normál 35 utasításos, de ahogy nézem csak az addwfc-t kell átírnom. De mi is ez pontosan, a W-hez hozzáadja a Carry bitet?
(#) potyo válasza maestro hozzászólására (») Máj 5, 2012 /
 
Hasonló, mint az ADDWF, de ha a Carry bit egyes a művelet előtt, akkor még plusz egyel megnöveli az eredményt. Több bájtos számok összeadásánál megspórol néhány utasítást.
(#) Hp41C válasza maestro hozzászólására (») Máj 5, 2012 /
 
Beírom ide is kommentezve. Telítéses 16 bites összeadás 35 utasításos Midrange kontrollerekre.

  1. Add16Sat ; (acc+1:acc) = (acc+1: acc) + (work+1:work)
  2. movf    acc+1,w
  3. movwf   temp; Az előző eredmény előjelének tárolása
  4.  
  5. movf    work,w; Alsó 8 bit összeadása
  6. addwf   acc,f
  7. btfsc   STATUS,C; Keletkezett átvitel ?
  8. incf    acc+1,f; Ha keletkeszett, akkor az eredmény nagyobb helyiértékű részének növelése
  9. movf    work+1,w; Felső helyiértékű 8 bit összeadása
  10. addwf   acc+1,f
  11.  
  12. movf    temp,w; Az előző eredmény
  13. xorwf    acc+1,w;  és a mostani
  14. andlw   0x80;   előjele
  15. btfss   STATUS,Z;    eltér egymástól, ha nem irány a return
  16. btfss   acc+1,7;  ha eltér megyünk a telítésre
  17. return
  18.  
  19. movlw   0xFF; Telítés
  20. movwf   acc; A maximális 16 bites, pozitív szám, a decimális 32767
  21. movlw   0x7F; betöltése az eredmény helyére
  22. movwf   acc+1
  23. return

Nem tudom eképzelni, mi nem érthető benne... Nem én kértem segítséget...
(#) maestro válasza Hp41C hozzászólására (») Máj 5, 2012 /
 
:worship:
De elég lett volna ha csak a változókat kommentezed. Vagy ennyi is:
; (acc+1:acc) = (acc+1: acc) + (work+1:work)
Meg hogy a temp micsoda (előjel).
Azért ezeket szerintem illik leírni, én legalábbis mindig kommentezem a sajátjaimat ha fura nevű változókat használok mert másnapra már én sem tudom, hogy mi az.
Következő: »»   251 / 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