Fórum témák
» Több friss téma |
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.
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.
Szia!
Átlagolj 4, 8 16 stb mérési eredményt.
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
Értem... a PIC18F25K80 helyett valami más...
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.)
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...
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.
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)
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).
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! ) 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... )
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... 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.
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.
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.
Szia!
Nem lehet olyan bonyolult....
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?
Itt az én verzióm:
(Ha nem hibáztam, akkor működik )
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.
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.)
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.
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...
É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).
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?
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.
Beírom ide is kommentezve. Telítéses 16 bites összeadás 35 utasításos Midrange kontrollerekre.
Nem tudom eképzelni, mi nem érthető benne... Nem én kértem segítséget...
: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. |
Bejelentkezés
Hirdetés |