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   77 / 118
(#) Master_of_the_web válasza Hp41C hozzászólására (») Jún 6, 2012 /
 
Helló!

Ezt az órajelnyújtást nem kéne automatikusan elvégeznie a fordítónak?
(#) icserny válasza Master_of_the_web hozzászólására (») Jún 7, 2012 /
 
A fordítónak nem, nincs köze hozzá. A gyári függvényben benne lehet, de ha nem publikus a forrás, akkor csak a visszafordított kód silabizálásból derül ki.
(#) Master_of_the_web válasza icserny hozzászólására (») Jún 7, 2012 /
 
Valóban lent tartotta a slave az SCL lábat. A CKP bitet írás után 1-re állítva valóban nem következik be blokkolás, de csak egy bizonyos sebességig.
Az sajnos továbbra is előfordul, hogy néha-néha hibás adatot kapok. 40kHz 25 cm-es vezetéken soknak számít?
(#) Master_of_the_web válasza Master_of_the_web hozzászólására (») Jún 7, 2012 /
 
Sajnos ki kell javítanom magamat: A blokkolás továbbra sem szűnik meg. 50kHz-től nagyon durván elkezd hibázni, és rövid időn belül blokkolódik a busz. Itt most 2 byte-ot olvasok ki folyamatosan. Lezajlik pár ilyen ciklus, majd blokkolódik. A slave lent tartja mindkét szálat.
A helyes értékek a 111 és a 222.

konzol2.jpg
    
(#) vilmosd válasza Master_of_the_web hozzászólására (») Jún 7, 2012 /
 
El kene, ha nem mondtad volna neki hogy ne csinalja:
  1. #use i2c(SLAVE, I2C1, address=0x40, FORCE_HW, NO_STRETCH)
(#) vilmosd válasza vilmosd hozzászólására (») Jún 7, 2012 /
 
Egy kis olvasnivalo.

i2c_hu.pdf
    
(#) Master_of_the_web válasza vilmosd hozzászólására (») Jún 7, 2012 /
 
Ezt már kivettem azóta. Ettől függetlenül lent tartja és ezzel blokkol.
(#) szuperman hozzászólása Jún 7, 2012 /
 
Helló mindenki!

Vettem egy PIC12f509 est. Csináltam hozzá egy ilyen hello world szerü progit teszteléshez:
  1. #include <12f509.h>
  2. #fuses INTRC, NOWDT, NOMCLR
  3. #use delay(clock=4MHz)
  4.  
  5. void main (void){
  6.    while(TRUE){
  7.       output_high(PIN_B2);
  8.    }
  9. }


Valamiért nem hajlandó a kódban szereplő kimenetet felkapcsolni. Nem értem miért. Ha jól értelmezem az adatlapot, akkor az MCLR láb kivételével mindegyik ki és bemenet egyaránt. Az MCLR meg csak bemenetnek használható. Vagy rosszul értelmezem? Valaki felvilágosítana?

Előre is köszi!
(#) vilmosd válasza szuperman hozzászólására (») Jún 7, 2012 /
 
Nezd meg elobb szimulatorban (MPLAB) mit csinal. Ott latni kell a lab valtozasat. Utana a hurokba tegyel egy "delay_ms(500); " sort. Mert ugye a kimenetet olyan gyorsan valtogatja, hogy nem lehet eszlelni. ja meg egy:
  1. #use delay(clock=4000000)
(#) sysy válasza szuperman hozzászólására (») Jún 8, 2012 /
 
Jó érzékkel megint beleválasztottál egy spéci tulajdonságokkal rendelkező lábba.
Ha bármelyik másik, kimenetnek alkalmas lábat választottál volna, akkor simán működik a programod.

Ez nem csak egy egyszerű I/O láb, hanem a TIMER0 külső órabemenete is (T0CKI). A TIMER0-t fel kell húzni, hogy NE használja ebben az üzemmódban ezt a lábat. A PIC12F509 adatlap 25. oldalán van az OPTION REGISTER leírása, ebben lehet látni, hogy melyik bit mit állít a TIMER0 üzemmódján. A bitek táblázatos felsorolása felett pedig az látható, hogy irható/olvasható a bit és a legfontosabb, hogy reset után milyen értékre áll be. Itt az látható, hogy W-1. Ez azt jelenti, hogy ezt a bitet, csak írni lehet és reset után 1 az értéke. Ez pedig azt jelenti, hogy a PIN_B2 a TIMER0 orabemenete lesz. Még oda is írták a funkció leírása mögé, hogy a TRIS regisztert sajnos felülírja ez a beállítás (overrides TRIS on the T0CKI pin).
Tehát, a megoldás, hogy a TIMER0-t felkonfigurálod és az utasításban legalább azt beleírod, hogy köszönjük, nem kérjük a külső órajel funkciót, helyette a belső órajelet szertnénk használni. (T0CS bit 0)
Ezáltal a programod ilyenre módosúl:



  1. #include <12f509.h>
  2.  
  3. #FUSES INTRC, NOWDT, NOMCLR
  4. #use delay(int=4MHz)
  5.  
  6. void
  7. main()
  8. {
  9. setup_timer_0(T0_INTERNAL);
  10. while(TRUE)
  11. {
  12. output_high(PIN_B2);
  13. }
  14. }


Árulja el már valaki nekem, hogy miért nem látszanak a tabulátorok a kódban? Mit kell írni helyette? Így nagyon csúnya behúzások nélkül.
(#) sysy válasza vilmosd hozzászólására (») Jún 8, 2012 /
 
Nem akarja váltogatni a kimenetet, csak egyszerűen magasba akarja kapcsolni.
A #use utasítás szerintem teljesen korrekt, mert több formátumban is meg lehet adni az órajelet. pl. 20MHz esetén így is lehetne írni:

#use delay (crystal=20000000)
#use delay (xtal=20,000,000)
#use delay(crystal=20Mhz)
#use delay(clock=20M, crystal)
(#) szuperman válasza sysy hozzászólására (») Jún 8, 2012 /
 
Köszi a helpet. Tényleg a Timer0 volt a gond. Viszont ezt kell megadni ,hogy leforduljon:
setup_timer_0(RTCC_INTERNAL);
(#) sysy válasza szuperman hozzászólására (») Jún 8, 2012 /
 
Akkor valószínűleg régi a fordítód, ha nem érti a T0_INTERNAL kifejezést. Mi a verziója?
(#) Master_of_the_web válasza Master_of_the_web hozzászólására (») Jún 8, 2012 /
 
Meglett a hibás adatok oka: Valahol a kód mélyén engedélyezve lett egy timer megszakítás.
Azt letiltva nem küld hibás adatokat.

Viszont mivel időszakosan végre kell hajtani egy mérést, ami a timer2 megszakításakor kell azonnal elvégezni ezért nem tudom elkerülni ezt a megszakítást.
Hiába tiltom le a timer2 megszakításokat a kommunikáció idejére, valamiért mindig bezavar az átvitelbe ha azt bárhol bármilyen módon engedélyezem.

Ti hogy oldanátok meg ezt úgy hogy ne zavarjon be a kommunikációba a mérés?

Fagyások néha előfordulnak továbbra is. Ilyenkor a slave mindkét adatvonalat lent tartja és sem a CKP bit piszkálásával, sem egyéb flag bitek állításával sem sikerül rávenni, hogy elengedje őket.
(#) nagy_david1 hozzászólása Jún 11, 2012 /
 
Sziasztok!

Egy kezdő kérdésem lenne. Az "output_x(value)" parancs értékének csak hexa-ban lehet megadni az értéket? Pl. ha binárisként adom meg az értéket azt felismeri? Köszi.
(#) Bell válasza nagy_david1 hozzászólására (») Jún 11, 2012 /
 
Szia!
A dokumentációban Bővebben: Link a 37. oldalon írnak erről.
(#) Hp41C válasza Master_of_the_web hozzászólására (») Jún 11, 2012 /
 
Szia!
Idézet:
„Ti hogy oldanátok meg ezt úgy hogy ne zavarjon be a kommunikációba a mérés?”

Ha az órajelet letiltod, az adatot előbb írod be az SSPBUF regiszterbe, aztán engeded az órajelet változni, akkor a műveletek között lefuthat a megszakítás kiszolgálás is, mégis jó lesz a kommunikáció. Ha a megszakítás kiszolgálás ideje összemérhető egy adat vételével az I2C buszon, akkor nem tudod biztosan beállítani az órajel nyújtást. Egyszerűen, ha a vétel vége felé jön a megszakítás kérés, a visszatéréskor már késő az órajel nyújtáshoz.

Ha az utóbbi a helyzet, akkor a megszakítás kiszolgáló rutin futási idejét kellene csökkenteni. A mérést csak indítsa el, nem várja meg a végét... Az MSSI -t is lehet megszakításosan kezelni.
(#) Hp41C hozzászólása Jún 11, 2012 /
 
Sziasztok!

Egy figyelemre méltó oldal.
(#) nagy_david1 válasza Bell hozzászólására (») Jún 13, 2012 /
 
Szia!
Nem sikerült kibogozni a választ a kérdésemre az említett oldal segítségével sem
(#) Hp41C válasza nagy_david1 hozzászólására (») Jún 13, 2012 /
 
Mindegy neki, milyen számrendszerben írod be....
(#) nagy_david1 válasza Hp41C hozzászólására (») Jún 13, 2012 /
 
Köszönöm szépen.
(#) kissi válasza nagy_david1 hozzászólására (») Jún 13, 2012 /
 
Idézet:
„Mindegy neki, milyen számrendszerben írod be....”
de jelölnöd kell a számrendszert !

Steve
(#) Gyimate hozzászólása Jún 18, 2012 /
 
Sziasztok!

PIC16F877-el kísérlezgetek CCS C nyelven és az analóg bemenetet szeretném használni, már több példaprogramot megnéztem, többek között a ccs c honlapján is, de valami miatt nem akar elfogadni egy sort a fordító:
setup_adc_ports(sAN0|sAN1);
Próbáltam már azt is, hogy csak egy bemenetet használnék, de akkor is azt állítja, hogy nem ismeri az sAN0-t és semmilyen sANx-et. Mit hagytam ki a programból ami miatt nem hajlandó ezt felismerni?
A válaszokat köszönöm!
(#) vicsys válasza Gyimate hozzászólására (») Jún 18, 2012 /
 
Ezt teszteld:
  1. #include <16F877A.h>
  2. #device adc=10
  3. #FUSES NOWDT                    //No Watch Dog Timer
  4. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  5. #FUSES PUT                      //Power Up Timer
  6. #FUSES NOPROTECT                //Code not protected from reading
  7. #FUSES NODEBUG                  //No Debug mode for ICD
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10. #FUSES NOCPD                    //No EE protection
  11. #FUSES NOWRT                    //Program memory not write protected
  12. #FUSES RESERVED                 //Used to set the reserved FUSE bits
  13. #use delay(clock=20000000)
  14. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  15.  
  16. void main()
  17. {
  18.  
  19.    setup_adc_ports(AN0_AN1_AN3);
  20.    setup_adc(ADC_CLOCK_INTERNAL);
  21.    setup_psp(PSP_DISABLED);
  22.    setup_spi(SPI_SS_DISABLED);
  23.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  24.    setup_timer_1(T1_DISABLED);
  25.    setup_timer_2(T2_DISABLED,0,1);
  26.    setup_comparator(NC_NC_NC_NC);
  27.    setup_vref(FALSE);
  28.  
  29.    // TODO: USER CODE!!
  30.  
  31. }
(#) Gyimate válasza vicsys hozzászólására (») Jún 18, 2012 /
 
Kösz a segítséget!
Utánna még próbálkoztam és végül elfogadta azt is, hogy PIN_A1 és így tovább, csak hiányzott a programom elejéről ez a sor: #device adc=10, gondolom ez azt mondja meg, hogy hány analóg bemenetet akarok használni...
Majdnem elfelejtettem, Azt még megtudod mondani, hogy ennél a parancsnál " set_adc_channel ()" a port számát adjam meg? Kösz
Még egyszer köszönöm!
(#) vicsys válasza Gyimate hozzászólására (») Jún 18, 2012 /
 
  1. while(1)
  2. {
  3. setup_adc_ports(AN0);//RA0
  4. set_adc_channel(0);
  5. delay_us(10);//10uS várakozás
  6. result=read_adc();//result változóban a mért érték
  7. printf(lcd_putc,"%04Lu",result);//kiíratás
  8.  
  9. }
(#) Gyimate válasza vicsys hozzászólására (») Jún 18, 2012 /
 
Ez nekem is működött, ott van a probléma, amikor több bemenetet is szeretnék monitorozni, egyelőre 2 poti van a bemeneteken és az egyik beleszól a másik mérési eredményébe. Bocs a zavarásért, de nemrég kezdtem el foglalkozni a PIC-ekkel, és a mai tananyag az analóg bemenetek kezelése...
  1. #include <16F877.h>
  2. #device adc=8
  3. #FUSES NOWDT,HS, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD
  4. #use delay(clock=12000000)
  5. #include <lcd.c>
  6.  
  7. void main ()
  8. {
  9.    setup_adc_ports(PIN_A0, PIN_A1);
  10.    setup_adc(ADC_CLOCK_INTERNAL);
  11.  
  12.     int i=0;
  13.     int16 Anal1, Anal2;
  14.     int16 temp1, temp2;
  15.     lcd_init ();
  16.     lcd_putc ("\f");
  17.     while (1)
  18.     {
  19.         set_adc_channel (0);
  20.         Anal1 = read_adc ();
  21.         delay_ms (10);
  22.         set_adc_channel (1);
  23.         Anal2 = read_adc ();
  24.  
  25.         lcd_putnum (Anal1);
  26.         lcd_gotoxy (1,2);
  27.         lcd_putnum (Anal2);
  28.         delay_ms (20);
  29.         lcd_putc ("\f");
  30.     }
  31. }


Az lcd_putnum ()-ot még én írtam bele az LCD.c fájlba, hogy könnyebben tudjak számokat kiiratni.

Ilyenkor ha az egyik potit teljesen feltekerem és a másikat hagyom, akkor az egyik változó 128-at vesz fel, mí a másik 70-et.
(#) vicsys válasza Gyimate hozzászólására (») Jún 18, 2012 /
 
Az analóg bemenetek zavart is szednek össze. Tegyél rá 100nF-os hidegítést és kicsit ritkábban mérj rá. (Hagyj egy kis időt.) A másik, hogy ne terheld le 2.5Kohm-nál kisebb ellenállással az analóg bemeneteket. Ha így sem jó, akkor marad a mintavételezés és az átlagolás. (Illetve, próbáld ki, hogy unsigned int változót használsz).
(#) _vl_ válasza Gyimate hozzászólására (») Jún 18, 2012 /
 
Az a baj, hogy a csatornaváltás után rögtön olvasni próbálsz, majd ezután vársz 10ms-ot. Fordítva kéne: csatornaváltás, várakozás, olvasás. De legalábbis a váltás és az olvasás közé mindenképpen kell valami várakozás (a data sheet tartalmazza az A/D belső kapacitását, a belső ellenállást, ill. tudod a bemenetre kapcsolt ellenállást, valamint a max. várható feszültséget is - ezekből kiszámolható, hogy a kondi mennyi idő alatt tud feltöltődni reálisan - na minimum ennyit kell várni a kapcsolás és az olvasás között).
(#) Gyimate válasza vicsys hozzászólására (») Jún 18, 2012 /
 
Lehet, hogy bennem van a hiba, vagy a PIC-ben, de nem akarja az igazat, a programkódban azért maradt bent egy i változó és 2 temp, mert az átlagolással kezdtem, vettem 64 mintát és átlagot számoltam. Kipróbáltam amit mondtál, beraktam egy 27Kohm-os ellenállást az analóg bemenet elé, tetem hidegítést is 470nF formájában, ritkábban mértem rá (200ms) de semmi hatása sincs, ugyan úgy megmaradt az "áthallás" a két analóg bemenet között. Most tartok egy kis szünetet aztán majd meglátjuk.
Azért köszönöm a segítséget!
Következő: »»   77 / 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