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   98 / 118
(#) vilmosd válasza messer hozzászólására (») Feb 18, 2014 /
 
Keress ra a "PBUS" szora. Ez egy egydrotos kommunikacio. Mindenkinek van sajat cime, es csak a neki szolo uzenetet veszi. Itt egy pelda. En csinaltam ilyen halozatot, es szepen dolgozott. A SW termeszetesen CCS C-ben van irva.
(#) messer válasza vilmosd hozzászólására (») Feb 18, 2014 /
 
Nekem ez nem jó mert minden dali eszköznek lesz kihúzva külön kábel.
(#) vilmosd válasza messer hozzászólására (») Feb 18, 2014 /
 
Attol meg lehet egy labra kotni a kabelt.
(#) messer válasza vilmosd hozzászólására (») Feb 18, 2014 /
 
Szeretném én megírni a dolgot, csak az a baj, hogy a c ismeretek hiányosak még most pl itt akadtam meg:

  1. #include <18F25K80.h>
  2. int data,c;
  3.  
  4. #bit data0 = data.0
  5. #bit data1 = data.1
  6. #bit data2 = data.2
  7. #bit data3 = data.3
  8. #bit data4 = data.4
  9. #bit data5 = data.5
  10. #bit data6 = data.6
  11. #bit data7 = data.7
  12.  
  13. int write_dali(int data);
  14.  
  15. int write_dali(int data)       
  16.         {
  17.         c=data0;
  18.         c=data1;
  19.         c=data2;
  20.         c=data3;
  21.         c=data4;
  22.         c=data5;
  23.         c=data6;
  24.         c=data7;
  25.         }
  26.  
  27. void main(){
  28. while(1){
  29.         {
  30.          write_dali(100);
  31.          }
  32. }


Nem tudom a c-be írni az adott bitek értékét. Nem értem hol hibázok.
A hozzászólás módosítva: Feb 18, 2014
(#) Hp41C válasza messer hozzászólására (») Feb 18, 2014 /
 
Ha lehet, kapcsold ki az optimalizálást. Olyan okos, hogy kiszedi azokat az utasításokat, amik fel nem használt változók értékét módosítják. Esetleg c legyen volatile:
volatile int c;
A hozzászólás módosítva: Feb 18, 2014
(#) messer válasza Hp41C hozzászólására (») Feb 18, 2014 /
 
  1. #include <18F25K80.h>
  2. int data;
  3. volatile int c;
  4.      
  5. #bit data0 = data.0
  6. #bit data1 = data.1
  7. #bit data2 = data.2
  8. #bit data3 = data.3
  9. #bit data4 = data.4
  10. #bit data5 = data.5
  11. #bit data6 = data.6
  12. #bit data7 = data.7
  13.      
  14. int write_dali(int data);
  15.  
  16. int write_dali(int data)      
  17.             {
  18.                         c=data;
  19.             c=data0;
  20.             c=data1;
  21.             c=data2;
  22.             c=data3;
  23.             c=data4;
  24.             c=data5;
  25.             c=data6;
  26.             c=data7;
  27.             }
  28.      
  29. void main(){
  30.     while(1){
  31.             {
  32.              write_dali(100);
  33.              }
  34.     }
  35. }


Ebben a formában betettem még egy c=data, C egyenlő is lesz százzal viszont bitenként nem íródik a c.
Szerintem nagyon rosszul csinálok valamit.
(#) Hp41C válasza messer hozzászólására (») Feb 18, 2014 /
 
Onnan még valami hiányzik...
(#) messer válasza messer hozzászólására (») Feb 18, 2014 /
 
Mikor simán értéket adok a data-nak fő rutinban akkor bitenként megjelenik az érték a watch ablakban...
(#) messer válasza Hp41C hozzászólására (») Feb 18, 2014 /
 
mi és honnan?
(#) Hp41C válasza messer hozzászólására (») Feb 18, 2014 /
 
..csak a lényeg, a dali üzenetté konvertálás és a küldés.
(#) messer válasza Hp41C hozzászólására (») Feb 18, 2014 /
 
Lehet hogy elbeszélünk egymás mellett nagyon titokzatos vagy... ott tartok egyenlőre hogy a 100-as érték átmegy a függvénybe, de a belsejében a c nem akar íródni a data változó bitenkénti értékével ez még messze nem a dali kommunikáció. Azt kéne megoldani hogy a függvényem működjön. Esetleg nem tudnád bedobni mplab alá a kódot és megvizsgálni?
(#) Tas84 válasza messer hozzászólására (») Feb 18, 2014 / 1
 
A globális data változónak nincs értéke, így nem sok értelme van kiszedni bitenként. A write_dali-ban használd a bit_test fügvényt.

bit_test(változó, hányadik bit)
(#) messer válasza Tas84 hozzászólására (») Feb 18, 2014 /
 
Amikor a write_dali(100); al meghívom a "int write_dali(int data)" függvényt akkor nem kapja meg a 100-as értéket?
(#) Tas84 válasza messer hozzászólására (») Feb 19, 2014 / 1
 
Megkapja a 100-ast, de a data0...data7-ben nem a 100-as bitjei vannak, hanem semmi. A data0...data7 fordításkor kap értéket, mégpedig azt ami a globális data változódban van.
(#) messer válasza Tas84 hozzászólására (») Feb 19, 2014 /
 
Köszönöm a válaszodat nagyon sokat segített a tanácsod
Idézet:
„bit_test(változó, hányadik bit)”
(#) Jossz hozzászólása Feb 26, 2014 /
 
Sziasztok fiúk, a véleményetek érdekelne. Egy számomra furcsa jelenségre lettem figyelmes, lehet, hogy valakinek van tapasztalata ill. megoldási ötlete az ügyben.
Egy saját távdetektoros mérőműszert fejlesztek PIC18F4620 MCU-val. A lényeg, hogy 3 féle megszakítást akartam használni a kéziműszer programjában:
1. az #int_timer1 egy késleltetést működtet, amely a bekapcsolás után a detektor szenzor bemelegedését hivatott "kiváratni" a felhasználóval, valamint a várakozási idő alatt elvégzi a detektor beazonosítását, paramétereinek egyeztetését RS232-n keresztül. Ez a megszakítás és a hozzá tartozó rutin tökéletesen működik.
2. az #int_rda figyeli a detektortól beérkező üzeneteket annak rendje és módja szerint getc() rutinnal. Ez a megszakítás és a hozzá tartozó rutin is tökéletesen működik.
3. az #int_rb figyeli a kéziműszer billentyűzetét amely a rb4,rb5,rb6 lábakra van kötve. Használom a felhúzó ellenállások aktiválását, stb., aktiváláskor normálisan inicializálom a b portot, ahogy azt kell. Nos, ennél a megszakításnál van a bibi. Teljesen mindegy, hogy milyen rutint írok hozzá (az #int_rb alá), akár üres rutint is, már az is elegendő a hibajelenséghez, ha az #int_rb sort beírom, tehát ha kikommentelem, akkor nincs hiba.
A hibajelenség pedig az, hogy ha beírom a megszakítás sorát, akkor a főprogramban a megszakítások engedélyezése utáni résztől kezdve jelentősen lelassul a program futása, a 2 perc várakoztatásból 3 perc lesz, elmegy az UART időzítése is, ezért azután mindenféle értelmetlenséget vesz és a futás egyre csak lassul. Ha kikommentelem az #int_rb sort, akkor semmi gond, minden tökéletesen működik. Próbálkoztam a megszakítások prioritásának beállításával, stb., de nem segített semmi.
Hardveresen a billentyűzet bekötése jó, cikluson belüli időzített figyeléssel megszakítás használata nélkül megoldottam a billentyűzet kezelését, tehát ez a rész is jól működik.
Lehet, hogy ez a 4620-as valamilyen típushibája, mert ilyennel nem találkoztam más típusoknál (4520, 4580) ? A compiler v5.011, de a v4.140 alatt lefordítva is ugyenezt csinálta.
Van valakinek tapasztalata, ötlete? Mert ezzel a megoldásommal is működik szépen a cucc, de nem igazán "elegáns"...
A hozzászólás módosítva: Feb 26, 2014
(#) kissi válasza Jossz hozzászólására (») Feb 26, 2014 /
 
Szia!

Nem használom a CCS-t, de az RB changed funkció megszakításánál a PORTB olvasásával kell emlékeim szerint törölni a jelzést( nézd meg az adatlapban, mert most nincs előttem és régen használtam!), a leírásod alapján úgy gondolom ez elmarad és emiatt folyamatosan visszatérve a rutinba jelentősen lelassul!
(#) vicsys válasza Jossz hozzászólására (») Feb 26, 2014 /
 
Felfutó/lefutó él be van állítva? Felhúzó ellenállás, stb... okés? Megszakítás prioritás be van állítva? Van elég idő a megszakítást lekezelni? RB-nél ha lefutott a megszítás, törlöd a megszakítást kérő flag-et? Nem túl nagy a megszakításban lekezelt rész?
(#) Hp41C válasza Jossz hozzászólására (») Feb 26, 2014 /
 
Az RB megszakításkezelésében kiolvasod a PORTB -t, törlöd az RBIF -et? Az errata -ban levő megszakítással kapcsolatos megjegyzést olvastad?
(#) vilmosd válasza Jossz hozzászólására (») Feb 26, 2014 /
 
Jo lenne ha a megszakitaskezeles programreszleteket felraknad, es igy tobbet lehetne esetleg mondani. Igy latatlanban eleg nehez kitalalni mi is lehet a problema.
(#) Jossz válasza vilmosd hozzászólására (») Feb 26, 2014 /
 
Sziasztok, köszönöm a segítőkészséget!
Idemásolom a lényeges kódrészletet, talán így többet láttok... Egyébként így belegondolva arra hajlok, lehet hogy a timer1 megszakítás miatt nincs ideje végrehajtani az rb megszakítást? Mindegy, nézzétek:

  1. #if defined(__PCH__)
  2.         #include <18F4620.h>
  3.         #device HIGH_INTS=TRUE
  4.  
  5.         #fuses HS,NOWDT,PUT,NOBROWNOUT,NOPROTECT,NOLVP
  6.         #use delay(clock=20000000)
  7.         #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,PARITY=N,BITS=8,STOP=1,ERRORS)
  8.  
  9.         #priority int_timer1, int_rb
  10.  
  11.         #define FAST_GLCD
  12.  
  13.         #define power_on output_bit(pin_E0,1)
  14.         #define power_off output_bit(pin_E0,0)
  15.  
  16.  
  17.         #define vent_on output_bit(pin_E1,1)
  18.         #define vent_off output_bit(pin_E1,0)
  19.  
  20.         #define gate1 input_state(PIN_B4)
  21.         #define gate2 input_state(PIN_B5)
  22.         #define gate3 input_state(PIN_B6)
  23.         #define b_vil (!gate1 && !gate2 && !gate3) //b_setup
  24.         #define b_hold (!gate1 && gate2 && gate3)
  25.         #define b_minmax (gate1 && !gate2 && gate3)
  26.         #define b_avg (!gate1 && !gate2 && gate3)       //b_up
  27.         #define b_set (gate1 && gate2 && !gate3)        //b_down
  28.         #define b_vent (!gate1 && gate2 && !gate3)      //b_mem
  29.         #define b_setup (gate1 && !gate2 && !gate3) //b_set
  30.         #define LAST_VOLUME 0
  31.         #define perc 60
  32.  
  33.         #define RX_BUFFER_SIZE 40       //40
  34.         #define TX_BUFFER_SIZE 22
  35.  
  36. #endif
  37.  
  38.  
  39. #include <stdio.h>
  40. #include <string.h>
  41. #include <stdlib.h>
  42. #include <math.h>
  43. #include <input.c>
  44. //#include <ds1302.c>
  45. #include <HDM64GS12_s.c>
  46. #include <graphics.c>
  47. #include <Exologo_GLCD.h>
  48. .
  49. .
  50. .
  51. .
  52.  
  53. //-------------Soros port figyelő megszakítási rutin------------
  54. #int_RDA HIGH
  55. void RDA_isr(void) {
  56.         rxd = getc();
  57.         if (rxd != 0x00) {
  58.                 rx_buffer[rx_wr_index] = rxd;  
  59.                 rx_wr_index++;
  60.         }
  61.         if (rx_wr_index > RX_BUFFER_SIZE) {
  62.                 rx_wr_index = 0;
  63.                 data_avail = TRUE;
  64.         }
  65. }
  66.  
  67.  
  68. //-------------Időzítő megszakítási rutin------------
  69. #int_timer1
  70. void isr_timer1(void)   {
  71.         if(xpoz < 112)  {
  72.                 t1_ms++; // növelés 0,1 sec időközönként
  73.                 if(t1_ms<=100)  {
  74.                         if(xpoz < 112)  {
  75.                                 if((t1_ms==10) || (t1_ms==30) || (t1_ms==50) || (t1_ms==70) || (t1_ms==90)) {  
  76.                                         glcd_circle(xpoz, ypoz, 2, YES, OFF);             // Draw the clock circle
  77.                                         glcd_circle(xpoz, ypoz, 1, YES, ON);             // Draw the clock circle
  78.                                         glcd_update();
  79.                                 }
  80.                                 if((t1_ms==20) || (t1_ms==40) || (t1_ms==60) || (t1_ms==80) || (t1_ms==100)) {  
  81.                                         glcd_circle(xpoz, ypoz, 2, YES, ON);             // Draw the clock circle
  82.                                         glcd_update();
  83.                                 }
  84.                         }
  85.                 }
  86.                 if(t1_ms==100) {
  87.                         xpoz=xpoz+8;
  88.                         t1_ms=0;
  89.                 }
  90.         }
  91.         else {
  92.                 disable_interrupts(INT_TIMER1); // Timer1 megszakítás tiltása
  93.                 xpoz=0;
  94.                 enable_interrupts(INT_RDA);
  95.         }
  96. }
  97.  
  98. int8 input_state_b(void)
  99. {
  100.         #byte PortB = getenv("SFRORTB") //SFR(kettőspont)PORTB
  101.         return(PortB);
  102. }
  103.  
  104.  
  105. //--------Megszakítási rutinok billentyű lenyomására--------
  106. #int_rb
  107. void isr_gombnyomas(void) {
  108.  
  109.         int8 temp;
  110.         delay_ms(20);   //Kivárás billentyű állapot kiolvasához
  111.  
  112.         if(b_setup)     {
  113.                 glcd_fillScreen(OFF); //Display törlése
  114.                 strcpy(char_kiiras1,"Setup");
  115.                 glcd_text57(6, 20, char_kiiras1, 2, ON);        // Display "Beallitasok"
  116.                 glcd_update();
  117.                 delay_ms(6000);
  118.         }
  119.  
  120.         if(b_hold)      {
  121.                 glcd_fillScreen(OFF); //Display törlése
  122.                 strcpy(char_kiiras1,"Utolso ertek");
  123.                 glcd_text57(6, 20, char_kiiras1, 2, ON);        // Display "Beallitasok"
  124.                 glcd_update();
  125.                 delay_ms(6000);
  126.         }
  127.  
  128.         if(b_minmax)    {
  129.                 glcd_fillScreen(OFF); //Display törlése
  130.                 strcpy(char_kiiras1,"Min / Max");
  131.                 glcd_text57(6, 20, char_kiiras1, 2, ON);        // Display "Beallitasok"
  132.                 glcd_update();
  133.                 delay_ms(6000);
  134.         }
  135.  
  136.         if(b_avg)       {
  137.                 glcd_fillScreen(OFF); //Display törlése
  138.                 strcpy(char_kiiras1,"Atlag");
  139.                 glcd_text57(6, 20, char_kiiras1, 2, ON);        // Display "Beallitasok"
  140.                 glcd_update();
  141.                 delay_ms(6000);
  142.         }
  143.  
  144.         if(b_set)       {
  145.                 glcd_fillScreen(OFF); //Display törlése
  146.                 strcpy(char_kiiras1,"Set");
  147.                 glcd_text57(6, 20, char_kiiras1, 2, ON);        // Display "Beallitasok"
  148.                 glcd_update();
  149.                 delay_ms(6000);
  150.         }
  151.  
  152.         if(b_vent)      {
  153.                 if(vent_stat==0) {
  154.                         vent_stat=1;
  155.                         strcpy(vent_mod,"Aktiv mod");
  156.                         vent_on;
  157.                 }
  158.                 else {
  159.                         vent_stat=0;
  160.                         strcpy(vent_mod,"Passziv mod");
  161.                         vent_off;
  162.                 }
  163.                 delay_ms(10);
  164.         }
  165.  
  166.         if(b_vil)       {
  167.                 glcd_fillScreen(OFF); //Display törlése
  168.                 strcpy(char_kiiras1,"H.vilagitas");
  169.                 glcd_text57(6, 20, char_kiiras1, 2, ON);        // Display "Beallitasok"
  170.                 glcd_update();
  171.                 delay_ms(6000);
  172.         }
  173.  
  174.         delay_ms(10);
  175.         temp = input_state_b(); // Clear mismatch condition on Port B
  176. }
  177. .
  178. .
  179. .
  180. .
  181. //************** FŐPROGRAM *******************
  182. void main() {
  183.        
  184.         int8 tempe;
  185.         delay_ms(20);
  186.  
  187.         strcpy(vent_mod,"Aktiv mod");
  188.         vent_on;
  189.  
  190.         delay_ms(20);
  191.         port_b_pullups(TRUE);   //RB port felhúzóellenállások aktiválása
  192.         delay_us(10);
  193.         tempe = input_b();
  194.     clear_interrupt(INT_RB);
  195.     enable_interrupts(INT_RB);
  196.  
  197.         setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); // Timer1 konfigurálása 0,1 sec-os megszakításra 20 MHz osc. frekvenciához
  198.         clear_interrupt(INT_TIMER1);    // Timer1 megszakítás engedélyezése
  199.         enable_interrupts(INT_TIMER1)// Timer1 megszakítás engedélyezése
  200.  
  201.         clear_interrupt(INT_RDA);
  202.         enable_interrupts(INT_RDA);
  203.         enable_interrupts(GLOBAL);
  204.  
  205.     disable_interrupts(INT_RB);
  206.         disable_interrupts(INT_TIMER1); // Timer1 megszakítás letiltása
  207.  
  208.         glcd_init(ON);                               // Must initialize the LCD
  209.  
  210.  
  211.         exologo();     //Exozone logó kiírása
  212.         glcd_update();
  213.     delay_ms(6000);
  214.     glcd_fillScreen(OFF); //Display törlése
  215.  
  216.         xpoz=16;
  217.         ypoz=50;
  218.  
  219.         t1_ms=0;
  220.         enable_interrupts(INT_TIMER1)// Timer1 megszakítás engedélyezése
  221.  
  222.         strcpy(char_kiiras1,"Beallitasok");
  223.         glcd_text57(6, 20, char_kiiras1, 2, ON);        // Display "Beallitasok"
  224.         glcd_circle(xpoz, ypoz, 2, YES, ON);             // Draw the clock circle
  225.         glcd_update();
  226.         xpoz=24;
  227. .
  228. .
  229. .
  230. .
  231.     enable_interrupts(INT_RB);
  232.  
  233.         while(1) {
  234.  
  235.                 if (data_avail) {
  236. .
  237. .
  238. .
  239. .      
  240.                 }
  241.                 delay_ms(200);
  242.         }
  243. }
A hozzászólás módosítva: Feb 26, 2014
(#) vilmosd válasza Jossz hozzászólására (») Feb 27, 2014 /
 
Ugy elso ranezesre ( igy koran reggel, kicsit meg almosan) az IT rutinokbol talan nem kellene hivogatni a GLCD irasat. Nem ismerem ezt a "Exologo_GLCD.h" includot, de gondolom a grafikus LCD kezelese van benne. Ezek altalaban idoigenyes muveletek, es Te addig fogod a procit IT-ben tartani, amig ki nem irtad a kiirandot. Talan jobb lenne ugy szervezni a programot, hogy az IT-ben bekovetkezo esemenyekhez hozzarendelni 1-1 bitet, amit az IT bekovetkezesekor allitassz, majd ezeket figyelni a foprogramban es ennek fuggvenyeben elvegezni a feladatokat (kijelzes, szamitasok, i tak dalse).
(#) vicsys válasza vilmosd hozzászólására (») Feb 27, 2014 /
 
Pont ugyanezt látom. Ezért is írtam Jossz-nak, hogy flag-ekkel operáljon a megszakításokban és ne felejtse el visszabillenteni őket a lefutás után.
(#) Jossz válasza vilmosd hozzászólására (») Feb 27, 2014 /
 
Köszönöm az ötleteket Neked is és Vicsys-nek is. Az Exologo_GLCD.h-ban csak egy adatmátrix van, amelyet egyszer olvas fel, ebben van a cég grafikus logója. Mindenképpen úgy tűnik, hogy egyszerűen az rb-nek nincs elég ideje végrehajtani a megszakítást. A flag-ekkel történő grafikus operációt is belevariálom a főprogramba, tuti, hogy segít. Az RDA csak 2 másodpercenként kap adatot, tehát ez lassú, ellenben mi van akkor, ha a Timer1-et úgy paraméterezem fel, hogy ne 10 ms-onként generáljon megszakítást (a kommentben rosszul írtam, mert most nem 0,1 s-onként szakít meg, hanem 0,01 s-onként), hanem mondjuk 100 ms-onként, mert nekem úgyis csak minden kerek másodpercben kell kiírnom a képernyőre egy működési jelet. Ez így minimum másodpercenként 90-el kevesebb db megszakítást jelent, lehet, hogy ez már elég lesz az rb működéséhez? Szerintetek? Csak holnap este tudom kipróbálni, ezért érdekelne, hogy szerintetek megér egy próbát?
(#) vilmosd válasza Jossz hozzászólására (») Feb 27, 2014 / 1
 
En ugy szoktam csinalni, hogy valamelyik timert felhasznal0m egy "tick" generalasara, es egy (vagy tobb) szamlalot szamoltatok vele lefele. ha elerem a "0" erteket akkor egy bittel jelzem a foproginak, hogy itt az ido pl. a kijelzesre, vagy mas muveletre. Mellette meg pl az timer IT-ben szoktam lekezelni a gombok beolvasasat is, mert a RB IT nem ad jo lehetoseget a gombok prellmentesitesere. Erre szinten van egy szamlalom, amivel meg tudom poldani a biztonsagos beolnasast.
Alljon itt egy pelda az altalam alkalmazott megoldasra:
  1. #int_rtcc                          
  2. void clock_isr()
  3. {                                                      
  4.     set_timer0(100);                
  5.         rtccif=0;
  6.         tsample++;
  7.          if (tsample == SAMPLET)
  8.          {
  9.                  tsample=0;
  10.                  sample=1;
  11.                  meass=1;
  12.          }
  13.          
  14.          if(--int_count==0)                     // per second.
  15.         {          
  16.         int_count=INTS_PER_SECOND;
  17.        
  18.                 for (k=0;k<SAMPLEM;k++)
  19.                          {
  20.                                  vm[k]= 0;
  21.                          }
  22.                 disable_interrupts(INT_TIMER1);
  23.                 meass=1;
  24.     }
  25.     if (sampleb)
  26.          {
  27.                 sampleb--;
  28.          }
  29.     bott_in=port_b;
  30.     bott_c=botton(~bott_in);
  31.     if (bott_c==bott_o&&bott_c&&!sampleb)
  32.     {
  33.     switch (bott_c)
  34.                 {
  35.                         case 1: if(!m_run)
  36.                                         {
  37.                                                 st_count+=50;
  38.                                                 if (st_count>MAXR) st_count=50;
  39.                                                 st_cnt=st_count;
  40.                                                 sampleb=SAMPLEBI;
  41.                                                 readm=1;
  42.                                         }      
  43.                                         break;
  44.                         case 2: if(!m_run)
  45.                                         {
  46.                                                 st_count-=50;
  47.                                                 if (st_count<50) st_count=MAXR;
  48.                                                 st_cnt=st_count;
  49.                                                 sampleb=SAMPLEBI;
  50.                                                 readm=1;
  51.                                         }
  52.                                         break;
  53.                         case 3: sampleb=SAMPLET;                       
  54.                                        
  55.                                         if (!m_run)
  56.                                         {
  57.                                                 m_run=1;
  58.                                                 led1=1;
  59.                                                 st_cnt=st_count;
  60.                                         }      
  61.                                         else
  62.                                         {                                      
  63.                                                 m_run=0;
  64.                                                 led1=0;
  65.                                                 st_cnt=st_count;
  66.                                                
  67.                                         }
  68.                                         readm=1;                                               
  69.                                         break;                         
  70.  
  71.                         default :
  72.                 }
  73.     }
  74.     if (bott_o!=bott_c) sampleb=SAMPLET;
  75.     bott_o=bott_c;
  76. }
Itt a TMR0 van hasznalva, de semmi akadalya a TMR1 hasznalatanak sem.
A gomb beolvasashoz a mellekelt includot alkalmazom, aholis a "#define Buttx" hatarozza meg a fveny visszateresi erteket a bemenet kombinaciojanak megfeleloen. Lehet tobb gomb egyuttes lenyomasahoz is hozzarendelni visszateresi erteket. Ja persze en altalaban 10 mS "tick" idot hasznalok, es igy ennek tobbszoroset tudok hasznalni a klf. idozitesekre.
A hozzászólás módosítva: Feb 27, 2014

bott.h
    
(#) Jossz válasza vilmosd hozzászólására (») Feb 27, 2014 /
 
Kiváló ötlet ez a Timer IT-n belüli gomb beolvasás, köszönöm! És köszi a headert is...
Tulajdonképpen most végül is én is hasonlóan olvasom be a gombokat a RDA-ra történő várakozás alatti "üres idő"-ben a végtelen ciklus belsejében elhelyezett gombmegnyomás vizsgálattal, de a Te megoldásod mindenképpen praktikusabb és elegánsabb, engedelmeddel "asszimilálom"... Így azután meghagyom is a 10 ms-os megszakítási időt is a Timer1 IT-ben...
(#) vilmosd válasza Jossz hozzászólására (») Feb 27, 2014 /
 
Egeszsegedre!!
(#) Buddha hozzászólása Márc 30, 2014 /
 
Sziasztok!

Egy karakter vétele után hogyan tudom kitörölni a soros vételi puffert, hogy az üres legyen?
A processzor: PIC18F14K22
Kössz.
Üdv: B
(#) Hp41C válasza Buddha hozzászólására (») Márc 31, 2014 /
 
Kiolvasással vagy a vevő letiltásával és újraengedélyezésével.
(#) subi válasza Buddha hozzászólására (») Márc 31, 2014 /
 
Ha jól értem a RCREG nevű regisztert akarod törölni, kiolvasás után. Nos, az én tudásom szerint ezt a regisztert kiolvasás után nem kell törölni, azt elvégzi automatikusan a CCS. De ha kiolvasás után te szeretnéd jelezni a kiolvasás tényét, akkor nem az RCREG -t kell törölnöd, hanem a PIR1 regiszter 5 -k bitjét az RCIF -t kell nullára állítanod.

A törlést több módon el lehet végezni. Például deklaráljuk a "B" portot, és annak egy bitjét, majd azt töröljük. Valahogy, így gondolom,

#byte PIR1 = 0xF9Eh
#bit RCIF=PIR1.5

majd kiolvasás után:
RCIF = 0;

Remélem, jól olvastam ki a címeket az adatlapból.....
Üdv.
Subi
Következő: »»   98 / 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