Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1174 / 1320
(#) Attila86 válasza HeZ hozzászólására (») Máj 8, 2014 /
 
Rendben, én ezt értem. Persze hogy lehet még egyszerűsíteni hogy még kevesebb helyet foglaljon, de cserébe egy halom elágazás, számlálás stb kerülne be. Emiatt lassabban futna le a program ezen része. Ha olyan nagyon spórolni akarnék a programmemóriával akkor a SIN és COS függvények értékeit kiszámoltathatnám a PIC-kel és akkor aztán semmilyen jelalakot nem kellene a memóriában letárolni. Ez lenne az igazi spórolás! De persze egy szinusz függvény kiszámoltatása relatíve hosszadalmas feladat lenne.
A program ahol ezt a szinusz-cosinusz táblát használnám úgy fog működni hogy az A/D folyamatosan, fix időközönként mintákat vesz egy jelből és két mintavétel közt míg az A/D dolgozik, a legutóbb vett mintát összehasonlítja a szinuszfüggvény valamelyik értékével. Hogy melyikkel, azt ki kell számolnia a PIC-nek és táblamutatóval ki kell olvasnia a memóriából. Ezt az értéket pedig lehetőleg elég gyorsan meg kell találnia a PIC-nek mert még az A/D mintájával össze is kell szoroznia meg göngyölnie egy sok bájtos számhoz. Ennek az egésznek mindenképp le kell futnia azelőtt hogy a következő A/D konverzió befejeződik, különben mikor az A/D megszakítást okoz akkor kutyulódik az egész. Hogyha csak egy negyed hullámot tárolok el és abból némi számítással és elágazásokkal találom ki hogy melyik értéke kell a hullámnak, akkor ez növeli a két mintavétel közti időt amit a PIC számolással végez. Jelen esetben pedig törekedni kell arra hogy ez a számítgatás minél hamarabb lefusson.
Valóban, a watt által vázolt megoldás sokkal elegánsabb (gyönyörűen csillogó gyémánt) de ebben a felhasználásban most igenis nem az a jó megoldás.

A programmemóriával való spórolás célja micsoda? Az, hogy beleférjen a program a mikrovezérlőbe. Tömöríteni, okoskodni csak addig szükséges míg bele nem fér. Tovább már felesleges. 32KB a PIC memóriája és a legpazarlóbb megoldásban a szinuszhullám kb 16KB, a cosinus szintén 16KB azaz pont tele lenne a memória. Akkor jött az ötlet hogy akkor legyen csak egy egy és egynegyed szinusz ami már csak kb 20KB, így 12KB marad a program érdemi részének. Ami bőven elegendő mert az maximum csak néhány száz bájt. Ha tovább csökkentem, tömörítem a hullámot akkor csak azt érem el hogy a programmemóriában nagyobb lesz az üres hely. Ebből milyen előny származik? Semmilyen! Ja de bocsánat, nem másfél hanem csak 1,4 másodpercig fog tartani a mikrovezérlő felprogramozása. Ezen felül semmilyen más előnye nincs, csak a szépérzékünk lesz tőle boldogabb hogy elegánsabb, okosabb kódot írtunk. Valójában viszont a fentebb vázolt működésből eredően lehet hogy a kódunk elegáns, csak működni nem fog. (Mert túl sokat számol két mintavétel közt.)

Az pedig hogy miért áll ilyen sok értékből a hullám mikor már 512db érték is elegendő lenne:
Azért, mert (mint egyébként már egyszer említettem); nem minden értéket olvasok ki a táblából. Van hogy mindegyiket, de van hogy csak minden másodikat, minden negyediket stb. A legnagyobb ugrálás az értékek közt 512.
(#) HeZ válasza Attila86 hozzászólására (») Máj 8, 2014 /
 
Egyetértünk!
Ha a sebesség kritikus, gyorsabb órajelű mikrovezérlő kell(het).
A 32 bites 40-120 MHz órajelű mikrovezérlők gyorsak, elérhetőek, olcsók, több gyártótól is.
A PIC18F25K80 16 MHz-es ha jól olvastam...
(#) watt válasza Attila86 hozzászólására (») Máj 8, 2014 /
 
Egy-két shifttel(osztás) fele, negyede, nyolcada lehetne a tábla mérete. Ha e miatt nem elég az idő, akkor neked van igazad. Meg ahogy látom itt csak neked lehet, tehát legyen úgy... Csak azt nem értem, ha ennyire penge vagy, mi a fenének kérdezel miket? PIC kérdésed nem is volt ebben a táblázatos részben...
(#) watt válasza HeZ hozzászólására (») Máj 8, 2014 /
 
Ennek a PIC-nek az AD-je nem valami gyors egyébként...
(#) Attila86 válasza HeZ hozzászólására (») Máj 8, 2014 /
 
A PIC18F25K80 maximum 64MHz-en tud menni. És sajnos egyenlőre csak a nyolc bites mikrovezérlőkkel tudok operálni.
(#) Attila86 válasza watt hozzászólására (») Máj 8, 2014 /
 
Én csak annyit kérdeztem hogy az Excelből hogyan lehetne az MPLAB-ba valahogyan "kiexportálni" adatokat úgy hogy mind előtt egy DE direktíva legyen. A választ erre megkaptam, meg is köszöntem, meg is valósítottam és működik. Ennyi.

Innentől már ti (pontosabban te) kötöttél bele abba hogy erre miért van szükség, mi értelme ennek és egyébként is felesleges ennyi érték stb. Ha elhittétek volna elsőre hogy nekem tényleg pontosan erre van szükségem akkor nem kellett volna elmagyaráznom. Most hogy elmagyaráztam így már elhiszitek hogy tényleg így a jó ahogy kitaláltam. De most meg az a baj hogy akkor meg mi a fenéért kérdeztem. Hát nem kérdeztem!
(#) helektro válasza Attila86 hozzászólására (») Máj 8, 2014 /
 
Az összes PIC18 alatti sorozat 8 bites.
(#) HeZ válasza Attila86 hozzászólására (») Máj 8, 2014 /
 
Felesleges felkapnod-felkapnotok a vizet, igazán nincs mire, hiszen magunk között vagyunk javító, tanuló, tapasztaló, problémamegoldó céllal. Mindketten kicsit nyersek vagytok, nem kell rögtön harapni, szavakon lovagolni, fogalmazást kritizálni, hamár nem tudtok olyan kifinomultan, pallérozottan, türelmesen fogalmazni (mint én ) vagy amilyen jó programot írni .

Én azért kíváncsi vagyok mi a feladat, mit kell megoldanod.

Nem az értelme a fontos, mert valószínűleg az emberiség túlnyomó részének teljesen értelmetlen a Te gondod és sz...k rá nagy ívben. Mi legalább kérdezünk és próbálunk segíteni. Hiába mutatsz egy nagyszerű célszerszámot, ha nem tudható mire való, hogy kell használni, akkor nem lehet értékelni, ötletelni, javítani, továbbfejleszteni, tanulni belőle...
(#) sooty hozzászólása Máj 11, 2014 /
 
Sziasztok! Az alábbi problémával szembesültem ws2812b intelligens RGB led meghajtásánál:

A ledet 16f886 PIC-kel vezérlem 20Mhz-es órajellel. A led időzítései miatt (800kbit/s jelet vár) 6 assembly utasítást tudok adni a picnek egy bit átviteli ideje alatt. 24 bitet kell kiírni G7 G6 G5 G4 G3 G2 G1 G0 R7 R6 R5 R4 R3 R2 R1 R0 B7 B6 B5 B4 B3 B2 B1 B0 sorrendben.

  1. bit1 : Bsf PORTA.0
  2.          Nop
  3.          Nop
  4.          Bcf PORTA.0
  5.          Nop
  6.          Nop
  7.    
  8. bit0: Bsf PORTA.0
  9.         Bcf PORTA.0
  10.         Nop
  11.         Nop
  12.         Nop
  13.         Nop


Ezek megfelelő ismételgetésével egy (vagy több) konkrét színt be is tudok állítani a leden, de nem tudom pl. egy változó értékétől függően változtatni a színeket vagy a fényerőt. Lehetséges ez ezzel a piccel valahogy egyáltalán vagy túl lassú a feladathoz?
A hozzászólás módosítva: Máj 11, 2014
(#) Hp41C válasza sooty hozzászólására (») Máj 11, 2014 /
 
Talán így:
  1. movlw 8
  2. movwf COUNTER1
  3. movwf COUNTER2
  4. movwf COUNTER3
  5. Loop1
  6. bsf PORTA,0
  7. btfss DATA0,7
  8. bcf PORTA,0
  9. rlf DATA0,f
  10. bcf PORTA,0
  11. decfsz COUNTER1,f
  12. goto Loop1
  13. Loop2
  14. bsf PORTA,0
  15. btfss DATA1,7
  16. bcf PORTA,0
  17. rlf DATA1,f
  18. bcf PORTA,0
  19. decfsz COUNTER2,f
  20. goto Loop2
  21. Loop3
  22. bsf PORTA,0
  23. btfss DATA2,7
  24. bcf PORTA,0
  25. rlf DATA2,f
  26. bcf PORTA,0
  27. decfsz COUNTER3,f
  28. goto Loop3
A hozzászólás módosítva: Máj 11, 2014
(#) nedudgi válasza sooty hozzászólására (») Máj 11, 2014 /
 
Ha összeállítottad a 24 bitet, az MSSP modul jó lehet kiküldeni az adatokat.
(#) sooty válasza Hp41C hozzászólására (») Máj 11, 2014 /
 
Az a gond, ha lassabban jön az adat, össze-vissza színeket és fényerőt eredményez. Még a hardwer megszakítást is tiltani kell, az átvitel idejére. 6 utasítás ideje áll rendelkezésre, amiből 1 db. goto máris elvisz 2 részt...
(#) Hp41C válasza sooty hozzászólására (») Máj 11, 2014 /
 
Akkor a ciklusok helyett mind a 8 bitre le kell írni külön külön...
(#) sooty válasza nedudgi hozzászólására (») Máj 11, 2014 /
 
Igen, kellene egy 3 byte hosszú buffer, amit egy parancsra az adott időzítéssel kiír a pic az egyik portján. Az MSSP Fosc/4 vagy Fosc/16-tal megy de a buffere az csak egy byte ügye? Hogy töltöm fel két byte között?
(#) nedudgi válasza sooty hozzászólására (») Máj 11, 2014 /
 
A feltöltés lehet poll alapján, és lehet interrupt alapján is. Jelen esetben valószínűleg folyamatosan kell kérdezni a BF bitet. Az MSSP tud működni az SSPADDR-ben megadott osztó alapján is.
A hozzászólás módosítva: Máj 11, 2014
(#) sooty válasza Hp41C hozzászólására (») Máj 11, 2014 /
 
Ha külön szedném a 8 bitet, akkor is bajban lennék, mert a "0" értékél az első hi->lo váltás 1 utasításon (4 órajelen) belül van. Tehát nincs idő a scrollozásra, csak akkor lehetne, ha az egész PORTA -t scrolloznám és a többi 6 bitre raknám be az értékeket a maradék időben...
A hozzászólás módosítva: Máj 11, 2014
(#) watt válasza sooty hozzászólására (») Máj 11, 2014 /
 
Én is az SPI-re szavazok...
(#) sooty válasza Hp41C hozzászólására (») Máj 11, 2014 /
 
Megtaláltam a kiskaput Szerencsére a led nem teljesen úgy működik mint ahogy a leírásban van.
  1. Bsf  PORTA.0
  2.  Btfss COLOR_G,7
  3.  Bcf PORTA.0
  4.  Nop
  5.  Bcf PORTA.0
  6.  Btfsc COLOR_G,7
  7.  Nop


Ezt a szín minden bitjére meg kell csinálni (7x24 sor COLOR_G, COLOR_R,COLOR_B 7-0 bitjére) nincs idő közben számolgatni. A csalás ott van, hogy a 0 érték bitmintája 100000 helyett 110000 (az 1 maradt 111000)...
A hozzászólás módosítva: Máj 11, 2014
(#) sooty válasza sooty hozzászólására (») Máj 11, 2014 /
 
Két kevert szín:
(#) watt válasza sooty hozzászólására (») Máj 11, 2014 /
 
SPI esetén nem kéne visszakódolni a színt, csak kitenni a pufferre.
(#) sooty válasza watt hozzászólására (») Máj 11, 2014 /
 
Hogy néz ki az kód szintjén? Hogy kell beállítani a 3 byte-os puffert?
(#) sooty válasza watt hozzászólására (») Máj 11, 2014 /
 
Biztos meg lehet csiálni, csak nem tudom a módját: ws2812b 4Mhz SPI
(#) watt válasza sooty hozzászólására (») Máj 11, 2014 /
 
Az SPI puffere (SSPBUFF) 8bites. Beteszed az első bájtot, majd figyeled az SSPIF-et, hogy kiért-e az adat. Beteszed a következőt, törlöd az SSPIF-et és így tovább a 3 bájtig.
(#) sooty válasza watt hozzászólására (») Máj 11, 2014 /
 
Megpróbálom, mert ez az asm megoldás (még ha működik is elég lábbalhajtós). Csak fel kell szabadítanom az spi-hez a PORTC.5-öt lévén ez egy meglévő óraprogramomba menne bele utólag... így, hogy látom hogy megy 4mhz-en érdemes kipróbálni.
(#) proba válasza sooty hozzászólására (») Máj 11, 2014 /
 
A SPI nem igazán tetszett. Két byte között egy extra szünetet tesz be, így már borul a teljes időzítés. Én egy 16f1503-mal csináltam. 16Mhz 5 utasítás/bit. Le kell tárolni az egész képet.Címzéshez az FSR-t használtam.
Egy bit kb így néz ki:
  1. BSF PORTC,0                     ; kezdő szint
  2. RLF PORTC                       ;középső rész a tartalomtól függ
  3. RLF INDF1                               ;következő bit információ kiolvasása
  4. BCF PORTC,0                    ;befejező szint  
  5. NOP


Azért 16 részből áll egy ciklus, mert a picbe nem volt több memória, így a 60 ledhez feláldoztam a fényerő alsó biteit Ha a clrc-s programrészek törlésével egy Byte egy szín állapot elérhető
Sajna ez alatt a port másra nem használható, az összes kimenete változik a kiírás alatt.
A hozzászólás módosítva: Máj 11, 2014

ledszalag.asm
    
(#) Attila86 válasza proba hozzászólására (») Máj 11, 2014 /
 
Idézet:
„Két byte között egy extra szünetet tesz be”

Ha ez zavar akkor állítsd lassabbra az SPI-t. Nem tudom ez az adott áramkörben megengedhető-e, de ezzel eltűnik (jelentéktelen mértékű lesz) az a szünet. És/vagy nagyobbra is állíthatod az órajelet.
A hozzászólás módosítva: Máj 11, 2014
(#) proba válasza sooty hozzászólására (») Máj 11, 2014 /
 
Más részről a SPI hez a byte-okat szét kell darabolni, ami szintén problémás a rendelkezésre álló idő alatt.(egy byte 2 bitet meg egy kicsit tud csak postázni.)
(#) Attila86 válasza proba hozzászólására (») Máj 11, 2014 /
 
És az nem járható hogy előbb szétdarabolod, elteszed három külön regiszterbe és utána küldöd csak ki? Így az egyes bájtok kiküldése közt kevesebbet kell gondolkodni.
A hozzászólás módosítva: Máj 11, 2014
(#) proba válasza Attila86 hozzászólására (») Máj 11, 2014 /
 
Egészen lassúra állítottam, így derült ki.Sajna az adott alkalmazásban (WS2812B) ez nem tehető meg, mert igencsak szűk időzítéssel rendelkezik.(kb 400ns) És mielőtt nagyobb processzort javasolnál, ez volt otthon, és ezzel is tökéletesen működött (azzal az apró hibával hogy a fényerő csak 4 bites.)
Ami megkötés az egész füzér képét egyben megszakítás nélkül pontos időzítéssel kell kiküldeni (60*3 byte).
A hozzászólás módosítva: Máj 11, 2014
(#) Hp41C válasza Attila86 hozzászólására (») Máj 11, 2014 /
 
A ws2812b kötött időzítéssel működik...
Következő: »»   1174 / 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