logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Bascom: Jak napisać program na ATmega8 do odtwarzania melodyjki po naciśnięciu?

demolkg 05 Lis 2007 15:10 4964 15
REKLAMA
  • #1 4448766
    demolkg
    Poziom 10  
    Posty: 5
    Witam, bardzo proszę o pomoc a mianowicie, potrzebuje program napisany w BASCOMIE który będzie działał na ATmega8. Program po wciśnięciu przycisku podłączonego do Portd.0 bedzie mi grał melodyjke na PCSPEAKERZE podłączonym do portu Portd.4. Molodyjka ma byc prosta. Coś bym podziałał ale zupełnie nie wiem od czego zacząć. Jedyne co umiem zrobić to puścić sygnał za pomocą przycisku na ten portd.4 ale jak zagrać jakąś melodyjkę(zmiana częstotliwości sygnału) to już nie mam pojęcia. Jestem laikiem w sprawach mikrokontrolerów i programowania. Bardzo prosze o pomoc. Zależy mi na czasie.
  • REKLAMA
  • #2 4449131
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Instrukcja SOUND pin , il_impulsów , czas_impulsu, powtarzana wielokrotnie z różnymi parametrami, lub timer generujący przerwania w określonym czasie tworząc przebieg prostokątny na konkretnym pinie.
    O resztę zapytaj znajomego muzyka.
  • #3 4449372
    demolkg
    Poziom 10  
    Posty: 5
    No właśnie chodzi o to że nie mam znajomych muzyków:)
    Także proszę jak możesz skrobnij jakiś kawałek kodu w jaki sposób skonfigurować Timera0 w tym przypadku. Bo wiem ze za pomocą nie wszystkich pinów da się przestrajać częstotliwość. Myślałem o CRYSTAL ale ona jest do konfiguracji UARTa a nie wiem czy za pomocą tego portu moze tym sterować...
    a co do SOUND to ona nie generuje różnych tonów.
  • REKLAMA
  • #4 4450483
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Cytat:
    ??? SOUND to ona nie generuje różnych tonów ???


    A parametr czas impulsu? Decyduje przecież o częstotliwości, a ilość impulsów to czas trwania danego tonu.

    Co do
    Cytat:
    skrobnij jakiś kawałek kodu
    to napisanie programu wymaga obliczenia wartości początkowych lub wartości porównania dla timera dla każdego tonu osobno. Niestety tak dużo czasu nie mam i muzykiem nie jestem.
  • #5 4450744
    demolkg
    Poziom 10  
    Posty: 5
    Dzięki kolego za odpowiedź. Coś już próbowałem robić za pomocą SOUND. Nie mam jeszcze gotowej płytki z prockiem także ciężko przetestować. Symulator Bascoma czy Avr-Studio chyba nie posiadają opcji sprawdzenia freq na portach.......przynajmniej ja nie umiem tego zlokalizować. Jak już mówiłem jestem laikiem w tej kwestii.
    Co do TIMERA0 proszę napisz dosłownie kawałeczek kodu z dosłownie dwoma przykładowymi tonami, będzie mi to bardzo pomocne....
    pozdrawiam
  • REKLAMA
  • #7 4453213
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Co do TIMERA0 proszę napisz dosłownie kawałeczek kodu


    $crystal = 1000000
    Config Piny.x = 1
    CONFIG TIMER0 = TIMER , PRESCALE = 8
    Enable Interrupts
    Enable TIMER0
    On Timer0 Dzwiek
    Timer0=193
    Start Timer0
    
    Do : Loop
    End
    
    Dzwiek:
    Timer0=193
    Toggle Porty.x 'Na tym porcie powinien wygenerować się przebieg prostokątny o częstotliwości ok. 1kHz
    Return


    Dla Timer0=225 będzie ok. 2kHz
    Dokładność częstotliwości można powiększyć zwiększając częstotliwość taktowania procesora i przeliczając wartość początkową dla timera. Polecam program kalk.exe
    Zadanie można zrobić też w inny sposób, korzystając z rejestru porównania.
    Zaleta użycia timera jest taka, że końcówka sobie będzie grać bez istotnego udziału procesora, który w tym czasie będzie mógł zająć się innym zadaniem. Do .. Loop jest pusta i czeka na zadania!
  • #8 4453548
    K_o_n_r_a_d
    Poziom 23  
    Posty: 318
    Pomógł: 86
    Ocena: 9
    Sprawdz ten kod:
    $regfile = "m8def.dat"
    $crystal = 4000000
    Pwm1a = 0
    Config Timer1 = Timer , Prescale = 8 , Compare A = Toggle , Clear Timer = 1
    
    Do
       Pwm1a = 956
       Start Timer1
       Waitms 500
       Pwm1a = 851
       Waitms 500
       Pwm1a = 758
       Waitms 500
       Pwm1a = 716
       Waitms 500
       Pwm1a = 638
       Waitms 500
       Pwm1a = 568
       Waitms 500
       Pwm1a = 506
       Waitms 500
       Wait 4
    Loop
    End

    Jest to chyba najlepszy sposób na generowanie dzwięku.
    - nie obciąża uK (nie zatrzymuje się na czas generowania),
    - wystarczy do rejestru PWM1A wpisać wartość odpowiadającą danej częstotliwości,
    - impulsy są generowane na końcówce OC1A.
    Ja wstawiłem Waitms 500 pomiędzy zmianę częstotliwości, ale mozna oczywiście zmieniać w przerwaniach innego Timera lub dowolnych innych i w ten sposób zrobić dowolne dźwięki nie obciążając zbytecznie uK.

    Tutaj masz czestotliwości poszczegulnych tonów: http://pl.wikipedia.org/wiki/Ton_%28d%C5%BAwi%C4%99k%29
    Znajdz dowolne nuty, wylicz wartości PWM1A, zrób odpowiednie opóźnienia i masz melodię :)
  • #9 4453693
    demolkg
    Poziom 10  
    Posty: 5
    Cytat:
    - impulsy są generowane na końcówce OC1A.


    -głównie chodziło mi o wyjście (XCK/T0)PD4 ale dzięki wielkie za odpowiedź. Ta wiedza też mi się na pewno przyda zwłaszcza te tonacje.

    Ogólnie to dzięki wam wszystkim za odpowiedzi, które naprawdę są dla mnie bardzo wartościowe. Zaskoczyła mnie szybka reakcja forumowiczów na zadany problem. Szacuneczek dla was chopaki i dla adminów tego forum. Jutro pójdę do promotora bez żadnych obaw z gotowym kawałkiem kodu. Pewnie podczas pisania mojej pracy mgr jeszcze nie raz tu zaglądnę i Was pomęczę jakimiś "błahostkami"..........
    pozdro
  • #10 4453928
    K_o_n_r_a_d
    Poziom 23  
    Posty: 318
    Pomógł: 86
    Ocena: 9
    Na (XCK/T0)PD4 to tylko programowo i sposób zaproponowany przez M. S. w tym przypadku jest najlepszy (ten z timerem).
  • #11 7009257
    grabek_radek
    Poziom 21  
    Posty: 579
    Pomógł: 2
    Ocena: 37
    a ja sobie pomyslalem czy dalo by rade wygenerowac np szczekanie psa ;) ??
  • #12 7551950
    chris077
    Poziom 10  
    Posty: 6
    K_o_n_r_a_d napisał:
    Sprawdz ten kod:
    $regfile = "m8def.dat"
    $crystal = 4000000
    Pwm1a = 0
    Config Timer1 = Timer , Prescale = 8 , Compare A = Toggle , Clear Timer = 1
    
    Do
       Pwm1a = 956
       Start Timer1
       Waitms 500
       Pwm1a = 851
       Waitms 500
       Pwm1a = 758
       Waitms 500
       Pwm1a = 716
       Waitms 500
       Pwm1a = 638
       Waitms 500
       Pwm1a = 568
       Waitms 500
       Pwm1a = 506
       Waitms 500
       Wait 4
    Loop
    End



    Jakiego wzoru używamy do obliczenia Pwm1a ?
  • REKLAMA
  • #14 7559926
    ZbeeGin
    Poziom 39  
    Posty: 4299
    Pomógł: 600
    Ocena: 437
    grabek_radek napisał:
    a ja sobie pomyslalem czy dalo by rade wygenerowac np szczekanie psa ;) ??

    Owszem. AVR nawet potrafi mówić - mój na przykład wymawia godziny w zegarku.
  • #15 7612727
    Madik
    Poziom 15  
    Posty: 148
    Pomógł: 15
    Ocena: 4
    ZbeeGin napisał:
    grabek_radek napisał:
    a ja sobie pomyslalem czy dalo by rade wygenerowac np szczekanie psa ;) ??

    Owszem. AVR nawet potrafi mówić - mój na przykład wymawia godziny w zegarku.

    To był żart czy tak na poważnie? Bo trochę szukam imformacji na ten temat i nie wiem czy pytać o szczegóły czy się pośmiać?

Podsumowanie tematu

✨ Dyskusja dotyczyła napisania programu w Bascom dla mikrokontrolera ATmega8, który po naciśnięciu przycisku na porcie PortD.0 generowałby prostą melodyjkę na PC Speakerze podłączonym do PortD.4. Wskazano, że do generowania dźwięków można użyć instrukcji SOUND z odpowiednimi parametrami impulsów lub skonfigurować Timer0 do generowania przebiegu prostokątnego o zmiennej częstotliwości. Podano przykładowy kod konfiguracji Timer0 z preskalerem i wartością początkową, umożliwiający generowanie tonów o różnych częstotliwościach poprzez zmianę wartości rejestru timera. Zaproponowano także użycie Timer1 z trybem Compare A Toggle i rejestrem PWM1A do generowania dźwięków na wyjściu OC1A, co pozwala na nieobciążające procesor generowanie tonów o zadanych częstotliwościach. Podano link do tabeli częstotliwości tonów muzycznych oraz wskazano, że dokładność można poprawić zwiększając częstotliwość taktowania mikrokontrolera i odpowiednio przeliczając wartości timerów. Dyskusja zawierała również uwagi o ograniczeniach symulatorów Bascom i AVR Studio w testowaniu generowanych częstotliwości oraz sugestie dotyczące wykorzystania przerwań do zmiany tonów. Wątek zakończył się podziękowaniami za pomoc i potwierdzeniem, że rozwiązanie z timerem jest najlepsze dla wyjścia na pinie PD4 (XCK/T0).
Wygenerowane przez model językowy.
REKLAMA