Fórum témák

» Több friss téma
Fórum » CCS PIC Compiler
 
Témaindító: (Felhasználó 1542), idő: Ápr 3, 2006
Lapozás: OK   35 / 118
(#) pepe33 válasza icserny hozzászólására (») Márc 19, 2010 /
 
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 ?
(#) icserny válasza pepe33 hozzászólására (») Márc 19, 2010 /
 
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á.
(#) pepe33 válasza icserny hozzászólására (») Márc 19, 2010 /
 
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 ?
(#) icserny válasza pepe33 hozzászólására (») Márc 19, 2010 /
 
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.
(#) whalaky válasza icserny hozzászólására (») Márc 21, 2010 /
 
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.
(#) icserny válasza whalaky hozzászólására (») Márc 21, 2010 /
 
Idézet:
„PC-knek is ekkora szórásuk van?”
Nem kellene, de azoknak rezonátora is kvarcból van....

Örülök, hogy sikerült megoldani a problémákat!
(#) pepe33 válasza icserny hozzászólására (») Márc 27, 2010 /
 
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:
  1. #include <18F46J50.h>
  2. #device adc=10
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  6. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  7. #FUSES NODEBUG                  //No Debug mode for ICD
  8. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  9. #FUSES STVREN                   //Stack full/underflow will cause reset
  10. #FUSES NOPROTECT                //Code not protected from reading
  11. #FUSES NOFCMEN                  //Fail-safe clock monitor disabled
  12. #FUSES IESO                     //Internal External Switch Over mode enabled
  13. #FUSES IOL1WAY                  //Allows only one reconfiguration of peripheral pins
  14. #FUSES PRIMARY                  //Primary clock is system clock when scs=00
  15. #FUSES NOWPCFG              
  16. #FUSES WPEND                
  17. #FUSES WPDIS                
  18. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  19. #FUSES T1DIG                
  20. #FUSES MSSPMSK7              
  21. #FUSES PLLDIV1              
  22. #FUSES DSWDT2147483648      
  23. #FUSES DSWDT                
  24. #FUSES DSBOR                
  25. #FUSES RTCOSC_T1            
  26. #FUSES DSWDTOSC_INT          
  27. #FUSES WPFP0                
  28. #FUSES WPFP1                
  29. #FUSES WPFP2                
  30. #FUSES WPFP3                
  31. #FUSES WPFP4                
  32. #FUSES WPFP5                
  33. #FUSES NOCPUDIV              
  34.  
  35. #use delay(clock=20000000)
  36.   #ZERO_RAM
  37. #include <dt_lcd_v01.c>
  38. #include <math.h>
  39. #define  gomb_jobb   PIN_D0
  40. #define  gomb_kozep  PIN_D1
  41. #define  gomb_bal    PIN_D2   // ha 0 akkor benyomva
  42. #define  charge      PIN_D3   // ha 0 akkor töltés
  43. #define  light       PIN_B5   // ha 0 akkor bekapcsolva
  44. #define  EECON2      0xFA7
  45. #define  RPOR2       0xEC8    // PERIPHERAL PIN SELECT OUTPUT REGISTER 2
  46. #define  PPSCON      0xEFF    // PERIPHERAL PIN SELECT INPUT REGISTER 0
  47. #define  IOLOCK      0
  48. #define  INTCON      0xFF2
  49. #define  GIE         7
  50. int16 batt=0;
  51. char charbatt[]="000__00000";
  52. int sec = 0;
  53. int perc = 0;
  54.  
  55. #INT_TIMER1
  56. void timer1_interrupt_service()
  57. {
  58. set_timer1(32768);      //49152);
  59. sec++;
  60. if (sec==60){
  61.     sec=0;
  62.     perc++;
  63.    }
  64. if (perc==60){
  65.    perc=0;
  66.    }
  67. }
  68.  
  69. void main()
  70. {
  71. #asm
  72. MOVLB 0x0E              // Bank 14
  73. BCF INTCON, GIE         //Disable interrupts for unlock sequence
  74. MOVLW 0x55            // 1st unlock code into W
  75. MOVWF EECON2         // 1st unlock code from W to EECON2
  76. MOVLW 0xAA            // 2nd unlock code into W
  77. MOVWF EECON2         // 2nd unlock code from W into EECON2
  78. BCF   PPSCON, IOLOCK   // Clear IOLOCK of PPSCON, unlocking PPS
  79.  
  80. MOVLW 0x0E            // Set value 14 (CCP1) in W
  81. MOVWF RPOR2            // Move W into RPOR2
  82.  
  83. BCF INTCON, GIE         //Disable interrupts for unlock sequence
  84. MOVLW 0x55            // 1st lock code into W
  85. MOVWF EECON2         // 1st lock code from W to EECON2
  86. MOVLW 0xAA            // 2nd lock code into W
  87. MOVWF EECON2         // 2nd lock code from W into EECON2
  88. BSF   PPSCON, IOLOCK   // Set IOLOCK of PPSCON, locking PPS
  89. #endasm//*/
  90.    setup_adc_ports(sAN0|VSS_VDD);
  91.    setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_0);
  92.    setup_psp(PMP_DISABLED);
  93.    setup_spi(SPI_SS_DISABLED);
  94.    setup_spi2(SPI_SS_DISABLED);
  95.    setup_wdt(WDT_OFF);
  96.    setup_timer_0(RTCC_INTERNAL);
  97.    setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_CLK_OUT);
  98.    setup_timer_2(T2_DIV_BY_1,152,1);
  99.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  100.    setup_timer_4(T4_DISABLED,0,1);
  101.    setup_comparator(NC_NC_NC_NC);
  102.    setup_ccp1(CCP_PWM);
  103.    set_pwm1_duty(306);
  104.    setup_vref(FALSE);
  105.    ENABLE_INTERRUPTS(GLOBAL);
  106.    enable_interrupts(INT_TIMER1);  
  107.    DELAY_MS(100);
  108.    dt_lcd_init();                              // OLED initialzation
  109.    dt_lcd_clear_screen();                     // rest all screen RAM data
  110.    DELAY_MS(100);
  111.    dt_lcd_gotoxy(0,1);
  112.    printf(dt_lcd_printchar,"START");
  113.    set_adc_channel(0);
  114. while(true){
  115. delay_ms(10);
  116. batt = read_adc();
  117.    dt_lcd_gotoxy(0,3);
  118.    sprintf(charbatt, "batt=%4Lu",batt);
  119.    printf(dt_lcd_printchar,charbatt);
  120.    dt_lcd_gotoxy(0,6);
  121.    sprintf(charbatt, " %02u:%02u",perc,sec);
  122.    printf(dt_lcd_printchar,charbatt);
  123.    set_pwm1_duty(306);
  124.    delay_ms(500);
  125.    set_pwm1_duty(0);
  126.    delay_ms(500);
  127. }
  128. }
(#) icserny válasza pepe33 hozzászólására (») Márc 27, 2010 /
 
  1. #FUSES IOL1WAY

Ezt próbáld meg kikapcsolni!
(#) pepe33 válasza icserny hozzászólására (») Márc 28, 2010 /
 
Sajna már ezen is megvolt , de nem segítet....
(#) icserny válasza pepe33 hozzászólására (») Márc 28, 2010 /
 
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:
  1. BCF PPSCON, IOLOCK, BANKED


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).
(#) pepe33 válasza icserny hozzászólására (») Márc 28, 2010 /
 
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]
(#) pepe33 válasza icserny hozzászólására (») Márc 28, 2010 /
 
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
....................
(#) pepe33 válasza pepe33 hozzászólására (») Márc 28, 2010 /
 
Így működik:
  1. #pin_select P1A=PIN_A5


De azért érdekelne hogy mért nem ment az asm beilesztéssel.
(#) icserny válasza pepe33 hozzászólására (») Márc 28, 2010 /
 
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...
(#) pepe33 válasza icserny hozzászólására (») Márc 28, 2010 /
 
É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.
(#) icserny válasza icserny hozzászólására (») Márc 28, 2010 /
 
Idézet:
„A CCS C beépített assemblerének nyilván más szintaktikával kellene megadni”
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".

Na, akkor most már én sem értem, hogy mi volt a probléma az assembly betéttel!
(#) szkrep hozzászólása Ápr 3, 2010 /
 
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:

  1. #INT_RB
  2. void int_rb_isr()
  3. {
  4.    if(!input (PIN_B5))
  5.    {
  6.    s1++;
  7.    }
  8.         if(!input (PIN_B4))
  9.         {
  10.         s2++;
  11.         }
  12. }
  13.  
  14.  
  15. void main()
  16. {
  17. set_tris_b (00001100);  //2 bemenet a 2 kerékjeladónak
  18. set_tris_c (0);
  19.  
  20. clear_interrupt(INT_RB);  
  21. enable_interrupts(INT_RB);
  22. enable_interrupts(GLOBAL);
  23.  
  24. output_c (0b1111);  //2 motor forogni kezd, és 2 jeladó B4 és B5-re 24jelet ad fordulatonként
  25.  
  26. while(1);
  27. }
(#) szkrep válasza szkrep hozzászólására (») Ápr 3, 2010 /
 
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?...
(#) szkrep válasza szkrep hozzászólására (») Ápr 4, 2010 /
 
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?


  1. #byte IOCB = 0x096
  2. #bit IOCB4 = IOCB.4
  3. #bit IOCB5 = IOCB.5
  4.  
  5. #byte INTCON = 0x0B
  6. #bit RBIE = INTCON.3
  7. #bit RBIF = INTCON.0
  8.  
  9.  
  10. #INT_RB
  11. void int_rb_isr()
  12. {
  13. if(!input (PIN_B5))
  14.    {
  15.    s1++;
  16.    s11++;
  17.    }
  18.         if(!input (PIN_B4))
  19.         {
  20.         s2++;
  21.         s22++;
  22.         }
  23.  
  24.  RBIF=0;                                   //töröljük a "mismatch conditiont"
  25. }
  26.  
  27. main()
  28. {
  29. set_tris_b (0001100);
  30. RBIE=1; //engedélyezem a portb változásra bekövetkező megszakítást.
  31. IOCB4=1;
  32. IOCB5=1;   //b4 és b5 lábakat akarom csak figyelni
  33. enable_interrupts(global);
  34.  
  35. //+megforgatom a motorokat, stbstb
  36. while(1);
  37. }

33.oldal.pdf
    
(#) petike válasza szkrep hozzászólására (») Ápr 4, 2010 /
 
Hello !

Reset, vagy indulás után a portok analóg bemenetek.
Álitsd az ANSELH-t 0-ra.
(#) szkrep válasza petike hozzászólására (») Ápr 4, 2010 /
 
Ez B porton van, ami csak digitális tud lenni. A teljes beállítgatás így néz ki:
  1. void init()
  2. {
  3.  setup_adc(ADC_CLOCK_INTERNAL);
  4.  setup_adc_ports (sAN0 | sAN1);      //0>szenzor 1>akku
  5.  set_tris_b (00110000); //2 bemenet a 2 kerékjeladónak
  6.  set_tris_c (0);
  7.  set_tris_d (00110000);      //2 bemenet a 2 infrabumbernek
  8.  set_tris_e (1);                     //nyomógombok
  9.  
  10. SendWireless('a', 'b', 'c');   //valami különítse el konzolban a dolgokat
  11. SendWireless('a', 'b', 'c');  
  12. SendWireless('a', 'b', 'c');  
  13.  
  14.  high_count=HIGH_START;
  15.  set_rtcc(0);
  16.  setup_counters(RTCC_INTERNAL, RTCC_DIV_128);  
  17.  enable_interrupts(INT_RTCC);                    //timer1 megszakítása
  18.  //enable_interrupts(INT_RB4);                     //jeladók megszakítása
  19.  //enable_interrupts(INT_RB5);
  20.  
  21.  IOCB4=1;
  22.  IOCB5=1;
  23.  RBIE=1;
  24.  enable_interrupts(GLOBAL);
  25. }
(#) petike válasza szkrep hozzászólására (») Ápr 4, 2010 /
 
Az adatlap szerint (PIC16F887) PORTB0-PORTB5-ig
lehet analóg bemenet.
(#) szkrep válasza petike hozzászólására (») Ápr 4, 2010 /
 
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.
(#) vilmosd válasza szkrep hozzászólására (») Ápr 4, 2010 /
 
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
(#) DJani válasza szkrep hozzászólására (») Ápr 4, 2010 /
 
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"
(#) szkrep válasza DJani hozzászólására (») Ápr 5, 2010 /
 
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...

hiba.c
    
(#) potyo válasza szkrep hozzászólására (») Ápr 5, 2010 /
 
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.
(#) vilmosd válasza szkrep hozzászólására (») Ápr 5, 2010 /
 
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 :
  1. set_tris_b (00110000);
Mit irtal be a TRISB regiszterbe? 110000 azaz szaztizezer. A helyes :
  1. set_tris_b (0b00110000);

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
(#) szkrep válasza potyo hozzászólására (») Ápr 5, 2010 /
 
#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...

#int_rb.c
    
(#) potyo válasza szkrep hozzászólására (») Ápr 5, 2010 /
 
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?
  1. if(!input (PIN_B4))
Következő: »»   35 / 118
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