Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   804 / 1320
(#) trudnai válasza Lozsa hozzászólására (») Szept 21, 2010 /
 
Lehet nem varsz eleget az AD feltoltodesehez, az szokott ilyen hibakat eredmenyezni...
(#) p_istvan válasza Lozsa hozzászólására (») Szept 21, 2010 /
 
Túl sok ideje van a mérésre, a katalógus ajánlása 8 vagy 16-os osztás 4 MHz-en. Meg ráadásul lehet, hogy nem várod meg a mérés végét sem, az adatlap 64. oldalán találsz mintapéldát arra hogy kell az AD konverziót indítani és kiolvasni.
(#) icserny válasza Lozsa hozzászólására (») Szept 21, 2010 /
 
Idézet:
„A Pic 4Mhz belső oszcillátorról megy, az A/D pedig 1:64-es osztással, tehát a lehető legtöbb ideje van a mérésre...”

1. Ezen a frekvencián az FOSC/8 osztást kellene használni (Tad = 2.0 us konverziós időegység).

2. Fontos, hogy a Tacq adatgyűjtési idő elegendően hosszú legyen, hogy az ADC mintavevő/tartó áramkörének kondenzátora fel tudjon töltődni. Ehhez az ADCON0 regiszter írása (konfigurálás vagy csatornaválasztás) és a GO/#DONE bit beállítása közé minimum 5 us késleltetést kell tenni, de inkább többet... Itt igaz a minél hosszabb, annál jobb kitétel, nem pedig a konverziós időnél. Konverziónál a szükséges minimum közelében célszerű maradni.
(#) Lozsa válasza icserny hozzászólására (») Szept 21, 2010 /
 
Köszönöm mindenkinek. Valóban a minimális idő számítását átugrottam az adatlapban, mert túl bonyolultnak tűnt, és nem tudtam, hogy várni kell az indítás előtt.

Kipróbálom
(#) icserny válasza Lozsa hozzászólására (») Szept 21, 2010 /
 
A fejlettebb (vagy legalábbis bonyolultabb) PIC mikrovezérlőknél van lehetőség automatikus késleltetés beállítására. Itt azonban nincs ilyen, tehát a programnak kell gondoskodnia a várakozásról. Ezt az adatlap mintapéldája is jelzi a
  1. CALL SampleTime ;Acquisiton delay

sorral.
(#) lidi válasza Lozsa hozzászólására (») Szept 21, 2010 /
 
Szerintem az ellenállás osztód is nagyon nagy értékű ellenállásból van, azt is érdemes legalább a 20-adára levenni.
(#) Hp41C válasza Attila86 hozzászólására (») Szept 21, 2010 /
 
Szia!

Idézet:
„Egy fettel (BS170) megoldható hogy csak a mérés idejére kapcsolódjon rá az osztó az akkumulátorra.”


Én mégis kettőt ajánlanék: egy P-fet kapcsolná a tápot az osztóra, ennek a gate-ját (ami a tápra van húzva) egy N-fet földre. A két fet egy SO8 tokban is kapható...

Okok:
- Ha az N-fet a földet kapcsolja, az osztón a feszültség a pic tápfeszültsége fölé emelkedhet, a pic belső védő diódái kinyithatnak.
- Ha az N-fet a tápot kapcsolná az osztóra, akkor a gate feszültségének min. 4V-tal magasabbnak kellene lennie a Source feszültségénél. Egy 20-22V-os segéd feszültséget kellene előállítani valahogy...
(#) PetAd válasza icserny hozzászólására (») Szept 21, 2010 /
 
Igen, csak 4 bites, el is felejtettem. A vezetékeket megnéztem többször, jó helyre mennek, a vezetékekkel sincs baj, de még mindig ugyanazokat az ábrákat rajzolja ki, legtöbbször azt írja ki hogy: '11'╟ néha meg azt hogy ooo meg még egy fura karakter. Itt vannak a programok, de szerintem ezekben nincs hiba.
(#) Hp41C válasza PetAd hozzászólására (») Szept 21, 2010 /
 
Szia!

A 16F690 esetén a PORTC sajnos analóg funkciókkal is rendelkezik, az ANSEL és ANSELH regisztereket törölni kell a digitális ki-/bemenet használatához.
(#) icserny hozzászólása Szept 21, 2010 /
 
PIC18F-hez soros porton kommunikáló bootloader sokféle van, ezek közül melyiket használja/ajánlja valaki?

Hirtelenjében ezeket találtam:
AN851
AN1310
Colt bootloader
ds30 bootloader
Tiny bootloader

Felületes vizsgálat alapján eddig az AN1310 és a Tiny tűnik szimpatikusnak. A ds30 letöltőjéhez pilótavizsga kell, nem tudnám jó szívvel ajánlani.

Követelmények: egyszerű legyen a kezelése, ne a felhasználótól kérdezze, hogy milyen mikrovezérlőt kell programoznia, s legyen terminál funkciója is (a programletöltés után tudjon kommunikálni az alkalmazással).
(#) PetAd válasza Hp41C hozzászólására (») Szept 21, 2010 /
 
És CCS-nél hogy tudnám törölni a regisztereket? Sajnos/szerencsére ez nem assembly. Eddig még nem találtam semmit erről, de tovább keresem.
(#) szilva válasza icserny hozzászólására (») Szept 21, 2010 /
 
Én írtam magamnak anno egy olyan bootloadert, ami soros porton keresztül tud kódot fogadni, méghozzá közvetlenül a hex-et. Emiatt nem kell hozzá semmilyen hókuszpókusz a PC oldalra, egy jó soros terminálprogram megteszi. Az alkalmazás meg ugyanúgy használhat soros portot a kommunikációra, mint a bootloader, így a terminálprogram ott is használható.

Itt található a bootloader, de már nagyon régen nem foglalkoztam vele.
(#) vicsys válasza Hp41C hozzászólására (») Szept 21, 2010 /
 
Ez nagyon izgalmasan hangzik! Készítenél egy skiccet ha szépen megkérlek?
(#) PetAd válasza PetAd hozzászólására (») Szept 21, 2010 /
 
Azóta se találtam semmit, hogy hogy lehetne kikapcsolni az analóg módot CCS C-ben, flex_lcd.c vel se működik, ugyanazt írja ki. Ha más karaktereket küldök ki akkor változik az amit kiír az lcdre de soha nem az amit küldök. abc-t írtam 'bb lett belőle, cab-ot írtam b'b lett belőle. az utolsó karakter mindig egy ╟
(#) vicsys válasza PetAd hozzászólására (») Szept 21, 2010 /
 
  1. #include <16F690.h>
  2. #device adc=8
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6. #FUSES NOPROTECT                //Code not protected from reading
  7. #FUSES NOBROWNOUT               //No brownout reset
  8. #FUSES MCLR                     //Master Clear pin enabled
  9. #FUSES NOCPD                    //No EE protection
  10. #FUSES NOPUT                    //No Power Up Timer
  11. #FUSES IESO                     //Internal External Switch Over mode enabled
  12. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  13.  
  14. #use delay(clock=20000000)
  15. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  16.  
  17.  
  18. void main()
  19. {
  20.  
  21.    setup_adc_ports(NO_ANALOGS|VSS_VDD);   //ITT*******
  22.    setup_adc(ADC_OFF);   //ITT*************
  23.    setup_spi(SPI_SS_DISABLED);
  24.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  25.    setup_timer_1(T1_DISABLED);
  26.    setup_timer_2(T2_DISABLED,0,1);
  27.    setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
  28. //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
  29.  
  30.    // TODO: USER CODE!!
  31.  
  32. }
(#) icserny válasza PetAd hozzászólására (») Szept 21, 2010 /
 
Gondolom, a setup_adc_ports() függvénnyel. Vagy az ANSEL és ANSELH regiszter direkt írásával.

Egy olyan példát találtam, ahol AN0 engedélyezve marad, de a C port felszabadításához talán ez is jó lesz:
  1. setup_adc_ports(sAN0|VSS_VDD);
  2.    setup_adc(ADC_CLOCK_DIV_8);


Mellesleg a CCS C helpjét érdemes forgatni, mert viszonylag könnyen megtalálható benne minden hasznos információ.
(#) PetAd válasza vicsys hozzászólására (») Szept 21, 2010 /
 
Beraktam a device adc sort és a 2 setup adc sort mindkét félét, de nem segített mindig ugyanazt írja, multival megmértem az alkatrészek lábán, hogy nem-e szakadtak a kábelek, de mindegyik jó. Kiszedtem a tris c sort is, akkor is rossz.
Kösz, hogy próbáltok segíteni holnap teljesen újraépítem, meg újraírom talán megjavul.
(#) icserny válasza szilva hozzászólására (») Szept 21, 2010 /
 
Köszönöm, majd megnézem ezt is.
(#) szilva válasza PetAd hozzászólására (») Szept 21, 2010 /
 
Tegyél LED-eket (ellenállásokkal) azokra a PORTC lábakra, amik az LCD-re vannak kötve, és próbáld meg egyenként megvillogtatni őket a programodból. Ha mindegyiket sikerül villogtatni, és mindegyik azon a portlábon villog, ahova az szeretted volna kötni, akkor nem a port beállításával lesz a gond, hanem valahol máshol: vagy a hardveres összekötésnél (az LCD modul tápfeszére is tegyél 100nF körüli kerámiát, akár magára a modulra, ahol a vezetékek belemennek), vagy a programban.

Egyébként ilyenkor szoktuk elkezdeni szidni a C-t, mert nem biztos, hogy az történik ASM szinten, mint amire a C kód alapján számítana az ember.

Mellesleg halvány emlékeim szerint a CCS-ben vannak olyan direktívák, amik a portok kezelésének a lefordított ASM kódba kerülő módját befolyásolják (fast_io, direct_io és ilyesmik rémlenek). Ezeket is át kellene nézni, mert van olyan mód (és ez az alapértelmezett?), amikor minden egyes portpiszkálás esetén adatirányt állít az adott porton és ki tudja, még milyen, esetleg zavaró dolgok kerülnek be a kódba. Az ilyenek során esetleg előálló tüskék a kimeneteken okozhatnak olyan jelenségeket is, amit épp az áramkörödben tapasztalsz. A help-ben el kellene olvasni ezeket, meg azt is, hogy a használni kívánt LCD rutinoknak nincs-e valami ilyen jellegű előfeltétele (esetleg még olyan is lehet, hogy az adatbitek és a vezérlőbitek ne egy porton legyenek, pont az említett viselkedések miatt).

Ha nagyon nem megy a dolog, de LED-ekkel kipróbálva látszólag minden bit a helyén van, akkor nem marad más, mint a C-ből lefordított ASM kódban kell körülnézni, hogy mi hiúsíthatja meg a helyes kommunikációt az LCD-vel.

Szerk.: a LEDvillogtatást is érdemes úgy csinálni, hogy a portláb állapotát visszaolvasva és megnegálva kiírni, nem pedig fix 1-be és 0-ba állító utasításokat betenni. Így ugyanis kibukik, ha valami miatt (pl. túl nagy külső terhelés, vagy analóg funkció aktív a kérdéses lábon) nem tudja visszaolvasni a láb állapotát a progi.
(#) Hp41C válasza vicsys hozzászólására (») Szept 21, 2010 /
 
Szia!

Nem olyan bonyolult...
(#) vicsys válasza Hp41C hozzászólására (») Szept 21, 2010 /
 
Nem hát! Köszi, ki fogom próbálni.
(#) Hp41C válasza vicsys hozzászólására (») Szept 21, 2010 /
 
Szia!

Jó hozzá a BS170 / BS250 is..
(#) PetAd válasza szilva hozzászólására (») Szept 22, 2010 /
 
Átraktam az lcd lábait másik portokra így:
B4-B7 - B7,C7,C6,C3
RS B5
RW föld
E B6
Ezek közt is van analóg bemenet de így működik.
Így most már azt írja ki amit kellene, de minden írás után tesz egy ╟ karaktert a következő pozícióba. Ha van olyan parancs ami lekéri a string hosszát akkor fel lehet tölteni a többi részt szóközzel, viszont így elpazarolnék egy csomó helyet a memóriában, meg prociidőt.
(#) watt válasza PetAd hozzászólására (») Szept 22, 2010 /
 
Egyértelmű, hogy a konfigurációval van probléma, és még a programmal is. Ez az átka, mikor valaki ollózik és nem tudja hogy működik az a rész, amit használ...
De a lényeg, hogy lassan de haladsz. Érdemes lenne jobban elmerülni a kódban...
(#) Hp41C válasza PetAd hozzászólására (») Szept 22, 2010 /
 
Szia!

Kérlek, olvasd át az LCD kezelését... Látnod kellene, hogy a parancsok, karakterek írása után a program a BUSY flag-et ki szeretné olvasni az LCD-ből, azonban a R/W láb földön van, ezért az olvasás nem sikerül (írás lesz belőle)...
Kellene keresni olyan LCD rutint, ami nem a BUSY flag figyelésével működik, hanem várakozással...

  1. BYTE lcd_read_byte() {
  2.       BYTE low,high;
  3.       set_tris_lcd(LCD_READ);
  4.       lcd.rw = 1;
  5.       delay_cycles(1);
  6.       lcd.enable = 1;
  7.       delay_cycles(1);
  8.       high = lcd.data;
  9.       lcd.enable = 0;
  10.       delay_cycles(1);
  11.       lcd.enable = 1;
  12.       delay_us(1);
  13.       low = lcd.data;
  14.       lcd.enable = 0;
  15.       set_tris_lcd(LCD_WRITE);
  16.       return( (high<<4) | low);
  17. }


  1. while ( bit_test(lcd_read_byte(),7) ) ;
(#) PetAd válasza watt hozzászólására (») Szept 22, 2010 /
 
Pedig, csak annyit változtattam, hogy átkábeleztem meg flex_lcd.c ben átírtam az új lábkiosztást. Úgy is működik, ha kikommentezem az adc kikapcsolós részt. Tényleg át kellene néznem, hogy mit is csinál ez a flex lcd, a főprogit értem.
Hp41C: Bocs, azt elfelejtettem mondani, hogy a flex_lcd.c-t használom, nem az alap lcd.c-t és ebben nem kell használni az RW lábat, elég kikommentezni egy sort, én is így tettem.
Ha ezt írtam be: lcd_putc("alma"); akkor megjelent az a fura karakter, ha meg ezt: printf(lcd_putc,"alma");
akkor nem, érdekes.
(#) icserny válasza PetAd hozzászólására (») Szept 22, 2010 /
 
Idézet:
„Ha ezt írtam be: lcd_putc("alma"); akkor megjelent az a fura karakter”
Ez mennyiben tekinthető rendeltetésszerű használatnak? Az lcd_putc() szerintem nem nullával terminált sztringek kiírására készült.
(#) PetAd válasza icserny hozzászólására (») Szept 22, 2010 /
 
Idézet:
„lcd_putc(c) Will display c on the next position of the LCD.”
Ezt írja a komment az lcd.c-ben, szerintem ez rendeltetésszerű használatnak tekinthető.
(#) Hp41C válasza PetAd hozzászólására (») Szept 22, 2010 /
 
Szia!

Valószínűleg nem. Ugyanis karakterlánc esetén a kezdőcímet adják át, egy karakteres változó esetén az értékét. Ha ez igaz, akkor a megjelent karakter az "alma" szöveg kezdőcímének egy részéből képződik...
  1. lcd_putc('@');
(#) icserny válasza PetAd hozzászólására (») Szept 22, 2010 /
 
Az lcd_putc() deklarációjában a paraméter char típusú, az általad átadott adat típusa pedig const rom char* (nem tudom, hogy CCS-ben is így hívják-e, lényegében a ROM-ban elhelyezett, nullával terminált karakterfüzérre mutató pointer).

Egy sztringet szerintem így kellene kiírni:
  1. //--- Egy nullával határolt katraktefüzér kiíratása
  2. void outString(const rom char* p) {
  3.   char c;
  4.   while ((c=*p)) {
  5.     lcd_putc(c);
  6.     p++;
  7.   }
  8. }
Következő: »»   804 / 1320
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