Форум РадиоКот • Просмотр темы - Портирование проекта, проблема с таймером
Сообщения без ответов | Активные темы
Страница 1 из 1
[ Сообщений: 6 ]
Автор
Сообщение
kote52
Заголовок сообщения: Портирование проекта, проблема с таймером
Добавлено: Пт авг 25, 2023 10:00:14
Зарегистрирован: Пт мар 19, 2021 08:58:45Сообщений: 118
Рейтинг сообщения: 0
Всем привет! Приспичило мелодию проиграть на мк, на
chipenable.ru нашел проект к меге8535, решил его перетащить на atmega328p. И как бы я все сделал, но ни чего не работает... Генерация на ножке мк есть, постоянно одна частота идет. Собрал в протусе проект автора, все играет. С самого начала у меня возникли большие вопросы, настраивается таймер 2, а биты для таймера 0 - это как и почему это работает?
Код:
TIMSK |= (1 <<TOIE2); TCCR2 = (0 <<WGM01)|(0 <<WGM00)|(0 <<CS02)|(0 <<CS01)|(1 <<CS00); TCNT2 = 0 ; OCR2 = 0 ;
ну сам изначальный проект:
sound.c Спойлер Код:
#include "sound.h" #define LOOP 0xff PROGMEM unsigned int FurElise[] = { 18 , 1 , n8,e2, n8,xd2, n8,e2, n8,xd2, n8,e2, n8,b1, n8,d2, n8,c2, n4,a1, n8,p, n8,c1, n8,e1, n8,a1, n4,b1, n8,p, n8,e1, n8,xg1, n8,b1, n4,c2, n8,p, n8,e1, n8,e2, n8,xd2, n8,e2, n8,xd2, n8,e2, n8,b1, n8,d2, n8,c2, n4,a1, n8,p, n8,c1, n8,e1, n8,a1, n4,b1, n8,p, n8,e1, n8,c2, n8,b1, n4,a1, 0 }; PROGMEM unsigned int Mozart[] = { 16 , 1 , n16, xf1, n16, e1, n16,xd1, n16,e1, n4,g1, n16,a1, n16,g1, n16,xf1, n16,g1, n4,b1, n16,c2, n16,b1, n16,xa1, n16,b1, n16,xf2, n16,e2, n16,xd2, n16,e2, n16,xf2, n16,e2, n16,xd2, n16,e2, n4,g2, n8,e2, n8,g2, n32,d2, n32,e2, n16,xf2, n8,e2, n8,d2, n8,e2, n32,d2, n32,e2, n16,xf2, n8,e2, n8,d2, n8,e2, n32,d2, n32,e2, n16,xf2, n8,e2, n8,d2, n8,xc2, n4,b1, 0 }; PROGMEM unsigned int Minuet[] = { 18 , 1 , n4,d2, n8,g1, n8,a1, n8,b1, n8,c2, n4,d2, n4,g1, n4,g1, n4,e2, n8,c2, n8,d2, n8,e2, n8,xf2, n4,g2, n4,g1, n4,g1, n4,c2, n8,d2, n8,c2, n8,b1, n8,a1, n4,b1, n8,c2, n8,b1, n8,a1, n8,g1, n4,xf1, n8,g1, n8,a1, n8,b1, n8,g1, n4,b1, n2,a1, 0 }; PROGMEM unsigned int Sirene2[] = { 1 , LOOP, ms (500 ), c2, ms (500 ), g2, 0 };#define PIN_SOUND (*(&PORT_SOUND-2)) #define DDR_SOUND (*(&PORT_SOUND-1)) PROGMEM unsigned int Empty[] = { 1 , 1 , n4, p, 0 }; PROGMEM unsigned int PROGMEM* melody[] = {Empty, FurElise, Mozart, Minuet, Sirene2};volatile static unsigned int *pSong;volatile static unsigned char state = SOUND_STOP; volatile static unsigned int durationNote = 0 ; volatile static unsigned int toneNote = 0 ; volatile static unsigned char indexNote = 0 ;volatile static unsigned char statReg = 0 ;volatile static unsigned char repeat = 0 ;#ifndef SOUND_BPM static unsigned char bpm = 0 ;#endif #define SOUND_VOLUME 0 #define SOUND_GEN 1 #define SOUND_BPM_SONG 0 #define SOUND_REPEAT_SONG 1 #define SOUND_START_SONG 2 #define SOUND_COUNTER_CAP 256 #define SOUND_PROG_COUNTER 31 void SOUND_Init (void ) { PORT_SOUND &= ~(1 <<PINX_SOUND); DDR_SOUND |= (1 <<PINX_SOUND); TIMSK |= (1 <<TOIE2); TCCR2 = (0 <<WGM01)|(0 <<WGM00)|(0 <<CS02)|(0 <<CS01)|(1 <<CS00); TCNT2 = 0 ; OCR2 = 0 ; pSong = (unsigned int *)pgm_read_word (&(Empty)); state = SOUND_STOP; durationNote = 0 ; toneNote = 0 ; repeat = 0 ; indexNote = 0 ; statReg = 0 ;#ifndef SOUND_BPM bpm = 0 ;#endif }void SOUND_SetSong (unsigned char numSong) { if (numSong <= SOUND_AMOUNT_MELODY) { pSong = (unsigned int *)pgm_read_word (&(melody[numSong])); } } void SOUND_Com (unsigned char com) {unsigned char saveSreg = SREG; cli (); switch (com){ case SOUND_STOP: state = SOUND_STOP; TIMSK &= ~(1 <<OCIE2); PORT_SOUND &= ~(1 <<PINX_SOUND); break ; case SOUND_PLAY: if (state == SOUND_PAUSE){ state = SOUND_PLAY; TIMSK |= (1 <<OCIE2); } else { #ifndef SOUND_BPM bpm = pgm_read_word (&(pSong[SOUND_BPM_SONG])); #endif indexNote = SOUND_START_SONG; repeat = pgm_read_word (&(pSong[SOUND_REPEAT_SONG])); durationNote = 0 ; state = SOUND_PLAY; TIMSK |= (1 <<OCIE2); } break ; case SOUND_PAUSE: state = SOUND_PAUSE; TIMSK &= ~(1 <<OCIE2); break ; default : break ; } SREG = saveSreg; }void SOUND_PlaySong (unsigned char numSong) { if (numSong <= SOUND_AMOUNT_MELODY) { pSong = (unsigned int *)pgm_read_word (&(melody[numSong])); } #ifndef SOUND_BPM bpm = pgm_read_word (&(pSong[SOUND_BPM_SONG])); #endif indexNote = SOUND_START_SONG; repeat = pgm_read_word (&(pSong[SOUND_REPEAT_SONG])); durationNote = 0 ; state = SOUND_PLAY; TIMSK |= (1 <<OCIE2); }inline static void SOUND_Duration (void ) { static unsigned char counter = 0 ; if (state == SOUND_PLAY){ if (durationNote){ counter++; counter &= SOUND_PROG_COUNTER; if (!counter){ durationNote--; } } else { durationNote = pgm_read_word (&(pSong[indexNote])); if (durationNote) {#ifndef SOUND_BPM durationNote = durationNote/bpm;#endif indexNote++; toneNote = pgm_read_word (&(pSong[indexNote])); if (toneNote!=P) { statReg |= (1 <<SOUND_VOLUME); } else { statReg &= ~(1 <<SOUND_VOLUME); } indexNote++; TIFR |=(1 <<OCF2); } else { if (repeat == LOOP){ indexNote = SOUND_START_SONG; durationNote = 0 ; return ; } repeat--; if (!repeat){ state = SOUND_STOP; TIMSK &= ~(1 <<OCIE2); PORT_SOUND &= ~(1 <<PINX_SOUND); return ; } else { indexNote = SOUND_START_SONG; durationNote = 0 ; } } } } }inline static void SOUND_Tone (void ) { static unsigned int tone = 0 ; if (statReg & (1 <<SOUND_GEN)){ if (statReg & (1 <<SOUND_VOLUME)){ PORT_SOUND ^= (1 <<PINX_SOUND); } tone = toneNote; statReg &= ~(1 <<SOUND_GEN); } if (tone > SOUND_COUNTER_CAP) { tone -= SOUND_COUNTER_CAP; } else { OCR2 = tone; statReg |= (1 <<SOUND_GEN); } }ISR (TIMER2_OVF_vect) { SOUND_Duration (); BUT_Debrief (); }ISR (TIMER2_COMP_vect) { SOUND_Tone (); }
sound.h Спойлер Код:
#ifndef SOUND_H #define SOUND_H #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include "buttons.h" #define SOUND_BPM 24 #define SOUND_F_CPU 16U #define SOUND_TIM_PRE 1U #include "tone.h" #define PORT_SOUND PORTB #define PINX_SOUND 0 #define SOUND_AMOUNT_MELODY 4 #define SOUND_STOP 0 #define SOUND_PLAY 1 #define SOUND_PAUSE 2 void SOUND_Init (void ) ;void SOUND_SetSong (unsigned char numSong) ;void SOUND_Com (unsigned char com) ;void SOUND_PlaySong (unsigned char numSong) ;#endif
tone.h Спойлер Код:
#define f(x) (SOUND_F_CPU*1000000UL/(x*2*SOUND_TIM_PRE)) #define fn(x) ((x*SOUND_F_CPU)/SOUND_TIM_PRE) #ifdef SOUND_BPM #define COEF SOUND_BPM #else #define COEF 1 #endif #define dn(x) ((24U*SOUND_F_CPU*1000000UL)/(x*SOUND_TIM_PRE*256UL*32UL)/COEF) #define ms(x) (((x)*SOUND_F_CPU*1000UL)/(SOUND_TIM_PRE*256UL*32UL)) #define n1 dn(1) #define n2 dn(2) #define n4 dn(4) #define n8 dn(8) #define n3 dn(12) #define n16 dn(16) #define n6 dn(12) #define n32 dn(32) #define A fn(2273) #define xA fn(2145) #define Ax fn(2145) #define B fn(2025) #define C0 fn(1911) #define xC0 fn(1804) #define Cx0 fn(1804) #define D0 fn(1703) #define xD0 fn(1607) #define Dx0 fn(1607) #define E0 fn(1517) #define F0 fn(1432) #define xF0 fn(1351) #define Fx0 fn(1351) #define G0 fn(1275) #define xG0 fn(1204) #define Gx0 fn(1204) #define A0 fn(1136) #define xA0 fn(1073) #define Ax0 fn(1073) #define B0 fn(1012) #define C1 fn(956) #define xC1 fn(902) #define Cx1 fn(902) #define D1 fn(851) #define xD1 fn(804) #define Dx1 fn(804) #define E1 fn(758) #define F1 fn(716) #define xF1 fn(676) #define Fx1 fn(676) #define G1 fn(638) #define xG1 fn(602) #define Gx1 fn(602) #define A1 fn(568) #define xA1 fn(536) #define Ax1 fn(536) #define B1 fn(506) #define C2 fn(478) #define xC2 fn(451) #define Cx2 fn(451) #define D2 fn(426) #define xD2 fn(402) #define Dx2 fn(402) #define E2 fn(379) #define F2 fn(356) #define xF2 fn(338) #define Fx2 fn(338) #define G2 fn(319) #define xG2 fn(301) #define Gx2 fn(301) #define A2 fn(284) #define xA2 fn(268) #define Ax2 fn(268) #define B2 fn(253) #define C3 fn(239) #define xC3 fn(225) #define Cx3 fn(225) #define D3 fn(213) #define xD3 fn(201) #define Dx3 fn(201) #define E3 fn(190) #define F3 fn(179) #define xF3 fn(169) #define Fx3 fn(169) #define G3 fn(159) #define xG3 fn(150) #define Gx3 fn(150) #define A3 fn(142) #define xA3 fn(134) #define Ax3 fn(134) #define B3 fn(127) #define C4 fn(119) #define P 1 #define a fn(2273) #define xa fn(2145) #define ax fn(2145) #define b fn(2024) #define c0 fn(1911) #define xc0 fn(1804) #define cx0 fn(1804) #define d0 fn(1703) #define xd0 fn(1607) #define dx0 fn(1607) #define e0 fn(1517) #define f0 fn(1432) #define xf0 fn(1351) #define fx0 fn(1351) #define g0 fn(1275) #define xg0 fn(1204) #define gx0 fn(1204) #define a0 fn(1136) #define xa0 fn(1073) #define ax0 fn(1073) #define b0 fn(1012) #define c1 fn(956) #define xc1 fn(902) #define cx1 fn(902) #define d1 fn(851) #define xd1 fn(804) #define dx1 fn(804) #define e1 fn(758) #define f1 fn(716) #define xf1 fn(676) #define fx1 fn(676) #define g1 fn(638) #define xg1 fn(602) #define gx1 fn(602) #define a1 fn(568) #define xa1 fn(536) #define ax1 fn(536) #define b1 fn(506) #define c2 fn(478) #define xc2 fn(451) #define cx2 fn(451) #define d2 fn(426) #define xd2 fn(402) #define dx2 fn(402) #define e2 fn(379) #define f2 fn(356) #define xf2 fn(338) #define fx2 fn(338) #define g2 fn(319) #define xg2 fn(301) #define gx2 fn(301) #define a2 fn(284) #define xa2 fn(268) #define ax2 fn(268) #define b2 fn(253) #define c3 fn(239) #define xc3 fn(225) #define cx3 fn(225) #define d3 fn(213) #define xd3 fn(201) #define dx3 fn(201) #define e3 fn(190) #define f3 fn(179) #define xf3 fn(169) #define fx3 fn(169) #define g3 fn(159) #define xg3 fn(150) #define gx3 fn(150) #define a3 fn(142) #define xa3 fn(134) #define ax3 fn(134) #define b3 fn(127) #define c4 fn(119) #define p 1
и моя реализация в студии7:
sound.c Спойлер Код:
#include "sound.h" #define LOOP 0xff const PROGMEM unsigned int FurElise[] = { 18 , 1 , n8,e2e, n8,xd2, n8,e2e, n8,xd2, n8,e2e, n8,b1, n8,d2, n8,c2, n4,a1, n8,p, n8,c1, n8,e1e, n8,a1, n4,b1, n8,p, n8,e1e, n8,xg1, n8,b1, n4,c2, n8,p, n8,e1e, n8,e2e, n8,xd2, n8,e2e, n8,xd2, n8,e2e, n8,b1, n8,d2, n8,c2, n4,a1, n8,p, n8,c1, n8,e1e, n8,a1, n4,b1, n8,p, n8,e1e, n8,c2, n8,b1, n4,a1, 0 };const PROGMEM unsigned int Mozart[] = { 16 , 1 , n16, xf1, n16, e1e, n16,xd1, n16, e1e, n4,g1, n16,a1, n16,g1, n16,xf1, n16,g1, n4,b1, n16,c2, n16,b1, n16,xa1, n16,b1, n16,xf2, n16,e2e, n16,xd2, n16,e2e, n16,xf2, n16,e2e, n16,xd2, n16,e2e, n4,g2, n8,e2e, n8,g2, n32,d2, n32,e2e, n16,xf2, n8,e2e, n8,d2, n8,e2e, n32,d2, n32,e2e, n16,xf2, n8,e2e, n8,d2, n8,e2e, n32,d2, n32,e2e, n16,xf2, n8,e2e, n8,d2, n8,xc2, n4,b1, 0 };const PROGMEM unsigned int Minuet[] = { 18 , 1 , n4,d2, n8,g1, n8,a1, n8,b1, n8,c2, n4,d2, n4,g1, n4,g1, n4,e2e, n8,c2, n8,d2, n8,e2e, n8,xf2, n4,g2, n4,g1, n4,g1, n4,c2, n8,d2, n8,c2, n8,b1, n8,a1, n4,b1, n8,c2, n8,b1, n8,a1, n8,g1, n4,xf1, n8,g1, n8,a1, n8,b1, n8,g1, n4,b1, n2,a1, 0 };const PROGMEM unsigned int Sirene2[] = { 1 , LOOP, ms (500 ), c2, ms (500 ), g2, 0 };#define PIN_SOUND (*(&PORT_SOUND-2)) #define DDR_SOUND (*(&PORT_SOUND-1)) const PROGMEM unsigned int Empty[] = { 1 , 1 , n4, p, 0 };const unsigned int * const melody[] = {Empty, FurElise, Mozart, Minuet, Sirene2};volatile static unsigned int *pSong;volatile static unsigned char state = SOUND_STOP;volatile static unsigned int durationNote = 0 ;volatile static unsigned int toneNote = 0 ;volatile static unsigned char indexNote = 0 ;volatile static unsigned char statReg = 0 ;volatile static unsigned char repeat = 0 ;#ifndef SOUND_BPM static unsigned char bpm = 0 ;#endif #define SOUND_VOLUME 0 #define SOUND_GEN 1 #define SOUND_BPM_SONG 0 #define SOUND_REPEAT_SONG 1 #define SOUND_START_SONG 2 #define SOUND_COUNTER_CAP 256 #define SOUND_PROG_COUNTER 31 void SOUND_Init (void ) { PORT_SOUND &= ~(1 <<PINX_SOUND); DDR_SOUND |= (1 <<PINX_SOUND); TCCR2A=(0 <<COM2A1) | (0 <<COM2A0) | (0 <<COM2B1) | (0 <<COM2B0) | (0 <<WGM21) | (0 <<WGM20); TCCR2B=(0 <<WGM22) | (0 <<CS22) | (0 <<CS21) | (1 <<CS20); TCNT2=0x00 ; OCR2A=0x00 ; OCR2B=0x00 ; TIMSK2=(1 <<TOIE2); pSong = (unsigned int *)pgm_read_word (&(Empty)); state = SOUND_STOP; durationNote = 0 ; toneNote = 0 ; repeat = 0 ; indexNote = 0 ; statReg = 0 ; #ifndef SOUND_BPM bpm = 0 ; #endif }void SOUND_SetSong (unsigned char numSong) { if (numSong <= SOUND_AMOUNT_MELODY) { pSong = (unsigned int *)pgm_read_word (&(melody[numSong])); } }void SOUND_Com (unsigned char com) { unsigned char saveSreg = SREG; cli (); switch (com){ case SOUND_STOP: state = SOUND_STOP; TIMSK2 &= ~(1 <<OCIE2A); PORT_SOUND &= ~(1 <<PINX_SOUND); break ; case SOUND_PLAY: if (state == SOUND_PAUSE){ state = SOUND_PLAY; TIMSK2 |= (1 <<OCIE2A); } else { #ifndef SOUND_BPM bpm = pgm_read_word (&(pSong[SOUND_BPM_SONG])); #endif indexNote = SOUND_START_SONG; repeat = pgm_read_word (&(pSong[SOUND_REPEAT_SONG])); durationNote = 0 ; state = SOUND_PLAY; TIMSK2 |= (1 <<OCIE2A); } break ; case SOUND_PAUSE: state = SOUND_PAUSE; TIMSK2 &= ~(1 <<OCIE2A); break ; default : break ; } SREG = saveSreg; }void SOUND_PlaySong (unsigned char numSong) { if (numSong <= SOUND_AMOUNT_MELODY) { pSong = (unsigned int *)pgm_read_word (&(melody[numSong])); } #ifndef SOUND_BPM bpm = pgm_read_word (&(pSong[SOUND_BPM_SONG])); #endif indexNote = SOUND_START_SONG; repeat = pgm_read_word (&(pSong[SOUND_REPEAT_SONG])); durationNote = 0 ; state = SOUND_PLAY; TIMSK2 |= (1 <<OCIE2A); }inline static void SOUND_Duration (void ) { static unsigned char counter = 0 ; if (state == SOUND_PLAY){ if (durationNote){ counter++; counter &= SOUND_PROG_COUNTER; if (!counter){ durationNote--; } } else { durationNote = pgm_read_word (&(pSong[indexNote])); if (durationNote) { #ifndef SOUND_BPM durationNote = durationNote/bpm; #endif indexNote++; toneNote = pgm_read_word (&(pSong[indexNote])); if (toneNote!=P) { statReg |= (1 <<SOUND_VOLUME); } else { statReg &= ~(1 <<SOUND_VOLUME); } indexNote++; TIFR2 |=(1 <<OCF2A); } else { if (repeat == LOOP){ indexNote = SOUND_START_SONG; durationNote = 0 ; return ; } repeat--; if (!repeat){ state = SOUND_STOP; TIMSK2 &= ~(1 <<OCIE2A); PORT_SOUND &= ~(1 <<PINX_SOUND); return ; } else { indexNote = SOUND_START_SONG; durationNote = 0 ; } } } } }inline static void SOUND_Tone (void ) { static unsigned int tone = 0 ; if (statReg & (1 <<SOUND_GEN)){ if (statReg & (1 <<SOUND_VOLUME)){ PORT_SOUND ^= (1 <<PINX_SOUND); } tone = toneNote; statReg &= ~(1 <<SOUND_GEN); } if (tone > SOUND_COUNTER_CAP) { tone -= SOUND_COUNTER_CAP; } else { OCR2A = tone; statReg |= (1 <<SOUND_GEN); } }ISR (TIMER2_OVF_vect) { SOUND_Duration (); }ISR (TIMER2_COMPA_vect) { SOUND_Tone (); }
Вернуться наверх
Реклама
Demiurg
Заголовок сообщения: Re: Портирование проекта, проблема с таймером
Добавлено: Пт авг 25, 2023 10:58:37
Это не хвост, это антенна
Карма: 4
Рейтинг сообщений: 139
Зарегистрирован: Ср июн 25, 2008 15:19:44Сообщений: 1478
Рейтинг сообщения: 0
Сравнить по даташитам режимы работы 32 и 328 мег. То есть, не просто скопировать как есть код. А понять какие режимы таймера в исходном проекте и как запускать аналогичные режимы на 328 Меге.
Вернуться наверх
Реклама
kote52
Заголовок сообщения: Re: Портирование проекта, проблема с таймером
Добавлено: Пт авг 25, 2023 13:25:49
Зарегистрирован: Пт мар 19, 2021 08:58:45Сообщений: 118
Рейтинг сообщения: 0
Сравнить по даташитам режимы работы 32 и 328 мег. То есть, не просто скопировать как есть код. А понять какие режимы таймера в исходном проекте и как запускать аналогичные режимы на 328 Меге.
Код в любом случае скопирован "как есть", изменен с учетом настройки таймера2 на меге328, режимы применены теже!
Я хотел сказать что автор пишет биты для таймера 0 в регистр таймера 2. Если честно меня смутил ваш ответ, дежурный чтоли...
Вернуться наверх
OKF
Заголовок сообщения: Re: Портирование проекта, проблема с таймером
Добавлено: Пт авг 25, 2023 15:17:16
Сверлит текстолит когтями
Карма: 12
Рейтинг сообщений: 124
Зарегистрирован: Вт июн 07, 2011 08:03:18Сообщений: 1217
Рейтинг сообщения: -1
Я хотел сказать что автор пишет биты для таймера 0 в регистр таймера 2.
Ну не красиво, конечно. Ошибся. Автору повезло в том, что в 8535 TCCR0 и TCCR2 совпадают по битам.
Вернуться наверх
kote52
Заголовок сообщения: Re: Портирование проекта, проблема с таймером
Добавлено: Пт авг 25, 2023 15:58:56
Зарегистрирован: Пт мар 19, 2021 08:58:45Сообщений: 118
Рейтинг сообщения: 0
OKF писал(а):
Ну не красиво, конечно. Ошибся. Автору повезло в том, что в 8535 TCCR0 и TCCR2 совпадают по битам.
Я почему не могу эту шарманку завести? Нашел на
github.com реализацию этой же шарманки играет на тиньке13
Вернуться наверх
Реклама
OKF
Заголовок сообщения: Re: Портирование проекта, проблема с таймером
Добавлено: Пт авг 25, 2023 17:09:53
Сверлит текстолит когтями
Карма: 12
Рейтинг сообщений: 124
Зарегистрирован: Вт июн 07, 2011 08:03:18Сообщений: 1217
Рейтинг сообщения: -1
Я почему не могу эту шарманку завести?
Ну кто ж его знает... Видать, просветление не наступило.)
Вернуться наверх
Реклама
Страница 1 из 1
[ Сообщений: 6 ]
Кто сейчас на форуме
Сейчас этот форум просматривают: Google [Bot] и гости: 8
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения