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   102 / 118
(#) vicsys válasza messer hozzászólására (») Dec 10, 2014 /
 
2 dolgot nem értek. Miért kell a megszakítást tiltani a megszakítás közben, ha nem kezel le semmit? Nem az lenne a lényeg, hogy érzékelje az összes megszakítási kérelmet? No, meg illik minél gyorsabban lekezelni a megszakítást... A másik, hogy a megszakítás belsejében nem kell törölni, azt majd a főprogramban kéne, ha tényleg lezajlott a visszatérés (és remélhetőleg) az általa okozott dolog dolog kérelmének a kiszolgálása. Én a megszakításban csak egy jelzőbitet szoktam átváltani és főprogramban kezelem le a hozzá tartozó dolgot majd csak ezután törlök. Persze ez viszonyfüggő...
(#) messer válasza vicsys hozzászólására (») Dec 10, 2014 /
 
Ez kód csak tesztelés majd lesz a megszakításban is remélem valami! Az érdekes számomra hogy a ccsc mikor belép a megszakításba magától tiltja a globalt, és ha vissza tér belőle akkor engedélyezi is azt.
(#) messer válasza vicsys hozzászólására (») Dec 10, 2014 /
 
Esetleg arra van ötleted, hogy az mplab miért ugrik a két megszakítás közé ahogy a képen látszik amit feltettem?
(#) potyo válasza messer hozzászólására (») Dec 10, 2014 /
 
A globalt nem a CCSC tiltja, hanem az hardveresen van tiltva, amikor a programszámláló a megszakítást kiszolgáló rutinra ugrik.

Amúgy azért szöszölhet, mert a valóságban nincs minden megszakításforrás kezelésére külön cím, hanem csak egyetlen van, és abban kell ellenőrizni, hogy mi okozta a megszakítást. A CCSC ezt megcsinálja a háttérben, de meg kell csinálnia, és gondolom az INT_RB van a listában előrébb, és utána ellenőrzi, hogy az EXT_INT is fennáll-e.
(#) messer válasza potyo hozzászólására (») Dec 10, 2014 /
 
Ez lehet amit írtál, mert megfigyeltem hogyha előre írom az EXT_int és utánna az int_rb megszakítást akkor végre sem tudja hajtani!
(#) Dempsey hozzászólása Dec 10, 2014 /
 
Ha már ennél a témánál vagyunk én is kipróbáltam az Mplab Sim-et. Eddig még nem használtam soha és csak egyszerűbb programokat írogattam. Most írtam egy egyszerűt és a szimulátorba nem lép be a Timer1-be, de élőbe teljesen jól működik a program. Ezt nem értem hogy miért van.
  1. #include<16f877a.h>
  2. #fuses hs,nowdt,put,noprotect
  3. #use delay(clock=20Mhz)
  4.  
  5. boolean a=false;
  6. int i=0;
  7.  
  8.  
  9. #int_ext
  10. void gomb_isr(){
  11.         if (input(pin_B0)){
  12.         a=true;
  13.         }
  14. }
  15.  
  16. #int_timer1
  17. void ido_isr(){
  18.         set_timer1(3036);
  19.         if (a==true){
  20.         output_high(pin_b1);
  21.         i=i+1;
  22.         }
  23. }
  24.  
  25. void main(){
  26.         setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
  27.         enable_interrupts(INT_TIMER1);
  28.         enable_interrupts(int_ext);
  29.         ext_int_edge(L_TO_H);
  30.         enable_interrupts(global);
  31.  
  32. for(;;){
  33.  
  34.         if (i==30){
  35.         output_low(pin_b1);
  36.         a=false;
  37.         i=0;
  38.         }
  39.         }
  40. }
(#) potyo válasza messer hozzászólására (») Dec 10, 2014 /
 
Akkor az valami hiba lehet valahol, gyanítom, hogy az MPLAB SIM-ben, ha a kontrollerben egyébként jól működik .
(#) potyo válasza Dempsey hozzászólására (») Dec 10, 2014 /
 
Erre is azt gyanítom, hogy az MPLAB és a CCS közötti együttműködés nem hibamentes. Valamelyik nap épp szimuláltam timert az MPLAB SIM-el XC8-at használva fordítónak, azzal szépen belefutott a megszakításba.
(#) Dempsey válasza potyo hozzászólására (») Dec 11, 2014 /
 
Értem. Köszi a segítséget.
(#) messer válasza Dempsey hozzászólására (») Dec 16, 2014 /
 
Szia megnéztem nálam is a kodot nálam belép jól működik.

Mplab--8.89
Ccsc----5.024
(#) Dempsey válasza messer hozzászólására (») Dec 16, 2014 /
 
Köszi!
Nekem Mplab-->8.92
CCSC-->5.008
(#) Dempsey válasza Dempsey hozzászólására (») Dec 16, 2014 /
 
Megszereztem az CCSC-->5.015-öt azzal se jó még :S.
(#) kormika hozzászólása Dec 24, 2014 /
 
Sziasztok! Egy játék távirányítóját tuningolom fel kicsit, és oda kerültem, hogy az "ö" betüt kellene kiíratnom az LCD-re. A csatolt forráskódban ezt hogyan tudnám megoldani? Jelenleg ö betü helyett a görög nagy éta jeleneik meg az LCD-n. Az LCD meghajtó adatlapja szerint tudja az ö betüt, de mivel ST7066 máshol van.
  1. #include <16F819.h>
  2. #device ADC=10
  3. #fuses NOWDT,INTRC_IO,PUT,NOPROTECT,BROWNOUT,NOLVP,NOCPD,NOMCLR
  4. #use delay(clock=500000)
  5.  
  6. #define LCD_ENABLE_PIN PIN_B6
  7. #define LCD_RS_PIN PIN_B4
  8. #define LCD_RW_PIN PIN_B5
  9. #define LCD_DATA4 PIN_B3
  10. #define LCD_DATA5 PIN_B2
  11. #define LCD_DATA6 PIN_B1
  12. #define LCD_DATA7 PIN_B0
  13.  
  14. #define PowerLED PIN_B7
  15.  
  16. #include <lcd.c>
  17.  
  18. void main(){
  19.  
  20.    delay_ms(500);
  21.    int16 volt;
  22.    int16 volte;
  23.    int16 volts;
  24.    delay_ms(500);
  25.    setup_adc(ADC_CLOCK_INTERNAL);
  26.    setup_adc_ports(AN0);
  27.    lcd_init();
  28.    delay_ms(250);
  29.    lcd_gotoxy(2,1);
  30.    printf(lcd_putc,"Okosabb lettem");
  31.    lcd_gotoxy(2,2);
  32.    lcd_putc("Köszi: Kormika");
  33.    delay_ms(1000);
  34.    
  35. while(TRUE){
  36.    
  37.    volt = 0;
  38.    set_adc_channel(0);
  39.    delay_ms(25);
  40.    volt = read_adc();
  41.    volt = volt*4.89;
  42.    volt = volt*2;
  43.    volte = volt/1000;
  44.    volts = volt%1000;
  45.    
  46.    if(volts<10){
  47.       lcd_gotoxy(1,1);
  48.       printf(lcd_putc,"Akkufesz: %ld\.00\%ldV",volte,volts);
  49.    }
  50.    else if(volts<100){
  51.       lcd_gotoxy(1,1);
  52.       printf(lcd_putc,"Akkufesz: %ld\.0\%ldV ",volte,volts);
  53.    }
  54.    else{
  55.       lcd_gotoxy(1,1);
  56.       printf(lcd_putc,"Akkufesz: %ld\.\%ldV  ",volte,volts);
  57.    }
  58.    
  59.    if(volt<7200){
  60.      lcd_gotoxy(3,2);
  61.      lcd_putc("Tölts fel!!!");
  62.      output_low(PowerLED);
  63.    }
  64.    else{
  65.      lcd_gotoxy(1,2);
  66.      lcd_putc("                ");
  67.      output_high(PowerLED);
  68.    }
  69.    
  70.    }
  71.  
  72. }
(#) czinka válasza kormika hozzászólására (») Dec 25, 2014 /
 
Szia!
A main void előtt beszúrod ezt:
//--------------------------Új karakterek dekrarálása---------------------------
char image[56] =
{
4,4,14,1,15,17,15,0, /* 0 dik karakter 'á'*/
4,4,14,17,31,16,14,0, /* 1 dik karakter 'é'*/
10,0,14,17,17,17,14,0, /* 2 dik karakter 'ö'*/
10,14,17,17,17,17,14,0, /* 3 dik karakter 'Ö'*/
10,10,14,17,17,17,14,0, /* 4 dik karakter 'ő'*/
4,14,17,17,17,17,14,0, /* 5 dik karakter 'Ó'*/
10,0,17,17,17,19,13,0 /* 6 dik karakter 'ü'*/
};
A main voidba a konfigután:
lcd_init(); //LCD inicializálása
delay_ms(100);
lcd_send_byte(0,0x40); // LCD belső memória kijelölése
for (betu = 0; betu < sizeof(image); betu++)// új kar. letárolása az LCD-ben
{
lcd_send_byte(1,image[betu]);
}
printf(lcd_putc, "\f");
A programban pedig így használod a karaktereet:
printf(lcd_putc,"H%cm%crs%cklet hiba",4,1,1); //Hőmérséklet hiba
(#) kormika válasza czinka hozzászólására (») Dec 25, 2014 /
 
Köszönöm szépen, most végre nem pákósan beszél a programom.
(#) icserny válasza kormika hozzászólására (») Dec 25, 2014 /
 
Én úgy oldottam meg, hogy karaktereket kiíró függvényt (ami nálam lcd8_putc névre hallgat) megfejeltem egy kis karakterkód-helyettesítéssel. Bővebben: Link

  1. //-- karakter kiírás az LCD-re, az ékezetes karakterek átkódolásával
  2. void lcd8_putc(unsigned char c) {
  3.     switch(c) {
  4.             case 'á':  c = 0x00; break;
  5.             case 'é':  c = 0x01; break;
  6.             case 'í':  c = 0x02; break;
  7.             case 'ó':  c = 0x03; break;
  8.             case 'ú':  c = 0x04; break;
  9.             case 'ü':  c = 0x05; break;
  10.             case 'ű':  c = 0x06; break;
  11.             case 'ő':  c = 0x07; break;
  12.             case 'ö':  c = 0xEF; break;
  13.     }
  14.     lcd8_write_data(c);
  15. }
(#) Gyimate hozzászólása Dec 26, 2014 /
 
Sziasztok!
Ismét elkezdtem foglalkozni USB-n történő kommunikációval. A PIC-el egy virtuális soros portot hozok létre és így kommunikálok a számítógéppel. A kapcsolat létre is jön, minden rendben megy, azonban van egy kis problémám, amit már két napja nem tudok megoldani: Amikor egy terminál programmal küldöm az adatot (RealTerm) szépen kezeli a szoftveres Handshake-et, vagyis a 0x11-es és 0x13-as karaktereket és így megközelítőleg fél mbit/s sebességet értem el, azonban többségében nem terminál programon keresztül szeretnék kommunikálni a PIC-el, ezért írtam egy egyszerű C# programot és itt kezdődik a probléma. A C# programban a szoftveres kézrázásra nem reagál a program és a hardveres adatfolyam kezelést pedig a PIC-en nem tudom megvalósítani, vagyis nem tudom módosítani a CTS jelet és így a legnagyobb sebesség amit el tudtam érni 9600 baud volt. Esetleg volt itt közöttetek valaki, aki foglalkozott hasonlóval és tudja a megoldást, hogy felgyorsítsam egy kicsit az adatfolyamot?
A válaszokat előre is köszönöm!
(#) Gyimate válasza Gyimate hozzászólására (») Dec 27, 2014 /
 
Sziasztok!
A kérdés már nem aktuális, rájöttem a megoldásra. A lényeg az egészben, hogy ha egy nagyobb elemszámú tömböt kell átküldeni soros porton, akkor ne egy for ciklussal küldjük ki külön-külön a tömb elemeit, hanem a serial.write függvénynek kell megadni a tömb elemszámát és ilyenkor kezeli az adatfolyamot rendesen. A CCS-ben pedig csak a DCD és a DSR lábakat tudtam billegtetni.
(#) feco93 hozzászólása Dec 30, 2014 /
 
Sziasztok!
Van egy egyszerű kódom mely gyakorlás/próbálkozás céljából csinálgattam.
Lényege annyi lenne hogy küld rs232-ön üzenetet és gomb nyomására világít a led s itt is küld egy üzenetet.
  1. #include <16F690.H>
  2. #fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT,
  3. #use delay(clock = 2000000)
  4. #use rs232(baud = 9600, xmit=PIN_B7, rcv=PIN_B5)
  5.  
  6. #define gomb1  PIN_A2
  7. #define gomb2  PIN_C0
  8. #define gomb3  PIN_C1
  9. #define gomb4  PIN_C2
  10.  
  11. #define LED1     PIN_C6
  12. #define LED2     PIN_C7
  13. #define LED3     PIN_C3
  14.  
  15. void elso();
  16.  
  17. //====================================
  18. void main()
  19. {
  20.  //output_low(LED1 && LED2 && LED3);
  21. printf("init\n\r");
  22. while(true)
  23.   {
  24.     if(!input(gomb1))
  25.         elso();
  26.        
  27.     else
  28.         output_low(LED1);
  29.  
  30.     if(!input(gomb2))
  31.         output_toggle(LED2);
  32.     else
  33.         output_low(LED2);
  34.  
  35.       if(!input(gomb3))
  36.         output_toggle(LED3);
  37.     else
  38.         output_low(LED3);
  39.  
  40.       if(!input(gomb4))
  41.         output_toggle(LED1&& LED2&& LED3);
  42.     else
  43.         output_low(LED1&& LED2&& LED3);
  44.       }
  45. }
  46. //==================================
  47. void elso(){
  48.  printf("szoveg \n\r");
  49.  output_toggle(LED1);
  50. }

A problémám az lenne hogy az üzenetek nem értelmezhető módon jelennek meg. Ami még fontos az uarthoz a pickit2-őt használom.
  1. //hex
  2. RX:  C6
  3. RX:  39 BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF C8
  4. RX:  39 BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF BE BF C8
  5. //ASCII


S még egy olyan kérdésem lenne hogy és kapcsolatot nem jól írtam meg mert ennek a sornak a végrehajtása nem történik meg ( output_toggle(LED1&& LED2&& LED3) Itt úgy gondoltam a gomb lenyomásakor mind a 3 led világítana. De sajnos nem működik!

Előre is köszönöm a segítséget!

BUÉK!
A hozzászólás módosítva: Dec 30, 2014
(#) jani87 válasza feco93 hozzászólására (») Dec 31, 2014 /
 
Szia!

Az ÉS kapcsolat ebben a formában nem is fog úgy működni, ahogy szeretnéd. Három külön sorba kell ezeket leírni és a zárójelbe csak egy LED-et beleírni.

A másik, az output_toggle() parancs az aktuális kimenet állapotát változtatja meg, tehát ha magasban volt, GND-re húzza, ha alacsonyban volt tápfeszre emeli. Ebben az esetben így is teljesen jó, hiszen ha nincs lenyomva a gomb, akkor a kimenet ki van kapcsolva és gombnyomásra megváltozik az állapota, tehát a a LED világítani fog. De logikailag szerintem jobb lenne a kimenetek bekapcsolására az output_high() parancs.
(#) feco93 válasza jani87 hozzászólására (») Dec 31, 2014 /
 
Köszönöm szépen! Csak azt hittem hogy lehet ebben ilyet csinálni. Mert Suliba mi mspét tanultunk s abba lehetett ilyet csinálni!
Esetleg Uartra valami ötlet valakinek?
(#) Gyimate válasza feco93 hozzászólására (») Jan 6, 2015 /
 
Szia!
Nem tudom, hogy már megfejtetted-e a problémát az UART-al kapcsolatban, de ha még nem, akkor ellenőrizd le, hogy a PIC valóban 20MHz-ről üzemel-e, mellesleg a 20MHz-hez már illik a HS fuse-t használni az XT helyett. Nézd meg, hogy a PicKit programjában megfelelően van-e beállítva a baud rate, illetve, hogy a RX és a TX lábakat jó helyre kötötted-e. Ha ezek is rendben vannak, akkor a PIC tápjához, minél közelebb a lábához tegyél be hidegítőkondikat, mondjuk 100µF + 100nF párost. Győződj meg róla, hogy az MCLR láb nem lóg-e a levegőben, amikor a PicKitet soros kommunikációra használod.
Egyelőre ennyi jut eszembe, ha egyik tipp sem jött be, akkor írj és agyalok rajta még egy kicsit.
(#) feco93 válasza Gyimate hozzászólására (») Jan 6, 2015 /
 
Szia!

Ki próbáltam mindent amit írtál nem segített. Viszont meg próbáltam azt hogy a programban átírtam a baud = 4800 Pickit 2 Uart toolban pedig véletlen 9600 hagytam és így működik nem tudom mi lehet a baj. Ha pedig a programba írok 9600 akkor az uart tool-ba kell 19200 állítani olyan mintha valami el lenne csúszva de nekem tippem sincs mi lehet a probléma. Próbáltam egy GPS modult a PICkit2-vől az tök jól működőt a 9600 baud rate értéken(Ez volt megadva az adatlapon). Szóval gondolom hogy a programban nem jó valami. Esetleg a kvarcal lenne valami probléma?
(#) Peppe válasza feco93 hozzászólására (») Jan 6, 2015 /
 
Ez tipikus órajel beállítási hiba. A konfig bitek környékén nézz szét.
A kvarc sebessége tuti a forrásban meghatározott?
(#) feco93 válasza Peppe hozzászólására (») Jan 6, 2015 /
 
A kvarcon ez áll: YIC 20.000 J1 és ez mellet a két kondenzátor melyen ez áll: NJ 22
(#) Peppe válasza feco93 hozzászólására (») Jan 6, 2015 /
 
A forrásban definiálva van a kvarc sebessége?
Ha igen akkor 20MHz van be írva? Illetve a soros periféria jól van konfigurálva?
Milyen leosztott órajelet kap? Baudrate regiszterben jó érték van beírva?

A konfig biteknél HS órajel van kiválasztva?

Ebben az irányban keresd a hibát. Én is megszívtam egyszer már. Akkor a fordató viccelt meg.
A hozzászólás módosítva: Jan 6, 2015
(#) feco93 válasza Peppe hozzászólására (») Jan 6, 2015 /
 
  1. #include <16F690.H>
  2. #fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT,
  3. #use delay(clock = 2000000)
  4. #use rs232(baud = 9600, xmit=PIN_B7, rcv=PIN_B5)


A beállítás rész nekem ennyi.
De a komplett program ebben az hozzászólásban van Link
(#) Peppe válasza feco93 hozzászólására (») Jan 6, 2015 / 1
 
#use delay(clock = 20000000)
Így lenn a helyes 1db "0" kihagytál.
Szerintem!! Ha nem javul meg írd meg.
(#) sysy válasza Peppe hozzászólására (») Jan 6, 2015 /
 
Mi az oka annak, hogy nem ezt a formátumot használod?:

#use delay(clock=20MHz)
(#) Peppe válasza sysy hozzászólására (») Jan 6, 2015 /
 
feco93 nevű fórumtárs használja ezt a programot.
Én csak segíteni próbálok neki
Következő: »»   102 / 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