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

Atmega8 - jak uzyskać dźwięk z AVR? Moj pierwszy uklad

Sakurazuka 12 Sty 2011 17:02 3107 13
REKLAMA
  • #1 8995718
    Sakurazuka
    Poziom 2  
    Witam

    Czy ktos mógłby mi podpowiedzieć jakich komend w C lub asemblerze należy użyć by uzyskać dźwięk z głośnika podpiętego do Atmegi8? Chodzi mi o proste "midi".
  • REKLAMA
  • #2 8995750
    tmf
    VIP Zasłużony dla elektroda
    midi? To poczytaj najpierw czym jest midi. Implementacja tego wcale nie jest banalna. Natomiast prosty dźwięk uzyskasz przy pomocy timera, można też odtwarzać próbki przy pomocy fastPWM.
  • REKLAMA
  • #4 8996002
    Sakurazuka
    Poziom 2  
    Wiem, że nie ma takiej procedury. I jak wytknął tmf, nie chodzi mi o midi tylko o proste dźwięki typu gama "pisków" z głośnika. Spróbuję poczytać o timerach więcej, ale będę wdzięczny za każdą kolejną informację.
  • REKLAMA
  • #6 8998515
    Konto nie istnieje
    Poziom 1  
  • #7 8998589
    jarekz_2
    Poziom 16  
    Sakurazuka napisał:
    (...)Czy ktos mógłby mi podpowiedzieć jakich komend w C lub asemblerze należy użyć by uzyskać dźwięk z głośnika podpiętego do Atmegi8?

    Może to okaże się pomocne?
    Zrobiłem też drugą, ulepszoną, wersję na ATmega168, z filtrem 12dB/okt. Ale na razie nie mam zdjęć.
  • #8 8998880
    Sakurazuka
    Poziom 2  
    dodam jeszcze, że bazuję na kicie:

    http://www.nikomp.com.pl/zestawyK/K-4530.htm

    Jednak nie zamierzam wysyłać mu nic przez RS - wystarczy mi, zeby zaprogramowac go by gral kilka nut

    Czyli wygląda na to, iż mam odliczać na timerze do pewnej wartości zależnej od nuty, którą chcę uzyskać a następnie wygenerować przerwanie i zmienić stan na przeciwny. Pytanie brzmi: jak sprawdzić obecny stan na wyjściu?

    czy wystarczy uzycie instrukcji
    sbis oraz sbic
    z wykorzystaniem rejestru PIN?

    EDITED:

    Posiedziałem trochę nad książką dzisiaj i ostatecznie napisałem taki programik:
    .nolist
    .include "m8def.inc"
    .list
    
    .equ gr1 = 38226
    .equ gr2 = 34059
    .equ gr3 = 30339
    .equ gr4 = 28636
    .equ gr5 = 25510
    .equ gr6 = 22727
    .equ gr7 = 20251
    
    
    .cseg
    .org 0
    
    rjmp start ;skok do poczatku programu
    reti
    reti
    reti
    reti
    reti
    rjmp TIMER1_COMPA ;przewanie timera
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    reti
    
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    
    ;program glowny
    
    start:
    ;wlaczenie obslugi przerwan
    cli
    
    ;zaladowanie adresu konca pamieci - obsluga stosu
    
    ldi R16, HIGH(RAMEND)
    out SPH, R16
    ldi R16, LOW(RAMEND)
    out SPL, R16
    ////////////////////////////////////////////////
    ;ustawienia timera - i hope it'l work
    ldi R16, 0
    out TCCR1A, R16
    ;wyzerowanie licznika
    out TCNT1H, R16
    out TCNT1L, R16
    ldi R16, (1<<WGM12)|(1<<CS11)
    out TCCR1B, R16 
    
    ///////////////////////////////////////////////
    ;ustawienie linii D2 i D3 - diody LED
    sbi DDRD, 2
    sbi DDRD, 3
    ;wartosc wysoka - diody nie swieca
    sbi PORTD, 2
    sbi PORTD, 3
    ///////////////////////////////////////////////
    ;ustawienie linii D7 i B0 - przyciski
    cbi DDRD, 7
    cbi DDRB, 0
    ;wartosc wysoka dla tych linii
    sbi DDRD, 7
    sbi DDRB, 0
    ///////////////////////////////////////////////
    ;ustawienia linii PC3 (tester) i PC2 (grajek)
    sbi DDRC, 2
    cbi DDRC, 3
    
    sbi PORTC, 2
    ////////////////////////////////////////////////
    ;jakis konkret by sie przydal
    
    
    petla:
    
    ;opusc instrukcje jesli przycisk SW1 jest wcisniety
    sbis PIND, 7
    rjmp muzodajnia
    
    sbis PINB, 0
    rjmp muzodajnia2
    ///////////////////////////////////////////////////
    ;czyszczenie -> zgas diode 1 i 2
    sbi PORTD, 3
    sbi PORTD, 2
    
    rjmp petla
    
    ///////////////////////////////////////////////////
    
    muzodajnia:
    ;let's do this!!!
    ;zapalanie diody!
    cbi PORTD, 3
    
    ;ustawienie TIMERA1 nr 1
    ;wartosc rganiczna 1
    ldi R16, high(gr1)
    out OCR1AH, R16
    ldi R16, low(gr1)
    out OCR1AH, R16
    ;engage
    ldi R16, (1<<OCIE1A)
    out TIMSK, R16
    
    rcall Czekaj1sekunde
    
    ;wartosc rganiczna 2
    ldi R16, high(gr2)
    out OCR1AH, R16
    ldi R16, low(gr2)
    out OCR1AH, R16
    ;engage
    ldi R16, (1<<OCIE1A)
    out TIMSK, R16
    
    rcall Czekaj1sekunde
    
    ;wartosc rganiczna 3
    ldi R16, high(gr3)
    out OCR1AH, R16
    ldi R16, low(gr3)
    out OCR1AH, R16
    ;engage
    ldi R16, (1<<OCIE1A)
    out TIMSK, R16
    
    rcall Czekaj1sekunde
    
    ;wartosc rganiczna 4
    ldi R16, high(gr4)
    out OCR1AH, R16
    ldi R16, low(gr4)
    out OCR1AH, R16
    ;engage
    ldi R16, (1<<OCIE1A)
    out TIMSK, R16
    
    rcall Czekaj1sekunde
    
    ;wartosc rganiczna 5
    ldi R16, high(gr5)
    out OCR1AH, R16
    ldi R16, low(gr5)
    out OCR1AH, R16
    ;engage
    ldi R16, (1<<OCIE1A)
    out TIMSK, R16
    
    rcall Czekaj1sekunde
    
    ;wartosc rganiczna 6
    ldi R16, high(gr6)
    out OCR1AH, R16
    ldi R16, low(gr6)
    out OCR1AH, R16
    ;engage
    ldi R16, (1<<OCIE1A)
    out TIMSK, R16
    
    rcall Czekaj1sekunde
    
    ;wartosc rganiczna 7
    ldi R16, high(gr7)
    out OCR1AH, R16
    ldi R16, low(gr7)
    out OCR1AH, R16
    ;engage
    ldi R16, (1<<OCIE1A)
    out TIMSK, R16
    
    rcall Czekaj1sekunde
    
    rjmp petla;
    //////////////////////////////////////////////////
    muzodajnia2:
    ;let's do this!!!
    ;zapalanie diody!
    cbi PORTD, 2
    
    ;ustawienie TIMERA1 nr 7
    ;wartosc rganiczna 7
    ldi R16, high(gr7)
    out OCR1AH, R16
    ldi R16, low(gr7)
    out OCR1AH, R16
    ;engage
    ldi R16, (1<<OCIE1A)
    out TIMSK, R16
    
    rcall Czekaj1sekunde
    
    ;wartosc rganiczna 6
    ldi R16, high(gr6)
    out OCR1AH, R16
    ldi R16, low(gr6)
    out OCR1AH, R16
    ;engage
    ldi R16, (1<<OCIE1A)
    out TIMSK, R16
    
    rcall Czekaj1sekunde
    
    ;wartosc rganiczna 5
    ldi R16, high(gr5)
    out OCR1AH, R16
    ldi R16, low(gr5)
    out OCR1AH, R16
    ;engage
    ldi R16, (1<<OCIE1A)
    out TIMSK, R16
    
    rcall Czekaj1sekunde
    
    ;wartosc rganiczna 4
    ldi R16, high(gr4)
    out OCR1AH, R16
    ldi R16, low(gr4)
    out OCR1AH, R16
    ;engage
    ldi R16, (1<<OCIE1A)
    out TIMSK, R16
    
    rcall Czekaj1sekunde
    
    ;wartosc rganiczna 3
    ldi R16, high(gr3)
    out OCR1AH, R16
    ldi R16, low(gr3)
    out OCR1AH, R16
    ;engage
    ldi R16, (1<<OCIE1A)
    out TIMSK, R16
    
    rcall Czekaj1sekunde
    
    ;wartosc rganiczna 2
    ldi R16, high(gr2)
    out OCR1AH, R16
    ldi R16, low(gr2)
    out OCR1AH, R16
    ;engage
    ldi R16, (1<<OCIE1A)
    out TIMSK, R16
    
    rcall Czekaj1sekunde
    
    ;wartosc rganiczna 1
    ldi R16, high(gr1)
    out OCR1AH, R16
    ldi R16, low(gr2)
    out OCR1AH, R16
    ;engage
    ldi R16, (1<<OCIE1A)
    out TIMSK, R16
    
    rcall Czekaj1sekunde
    
    rjmp petla;
    /////////////////////////////////////////////////
    Czekaj1sekunde:
    ldi R19, 0
    czekaj1sekunde2:
    ldi R20, 0
    czekaj1sekunde0:
    ldi R21, 0
    czekaj1sekunde1:
     inc R21
     cpi R21, 250
     brlo czekaj1sekunde1 
    inc R20
    cpi R20, 249
    brlo czekaj1sekunde0
    inc R19
    cpi R19, 4
    brlo czekaj1sekunde2
    ret
    
    //////////////////////////////////////////////////
    
    TIMER1_COMPA:
    sbis PINC, 3
    sbi PORTC, 2
    
    sbic PINC, 3
    cbi PORTC, 2
    reti
    


    jak sądzicie? ma prawo zadziałać? kosmetyka mogła by być na wyższym poziomie ale chyba będzie sprawny
  • REKLAMA
  • #9 9014755
    chifchif
    Poziom 12  
    Jak by ktoś potrzebował polecam kurs AVR C
    w Bascom Digital Melody Player komenda Sound trzeba tylko w tym przykładzie poprawić błąd konfiguracji pinu z
    Config Portb.0 = Output na Config Pinb.0 = Output
  • #10 9015718
    LordBlick
    VIP Zasłużony dla elektroda
    Sakurazuka napisał:
    jak sądzicie? ma prawo zadziałać?
    1. Nie - przerwania wyłączone...
    2. Co to za programowanie na sucho ? Żarty sobie robisz ? ;)
    3. Używasz timera i wplatasz tu pętle bezrobocia dla opóźnienia ? A fe...
    4. PWM działa bez potrzeby wywoływania jakiejkolwiek procedury przerwania, tylko trzeba to skonfigurować (zajrzyj do noty katalogowej).
    5. Cały czas wpisujesz do OCR1AH, a biedny OCR1AL leży odłogiem...
    6. zamiast
    rjmp muzodajnia
    i
    rjmp muzodajnia2
    miałeś na myśli chyba
    rcall muzodajnia
    i
    rcall muzodajnia2
    ?
  • #11 9016708
    Sakurazuka
    Poziom 2  
    pisanie na sucho boli, ja wiem. Ale programator dostępny mam tylko raz na tydzień.
  • #13 9018852
    LordBlick
    VIP Zasłużony dla elektroda
    1. Ten kod da się zoptymalizować do Fast PWM bez obsługi przerwania od Timer1 CTC.
    2. Te wartości grX to co to jest ? Częstotliwość razy 10 ?
REKLAMA