Dźwięk z ATMEGA8

Tutaj mozesz poruszać tematy ogólne powiązane z elektroniką, np. dyskusje na temat podzespołów, układów, zasad ich działania. Czyli można pisać o wszystkim czego nie da się przyporządkować do innych działów.
K_o_n_r_a_d
Użytkownik
Posty: 123
Rejestracja: 29 lip 2005, 10:21
Lokalizacja: Lublin

Post autor: K_o_n_r_a_d » 09 gru 2006, 12:35

Zauważ, że u mnie jest:

Kod: Zaznacz cały

$regfile = "m8def.dat"
$crystal = 4000000
Na 1MHz z tymi samymi częstotliwościami to będzie tak:

Kod: Zaznacz cały

$regfile = "m8def.dat"
$crystal = 1000000
Pwm1a = 0
Config Timer1 = Timer , Prescale = 8 , Compare A = Toggle , Clear Timer = 1

Do
   Pwm1a = 239
   Start Timer1
   Waitms 500
   Stop Timer1
   Pwm1a = 213
   Start Timer1
   Waitms 500
   Stop Timer1
   Pwm1a = 190
   Start Timer1
   Waitms 500
   Stop Timer1
   Pwm1a = 179
   Start Timer1
   Waitms 500
   Stop Timer1
   Pwm1a = 160
   Start Timer1
   Waitms 500
   Stop Timer1
   Pwm1a = 142
   Start Timer1
   Waitms 500
   Stop Timer1
   Pwm1a = 127
   Start Timer1
   Waitms 500
   Stop Timer1
   Wait 4
Loop
End

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 09 gru 2006, 16:10

Nie chodzi o częstotliwośc tylko tempo, bo przy waitms <500 nie działa już jak należy. No chyba że przy 4MHz da sie osiągnąc dobry efekt.

K_o_n_r_a_d
Użytkownik
Posty: 123
Rejestracja: 29 lip 2005, 10:21
Lokalizacja: Lublin

Post autor: K_o_n_r_a_d » 09 gru 2006, 17:27

Nie bardzo rozumiem o co chodzi. Ja u siebie wstawiłem Waitms 500 tylko tak dla przykładu. Możesz wstawić dowolne opóźnienia i nie będzie to miało wpływu na częstotliwość dzwięku.

Ale zmiana częstotliwości taktującej uK wpływa na długość opóźnienia i zmienia je proporcjonalnie do częstotliwości generatora taktującego. Wpływa tez na częstotliwość dzwieku generowanego dla tej samej wartości rejestru Pwm1a.

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 09 gru 2006, 19:04

Waitms jest ustawiene względem $crystal i częstotliwośc rzeczywista kwarcu oraz taka sama watrośc w $crystal nie powoduje zmiany opóźnienia w przypadku zmiany częstotliwości kwarcu( i oczywiście $crystal = Hz kwarcu).
Mnie nie chodzi o zmiane częstotliwości dźwięku tylko jego tępa, czyli pwm1a=const a waitms trzeba obniżyc. I tu jest problem bo melodia staje się niestabilna. Pisałeś że możesz dowolnie zmieniac waitms i wszystko jest w porządku, czyli wynika z tego że watośc kwarcu muszę miec większą, np. te 4MHz.

Awatar użytkownika
Koppel
Użytkownik
Posty: 500
Rejestracja: 24 lip 2005, 18:05
Lokalizacja: Gliwice

Post autor: Koppel » 10 gru 2006, 11:39

K_o_n_r_a_d pisze:Chyba jednak nie przeczytałeś dokładnie programu. W tym przypadku wypełnienie będzie zawsze 50% a będzie się zmieniała częstotliwość.
Racja.... Ogólnie ciężko mi się czyta BASCOM'a i przeoczyłem ten fragment.

:arrow: Aro
Patrzyłeś na kod jaki się wygenerował? Próbowałeś symulować układ w pracy krokowej z podglądaniem co się dzieje w rejestrach? To podstawa w takich przypadkach.

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 10 gru 2006, 17:35

Dla mnie to czarna magia, nie znam prawie wcale asemblera, C się dopieo zaczynam uczyc, tak więc z tymi rejestrami to nie bardzo.

[ Dodano: 2006-12-29, 14:48 ]
Generowanie dźwięku przez TIMER1 nie powiodło się. Mówi się trudno. Ale jak na melodyjkę to całkiem dobrze wyszło inne rozwiązanie. Dźwięk wytwarzany jest programowo przez toggle w pętli do loop. Tępem steruje TIMER0. Całośc działa jak należy, tylko trzeba się pobawic częstościomierzem żeby znaleźc odpowiednie dźwięki. Poniżej daje kod.

Kod: Zaznacz cały

$regfile = "m8def.dat"
'*******************************************************************************
Cls
Lcd "For Next Mellody"

Dim I As Byte
Dim Ii As Byte
Dim A As Byte
Dim N As Byte
Dim S As Byte
Config Pinb.1 = 1
Config Timer0 = Timer , Prescale = 1024
Enable Interrupts
Enable Timer0
On Timer0 T

A = 100
P:
Enable Interrupts
A = Lookup(ii , Mel)
Do
Toggle Portb.1
For I = 0 To A
Waitus 50
Next
Loop
End                                                         'end program

T:
Incr Ii
If Ii > 25 Then Ii = 0
Goto P
Return
Mel:
Data 10 , 255 , 15 , 255 , 10 , 255 , 15 , 255 , 10 , 255 , 15 , 255 , 10 , 255 , 15
Data , 8 , 8 , 255 , 12 , 255 , 8 , 255 , 12 , 255 , 8 , 255

ODPOWIEDZ