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   41 / 118
(#) MPi-c válasza pppsss hozzászólására (») Szept 24, 2010 /
 
Az includolt 24512.c-t nem tetted fel. Ha a "gyári" includ fájlt használod, (drivers mappa) akkor nem kell bonyolítani, abban az eeprom írása és olvasása benne van, csak az I2C vonalait kell beállítani. A PORTA digitálisra állításáról se feledkezz meg!
Mindezek alapján itt a kód:
  1. #include <16F877A.h>
  2.  
  3. #define EEPROM_SDA  PIN_C4
  4. #define EEPROM_SCL  PIN_C3
  5. #include <24512.c>
  6.  
  7. #use delay (clock=4000000)  
  8.  
  9. void main()
  10. {
  11.         char data=0;
  12.    
  13.         setup_adc_ports(NO_ANALOGS);
  14.         init_ext_eeprom();
  15.         write_ext_eeprom(0,0x0a);
  16.         delay_ms(6);
  17.         data= read_ext_eeprom(0);
  18.         if (data == 0x0A)
  19.         {
  20.                 output_high(PIN_A0);      // ha megegyezik a kiolvasott
  21.         }
  22.         else
  23.         {
  24.                 output_high(PIN_A1);      // ha nem egyezik meg  
  25.         }      
  26.         while (1);
  27. }
(#) pppsss válasza MPi-c hozzászólására (») Szept 25, 2010 /
 
Köszi MPi-c ! Így már működik, de a 24512 include-t átnézve már rájöttem a hibámra!
Az általad küldött kódba felesleges a delay mert az include-ban while-al figyeli hogy befejeződött-e az írás.
  1. #include <16F877A.h>
  2. #use delay (clock=4000000)
  3. #use i2c(master, sda=PIN_C4, scl=PIN_C3)  /* Configure Device as Master*/
  4.  
  5. void main()
  6. {
  7.  
  8.    char data=0;
  9.    
  10.    i2c_start();             // Start condition
  11.    i2c_write(0xA0);         // Device address  24Lc512 => 1010 A2 A1 A0 WRITE=0
  12.    i2c_write(0x00);         // High byte of adress
  13.    i2c_write(0x00);         // Low byte of adress
  14.    i2c_write(0x0A);         // DATA
  15.    i2c_stop();              // Stop condition  
  16.  
  17.    delay_ms(6);
  18.  
  19.    i2c_start();             // Start condition
  20.    i2c_write(0xA0);         // Device address  24Lc512 = 1010 A2 A1 A0 WRITE=0
  21.    i2c_write(0x00);         // High byte of adress
  22.    i2c_write(0x00);         // Low byte of adress
  23.    i2c_start();             // Start condition
  24.    i2c_write(0xA1);         // Device address  24Lc512 = 1010 A2 A1 A0 READ=1
  25.    data=i2c_read();         // Read data  
  26.    i2c_stop();              // Stop condition
  27.  
  28.    set_tris_A(0);
  29.    if (data==0x0A)
  30.    output_high(PIN_A0);     // ha megegyezik a kiolvasott
  31.    else
  32.    output_high(PIN_A1);     // ha nem egyezik meg  
  33.  
  34.  while(1);
  35. }
(#) sirály12 hozzászólása Szept 25, 2010 /
 
Csak nem tudom a jeleket rendesen fogadni a piccel. Valaki megtenné, hogy átnézi ez alábbi fájlt, hogy vajon mi lehet a hiba?

Az analizálandó jelsor a következő: jelsor
A függőleges osztás 200us.
Egy 1-es min 5-600us magas, a nulla ugyanez csak alacsony szint.

Minden felfutó élre kellene figyelni, itt kezdődik egy bit. Az első felfutó él utáni hosszabb szakasz a stratbit. Ezután jön a 8 bit. Ha a magas szint a hoszabb, akkor 1, ha az alacsony szint tart tovább, akkor 0 a bit. És ezt kellene nekem usb-n elküldenem a pc-nek.

A jelforrás egy tolatóradar, amit a kocsimba akarok rakni, a carpc-hez illesztése miatt kellene ezt megoldanom.

Előre is kösz a segítséget.

ex_usb_hid.c
    
(#) icserny válasza sirály12 hozzászólására (») Szept 26, 2010 /
 
  1. #use delay(clock=20000000)

helyett ezt írd:
  1. #use delay(clock=48000000)
(#) sirály12 hozzászólása Szept 26, 2010 /
 
Ezt is kipróbáltam, és kicsit át írtam, de még most sem jó.
Adat helyett, egy 4-est kapok vissza. Valami nagyon nem jó. Az átvitel jó, a 255-ös számot megkapom, ezért is írtam bele, mert már azt hittem, hogy a kommunikációval van valami. De ezt a 4-est nem tudom hová tenni. Próbáltam változtatni a számlálásom is, átírtam a számokat, de semmi ugyanúgy 4-est kapok. Valamit nem jól állítottam be, vagy a kód nem jó?

ex_usb_hid.c
    
(#) szkrep hozzászólása Szept 29, 2010 /
 
Két lemenő él közt eltelt időt szeretném megmérni a következő kóddal, de rendszerint a második while ciklusba beragad. A figyelt lábra időnként 5 vagy 10ms időközönként érkezik impulzus (egyszerre egyik, pont azt akarom felismerni, hogy melyik), rendszerint akkor van baj, ha folyamatosan kapja a lemenőéleket.
Hogy ragadhat bele, ha a hardveres timerrel mindenképp kilököm?

  1. if (!input (PIN_D2)) //valamit láttam!
  2.          {
  3.             set_timer1 (0);
  4.             while ( (input (PIN_D2)) && (get_timer1 ()<8000)); //megvárom a következőt, de nem vár a végtelenségig- nem biztos hogy lesz jel.
  5.             set_timer1 (0);
  6.             delay_ms (3);     //úgyis min 5s fog eltelni
  7.             while ( (input (PIN_D2)) && (get_timer1 ()<8000)); //teljen el az idő, vagy legyen jel.
  8.             time=get_timer1  () ; //aztán ezzel tovább számolgatok
(#) szkrep hozzászólása Okt 5, 2010 /
 
Na az előző gondom megoldódott, hardveres gond volt...
Új dolog, amit nem értek: 18F2553-nál valami nem jó az órajellel. Próbáltam 20MHz, 40MHz kvarccal, belső órajellel, de az uart kapcsolat mindig rossz maradt. Amikor 19200 baudra állítottam, 4800-ra kellett állítani a hyperterminalt, hogy megjelenjen az adat.
18F piccel még nem játszottam, configban itt valami más lenne, mint a 16-osoknál?
Ezek a beállításaim, gondolom ott a hiba:
  1. #include <18F2553.h>
  2. #fuses HS, NOLVP, NOPROTECT, NOWDT, PUT, NOBROWNOUT
  3. #use delay(clock=40M)
  4. #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7, stream=uart)
  5. #use I2C(master, sda=PIN_B0, scl=PIN_B1,stream=iic)

CCSC súgó szerint vagy így adom meg az órajelet (HS, és 40M) vagy azt mondom, hogy 40M, oscillator, és akkor a fordító helyre teszi a HS fuse bitet magától. Úgy sem működött jól. A program fut, irkál mindenfélét, de nem értelmes karakterek.
(#) icserny válasza szkrep hozzászólására (») Okt 5, 2010 /
 
40 MHz-es kvarccal ne próbálkozz, nem fér bele a specifikációba! 20 MHz-es kvarc esetén 1:5-ös előosztót kell beállítani (CPUDIV=5, nem tudom, hogy mondják ezt CCS-ül), be kell kapcsolni a PLL-t (HS helyett HSPLL), és nem kell leosztani a kimenetet (PLLDIV=1, vagy ahogy hívják). Biztosan találsz 18f4550-hez mintaprogramot, annak alapján kell konfigurálni.
  1. #use delay(clock=40M)

Az órajel nem 40 M, hanem 48M lesz (legalábbis remélem).
(#) szkrep válasza icserny hozzászólására (») Okt 5, 2010 /
 
Nem megy; 4550-re a gyári példák közt azt mondja, hogy 20MHz kvarchoz a következő való:
  1. #include <18F4550.h>
  2.   //#define USB_CON_SENSE_PIN PIN_B2   //CCS 18F4550 development kit has optional conection sense pin
  3.   //~~~ 20MHZ OSCILLATOR CONFIGS ~~~//
  4.   #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
  5.   #use delay(clock=48000000)

Ezzel sem jó. Nem értem, hogy számolja az órajelet. Ha PLLx és CPUDIVx dönti el, hogy mit kell nekem beírnom, hogy jön ki ott 48 (illetve nem jön ki mert nem megy vele)?
(#) icserny válasza szkrep hozzászólására (») Okt 5, 2010 /
 
Valószínűleg PLL5 jelenti az 1:5 előosztást (mindig 4 MHz-et kell adni a PLL bemenetére). A PLL ebből 96 MHz-et állít elő, s ennek a felezéséből (CPUDIV1, USBDIV) áll elő a 48 MHz a CPU és az USB SIE számára.

Kvarccsere esetén a fentiek közül csak a PLL5-öt kell átírni, a többit nem érdemes babrálni.

PLL1 4 MHz-es kvarchoz
PLL2 8 MHz-es kvarchoz
PLL3 12 MHz-es kvarchoz
PLL4 16 MHz-es kvarchoz

Helyesbítés: Amit előző beírásomban tévesen CPUDIV-nek írtam, azt PLLDIV-nek kellett volna mondanom.
(#) szkrep válasza icserny hozzászólására (») Okt 5, 2010 /
 
Ha tehát ez nem működik, akkor kuka... 4MHz kvarccal próbáltam:
  1. #include <18F2553.h>
  2. #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,PLL1,CPUDIV1,USBDIV
  3. #use delay(clock=48M)  
  4. #use rs232(parity=N, bits=8, stop=1, baud=19200, xmit=PIN_C6, rcv=PIN_C7, stream=uart)
  5.  
  6. void main()
  7. {
  8.   while(1)
  9.   {
  10.   printf(uart,"UART OK!\n\r");
  11.   delay_ms(500);
  12.   }
  13. }
(#) icserny válasza szkrep hozzászólására (») Okt 5, 2010 /
 
Tegyél már be egy
  1. output_toggle(pin_d0);

sort a késletetés után, és számold meg, hogy mondjuk 10 másodperc alatt hányszor villog a LED! Természetesen d0 helyett írj egy olyan lábat, amelyik digitális, és LED van rajta.
(#) szkrep válasza icserny hozzászólására (») Okt 5, 2010 /
 
Hát ez 20 alkalommal vált állapotot, eszerint meg jó az órajel.
(Közben nem jön semmi. hyperterminal jól van belőve, az is 19200 8-N-1; próbáltam PK2 UART toollal, annak sem tetszik.)
(#) icserny válasza szkrep hozzászólására (») Okt 5, 2010 /
 
Mellékelek egy bugyuta demót, ennek mennie kellene 19200 bit/s sebességen, 4 MHz-es kvarcot feltételezve. Ha véletlenül zagyvaságot írna, próbáld meg reset után is újra!
(#) szkrep válasza icserny hozzászólására (») Okt 5, 2010 /
 
EJNYE. Nem printf, hanem fprintf. A printf nem érti, ha a kiírandó dolog elé stringet írok. De a fordító ki nem nyögné, hogy neki az nem kellett oda... 1db f betű szerezte az örömöket.
Egyébként a mellékelt .hex is működött, köszi!
(#) trudnai válasza szkrep hozzászólására (») Okt 5, 2010 /
 
Hat igen, a C nyelv mar csak ilyen...
(#) icserny válasza szkrep hozzászólására (») Okt 6, 2010 /
 
Idézet:
„A printf nem érti, ha a kiírandó dolog elé stringet írok.”
Már miért ne értené? Lásd pl. itt:
  1. printf("frequency = %lu Hz\r\n",total_counts*256);

Szerintem stream-et akartál mondani, az tényleg nem kell neki.

Most kapartam elő egy régi programomat (PIC16F690-re készült), s abban én nem is definiáltam stream paramétert. Gondolom, hogy a CCS C-nél is a soros port az alapértelmezett kimenet.
  1. #use delay(clock=6144000)
  2. #use rs232(baud=9600,parity=N,xmit=PIN_B7,rcv=PIN_B5,bits=8)
(#) szkrep válasza icserny hozzászólására (») Okt 6, 2010 /
 
Elírtam valóban. Mikor a #use RS232-ben megadom, hogy stream="mi legyen a neve", azt nem használhatom ott.
(#) icserny válasza szkrep hozzászólására (») Okt 6, 2010 /
 
Ha csak egy stream van, akkor nem is kell. Az fprintf-re szerintem csak akkor van szükséged, ha váltogatni akarsz a stream-ek között.
(#) DecebaL hozzászólása Nov 5, 2010 /
 
Sziasztok!

Valaki használt már MAX6957 -os ledmeghajtót?
Két napja küzdök vele és még semmi.
(#) pepe33 hozzászólása Nov 5, 2010 /
 
Infra távirányító jelet szeretném fogni.
Találtam is egy jónak tűnő kódot hozzá, de sajnos valamiért nálam nem akar működni.
Az egyetlen eltérés hogy az eredeti kapcsolásban TSOP1738-at használnak, ami sajnos nekem nincs én TSOP1736-al próbálom, de emlékeim szerint egyszer valamikor régen egy ilyennel csináltam egy infra vevőt és az működött.
Szóval, ha valaki tudna segíteni, azt megköszönném!
Bővebben: Link

rc5[1].c
    
(#) sysy válasza pepe33 hozzászólására (») Nov 5, 2010 / 1
 
Lehet, hogy nem a kódban vana hiba. A TSOP17xx utolsó két számjegye az infra vevő frekijére utal. Pl. TSOP1738 az csak 38kHz frekit vesz. Mást nem!. Lehet, hogy a távirányítód nem ezen a frekin megy. Nézd meg szkóppal, vagy logikai analizátorral, a kimenő jelet.
(#) pepe33 válasza sysy hozzászólására (») Nov 5, 2010 /
 
Sajonos megmérni nincs lehetőségem most, egyébként az itthon található összes távkapcsolóval probálom.
De ha rámérek a TSOP1736 kimnenetére miközben kapcsolok, változásoka azért látok.
(#) potyo válasza DecebaL hozzászólására (») Nov 5, 2010 /
 
És konkrétan mégis mi a gond vele? Két napja nem sikerül beforrasztani?
(#) pepe33 válasza pepe33 hozzászólására (») Nov 5, 2010 /
 
A probléma ott van hogy amikor érkezik egy jel az infrától, lenullláza a T1-et és méri milyen hosszú a jel.
  1. set_timer1(0);
  2.    while(IR_STATUS==1);
  3.    t=get_timer1();
  4.    if ((t<400) || (t>800)) {
  5.    printf(" T: %Lu\n", t);    
  6.    return 0;   // no RC5 code, abort decoding

Csakohogy valamiért itt mindig 0 a t .
Az printf(.... sort beszurva láttam hogy ez a gond.
Ha ezt a részt modosítom ( return 0 kitörölve) akkor már néhány gombot stabilan felismer, de sokat nem.
Az a kérdés hogy mért nem müködik a timer1() mérése ?
Mért kapok ott mindig 0 értéket ?
(#) sirály12 válasza pepe33 hozzászólására (») Nov 7, 2010 /
 
Valamiitt nagyon nem kerek!
Az rc5 az 36khz-es, ha a progi 38khz-es vevőt támogat, az akkor nem rc5, legalábbis szeerintem.

Ezen a linken meg tudod nézni, hogy milyen frekikhez milyen kódolást használnak.
Bővebben: Link
Ebből láthatod, hogy valami nem igazán stimmel.

Ez egy rc5 vevő prog, bár kicsit bugyuta, de működik:
  1. int8 send[1];
  2. int1 irReady = false;
  3. int8 irStart = 0;
  4. int8 irCodeAdress =0;
  5. int8 irCodeCommand = 0;
  6. int i=0;
  7. int32 iraantal= 0;
  8.  
  9. //externe interrupt door tsop
  10. #int_ext
  11. interrupt(){
  12.    // zet de interrupts uit
  13.    disable_interrupts(int_ext);
  14.    irStart = 0;
  15.    irCodeAdress =0;
  16.    irCodeCommand = 0;  
  17.    // lees het eerste bit
  18.    delay_us(480);
  19.    if(IR){
  20.       irStart += 1;
  21.    }
  22.    irStart <<=1;
  23.    // lees het twee bit
  24.    delay_us(1778);
  25.    if(IR){
  26.       irStart += 1;
  27.    }
  28.    irStart <<=1;
  29.    // lees het derde bit
  30.    delay_us(1778);
  31.    if(IR){
  32.       irStart += 1;
  33.    }
  34.    //niet meer schuifen
  35.    //irStart <<=1;
  36.    // lees het vierde bit
  37.    delay_us(1778);
  38.    if(IR){
  39.       irCodeAdress += 1;
  40.    }
  41.    irCodeAdress <<=1;
  42.    // lees het vijfde bit
  43.    delay_us(1778);
  44.    if(IR){
  45.       irCodeAdress += 1;
  46.    }
  47.    irCodeAdress <<=1;
  48.    // lees het zesde bit
  49.    delay_us(1778);
  50.    if(IR){
  51.       irCodeAdress += 1;
  52.    }
  53.    irCodeAdress <<=1;
  54.    // lees het zevende bit
  55.    delay_us(1778);
  56.    if(IR){
  57.       irCodeAdress += 1;
  58.    }
  59.    irCodeAdress <<=1;
  60.    // lees het achtste bit
  61.    delay_us(1778);
  62.    if(IR){
  63.       irCodeAdress += 1;
  64.    }
  65.    // irCodeAdress <<=1;
  66.    // lees het negende bit
  67.    delay_us(1778);
  68.    if(IR){
  69.       irCodeCommand += 1;
  70.    }
  71.    irCodeCommand <<=1;
  72.    // lees het tiende bit
  73.    delay_us(1778);
  74.    if(IR){
  75.       irCodeCommand += 1;
  76.    }
  77.    irCodeCommand <<=1;
  78.    // lees het elfde bit
  79.    delay_us(1778);
  80.    if(IR){
  81.       irCodeCommand += 1;
  82.    }
  83.    irCodeCommand <<=1;
  84.    // lees het twaalfde bit
  85.    delay_us(1778);
  86.    if(IR){
  87.       irCodeCommand += 1;
  88.    }
  89.    irCodeCommand <<=1;
  90.    // lees het dertiende bit
  91.    delay_us(1778);
  92.    if(IR){
  93.       irCodeCommand += 1;
  94.    }
  95.    irCodeCommand <<=1;
  96.    // lees het veertiende bit
  97.    delay_us(1778);
  98.    if(IR){
  99.       irCodeCommand += 1;
  100.    }
  101.    //irCodeCommand <<=1;
  102.    // klaar
  103.    irReady = true;  
  104. }
(#) sysy válasza sirály12 hozzászólására (») Nov 7, 2010 /
 
Az RC5 szabvány nem az infra vivőfrekijét rögzítette, hanem a kódolási információkat, protokolt. Bármilyen vivőfrekivel mehet az információ. Én úgy csinálnám, hogy megmérném a START bit szélességét, hogy tudjam, milyen a bit szélesség. Ezáltal máris független a program a különböző gyártók által használt bitsebességtől. (tudni illik, hogy a jel 32 vivőfreki periódus és a mögötte kötelező szünet is 32 vivöfreki periódus husszúságú). Minde bitben van egy élváltás, és az élváltás utáni állapot hordozza az információt. Tehát az élváltást kell megvárni és utána fél bitszéleségnyi idő múlva be kell ovasni az infra bemenet állapotát. Ennyi.
Itt minden tudnak az infrás távirányítókról.
Bővebben: Link
(#) sirály12 válasza sysy hozzászólására (») Nov 7, 2010 /
 
Lehet, hogy tévedtem, és tényleg nem fontos a vivőfreki, viszont a linkelt oldalad, az ugyanaz, amit én is linkeltem.
És ezen az oldalon 36khz-esnek írják a Philips rc5-öt. Akkor most hogy is van ez?
(#) sirály12 válasza sirály12 hozzászólására (») Nov 7, 2010 /
 
Most látom, hogy az eleje lemaradt a kódnak.
Ez kell még hozzá, hogy működjön is.

  1. #define IR_SENSOR PIN_B0                  //infra
  2. #define IRIN (!input(IR_SENSOR))
(#) sysy válasza sirály12 hozzászólására (») Nov 7, 2010 /
 
Valószínűleg rosszul értelmezted a leírást. Nem a frekihez van választva a kódolás, hanem, hogy milyen kvarcot találtak a fiókban a gyártónál. Attól a kódolás még RC5-ös. Én már találkoztam 56kHz és 32kHz vivőfrekis RC5 kódolású távirányítóval is, mint két véglet.
A progidhoz még annyit írjál légyszíves, hogy milyen PIC-et használsz.
Következő: »»   41 / 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