Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   962 / 962
(#) kriszrap válasza Bell hozzászólására (») Hé, 20:56 /
 
Sikerült ahogy beilesztetted de akkor ez az "n" mire való???
A hozzászólás módosítva: Hé, 20:56
(#) Bell válasza kriszrap hozzászólására (») Hé, 22:09 /
 
Azt csak benne hagytam emlékeztetőnek, itt nincs használva.
Amíg kísérletezel a megfelelő értékkel, addig szükség van rá.
Ha megvan a megfelelő érték, fixen be lehet írni, vagy akár const double-ként deklárálni, vagy simán definiálni. Végülis a két érték bármi lehet, ha az összegük 1.
Fölösleges lenne minden alkalommal kiszámolni.
(#) pajti2 válasza hapci hozzászólására (») Kedd, 10:54 /
 
Az elektronikai problémát illetően konkrét kapcsolási rajzot kellene megkuksolni, milyen meghajtók vannak ott, amihez alkalmazkodni kell, és hogy annak a meghajtónak mit mond az adatlapja a tiltott zónás bemeneti feszültségre - valami akkor is csak kerülni fog a kimenetére, általában a default érték. Amikor a csatlakozót összedugod, és nincsen adatkommunikáció egyik irányban sem, akkor jellemzően default jelszint változás sincsen. A soros portot nagyon sokáig használta a világ, ki van találva, biztosan nem lesz csúnya problémád kábel hot plug miatt - vagy olyan legalább is nem lesz.

Ami problémád inkább lesz, az a földhurok. Soros kábellel jobb ötlet csak helyi eszközöket csatlakoztatni. Például a 20 méter kábel esete már rendszeresen fog tökretenni mindenféle eszközöket. Egyik volt ismerősöm pénztárgépeket szervízelt, amiket hosszú rs232 kábellel volt szokás egy másik szobában lévő számítógéphez hozzákötni, és ő úgy tapasztalta, hogy még egy szoba egyik sarkától a másikig is már jobb, ha van galván leválasztás, és el kellene fogadni a meghajtási gyengeségek végett a maximum 9600 baud sebességet. Próbálkozni persze mindig lehet bármivel, de sok év szervíz tapasztalatának az az utólagos statisztikája. Ahol lehetséges, ott azért érdemes átállni ethernetre, mert az trafós csatlakozókkal védett mindegyik csatlakozási ponton. Az ethernetnek nem a sebessége a legfőbb erénye, hanem a földhurok védelme - a mai fiatalok már azt sem tudják, mi az

A hőfok szabályozó típusát illetően páran tudni vélnek dolgokat, én annyira nem vagyok odahaza bennük, gőzöm sincs, mi az a Nextion vagy akármi, de a soros porton általában extra karakterekkel vagy időzítéssel oldanak meg frame szervezést.

Extra karakterekre a példa a base64 kódolás. Vannak engedélyezett 8 bites értékek, és tiltottak. Úgy persze áldozatul esik valamekkora sávszélesség, de az olyan. A frame startot és végét tiltott karakter jelzi. Tiltott karakter utána karakterek a következő tiltott karakterig 1 framehez tartoznak. Ha éppen olyankor dugod össze, hogy a frame adás kellős közepén van az egyik oldal, akkor azok az adatok már elvesznek. Ha olyankor húzod szét, hogy az előző frame végén még nem volt meg a lezáró karakter, akkor az is elveszik. Néhány alkalmazásban tudni kell dinamikus frame méretet használni, a frame pontos hossza nem lesz ismert, és csak menet közben derül ki, olyankor hasznos segítség.

Időzítésre példa a modbus rtu módja. Elvileg folyamatosan megy az adatcsere a soros porton (ott jellemzően rs485-ön), és ha az mégis megszakad 3 milli sec időnél hosszabb időre, az egy frame start. A frame startot csak szinkron felvételre használják, a frame szervezés utána már fix szélességű adatpakolászással, és adat értelmezéssel van megoldva (a frame elején érkezik, hogy milyen hosszú az a frame és hol fog kezdődni a másik).

Ha neked kellene megoldani mindkét oldalt, használhatnád, amelyik szimpi. Ha az egyik oldal már készen kapott, és alkalmazkodnod kell, akkor kellene valami gyártói leírás, vagy jó sokat méricskélni.
A hozzászólás módosítva: Kedd, 10:56
(#) hapci válasza pajti2 hozzászólására (») Kedd, 13:56 /
 
Huh! Ennyi szakmai információért máshol már pénzt kérnek... Nagyon köszönöm!
Szerencsére a projekt nagyon türelmes rendszert kezel: relékkel szivattyút és két termo-szelepet (3W ohmos), optocsatolóval gázkazánt. A szivattyú kapcsolgatásától tartottam, de alaptalanul, egyszer sem okozott zavart. Visszajelzésnek csak ledeket raktam be, ezért lenne jó időnként valami kijelző. (A Nextion kijelző valóban ügyes kis kütyü, érdemes rákeresni.)
Továbbiakban szeretném értékelni is a működést, de a számítógépet helyszínre vihetem, max. 1,5 m-re, gyakorlatilag zavarmentes környezetben. Az RS-232 9600 bauddal több, mint elég, negyed-másodpercenként tervezem a mintavételt, illetve a megelőző adatsor küldését. (De, ha tőlem kérnének tanácsot... :- Vegyen két bimetálos termosztátot, a mester meg azonnal beköti!)
Köszönöm mégegyszer
(#) silent15 hozzászólása Kedd, 17:34 /
 
Sziasztok!

Olyan problémába ütköztem, hogy a 16f1788-nál a timer1 modul túlságosan lassan működik.
  1. setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
  2. set_timer1(65535);

A belső órajel 32Mhz. Egy 360 lépéses szinusztáblát írok ki a DAC-ra megszakításban. Így elvileg egy 22,2 kHz -es jelnek kéne kint lennie, viszont szkópon is mérhetetlenül lassú jel jön ki. Mit ronthatok el, mi lehet a hiba? Mellékelem a teljes kódot is. Elvileg jónak kéne lennie, bár ahogy a probléma is mutatja nem . Ha nem a megszakításban van akkor szép gyors jelet tud kiadni, szóval nem a dac nem bírja.
  1. #include <16f1788.h>
  2. #fuses INTRC_IO, NOWDT, NOPROTECT, NOBROWNOUT, NOMCLR, NOPUT
  3. #use delay(clock = 32000000)
  4.  
  5. const unsigned int8 szinusz_tabla[360] =
  6. {
  7. 128,130,132,135,137,139,141,144,146,148,150,152,155,157,159,
  8. 161,163,165,168,170,172,174,176,178,180,182,184,186,188,190,
  9. 192,194,196,198,200,201,203,205,207,209,210,212,214,215,217,
  10. 219,220,222,223,225,226,227,229,230,232,233,234,235,237,238,
  11. 239,240,241,242,243,244,245,246,247,247,248,249,250,250,251,
  12. 252,252,253,253,254,254,254,255,255,255,255,255,255,255,255,
  13. 255,255,255,255,255,255,255,255,255,254,254,254,253,253,252,
  14. 252,251,250,250,249,248,247,247,246,245,244,243,242,241,240,
  15. 239,238,237,235,234,233,232,230,229,227,226,225,223,222,220,
  16. 219,217,215,214,212,210,209,207,205,203,201,200,198,196,194,
  17. 192,190,188,186,184,182,180,178,176,174,172,170,168,165,163,
  18. 161,159,157,155,152,150,148,146,144,141,139,137,135,132,130,
  19. 128,126,124,121,119,117,115,112,110,108,106,104,101,99,97,
  20. 95,93,91,88,86,84,82,80,78,76,74,72,70,68,66,
  21. 64,62,60,58,56,55,53,51,49,47,46,44,42,41,39,
  22. 37,36,34,33,31,30,29,27,26,24,23,22,21,19,18,
  23. 17,16,15,14,13,12,11,10,9,9,8,7,6,6,5,
  24. 4,4,3,3,2,2,2,1,1,1,0,0,0,0,0,
  25. 0,0,0,0,0,0,1,1,1,2,2,2,3,3,4,
  26. 4,5,6,6,7,8,9,9,10,11,12,13,14,15,16,
  27. 17,18,19,21,22,23,24,26,27,29,30,31,33,34,36,
  28. 37,39,41,42,44,46,47,49,51,53,55,56,58,60,62,
  29. 64,66,68,70,72,74,76,78,80,82,84,86,88,91,93,
  30. 95,97,99,101,104,106,108,110,112,115,117,119,121,124,126
  31. };
  32.  
  33. unsigned int16 szinuszjel_kimenet=0;
  34.  
  35. int8 Szinusz( int16 szog )
  36. {
  37.       return szinusz_tabla[szog];
  38. }
  39. #INT_TIMER1 //Szinusz
  40. void Timer1_megszakitas()
  41. {
  42.    set_timer1(65535);
  43.    szinuszjel_kimenet++;
  44.    if(szinuszjel_kimenet==360)
  45.    {
  46.       szinuszjel_kimenet=0;
  47.    }
  48.    dac_write(Szinusz(szinuszjel_kimenet));
  49. }
  50. void Init_szinuszjel( void )
  51. {
  52.    setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
  53.    set_timer1(65535-szinuszjel_frekvencia);
  54.    setup_dac(DAC_VSS_VDD | DAC_OUTPUT1);
  55. }
  56. void main( void )
  57. {
  58.    Init_szinuszjel();
  59.    ENABLE_INTERRUPTS(INT_TIMER1);
  60.    ENABLE_INTERRUPTS(GLOBAL);
  61.    while(1)
  62.    {
  63.  
  64.    };
  65. }


Köszönöm !
A hozzászólás módosítva: Kedd, 17:35
(#) Hp41C válasza silent15 hozzászólására (») Kedd, 18:02 /
 
Számoljunk egy kicsit:
A PIC 32MHz órajelről jár. Az utasítás végrehajtási ideje 4/32000000 = 125 ns.
A 22.222kHz periódusideje 1/22222 = 45 us. Utasítás végrehajtási időben mérve pontosan 360. Szóval, ha minden második utasítás a következő mintát írná ki a DAC számára egy PORT 8 bitjére, akkor is csak 90us alatt tudná fejezni a 360 minta kiküldését.
A programban 360 megszakítás belépés (latency + mentés), kilépés és még számtalan egyéb művelet történik...
Nézd meg, milyen assembly utasításokra fordul a program, mérj végrehajtási időket.
A hozzászólás módosítva: Kedd, 18:05
(#) silent15 válasza Hp41C hozzászólására (») Kedd, 18:10 /
 
Szkóppal mérve is kb 0,5-1 Hz a freki (ezt már az enyém mérni nem tudja, csak saccolom). A problémám az hogy nagyságrendekkel lassabb az egész mint amilyennek lennie kellene. A te értékeddel is 11,1khz fele kellene lennie, de meg sem közelíti.
Mindjárt megnézem mit csinál assembly szinten.

UI.: Ezzel a lookup table megoldással nagyon szép szinuszt lehet kiküldeni , szóval köszönöm a linket és az ötletet mégegyszer !
A hozzászólás módosítva: Kedd, 18:13
(#) silent15 válasza silent15 hozzászólására (») Kedd, 19:23 /
 
Közben még felmerült bennem az is hogy mi a különbség a T1_INTERNAL és a T1_FOSC között ? Az internal 4-el osztott a fosc nem? Így néz ki az álltala fordított assembly.
  1. //setup_timer_1(T1_FOSC | T1_DIV_BY_1);
  2. MOVLW  47
  3. MOVWF  18
  4. CLRF   19
  5. //set_timer1(65535);
  6. CLRF   16
  7. MOVLW  FF
  8. MOVWF  17
  9. MOVWF  16
A hozzászólás módosítva: Kedd, 19:24
(#) Hp41C válasza silent15 hozzászólására (») Kedd, 19:46 /
 
Idézet:
„The latency for synchronous interrupts is three or four instruction cycles. For asynchronous interrupts, the latency is three to five instruction cycles, depending on when the interrupt occurs. See Figure 8-2 and Figure 8.3 for more details.”

Ha a TMR1 órajele ez Fosc/4 azaz az utasításvégrehajtási idő (TMR1CS<1:0> = 00), egy utasítás végrehajtás alatt a TMR1 regisztere is lép 1 -et.
Ha a TMR1 órajele ez Fosc azaz az utasításvégrehajtási idő (TMR1CS<1:0> = 01), egy utasítás végrehajtás alatt a TMR1 regisztere 4 -et lép.

Teória: Minden minta beírása után lekési a timer árfordulását, a TMR1IF -et az átforulás után tölni. Azaz, minden minta után vár még 65536-n ciklust, mire megint átfordul. Ekkor a frekvencia Fosc/4 beállításnál: 32000000 / 4 / 65536 / 360 = 0.339 Hz, Fosc beállításnál: 32000000 / 65536 / 360 = 1.3563 Hz.

11.111kHz -et csak akkor lehetne elérni, ha a programod csak a következő utasításokat tartalmazná:
  1. movlw MINTA0
  2. movwf PORTD
  3. movlw MINTA1
  4. movwf PORTD
  5. movlw MINTA2
  6. movwf PORTD
  7. movlw MINTA3
  8. movwf PORTD
  9. ...
  10. movlw MINTA359
  11. movwf PORTD

Még ugrás sem lehetne a végén...
A hozzászólás módosítva: Kedd, 19:47
(#) silent15 válasza Hp41C hozzászólására (») Kedd, 19:58 /
 
A teóriád tökéletesen helyt áll és a segítségével rá is jöttem a hiba elhárításra A probléma az volt, tényleg, hogy lekéste, túlcsordult és várt még egyet amíg meghívta megint a megszakítást. Viszont ez az én szoftveres hibám volt.
Az alábbi kód helyett:
  1. #INT_TIMER1 //Szinusz
  2. void Timer1_megszakitas()
  3. {
  4.    set_timer1(65535);   
  5.    szinuszjel_kimenet++;
  6.    if(szinuszjel_kimenet==360)
  7.    {
  8.       szinuszjel_kimenet=0;
  9.    }
  10.    dac_write(Szinusz(szinuszjel_kimenet));
  11. }

Ez kell:
  1. #INT_TIMER1 //Szinusz
  2. void Timer1_megszakitas()
  3. { 
  4.    szinuszjel_kimenet++;
  5.    if(szinuszjel_kimenet==360)
  6.    {
  7.       szinuszjel_kimenet=0;
  8.    }
  9.    dac_write(Szinusz(szinuszjel_kimenet));
  10.    set_timer1(65535);
  11. }

Amíg végrehajtotta a megszakítást addig túlcsordult és tényleg kellett neki várnia még egyszer 65535 (minusz a végrehajtási idők utána) időt.
Szóval köszönöm szépen megint!
Következő: »»   962 / 962
Bejelentkezés

Belépés

Hirdetés
Frissek
2017. Máj, 25. Csü
8:51:40
Jelenleg 389 fő olvassa az oldalt
Online tagok:
Lapoda.hu     XDT.hu     HEStore.hu