Hledám program pro přehrávání zvuku (mluveného slova)

Tak som to skusil takto:

#include<avr/io.h>
#include<util/delay.h>

main()
{
int cas=500 ;
DDRD = 0x02;

while(1)
{

PORTD |= 0x2;  //nastavim pind.2 na log 1
_delay_us(500);
PORTD &= 0xFD; // nastavim pind.2 na log 0 
_delay_us(500);
PORTD |= 0x2;  //nastavim pind.2 na log 1
_delay_us(250);
PORTD &= 0xFD; // nastavim pind.2 na log 0 
_delay_us(750);
PORTD |= 0x2;  //nastavim pind.2 na log 1
_delay_us(750);
PORTD &= 0xFD; // nastavim pind.2 na log 0 
_delay_us(250);
}

}

ale jedina zmena, ktorá nastala je tá, že počujem výstupný zvuk skladajuci sa z 3 frekvencii…nejaky divny trojton, avsak hlasitost zvuku prehnaneho cez zosik nestupla…asi tomu zle rozumiem…kde robim chybu? Nemoze to byt tym ze naozaj mam chybu v zapojeni toho zosika? mozu tam byt tie elektrolity, ked na scheme v tom pdf neni znazornena polarita?

Nakresli si na papier sinusovku (alebo iny casovy signal).
Rozdel ju napriklad devatnastimi zvislimy ciarami rovnako od seba vzdialenymi.
Vzniknute “stlpceky” (malo by ich byt dvadsat) zarovnaj, tak aby Ti vznikli obdlzniky.

Najvyssiemu pridel precentualne nejaku hodnotu, napriklad 100.
Ak si neskor nakreslis sinusovku s mensou amplitudou, jej maximalna hodnota bude potom ina, napriklad 20.

Teraz tym stlpcekom prisud hodnotu v pomere s tou maximalnou hodnotou.

Ak by si si nakreslil trojuholnikovy signal (lahsie sa mi budu hodnoty z hlavy pocitat) a maximalnej hodnote si prisudil hodnotu 100%, ziskas hodnoty

h01=50
h02=60
h03=70
h04=80
h05=90
h06=100
h07=90
h08=80
h09=70
h10=60
h11=50
h12=40
h13=30
h14=20
h15=10
h16=0
h17=10
h18=20
h19=30
h20=40

Ak na generovanie signalu pouzijes 8b PWM (mohol by si pouzit vacsie alebo i mensie PWM, preto Ti to popisujem takto cez percenta :slight_smile: ) to znamena, ze pocitadlo bude vzdy pocitat od 0 do 255 a ked dosiahne hodnotu v registry na to urcenom, na vystupe bude log.0, inak hodnota 1. Kludne to moze byt i negovane, v tomto priprade na tom nezalezi.

Vystupny signal bude vyzerat nejako takto (jedna perioda):

|~~~~|________|

Do registra pre PWM vloz hodnotu H = h01 * 255/100
Odpocitaj 5 period pocitadla PWM
Do registra pre PWM vloz hodnotu H = h02 * 255/100
Odpocitaj 5 period pocitadla PWM


Do registra pre PWM vloz hodnotu H = h20 * 255/100
Odpocitaj 5 period pocitadla PWM

a opakuj to stale dokola.
Na vystupe filtra (ten tam musi byt, aby do zosiku nesli “pazvuky” z nosnej PWM) budes pocut zvuk toho trojuholnika.

Ak odpocitas menej ako 5 period pocitadla PWM, ton bude mat vyssiu frekvenciu. Naopak, ak na rovnakej hodnote PWM zotrvas viac period, zakladna frekvencia bude nizsia.

Ak chces, aby vystupny signal bol tichsi, pouzi nasledovne
hodnoty h

h01=50
h02=52
h03=54
h04=56
h05=58
h06=60
h07=58
h08=56
h09=54
h10=52
h11=50
h12=48
h13=46
h14=44
h15=42
h16=40
h17=42
h18=44
h19=46
h20=48

Vystupny signal bude 5x tichsi.
Vsimni si, ze PWM nejde az na nulu. Preto tam musi byt ten filter (PP - pasmova prepust ), ktory nepusti jednosmernu zlozku a nepusti nosnu samotneho PWM.

Princip prehravania lubovolnych zvukov cez PWM je tvoreny presne na tomto principe.
Na “papier si nakreslis” cely zvukovy priebeh napriklad v dlzke 10 sekund. Rozdelis ho na tolko dielikov, aku najvyssiu frekvenciu chces preniest. Ak chces prenies (cize pocut v repraku) 10kHz, musis spravit minimalne 200.tisic (slovom dvesto tisic, nie iba sto tisic) stlpcekov. Dalsi postup je uplne identicky s hore popisanym.

Ale nastastie to nemusis robit na papieri, spravi to za Teba DA prevodnik. Ak chces preniest 10kHz, DA prevodnik musi stihat 20tisic prevodov za sekundu a Ty ich musis zachytavat a ukladat do pamate. Ak by sa Ti vsak do signalu na vstupe priplietli frekvencie vyssie ako 10kHz, budes ich pocut ako neprijemne nizke kmitocty. 11kHz ako 1kHz a tak podobne. O tom je shanon-kotelnikova teorema. Ak Ta to zaujima, tak googli.

Ukladat nasnimany zvuk cez DA by si mal v pohode zvladat.
Do AT45DBxxx mozes vlozit 256/512B v ramci jedneho pamatoveho bufera. Samotny zapis trva 4.5ms, ale pocas neho mozes plnit druhy bufer. Dobre vymysleny svab :slight_smile:
Bufer staci plnit 10ms. Pri 256B (pocitam bajt na vzorku pri 8b DA) sa dostavas 12.8 kHz (25.6ksps).
Tak Ti vznikne zaznam. Ale kludne pouzi zaznam i z nejakych CD. Napr. program Audacity Ti ho pomoze vhodne upravit, osekat a zarovnat.

No a taketo 8b sample (slovensky vzorky, ale to slovo sa mi tam hodi viac) mozes pouzit priamo ako hodnoty pre PWM. Na jednu vzorku by malo prebehnut viac period PWM kvoli lepsej realizovatelnosti vystupneho PP filtra. Ziaden filter nie je idealny a ma urcitu frekvencnu a fazovu charakteristiku. To je ale uz uplne ina kategoria problematiky.

Myslim, ze ak si na zaciatku skusis vygenerovat ten trojuholnik a budes sa trochu hrat s frekvenciami a amplitudami, posunies sa omnoho dalej v chapani problematiky.

Daj vediet ako Ti to ide.

Diky moc za super vysvetlenie a navod, chcem to skusit, ale neviem do kotreho registra mam ukladať hodnotu, ktorú bude pwm porovnávat? Podľa vecí , čo som na nete pozeral, som ako tak pochopil ako nastavit TCCR1A a TCCR1B, ak spravne chapem, do ICR1 nastavujem 255 - pocet cyklov citaca a pomocou TOV1 zistujem reset citaca cize periody pwm. Neviem ci som to spravne pochopil, ak nie, prosim oprav ma. Do ktoreho registru mam zapisovat tie hodnoty, ktore sa porovnavaju s hodnotou citaca, cize vlastne percentualne tie cisla 50 60 70 a pod?

tak som to skusil. Pocital som s tym , ze vnutorny krystal na atmega8 defaultne klepe na 8Mhz. Spravil som tento zdrojak(nechcelo sa mi vyrabat cyklus for a case):

#include<avr/io.h>
#include<util/delay.h>

main()
{
int kolko=5 ;
int cas;
DDRD = 0x02;
DDRB = 0x02;
TCCR1A= 0x89;
TCCR1B= 0x9;
ICR1 = 255;

while(1)
{
  OCR1A = 50 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 60 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 70 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 80 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 90 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 100 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 90 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 80 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 70 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 60 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 50 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}		
  OCR1A = 40 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 30 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 20 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 10 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 0 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 10 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 20 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 30 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 40 * (255/100);
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  

}

}

Výstup som napichol na OC1A, a loadol som to do atmelu…vysledok…pocul som vysoku frekvenciu ktora sa nemenila v zavislosti od nastavenia premennej kolko, a frekvenciu nizsiu, ktora sa v zavislovti od tejto premennej menila…avsak stale to bolo s veeeelmi nizkou hlasitostou cez ten zosilovac…niekde mam urcite chybu:)

A práve som zistil ešte “lepšiu” vec, vlastne ani jeden z tych 2 tonov sa nemeni v zavislosti od premennej kolko.

Napasuj to na TimerCounter2, mozno sa to lahsie bude analyzovat (aspon mne :slight_smile: ).

Nepis prosim Ta ze TCCR1A= 0x89;

Malokto ma cas (napriklad ja urcite nie :slight_smile: ) studovat co si vlastne nastavil a co nie a ci si nahodou nespravil nejaky preklep.

zapisuj to prosim napriklad takto

// nastavim mod casovaca T2 na fast PWM, vst.frekvencia OSC/1, do hodnoty ORC2 bude mat hodnotu log.1 a potom log.0
TCCR2 = (1<<WGM21) | (1<<WGM20) |(1<<COM21)|(1<<CS20);

Prekladadac tam aj tak vlozi hotove cislo, takze program to nepredlzi a zdrojak rozhodne zprehladni. Urcite este predtym napis do poznamky, co chcel nasledovnymi riadami basnik povedat :slight_smile:

Druha vec je, ze nemusi by t vzdy dobre zapisat

OCR2 = 50 * (255/100);

nie som si isty ako konstatnu vlozi do hexu prave Tvoj prekladac. Ak najprv spravi 255/100 (co si mu zatvorkami prikazal) a az potom urobi nasobenie 50, moze mu vyjst 50* 2 = 100.
Ak by najprv spravil 50 * 255, potom je vysledok 127. Urcite chapes, ze 27% neurcitost vypocitanej konstany moze stat za to, ze si ju spocitas rucne a cislo tam vlozis. Ale ak poznas svoj prekladac a ten tam vlozi cislo 127, potom je to uplne v poriadku. Ja by so si pre istotu ten riadok zapisal nasledovne

OCR2 = 127; // (50 * 255)/100

Este taka uvaha na zaver.

Ak pouzijem interny RC s 8MHz a pouzijem 8b PWM, zakladna frekvencia PWM bude 31250Hz.
Ak chcem mat na periodicky signal 20 vzoriek a v kazdej vzorke 5 period, potom bude zakladna frekvencia takto vygenerovaneho signalu 31250/50/5 = 125Hz.

To je relativne dost nizky kmitocet.

zdroják som upravil:

#include<avr/io.h>
#include<util/delay.h>

main()
{
int kolko=20 ;
int cas;
DDRB = 0x02; //pin B1 nastav�m ako v�stupn�
TCCR1A= (1<<COM1A1) | (0<<COM1A0) | // OC1A non-inverting mode
(0<<COM1B1) | (0<<COM1B0) | // OC1B nepripojen�
(1<<FOC1A) | (0<<FOC1B) | // foc1A aktivne FOC1B neaktivne
(0<<WGM11) | (1<<WGM10); // fast PWM 8 bit

TCCR1B= (0<<ICNC1) | (0<<ICES1) | // vypnute noise canceler a edge select
(0<<WGM13) | (1<<WGM12) | // fast PWM 8 bit
(0<<CS12) | (0<<CS11) | (1<<CS10); // fekvencia citaca pomer 1:1 s krystalom

ICR1 = 255; // nastavenie perody PWM

while(1)
{
  OCR1A = 127;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 153;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 178;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 204;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 229;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 255;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 229;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 204;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 178;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 153;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 127;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}		
  OCR1A = 102;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 76;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 51;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 25;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 0;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 25;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}
  OCR1A = 51;
		for(int i=1; i<kolko; i++)
		{
			while(!TOV1)
			{
	         cas = cas;
			}
		}

avsak stale vydaval rovnaky dvojzvuk. Potom som si ešte chcel overiť frekvenciu kryštálu, tak som skočil na net, a našiel som, že atmega má defaultne nastavený dokonca 1KHz… tak som našiel fuse ktore mam nastaviť aby bolo 8MHz. sú to: SUT0, CKSEL3, CKSEL1, CKSEL0, SPIEN zaskrtnut neslo, BOOTSZ1, BOOTSZ0. Po tomto nastavení sa zvuk zmenil na oveľa pisklavejší, ale stále nereaguje na zmenu počtu periód PWM… a hlasitosť nízka. Ako by som mohol zvacsit tu frekvenciu? Musím použiť externý kryštál?

counter 2 nemožem použit, lebo OC2 je na pine , ktorym kominikuje programator, a neskor bude komunikovat externa flash…

Na konci toho zdrojaku mi nezkopirovalo 2 zatvorky tipu }

No uz ked si to tak pekne prepisal, neda mi nepozriet sa na to.
Vdaka tomu, ze si rozpisal jednotlive bity tak som lepsie porozumel ako si sa snazil casovac nastavit. Usetrilo mi to vela prace :slight_smile:
Akurat diakritika po Ctrl+C a Ctrl+V je necitatelna, je dobre pisat bez dlznov a makcenov.
Pri zapise (1<<XXX) a (0<<YYY) tie casti s nulou pisat nemusis, nezvykne sa to. Ale ak to tak chces kvoli prehladu, je to v pohode, rozhodne to nie je na zavadu. Aspon je vidiet, ze si na ziaden bit nezabudol a vies ze ho chces mat v log.0.

V prvom rade podmienka (!TOV) je nezmyselna.
Spravne ma byt miesto TOV napisane (TIFR & (1<<TOV))

V druhom rade nikde flag TOV nenulujes, takze podmienka je vzdy splnena a nikde sa necaka (ak by bol zapis spravny)

V druhom rade som program prepisal, snad i zjednodusil. A vyskusal v simulatore. Neviem vsak preco sa casovat T1 pre Atmega8 v simulatore nespraval ako fast PWM, ale vzdy ako phase corect, t. j. ked dopocital do 0xff zacal naspat odpocitavat. Tak som nastavil mod, v ktorom sa to ako tak sprava korektne - aspon co sa podstaty nasho problemu tyka. Len generovanie jedneho cyklu trva 2x dlhsie. To ale vobec nevadi.

Myslim, ze je jasne ze pri periodickom signaly nie je potrebne ukladat celu periodu, ale staci iba stvrtka. To vsak nie je momentalne dolezite. Dolezitejsia je prehladnost generovania signalu.

nemam momentalne hw s ATmega8, tak som to skusal iba v simulatore (aj toiba prve tri zmeny OCR1A)
Tu je vysledny kod

#include<avr/io.h>
#include<util/delay.h>

#define POCET 5
#define ZOSLABENIE 1 // nejake cele cislo. Bude sa sice posuvat js zlozka, ale ak tam mas v serii C, tak to vobec nevadi

int pole]  = {127,153,178,204,229,255,229,204,178,153,127,102,76,51,25,0,25,51,76,102};


int main()
{


	DDRB = 0x02; //pin B1 nastav?m ako v?stupn?
	// OC1A non-inverting mode
	// OC1B nepripojen?
	// foc1A aktivne FOC1B neaktivne
	// fast PWM 8 bit

	TCCR1A= (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<FOC1A) | (0<<FOC1B) | (0<<WGM11) | (1<<WGM10); 

	// vypnute noise canceler a edge select
	// fast PWM 8 bit
	// fekvencia citaca pomer 1:1 s krystalom
	TCCR1B= (0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); 
	ICR1 = 255;
	while(1) {

		for ( int i = 0; i < 20; i++) {

			for( int j = 0; j < POCET; j++) {
				OCR1A	= pole*/ZOSLABENIE;
				while(!(TIFR & (1<<TOV1))) ;
              // flag sa nuluje zapisom log.1 na jeho poziciu
				TIFR |= (1<<TOV1);
			}
		}
	}
} 

Daj vediet, ako to frci.

p.s. nejako som nezaznamenal aky prekldac pouzivas. Ja pouzivam GCC, ale snazilsom sa to napisat tak, aby to bolo jedno.*

Diiiiky moc, velka vdaka, funguje to, konecne kod, ktory funguje, a mozem sa z neho aj cosi poducit, kedze je to priamo usite na moje zapojenie:) funguje to super, premennou pocet menim frekvenciu, a zvacsovanim premennej zoslabeni to bolo naozaj tichsie:) Zjednodusil si ten kod ktory som pomerne otrocky a neprakticky napisal naozaj super:) Pouzivam AVR studio od atmelu a win-gcc takze s kompilaciou nebol problem. Uz asi aj viem, preco ten zosilovac nepiska hlasnejsie, problem je v tom, ze je to klasika LM324, a tie operaky, napajane z tych 5V z ktorych si taha aj atmel proste výstupný reproduktor o impedancii 8 ohm neutiahnu…bolo mi poradene, aby som vyskusal najst nejaky reproduktor s impedanciou okolo 100 ohm, vraj by to mohlo fungovat.
V nedavnom prispevku som sa docital, ze sa kusok audio stopy da navzorkovat aj v audio editore tusim audacity bol spominany. Dalo by sa to urobit tak, ze to pole s hodnotami PWM by bola vlastne pamet za programom na cipe, a do nej by sa ulozili vygenerovane audio vzorky? V dalsom postupe by som potom rad totiz pouzil externu pamäť, ktora by zniesla do seba ulozit vacsi obsah dat(ako mi na zaciatku tohoto vlakna bolo poradene). Da sa takto premenna typu pole nasmerovat zatial do pamete za programom?
Diky:)

Achjaj, teraz som asi urobil dost velku blbost…chcel som vyskusat ako to bude piskat pri defaultnej frekvencii interneho oscilatora, a nastavil som na nulu vsetky fuses co som mal nastavene, a s nimi aj CKSEL3 CKSEL1 a CKSEL0. Hned na to prestal atmega konunikovat cez ISP programator…ked som dobre pochopil blbost, ktoru som urobil, teraz budem musiet pripojit externy oscilator? Vsetky fuses som dal zapisat na 0…netusim co tam je nastavene…

Pokud jsi si nastavil na 0 (=programmed) všechny fuses, tak jsi bez paralelního parogramátoru skončil. Nejen že jsi jako zdroj hodin nastavil externí oscilátor(str.26), ale zároveň sis i vypnul reset(str.226), bez kterého nejde ISP.

Co se týká práce s programovou pamětí, lze to takto:

#include <avr/pgmspace.h>
unsigned char data[2] PROGMEM = {128, 160};
temp = pgm_read_byte(&(dataRC[0]));

Direktivou “PROGMEM” řekneš překladači, že mají být data ve flash.
Pomocí “pgm_read_byte” se data čtou. Argumentem čtecí funkce je adresa dat ve flash. Tu získáš pomocí “&”. Tyhle informace jsou v manuálu překladače, platí pro GCC.

Preco dataRC[0] a nie data[0]?

to je chyba v mazání - kopíroval jsem to z jednoho programu :smiley: Tady to “RC” být opravdu nemá.

V ponyprog by som na zrušenie resetu musel polozku RSTDISBL zaskrtnut , tak som neurobil, avsak ani pri pripojeni externeho krystalu som neuspel…a taky isty vysledok ma cakal aj s RC clankom, a este som to skusil s MAE555, kedze volba CKSEL 0000 odpovedá volbe externý zdroj na XTAL1, no tiež bez úspechu…takze asi sa rozlucim s atmega8, lebo to bol posledny kus, ktory mam doma, a prejdem na atmega8L, ktory mam pripraveny na zapojenie s flash pametou…:frowning:

Pokud ti reset funguje, mělo by stačit připojit externí oscilátor (ne krystal) na vstup XTAL1. Těžko říct, jaké frekvence ponyprog používá/zkouší, takže by se ten oscilátor měl pro jistotu blížit 1MHz (tovární nastavení mcu). Pokud nemáš jistotu, jesli ten externí oscilátor pracoval správně a na správné frekvenci, můžeš si ho vytvořit z jiného mcu :wink:

Aspon, ze toto sa mi dnes podarilo:) 3.3V napajanie, ISP funguje v pohodicke tiez…akurat mam este slabsi vystup:)

Diky, sorry nevsimol som si tvoju odpoved ked som vcera v stadiu riadnej ospalosti pisal posledny komentar:) To ma vobec nenapadlo, pouzit na generovanie xtal druhy mcu:) no, teraz tam mam vlozeny atmega8L, a myslim, ze s tymto budem pracovat aj nadalej, chcem aby so fungovalo na 3,3V… skusim dnes vygenerovat nejake kratucke audio a dat ho prehravat… este taka otazocka, ako cez ponyprog vygenerovane audio vlozim do pameti? viem ze tam su tlacitka write program, write data, ale mam nejako vygenerovat hex subor s tymi hodnotami?

Do interní eeprom se ti audio nevejde, ta je malá. Pokud by ti ovšem stačila, tak budiž. Data nemusejí být ani v HEX, ponyprog nahraje klidně i bin. Ovšem jak zapracovat externí data do projektu aby se uložily do FLASH a šlo k nim z programu přistupovat, to nevím. Až se dostanu dom, zkusím se na to podívat, samotného by mě to zajímalo…

Tak zatím jsem rozchodil jen takovej napůl manuální způsob.
Nechat si data vygenerovat do souboru v textové formě oddělená čárkami. Ručně data obalit deklarací unsigned char data] PROGMEM = {-->hejno čísel<--}; a sobor načíst na určené místo pomocí #include “nazev_souboru”;
V manuálu překladače jsem o načtení externích dat nic nenašel…