Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
Köszönöm szépen, esetleg még valaki tudna segiteni hogy ezt a hozzárendelést hogy tudom megcsinálni a CCS-ben ?
Egyikünk sem okosabb az adatlapnál, sőt! El kell olvasni a 9.7 fejezetet, nem lehet megúszni! Nem triviális a feladat, mert közben a perifériahozzárendelés tiltását is fel kell oldani. Assemblyben egy seciális szekvenciával, C-ben pedig, gondolom, van valami makró hozzá.
Tehát ha azt szeretném hogy PWM1 legyen a 19-es lábon (RA0) akkor RPOR0 regiszterbe be kell írnom 14 ami a PWM1 kódja.
Jól értelmeztem ?
Igen, a lényege ez. De az ördög a részletekben bújik meg, tehát gondosan tanulmányozd át a 9.7.3.3-tól kezdődően az EXAMPLE 9-7-tel záródó részt, hogy ezt hogyan kell csinálni.
Kösz az ötleteket, úgy néz ki hogy a frekvenciával van valami rút szétcsúszás. A kristály és a kondik cserélgetésével egyszercsak elindult. Igaz még mindíg nem 100%-os, de olyan jó 95%-ban felismeri minden gép.
Lehet hogy a PC-knek is ekkora szórásuk van? A CCS bootloader elkészült, amit belinkeltem az kellet kicsit átalakítani mert a neten található kódok jószokása szerint ez is több sebből vérzett. Idézet: Nem kellene, de azoknak rezonátora is kvarcból van.... „PC-knek is ekkora szórásuk van?” Örülök, hogy sikerült megoldani a problémákat!
Probálkozom a PWM modul életrekeltésén 18F46J50-nél.
A PWM1 modult az A5 kimenetre szeretném tenni , de valahogy nem jön össze a dolog. A program lefordul, de a PWM jel nem jelenik meg.... Csatolom a kódot:
Ezt próbáld meg kikapcsolni!
Sajna már ezen is megvolt , de nem segítet....
Azt elhiszem, hogy más hiba is van, de akkor is hagyd egyelőre kikapcsolva az IOL1WAY-t!
A másik probléma: MOVLB 0x0E-vel beállítod Bank14-et, de a PPSCON regiszter matatását nem banked módban csinálod. Milyen kódot generál erre a fordítód? Félek, hogy nem annak a regiszternek törlöd az egyik bitjét, mint amelyiknek szeretnéd! A mintaprogramban ez így nézett ki:
Ugyanez vonatkozik az RPORx regiszterek írására is, és az összes többi regiszterre, amelyek nem az Access területen helyezkednek el. (lásd adatlap Table 5-3).
Ha a BANKED-et odaírom akkor hibával nem fordul le.
Exepting an opcode mnemonic a hiba fordításkor. Itt a kód amit generál: [code=c] .................... #asm .................... MOVLB 0x0E // Bank 14 0C2A: MOVLB E .................... BCF INTCON, GIE //Disable interrupts for unlock sequence 0C2C: BCF FF2.7 .................... MOVLW 0x55 // 1st unlock code into W 0C2E: MOVLW 55 .................... MOVWF EECON2 // 1st unlock code from W to EECON2 0C30: MOVWF FA7 .................... MOVLW 0xAA // 2nd unlock code into W 0C32: MOVLW AA .................... MOVWF EECON2 // 2nd unlock code from W into EECON2 0C34: MOVWF FA7 .................... BCF PPSCON, IOLOCK // Clear IOLOCK of PPSCON, unlocking PPS 0C36: MOVLB E 0C38: BCF xFF.0 .................... .................... MOVLW 0x0E // Set value 14 (CCP1) in W 0C3A: MOVLW 0E .................... MOVWF RPOR2 // Move W into RPOR2 0C3C: MOVWF xC8 .................... .................... BCF INTCON, GIE //Disable interrupts for unlock sequence 0C3E: BCF FF2.7 .................... MOVLW 0x55 // 1st lock code into W 0C40: MOVLW 55 .................... MOVWF EECON2 // 1st lock code from W to EECON2 0C42: MOVWF FA7 .................... MOVLW 0xAA // 2nd lock code into W 0C44: MOVLW AA .................... MOVWF EECON2 // 2nd lock code from W into EECON2 0C46: MOVWF FA7 .................... BSF PPSCON, IOLOCK // Set IOLOCK of PPSCON, locking PPS 0C48: BSF xFF.0 .................... #endasm[code=c]
Létezik CCS nek PIN_SELCET utasitása, ami másnak sem müködik, más forumok alapján...
Az pedig ezt a kódot generálja: [code=c] .................... #pin_select CCP1=PIN_A5 .................... .................... void main() .................... { 0004: CLRF FF8 0006: BCF FD0.7 0008: MOVLB E 000A: MOVLW 55 000C: MOVWF FA7 000E: MOVLW AA 0010: MOVWF FA7 0012: BCF xFF.0 0014: MOVLW 02 0016: MOVWF xED 0018: MOVLW 55 001A: MOVWF FA7 001C: MOVLW AA 001E: MOVWF FA7 0020: BSF xFF.0 0022: CLRF FEA 0024: CLRF FE9 0026: MOVLW FF 0028: MOVLB F 002A: MOVWF x48 002C: BCF FC2.6 002E: BCF FC2.7 0030: MOVWF x49 0032: MOVLW 07 0034: MOVWF FB4 ....................
Így működik:
De azért érdekelne hogy mért nem ment az asm beilesztéssel.
A MOVF, BCF, BSF... stb. utasítások kódjában van egy egybites mező, amely azt mondja meg, hogy a műveletet az utasításban megcímzett regiszterrel az Access lapon, vagy a BSR regiszterrel megímzett lapon hajtsa végre. (utóbbi esetben BSR 4 bitje egészíti ki az utasításban kódolt 8-bites címet)
A kéféle címzésmódot az MPASM esetében így lehet megadni: BCF MYREG, THISBIT, BANKED BCF MYREG, THISBIT, ACCESS A CCS C beépített assemblerének nyilván más szintaktikával kellene megadni, de azt hadd ne én tudjam, hogy hogyan...
Értem , és köszönöm a segítséget.
A lényeg most hogy működik a dolog, majd utánanézek CCS nek hogy kell ezt megadni. Idézet: A CCS C helpje azt állítja, hogy nem lehet megadni, ezt a fordító önállóan dönti el és állítja be: "The compiler will set the access bit depending on the value of the file register".„A CCS C beépített assemblerének nyilván más szintaktikával kellene megadni” Na, akkor most már én sem értem, hogy mi volt a probléma az assembly betéttel!
Gondban vagyok a B port 4-7 pin állapotváltozására bekövetkező megszakítással.
B4 és B5 fel van húzva tápra, és földelgeti egy jeladó. B6 és B7 kimenetre van állítva, de nincsenek felhasználva, hogy ne kelljen kínlódni programozáskor. A megszakítás nem következik be. Ha az itt számlált s1 és s2 változókat simán végtelen ciklusban "if (!input stb" módon növelem, a program további része működik, tehát a hiba itt van. A kód:
Ha B6 és B7 is bemenet; és megadtam, hogy port_b_pullups(true), akkor sem megy. Néztem a ccsc saját mintapéldáját, a ccsc fórumot, de nem megy semmi.
Tudna valaki egy olyan programrészletet feltenni, ami neki működött? Nem értem miért nem megy. B4 és B5 10k ellenállással tápra van húzva; a mechanikus rotary encoder pedig földre húzza mikor érintkezik. B6 B7 ha bemenet "szoftverből tápra húzva", 0V mérhető rajtuk (szóval nem lebegnek; de nem is az a baj, hogy mindig megszakítás van; hanem sosem következik be). Annyi lenne a lényeg, hogy interruptból észleljem, hogy a kerék mennyit mozdul. Állítsak rá egy timer interruptot, ami örökké azt figyeli, hogy magas/alacsony B4 és B5?...
Most, hogy keresztbe lenyeltem az adatlapot, az derült ki, hogy ez (PIC16F887) bármely portb lábon történő változásra interruptot adhat. Belemásztam a regiszterekig; de így sem működik. Idegesítő.
Debug módban a watch ablakban helyes az intcon beállítása (tudtommal), de RBIF sosem 1, tehát ő nem vesz észre ott változást. Hardveresen pedig működik, és más kóddal is működött. Csatolom az adatlap ide tartozó 1 oldalát; ez alapján ha INTCON 11101100, akkor jók a beállítások, nem? (timer1 interrupt használatban van) Ha programban megadom, hogy RBIF=1; tehát igenis változás van, beugrik a megszakítás (egyszer, amikor én megadtam...). Mi a fenéért nem veszi észre, hogy az alacsony és magas szint eszeveszetten ugrál azokon a lábakon?
Hello !
Reset, vagy indulás után a portok analóg bemenetek. Álitsd az ANSELH-t 0-ra.
Ez B porton van, ami csak digitális tud lenni. A teljes beállítgatás így néz ki:
Az adatlap szerint (PIC16F887) PORTB0-PORTB5-ig
lehet analóg bemenet.
Igazad van, ez nem ugrott be.
De nullázhatom kedvemre, ez szarik rám. Különben a setup_adc_ports részben elvileg ha azt mondom meg h kik analógok, akkor a többiek digitálisak lesznek. Meg set_tris_b (valami) is digitálissá tenné szerintem. Most külön ANSELH ki van nullázva, így sem megy.
Hali
Probald meg az inicializalasban a RBIE=1; ele egy valami=input_b(); rbif=0; betenni. Ki kell olvasni a portot, majd torolni a RBIF-et. Udv Vili
Helló!
Próbáld meg így: IOCB4=1; IOCB5=1; RBIE=1; PEIE=1; enable_interrupts(GLOBAL); "Periféria megszakítás engedélyezése"
Kipróbáltam ezeket is, sikertelen.
Csatolom a teljes kódot, amivel ezt megszakítást igyekszem feltámasztani. Nekem az gyanús, hogy portB nem jól van beállítva. Mint mondtam, ha bármikor én beleírom a programba, hogy RBIF=1; a megszakításkezelőt meghívja. Szerintem valami miatt nem érzi a bemenetet. (Rendesen 10K-val tápra van húzva, stabil.) Van valami hiba B port beállításaiban? Kezdek nagyon kifogyni az ötletekből...
Tegyél az int_rb_isr-ben is az RBIF=0 elé egy temp=port_b; sort. A lényeg, hogy a portb-ről olvass be legalább egy bitet.
Hali
Melegen ajanlom a MPLAB IDE MPSIM szimulatorat. Lepesenkenti vegrehajtasnal sasolni a regiszterek valtozasat sorrol sorra. Latom Te nem hasznaltad, vagy nem figyeltel elegge. A te kododban van egy sor a TRISB beallitasara :
Figyelni kell nagyon a szamok irasi formajara, Mert Te decimalis szamot irtal, pedig binarist akartal. Nem artana meg a RBPU-t beallitani. Lehetoleg ne hasznald a output_b(0); utasitast mert automatikusan atallitja a TRISB-t. Hasznalj #pragma use fast_io(B) utasitast es akkor nem piszkalja a TRISB-t. Ugy nagyjabol. Udv Vili
#USE FAST_IO (ALL)!! Ennyi hiányzott végig
Kipróbáltam: kiolvasni nem kell, HA külön kinullázzuk RBIF-et. A kiolvasás csak azért kellhet, hogy a fordító tegye meg helyettünk rbif törlését. Csatolom a _működő_ kódot, legyen itt az is... Idézet: „A kiolvasás csak azért kellhet, hogy a fordító tegye meg helyettünk rbif törlését.” De szeretem, amikor valaki elmondja, hogy szerinte hogy jó ahelyett, hogy megnézné az adatlapban, hogy kell azt csinálni. Szerinted ez a sor mégis mit csinál?
|
Bejelentkezés
Hirdetés |