Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- 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   1188 / 1203
(#) don_peter válasza asch hozzászólására (») Jan 19, 2023 /
 
Indítok egy timer0-át 8bit-es módban. Beállítottam a leggyorsabb megszakításra, amely minimum 200nS / megszakítás. A megszakításban egy változót növelek.
1. timer0 indul
2. 1 byte adat lekérése SPI x 100 alkalom
3. timer0 leállít
Timer0 adatát megkapom: 128nS
Ez úgy jön ki, hogy timer0-ban növelt változó értéke 0.64, ezt úgy kaptam meg, hogy egymás után 100 alkalommal kérdezem le ugyan azt, majd ezt átlagolom. így jön ki a 0.64.
Timer0 200ns/megszakítás, 200*0.64 = 128nS
Minden más értéket is ugyan így mértem.
  1. // Időméréshez látrehozott megszakítás
  2. void HighIntTimer0(void)
  3. {
  4.         // Számoláshoz, 8bit-es mód
  5.         // (FOSC/4) / Prescaler / TMR0H TMR0L
  6.     // (40M/4) /        2               / 1
  7.         INTCON2bits.TMR0IP = 1;         // Timer0 megszakítás magas prioritású legyen
  8.        
  9.         T0CONbits.TMR0ON = 0;           // Timer0 kikapcsolva
  10.         T0CONbits.T08BIT = 1;           // 8 bites mód kiválasztás
  11.         T0CONbits.T0CS = 0;                     // Meghajtás belső órajelről
  12.         T0CONbits.T0SE = 0;                     // Külső órajel fel- vagy lefutó élének választása
  13.         T0CONbits.PSA = 0;                      // Előosztás bekapcsolása
  14.         //Előosztási arány beállítása (000 = 1:2, 001 = 1:4, 010 = 1:8, 011 = 0:16,
  15.                                                                 // 100 = 1:32, 101 = 1:64, 110 = 1:128, 111 = 1:256)
  16.         T0CONbits.T0PS2 = 0;            // Előosztás 1:2 osztásra állítása
  17.         T0CONbits.T0PS1 = 0;
  18.         T0CONbits.T0PS0 = 0;
  19.         INTCONbits.TMR0IE = 1;                  // Timer tiltása
  20.         //TMR0H = 0xCD;
  21.         TMR0L = 0x01;   // 200nS / megszakítás
  22. }

Mérés:
  1. HighIntTimer0();
  2.     Timer0Count = 0;
  3.     MemCim.value = 0x259;
  4.     T0CONbits.TMR0ON = 1;
  5.    
  6.     Sample = MemRead(MemCim);   // 128nS alatt fut le
  7. Sample = MemRead(MemCim);
  8. Sample = MemRead(MemCim);
  9. Sample = MemRead(MemCim);
  10. Sample = MemRead(MemCim);
  11. Sample = MemRead(MemCim);
  12. Sample = MemRead(MemCim);
  13. Sample = MemRead(MemCim);
  14. Sample = MemRead(MemCim);
  15. Sample = MemRead(MemCim);
  16.  
  17. // ...még 10 ilyen 10-es blokk lefele
  18.  
  19. T0CONbits.TMR0ON = 0;

Megszakítás:
  1. if (INTCONbits.TMR0IF)
  2.         {
  3.                 TMR0L = 0x01;   // 200nS / megszakítás
  4.                 Timer0Count++;
  5.                 INTCONbits.TMR0IF = 0;   // clear the flag
  6.         }

Breakpointtal állítom le a programot, debug módban.
A hozzászólás módosítva: Jan 19, 2023
(#) sonajkniz válasza don_peter hozzászólására (») Jan 19, 2023 /
 
Valami akkor sem stimmel.
Ha az órajelet direktben méred már az 25nsec.
Hogy lesz abból neked kevesebb mint 1nsec?
(#) don_peter válasza sonajkniz hozzászólására (») Jan 19, 2023 /
 
Idézet:
„Hogy lesz abból neked kevesebb mint 1nsec?”

Én azt írtam, hogy még mindig 1uS alatt vagyok.
Idézet:
„De még így is 1uS alatt vagyunk.”

Nem értem ezt az 1nS-t.
(#) benjami válasza don_peter hozzászólására (») Jan 20, 2023 /
 
Csak egy kérdés: Hogyan is akarsz 200nsec-enként megszakítást, amikor ennyi idő alatt 2db. 1 ciklusú utasítás fut le? 40MHz-es cpu clocknál ugye 25nsec a cpu órajel, de 4 órajel egy utasítást végrehajtania a procinak.
A másik: nem tudom milyen módon csinálod a cpu órajelet, de nekem a pll-es órajellel volt gondom anno ennél a típusnál, úgy rémlik egyszerűen nem akart a pll dolgozni, és csak az eredeti órajellel ment a proci. Mondjuk hogy pontosan mi is volt, az már az idő homályába veszett, de érdemes lenne megnézned a valós órajelet mondjuk egy láb billegtetéssel és rá rakott oszcilloszkóppal vagy logikai analizátorral.
(#) don_peter válasza benjami hozzászólására (») Jan 20, 2023 /
 
Igen PLL-elel használom. 10MHz-s külső kristállyal. ellenőrizve LED billegtetéssel, meg van a sebesség. 25nS egy órajel ez meg van nekem is, még is egy byte olvasás SPI-ről timer0-val mérve 128nS ideig tart. Ez összesen 5 utasításnak felelne meg, ha csak nem rosszul állítottam be a timer0-át, ami nem lehetetten, de oda figyeltem kellőképpen, akkor ez ennyi ideig tart neki. Kicsit én is keveslem, de ennyit mérek sokadjára is. Innentől már csak a timer0 oszcilloszkóp mérése ami per döntő lehet majd, de ezt már csak holnap elkörzöm. elvileg 200nS, de holnap pontosítok..
(#) sonajkniz válasza don_peter hozzászólására (») Jan 20, 2023 /
 
Ezt írtad:
Idézet:
„Timer0 200ns/megszakítás, 200*0.64 = 128nS”

Ha a 0.64 nem nsec-et jelent, akkor mit?
(#) benjami válasza don_peter hozzászólására (») Jan 20, 2023 /
 
Szerintem te el vagy tévedve. A PIC nem ATMEGA vagy ARM, hogy egy órajel alatt végrehajtson egy utasítást. A 8 bites PIC-eknek legalább 4 órajel kell egy utasításhoz, azaz a 128nsec alatt csak 1 utasítással végeznek, meg éppen csak belekezdenek a következőbe.
(#) don_peter válasza sonajkniz hozzászólására (») Jan 20, 2023 /
 
A timer0 megszakításom lefutásának számát mutatja. De ezt írtam is feljebb. 100 egymás után veszek 1 byte adatot, hogy az érték pontosabb legyen, majd a megszakítások számát elosztom 100-al, így kapom meg a 0.64-et.

Hogy érthetőbb legyen: PIC18F452
0. Timer0Count = 0;
1. Timer0 indítása (egy változó értékét növelem minden megszakításban)
2. Sample = MemRead(MemCim); // Kérek SPI-n 1 mintát ( ez egy 1byte)
3. ... 2.*99 összesen 100 alkalommal kérek 1 byte adatot
.
.
.
101. Sample = MemRead(MemCim); // Kérek SPI-n 1 mintát ( ez egy 1byte)
102. Timer0 tiltása
103. Eredmény = Timer0Count/100 = 0.64

Tehát a timer0 0.64szer fut le egy minta vétele alatt, amely összesen 1 byte adat az SPI memóriából kiolvasva.

Ezek után lehet az így kapott eredményt időre váltani:
Timer0 megszakításának ideje (feljebb a teljes kód): FOSC/4/2/1 vagy is 40MHz/4/2/1 = 5MHz és ebből jön ki az idő, ami 1/5MHz = 200nS
Tehát a megszakítások 200nS időnként érkeznek, így 200nS*0.64 = 128nS.
Ebből nekem ez a 128nS idő jött ki, vagy is, hogy 1 minta vétele 128nS alatt érkezik meg.
Remélem így világosabb. Újra átgondolva még mindig úgy gondolom, hogy jó a mérésem, de hátha rá tudtok világítani arra, hogy ha van is hiba azt hol keressem. Ma szkóp is befigyel.
A hozzászólás módosítva: Jan 20, 2023
(#) don_peter válasza benjami hozzászólására (») Jan 20, 2023 /
 
Igen azt értem és olvastam is, hogy 1 utasítás feldolgozása 4 órajel vagy is elvileg 40MHz-nél 100nS idő és egy SPI kezelésnél sokkal több utasítás van mint 1, de még is ezt mérem. Ezért is írok, hogy hátha valaki észre vesz valamit, vagy gondol valamire, amin átsiklottam vagy nem veszek észre. Timer0 megszakításom hibás lenne? Nem tűnik hibásnak elsőre, de ettől még lehet.

Egyébként nem csak 1 utasítás 4 órajel, hanem pl. egy ugrás 8 órajel időbe kerül. És nálam 1 memóriából való 1 byte olvasása véget legalább 3 ugrás van. Ami összességében vagy 600nS.
Szóval ezért is írtam feljebb, hogy nem értem és valami nem kerek, de még is minden úgy fest mint ha jó lenne.
(#) icserny válasza don_peter hozzászólására (») Jan 20, 2023 /
 
Idézet:
„hátha rá tudtok világítani arra, hogy ha van is hiba azt hol keressem.”
Nem lehetséges, hogy a Timer0Count változód túlcsordul? Esetleg többször is...
(#) benjami válasza don_peter hozzászólására (») Jan 20, 2023 /
 
Azt se felejtsd el, hogy egy megszakítás kiszolgálás is nagyságrendileg 20 utasításciklus (azaz 80 órajel), ha nem csinálsz benne semmit. Azaz felejtsd el a nsec sűrűségű megszakításokat. A timer0-t használhatod nyugodtan időmérésre, de állítsd be 16 bites módra, és ha 65536 számlálás után túlcsordulva megszakítást okoz, ott növelj egy 8 vagy 16 bites változót. Ekkor ha lekérdezed a "pontos időt", akkor az alsó 16 bitet a számláló aktuális értékéből, a felsőbb biteket meg túlcsordulás általi megszakításkor megnövelt változóban kapod meg.
(#) sonajkniz válasza don_peter hozzászólására (») Jan 20, 2023 / 1
 
Idézet:
„Timer0 megszakításának ideje (feljebb a teljes kód): FOSC/4/2/1 vagy is 40MHz/4/2/1 = 5MHz és ebből jön ki az idő, ami 1/5MHz = 200nS”

Szerintem itt van az amit elnéztél. Ha a Timer0 8 bites üzemmódban van, és tmr0 regiszterrel nem csinálsz semmit, akkor a beállításod szerinti megszakítási időd 200nS*256. Azaz 51,2usec lesz.
(#) don_peter válasza sonajkniz hozzászólására (») Jan 20, 2023 /
 
Megnézted a teljes beállításom és kódot a lap tetején lévő első hozzászólásban?
Megszakításban az újra töltés:
  1. if (INTCONbits.TMR0IF)
  2.             {
  3.                     TMR0L = 0x01;   // 200nS / megszakítás
  4.                     Timer0Count++;
  5.                     INTCONbits.TMR0IF = 0;   // clear the flag
  6.             }

Ez 256szor fut le?
Az elő töltés határozza meg, hogy mennyi ideig tart 1 megszakítás nem?
Mindjárt meg méreg egy szkóppal, hogy milyen ciklussal villog a led a megszakításba.
(#) don_peter válasza icserny hozzászólására (») Jan 20, 2023 /
 
No ezt nem néztem tényleg, de nem gondolom bár nem lehetetlen. Mondjuk unsigned long változót hoztam létre, ezért nem gondoltam ilyenre. Mindjárt megnézem long long-on is mit csinál aztán szkóp.

ui: ugyan az az eredmény.
(#) sonajkniz válasza don_peter hozzászólására (») Jan 20, 2023 /
 
Ebbe a hibába már én is beleestem.
A timer nem 255-től 0-ig számol, hanem 0-tól 255-ig.
Azaz ha 1-et írsz bele, akkor tonábbi 244-et fog még leszámolni!
(#) don_peter válasza sonajkniz hozzászólására (») Jan 20, 2023 /
 
Megmértem és tényleg benéztem. 0x01-es előtöltéssel 107.4uS 1 megszakítás, 0xFF előtöltéssel pedig 7.8uS.
Most padlót fogtam, mert akkor az elméleti számolások szart sem érnek.

Újra mérek és számolok.
(#) benjami válasza don_peter hozzászólására (») Jan 20, 2023 / 1
 
Azért azt gondold át, hogy 200nsec-enként (azaz 2 utasításciklusonként) szeretnél egy olyan megszakításkiszolgáló függvényt futtatni, aminek a végrehajtási ideje több microsec, azaz vagy 30-40 utasításciklus. Ez világos, hogy nem fog így normálisan működni.
(#) sonajkniz válasza don_peter hozzászólására (») Jan 20, 2023 /
 
Írtam egy rövid rutint az időzítés beállítására.
A legrövidebb ciklus ami stabil, 2uS.
Bár C-ben nem tudom, hogy össze lehet-e hozni.
Lásd a képeken.
(#) don_peter válasza benjami hozzászólására (») Jan 20, 2023 /
 
Igen, furcsa is volt.
Újra számoltam és így sajna nem is férhetne bele a 44.1kHz megszakításba egyetlen olvasás sem, nem hogy egy kiértékelés.
Pl.:
1. 1 byte kérése 68,736uS alatt fut le
2. 1 byte és minimum 1 semleges parancs kiértékelése 105,25uS
3. 1 byte és minimum egy érvényes parancs 108,47uS
4. 1 byte flash-ből érvényes parancssal 122,436uS
5. 4 byte-os cím olvasása 494,04uS

Bármelyik pont ideje több mint Timer2 44.1Khz-es megszakításom 22.6uS ideje.
A hozzászólás módosítva: Jan 20, 2023
(#) don_peter hozzászólása Jan 20, 2023 /
 
Köszi srácok, valószínűleg régebben is ezért hagytam abba ennek a projektnek a tovább fejlesztését. Most szkóppal is ránéztem és PCM adatot nem tartalmazó adatfolyam feldolgozása közben a 22.6uS m-os megszakítást elhúzza ~94-150uS időre. Ha PCM adat is van, akkor nagyon durva az eltolódás ~ 330uS, amely már erősen hallatszik is a zene lejátszassa közben. Előbbinél még optimális és élvezhető a zene.
Ugyan ezen projektet elkészítettem 18F64K22-re, majd ott is megnézem mi a maximum amit ki tudok hozni és ha az is gyenge lesz és márpedig az is az lesz, csak hangyányit erősebb, akkor ezen projektek félre is lesznek állítva és már elkészült egy ARM-es verzió, amellyel remélem jobb eredményeket lehet majd elérni. Megjegyzem, hogy már az is egy változatban játssza szépen a zenéket.
(#) asch válasza don_peter hozzászólására (») Jan 20, 2023 /
 
Szerintem 16 bit PCM-et ki tudnál olvasni a memóriából 44.1kHz sebességgel, az még beleférhetne a rendszer teljesítményébe, de az ugrándozás a memória címek között már nem. Az nem működne, hogy a lejátszandó zenét feltöltéskor PCM adatfolyamba konvertálod, és abból játszod le?
A hozzászólás módosítva: Jan 20, 2023
(#) don_peter válasza asch hozzászólására (») Jan 20, 2023 /
 
Ehhez nem értek, legalább is ahhoz nem, hogy egy VGM adatstruktúrát hogyan tudnék egy az egyben PCM adatfolyammá konvertálni. Nem foglalkoztam mélyebben a témával, csak az adatok alapján történő feldolgozással Most behoztam a 18F46K22-őt, megnézem az mit hoz, milyen eredményeket. Az 64MHz-en ketyeg.
(#) asch válasza don_peter hozzászólására (») Jan 20, 2023 /
 
Mivel a számaid és a 22.6uS között nagyságrendi eltérés van, nem hiszem hogy egy másfélszeres gyorsítás megoldaná a problémát. Ki tudod számolni, hogy hány bájtot kell legrosszabb esetben kiolvasni a memóriából és hogy mennyi az átlagos bájt szám mintánként. E mellé teheted az SPI órajelet és pontosan kijön, hogy mennyi a késleltetésed. Ha minden hangminta alatt feldolgozod ami hozzá tartozik, akkor kell a legrosszabb esettel számolni, ha előre pufferelsz, akkor az átlaggal.

PCM adatfolyammá úgy konvertálod, hogy pontosan ugyanazt hajtod végre, amit most a PIC csinál, csak nem valósidőben, hanem ahogy a csövön kifér a PC-n, és simán fájlba vagy bájt tömbbe írod az eredményt.
(#) don_peter válasza asch hozzászólására (») Jan 20, 2023 /
 
Igen, VGM fájlok pontosan ilyenek, nyers adatok vannak benne, pl így néz ki egy PCM adat:
  1. const rom unsigned char PCM[1317] = {0x80,
  2.  
  3. 0x80, 0x7F, 0x7F, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F, 0x7D, 0x79, 0x75, 0x72, 0x70, 0x6F, 0x6E, 0x6E, 0x6E, 0x71, 0x72, 0x72, 0x74, 0x79, 0x79, 0x78, 0x7B, 0x81, 0x8B, 0x9A, 0xA9, 0xD4, 0x0, 0xFD, 0xFF, 0x0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF4, 0xEE, 0xE9, 0xE5, 0xDD, 0xD3, 0xC9, 0xBE, 0xB1, 0xA2, 0x94, 0x88, 0x7B, 0x70, 0x65, 0x5A, 0x53, 0x4A,
  4.  
  5. 0x42, 0x3C, 0x39, 0x35, 0x32, 0x2E, 0x2E, 0x2E, 0x2C, 0x2A, 0x29, 0x2B, 0x2C, 0x2E, 0x2F, 0x30, 0x34, 0x39, 0x3F, 0x44, 0x4B, 0x52, 0x5A, 0x61, 0x69, 0x70, 0x77, 0x81, 0x8B, 0x93, 0x9B, 0xA5, 0xAF, 0xB6, 0xBD, 0xC6, 0xCD, 0xD2, 0xD6, 0xDA, 0xDD, 0xDF, 0xE1, 0xE3, 0xE4, 0xE4, 0xE6, 0xE8, 0xE8, 0xE6, 0xE3, 0xE2, 0xE1, 0xE0, 0xDD, 0xDA, 0xD7, 0xD5, 0xD2, 0xCE, 0xC9, 0xC5, 0xBE, 0xB7,
  6.  
  7. 0xAF, 0xA7, 0xA0, 0x9A, 0x94, 0x8E, 0x88, 0x81, 0x7B, 0x76, 0x70, 0x6B, 0x66, 0x60, 0x5B, 0x57, 0x52, 0x4D, 0x49, 0x45, 0x42, 0x3E, 0x3B, 0x38, 0x36, 0x34, 0x33, 0x32, 0x30, 0x2F, 0x2F, 0x2E, 0x2C, 0x2C, 0x2C, 0x2C, 0x2B, 0x2B, 0x2A, 0x2B, 0x2C, 0x2D, 0x2D, 0x2E, 0x2F, 0x2F, 0x30, 0x31, 0x33, 0x34, 0x35, 0x36, 0x38, 0x39, 0x3C, 0x3E, 0x40, 0x43, 0x46, 0x49, 0x4D, 0x51, 0x54, 0x58,
  8.  
  9. 0x5B, 0x5F, 0x63, 0x67, 0x6B, 0x6F, 0x73, 0x77, 0x7B, 0x7F, 0x84, 0x88, 0x8C, 0x90, 0x95, 0x99, 0x9E, 0xA2, 0xA6, 0xAB, 0xAF, 0xB4, 0xB8, 0xBC, 0xC0, 0xC4, 0xC8, 0xCC, 0xCF, 0xD1, 0xD4, 0xD6, 0xD8, 0xDA, 0xDB, 0xDC, 0xDD, 0xDF, 0xDF, 0xE0, 0xE1, 0xE2, 0xE2, 0xE3, 0xE3, 0xE4, 0xE4, 0xE5, 0xE5, 0xE6, 0xE6, 0xE7, 0xE7, 0xE7, 0xE6, 0xE6, 0xE5, 0xE4, 0xE3, 0xE2, 0xE1, 0xE0, 0xDF, 0xDE,
  10.  
  11. 0xDD, 0xDB, 0xDA, 0xD9, 0xD7, 0xD6, 0xD4, 0xD2, 0xD0, 0xCE, 0xCC, 0xC9, 0xC6, 0xC3, 0xC0, 0xBD, 0xB9, 0xB5, 0xB1, 0xAD, 0xA9, 0xA5, 0xA1, 0x9D, 0x99, 0x95, 0x92, 0x8E, 0x8A, 0x87, 0x83, 0x7F, 0x7C, 0x79, 0x75, 0x72, 0x6E, 0x6B, 0x68, 0x65, 0x62, 0x5F, 0x5C, 0x59, 0x56, 0x53, 0x50, 0x4D, 0x4B, 0x48, 0x45, 0x43, 0x40, 0x3E, 0x3C, 0x3A, 0x38, 0x37, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30,
  12.  
  13. 0x2F, 0x2E, 0x2E, 0x2D, 0x2D, 0x2C, 0x2C, 0x2B, 0x2B, 0x2B, 0x2A, 0x2A, 0x2A, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2A, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x30, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x3A, 0x3B, 0x3D, 0x3F, 0x41, 0x43, 0x45, 0x47, 0x4A, 0x4C, 0x4F, 0x51, 0x54, 0x57, 0x59, 0x5C, 0x5F, 0x62, 0x65, 0x68, 0x6B, 0x6E, 0x71, 0x74,
  14.  
  15. 0x77, 0x7A, 0x7D, 0x80, 0x83, 0x86, 0x8A, 0x8D, 0x90, 0x93, 0x97, 0x9A, 0x9E, 0xA1, 0xA4, 0xA8, 0xAB, 0xAF, 0xB2, 0xB6, 0xB8, 0xBB, 0xBE, 0xC1, 0xC3, 0xC5, 0xC8, 0xCA, 0xCC, 0xCE, 0xCF, 0xD1, 0xD2, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDD, 0xDE, 0xDE, 0xDF, 0xDF, 0xE0, 0xE0, 0xE1, 0xE1, 0xE2, 0xE2, 0xE2, 0xE3, 0xE3, 0xE3, 0xE4, 0xE4, 0xE4, 0xE5, 0xE5, 0xE4,
  16.  
  17. 0xE3, 0xE3, 0xE2, 0xE1, 0xE0, 0xE0, 0xDF, 0xDE, 0xDD, 0xDC, 0xDB, 0xDA, 0xD9, 0xD8, 0xD7, 0xD5, 0xD4, 0xD2, 0xD1, 0xCF, 0xCE, 0xCC, 0xCA, 0xC8, 0xC5, 0xC3, 0xC0, 0xBD, 0xBA, 0xB7, 0xB3, 0xB0, 0xAC, 0xA9, 0xA5, 0xA2, 0x9E, 0x9A, 0x97, 0x93, 0x90, 0x8D, 0x89, 0x86, 0x82, 0x7F, 0x7C, 0x79, 0x76, 0x73, 0x6F, 0x6C, 0x69, 0x66, 0x64, 0x61, 0x5E, 0x5B, 0x58, 0x55, 0x53, 0x50, 0x4E, 0x4B,
  18.  
  19. 0x48, 0x46, 0x44, 0x41, 0x3F, 0x3D, 0x3B, 0x39, 0x37, 0x35, 0x34, 0x32, 0x31, 0x30, 0x2F, 0x2E, 0x2D, 0x2D, 0x2C, 0x2B, 0x2B, 0x2A, 0x2A, 0x29, 0x29, 0x29, 0x28, 0x28, 0x28, 0x28, 0x27, 0x27, 0x27, 0x27, 0x27, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2C, 0x2C, 0x2D, 0x2E, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x39, 0x3A, 0x3C, 0x3E,
  20.  
  21. 0x40, 0x42, 0x45, 0x47, 0x49, 0x4C, 0x4E, 0x51, 0x53, 0x56, 0x59, 0x5C, 0x5E, 0x61, 0x64, 0x67, 0x6A, 0x6D, 0x70, 0x73, 0x76, 0x79, 0x7C, 0x7F, 0x82, 0x85, 0x88, 0x8B, 0x8F, 0x92, 0x95, 0x98, 0x9C, 0x9F, 0xA2, 0xA6, 0xA9, 0xAC, 0xAF, 0xB2, 0xB5, 0xB7, 0xBA, 0xBC, 0xBF, 0xC1, 0xC3, 0xC5, 0xC7, 0xC9, 0xCB, 0xCC, 0xCE, 0xCF, 0xD0, 0xD2, 0xD3, 0xD4, 0xD5, 0xD5, 0xD6, 0xD7, 0xD8, 0xD8,
  22.  
  23. 0xD9, 0xD9, 0xDA, 0xDA, 0xDA, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDC, 0xDB, 0xDA, 0xD9, 0xD8, 0xD7, 0xD6, 0xD5, 0xD4, 0xD3, 0xD2, 0xD1, 0xD0, 0xCF, 0xCE, 0xCD, 0xCB, 0xCA, 0xC9, 0xC7, 0xC5, 0xC4, 0xC2, 0xC0, 0xBE, 0xBC, 0xB9, 0xB7, 0xB4, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9B, 0x98, 0x95, 0x92, 0x8F, 0x8C, 0x89, 0x86,
  24.  
  25. 0x83, 0x80, 0x7D, 0x7A, 0x77, 0x75, 0x72, 0x6F, 0x6D, 0x6A, 0x68, 0x65, 0x63, 0x60, 0x5E, 0x5C, 0x59, 0x57, 0x55, 0x53, 0x51, 0x4F, 0x4D, 0x4B, 0x49, 0x47, 0x45, 0x44, 0x42, 0x41, 0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x3A, 0x39, 0x39, 0x38, 0x38, 0x38, 0x37, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x37, 0x38, 0x38, 0x39,
  26.  
  27. 0x39, 0x3A, 0x3A, 0x3B, 0x3B, 0x3C, 0x3D, 0x3D, 0x3E, 0x3F, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4A, 0x4B, 0x4D, 0x4F, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5A, 0x5C, 0x5E, 0x60, 0x62, 0x64, 0x66, 0x68, 0x6A, 0x6C, 0x6E, 0x71, 0x73, 0x75, 0x77, 0x79, 0x7B, 0x7E, 0x80, 0x82, 0x84, 0x87, 0x89, 0x8B, 0x8D, 0x90, 0x92, 0x94, 0x97, 0x99, 0x9B, 0x9D, 0x9F, 0xA1, 0xA2,
  28.  
  29. 0xA4, 0xA6, 0xA7, 0xA9, 0xAA, 0xAB, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB2, 0xB3, 0xB4, 0xB4, 0xB5, 0xB5, 0xB6, 0xB6, 0xB7, 0xB7, 0xB7, 0xB7, 0xB8, 0xB8, 0xB8, 0xB8, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xB9, 0xB9, 0xB8, 0xB8, 0xB7, 0xB7, 0xB6, 0xB5, 0xB5, 0xB4, 0xB3, 0xB3, 0xB2, 0xB1, 0xB0, 0xAF, 0xAF, 0xAE, 0xAD, 0xAC, 0xAB, 0xA9, 0xA8,
  30.  
  31. 0xA7, 0xA6, 0xA4, 0xA3, 0xA1, 0x9F, 0x9D, 0x9B, 0x99, 0x97, 0x95, 0x93, 0x91, 0x8F, 0x8C, 0x8A, 0x88, 0x86, 0x84, 0x82, 0x80, 0x7E, 0x7C, 0x7A, 0x78, 0x76, 0x75, 0x73, 0x71, 0x6F, 0x6E, 0x6C, 0x6A, 0x69, 0x67, 0x65, 0x64, 0x62, 0x61, 0x5F, 0x5E, 0x5D, 0x5B, 0x5A, 0x59, 0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, 0x4F, 0x4F, 0x4E, 0x4E, 0x4D, 0x4D, 0x4D, 0x4C, 0x4C, 0x4C, 0x4C,
  32.  
  33. 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4C, 0x4C, 0x4C, 0x4D, 0x4D, 0x4E, 0x4E, 0x4E, 0x4F, 0x4F, 0x50, 0x50, 0x50, 0x51, 0x51, 0x52, 0x53, 0x53, 0x54, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x60, 0x61, 0x62, 0x64, 0x65, 0x66, 0x68, 0x69, 0x6A, 0x6C, 0x6D, 0x6F, 0x70, 0x71, 0x73, 0x74,
  34.  
  35. 0x76, 0x77, 0x79, 0x7A, 0x7C, 0x7D, 0x7F, 0x80, 0x82, 0x83, 0x85, 0x86, 0x88, 0x89, 0x8B, 0x8C, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9B, 0x9C, 0x9D, 0x9D, 0x9E, 0x9E, 0x9F, 0x9F, 0x9F, 0xA0, 0xA0, 0xA0, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3,
  36.  
  37. 0xA2, 0xA2, 0xA1, 0xA1, 0xA0, 0xA0, 0xA0, 0x9F, 0x9F, 0x9E, 0x9E, 0x9D, 0x9D, 0x9C, 0x9C, 0x9B, 0x9A, 0x9A, 0x99, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 0x8E, 0x8D, 0x8B, 0x8A, 0x89, 0x87, 0x86, 0x84, 0x83, 0x81, 0x80, 0x7F, 0x7D, 0x7C, 0x7B, 0x79, 0x78, 0x77, 0x76, 0x75, 0x73, 0x72, 0x71, 0x70, 0x6F, 0x6E, 0x6D, 0x6C, 0x6B, 0x6A, 0x69, 0x68, 0x67, 0x66, 0x65,
  38.  
  39. 0x64, 0x63, 0x63, 0x62, 0x61, 0x60, 0x5F, 0x5F, 0x5E, 0x5E, 0x5D, 0x5D, 0x5C, 0x5C, 0x5C, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5B, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5B, 0x5B, 0x5B, 0x5B, 0x5C, 0x5C, 0x5C, 0x5C, 0x5D, 0x5D, 0x5D, 0x5D, 0x5E, 0x5E, 0x5E, 0x5F, 0x5F, 0x5F, 0x60, 0x60, 0x61, 0x61, 0x62, 0x62, 0x63,
  40.  
  41. 0x64, 0x64, 0x65, 0x66, 0x67, 0x68, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x88, 0x89, 0x8A, 0x8B, 0x8B, 0x8C, 0x8D, 0x8D, 0x8E, 0x8E, 0x8F, 0x8F, 0x90, 0x90, 0x90, 0x91, 0x91, 0x91, 0x92, 0x92, 0x92, 0x92, 0x92, 0x93,
  42.  
  43. 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x91, 0x91, 0x91, 0x90, 0x90, 0x90 };

Írtam egy programot, ami az adatfeltöltést végzi PC-ről és a PC programban egy rész kinyeri a PCM adatmennyiséget, hogy azt kísérletezésként fel tudjam használni.
A VGM fájl eleje pedig így néz ki, ezt csak ellenőrzés miatt emeli ki a PC-s program az adatfolyam elejéről.
  1. 56|67|6D|20|53|31|0A|00|50|01|00|00|99|9E|36|00|
  2.  
  3. 00|00|00|00|55|2F|0A|00|F5|BD|6F|00|20|0B|00|00|
  4.  
  5. 53|74|6F|00|00|00|00|00|09|00|10|00|B5|0A|75|00|
  6.  
  7. 00|00|00|00|0C|00|00|00|00|00|00|00|00|00|00|00|
  8.  
  9. 67|66|00|25|05|00|00|80|80|7F|7F|7E|7E|7E|7E|7E|
  10.  
  11. 7E|7E|7E|7E|7E|7F|7F|7D|79|75|72|70|6F|6E|6E|6E|
  12.  
  13. 71|72|72|74|79|79|78|7B|81|8B|9A|A9|D4|00|FD|FF|
  14.  
  15. 00|FF|FF|FF|FF|FC|F4|EE|E9|E5|DD|D3|C9|BE|B1|A2|
  16.  
  17. 94|88|7B|70|65|5A|53|4A|42|3C|39|35|32|2E|2E|2E|
  18.  
  19. 2C|2A|29|2B|2C|2E|2F|30|34|39|3F|44|4B|52|5A|61|
  20.  
  21. 69|70|77|81|8B|93|9B|A5|AF|B6|BD|C6|CD|D2|D6|DA|
  22.  
  23. DD|DF|E1|E3|E4|E4|E6|E8|E8|E6|E3|E2|E1|E0|DD|DA|
  24.  
  25. D7|D5|D2|CE|C9|C5|BE|B7|AF|A7|A0|9A|94|8E|88|81|
  26.  
  27. 7B|76|70|6B|66|60|5B|57|52|4D|49|45|42|3E|3B|38|
  28.  
  29. 36|34|33|32|30|2F|2F|2E|2C|2C|2C|2C|2B|2B|2A|2B|
  30.  
  31. 2C|2D|2D|2E|2F|2F|30|31|33|34|35|36|38|39|3C|3E|
  32.  
  33. 40|43|46|49|4D|51|54|58|5B|5F|63|67|6B|6F|73|77|
(#) KoblogPerGyok válasza asch hozzászólására (») Jan 20, 2023 / 1
 
Üdv!

Megoldottam, kicsit másképpen, de mintha működne a dolog.

Szóval jumperrel le tudom választani a perifériák tápellátását is és a PICKIT programozó lábait is. Még nem tudtam teljesen kipróbálni, mert sok forrasztás van még hátra, de ma sikerrel jártam. A kapcsoló átbillentésével tudom programozni és a másik állásban simán megy, a blink és a PWM- is.

A Pickit-3 mikor végez a feltöltéssel nem ad tápot tovább, nem üzemelteti a dsPIC-et tovább. De örülök neki, mert amit elterveztem végülis megy.

A RAM-ot és a DAC-ot csak később forrasztom be, mert elég volt egyelőre. Az ólommérgezést is el kellene kerülni. Mondjuk építettem egy elszívót is PC ventillátorokból, az is megy, de néha azért megcsap a páka szele. Teljesen kezdő vagyok a forrasztásban.... (is)

Annyit azéert még megjegyeznék, hogy eléggé süni már most is, de még így is sokkal-sokkal jobb, mert a breadbordon még a blink is kihívás. Rengeteg a kontakt hiba, nem lehet tesztelni a RAM-ot DAC-ot, mert az ember nem tudja mi okozza a hibát.

Szóval kösz mindenkinek, és jelentkezem még, ha lesz kérdésem, de most Egri Bikavér lesz a terítéken!
(#) pipi válasza KoblogPerGyok hozzászólására (») Jan 20, 2023 /
 
Hali!
Nem értem azt a táp mizériát... A pickiten nem kell engedélyezni a tápfesz bekapcsolást, a cucc megy a saját tápjáról, akár 3.3V akár 5V, a pickit csatin legyen ott a cucc tápja, a pickit3 meg "igazodik" hozzá automatikusan, nem fog 5V jelszintet kiadni a 3.3V-os cuccodra, megy a programozás-debugolás minden varázslat nélkül
(#) oregharcos válasza Bakman hozzászólására (») Jan 22, 2023 /
 
Szia Bakman Köszönöm a segítségedet! Igaz, hogy több hónapja írtad a segítséget, de azóta sokat foglalkoztam, hogy-hogyan oldjam meg, hogy pl. három vagy több gombra más program induljon. Én csak tanulgatom a programozást, tőletek tanulok. /lopom a tudást!/ Ez lehet alprogram vagy közvetlen beírt prg. Sajnos nem sikerült eddig megoldani. Van egy olyan problémám, hogy három gombra külön dallam menjen. /Sajnos a nejem súlyos mozgáskorlátozott, és kell egy dallam a csengetésre, egy a kapunyitásra, egy meg ha pl. az udvarból be kell jönni segíteni. Két PIC12675-el megoldottam két dallamot, de hiába próbálom berakni a PIC16F877-be, amit javasoltál, már az első sornál kiakad a mikroC PRO for PIC programozó. Az eredeti kérdésem itt van Felmerült, hogy nem jó programozót használok, mivel a C-re több is van? Az a kérdésem, hogy milyennel próbálkozzak, hogy meg tudjam oldani? Kérem hogy segítsetek, amit előre is nagyon köszönök!
(#) don_peter válasza oregharcos hozzászólására (») Jan 22, 2023 /
 
PICKit2 programozóval szépen lehet ezeket a PIC-eket programozni.
Írod, hogy
Idézet:
„amikor a futó alprogram lefut, leállna és vár a következő indításra”
Szerintem ez a mostani vagy is az első hozzászólásodban lévő program pontosan így működik, csak ha jól látom egy gombra van definiálva.
Több gomb is megvalósítható, csak a megfelelő fizikai részt meg kell építeni hozzá. (pont úgy mint az 1 gomb esetében, csak azt 3 szor vagy ahány gombot akarsz, itt érdemes a PIC manuálját megnézni, hogy mely lábak szabadok és melyikekre akarod kötni a gombokat)
Úgy látom, hogy programodban a PORTB.F0 bitre van kötve a gomb, de a beállításoknál a teljes prot bemenetre van állítva, szóval azokon vagy nincs semmi vagy csak simán bemenetre állította a készítő. (ez szerintem így, amúgy sem jó, TRISB = 0b11111111
A nygfigy(); függvénybe figyeli a gomb kezelést: (ez a függvény minden ciklusban lefut)
  1. void nygfigy()
  2. {
  3.   if(nyg!=1 && gomb !=1) // Ha gomb le van nyomva, valószínűleg egy valamekkora (~1-10K) ellenállással fel van húzva VCC-re (5v-ra) a gomb bemenete, továbbá figyeli, hogy volt e már korábban gomb nyomás (ez a rész gondolom a dallam végén vissza is áll alap állapotba)
  4.   {
  5.   gomb=1; // vagy is elindul a lejátszás és annak végén ugyan ebben a ciklusban vizsgálja és törli gomb értékét
  6.   jatek++; // ez a rész arra van, hogy mindig a következő dallamot játssza le
  7.   EEPROM_Write(0x00,jatek); // a PIC EEPROM  memóriájába elmenti az aktuális dallam állapotát, vagy is hogy melyik dallamnál tart a lejátszási sorrendben
  8.   }
  9.  
  10.   if(nyg!=0 && gomb !=0) // ezt a következő ciklusba vagy ha gyors, akkor a dallam végén fog lefutni és gomb-ot nullára állítja
  11.   {
  12.   gomb=0;
  13.   }
  14. }

Így talán jobban érthetőbb lesz számodra a programod működése, ezen elvek mentén már nem olyan bonyolult megírni a hiányzó részeket.
(#) oregharcos válasza don_peter hozzászólására (») Jan 23, 2023 /
 
Üdv. Don_peter! Köszönöm a választ! A PICKit2 programozóval töltöm PIC-be a programokat. A PORTB 0, PORTB 1 és a PORTB 2-en vannak nyg-ok. Igen, jól látod, hogy az eredetinél egy gombnyomásra lép a következőre, én azt akarom, hogy a 3 gombbal három különböző dalt, vagy programot lehessen indítani. A héten próbálkozok vele játszani. Még egyszer köszi a segítséget!
(#) don_peter válasza oregharcos hozzászólására (») Jan 23, 2023 /
 
Ez új információ. Lehet egy teljesen új kérdést kellene feltenned az összes releváns információval, hogy érdemben lehessen segíteni.
Pl.: milyen PIC-re szeretnéd megvalósítani az átdolgozást, pontosan hány gombot és azokat mire akarod használni. Van e kiindulási alap, amelyet tovább akarsz fejleszteni. Van e kapcsolási rajz, amely alapján fel lehet mérni mik a lehetőségek és hogyan történt a megvalósítása a mostani rendszerednek. Ezek a fontosabbak.
Majd ezek után írhatnád le, hogy mit szeretnél, hogy az eszköz csináljon és azt melyik gombokra.
Az első bejegyzésedben illetve az ott megosztott programkódban látom, hogy egy PORT csak a LED-ek vezérléséhez van használva. Pontosan minek a fényjáték? Ez a fény valamit vissza jelez? Vagy csak azért van mert jól néz ki? Lényegében van értelme?

Ha pl, gombnyomásra külön dallamot kell lejátszani az eszköznek, akkor nem pontosan annyi gomb kellene, amennyi dallam van? Vagy 2 gomb és azokkal kiválasztani, hogy melyik dallamot játssza le. (a 2 gombos választás, az egyik gomb léptet a másik gomb regisztrálja a választást) Utóbbi esetben kérdés, hogy egy vészhelyzet esetében mennyire jó ez a megoldás. Minden képen a régi programot akarod tovább fejleszteni vagy akár egy új is jó lenne? Fontos, hogy MicroC-ben legyen? Kb. ezek vannak bennem a kérdéseddel kapcsolatban.
A hozzászólás módosítva: Jan 23, 2023
Következő: »»   1188 / 1203
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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