Портирование проекта, проблема с таймером

Обсуждаем контроллеры компании Atmel.
Ответить
kote52
Встал на лапы
Сообщения: 120
Зарегистрирован: Пт мар 19, 2021 08:58:45

Портирование проекта, проблема с таймером

Сообщение kote52 »

Всем привет! Приспичило мелодию проиграть на мк, на chipenable.ru нашел проект к меге8535, решил его перетащить на atmega328p. И как бы я все сделал, но ни чего не работает... Генерация на ножке мк есть, постоянно одна частота идет. Собрал в протусе проект автора, все играет. С самого начала у меня возникли большие вопросы, настраивается таймер 2, а биты для таймера 0 - это как и почему это работает? :facepalm:

Код: Выделить всё

//настройка таймера T2
  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);
  
  //настройка таймера T2
  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;
}

//проиграть мелодию под номером numSong
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);
  }
}

//прерывания таймера Т2______________________
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  //если закомментировать длительность нот будет 
                              //расчитываться из заданного в мелодии BPM`а

#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 //SOUND_H
tone.h
Спойлер

Код: Выделить всё

/*****************************************************************************
*
*   Tone definition. Each tone are set up with a value which will give the 
*   right frequency when applied to a 16-bits timer with PWM. These values are based
*   on a CLKcpu running @ 1Mhz.
*
*   First find the frequency for all tones. 
*
*   Formula:    ToneX = Bf * 2^(ToneX/12)
*   
*   ToneX: the actual tone, e.g. C0 = 3
*   Bf: Basefrequency = 220Hz (A)
*
*       
*   E.g: For tone C0 this would be:     C0 = 220 * 2^(3/12)
*                                       C0 = 261,6256...
*
*   Now we must find which value to put in a 16-bits timer with PWM to achieve 
*   this frequency
*
*   Formula:    Timer value = 1Mhz / ToneHz / 2
*
*   E.g: For tone C0 this would be:     Timer value = 1000000 / 261,6256... / 2
*                                       Timer value = 1911
*
*   Set up a 16-bits timer to run at Phase/Freq-correct PWM, top value = ICR1,
*   set OC1A when upcounting, clear when downcounting.
*   
*****************************************************************************/

#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)        // tone 0
#define xA  fn(2145)        // tone 1
#define Ax  fn(2145)        // tone 1
#define B   fn(2025)        // tone 2
#define C0  fn(1911)       // tone 3
#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           // pause

/******************************************************************************
*
*   The tone definitions are duplicated to accept both upper and lower case
*
******************************************************************************/

#define a   fn(2273)        // tone 0
#define xa  fn(2145)       // tone 1
#define ax  fn(2145)        // tone 1
#define b   fn(2024)        // tone 2
#define c0  fn(1911)        // tone 3
#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);
	
	// Timer/Counter 2 initialization
	// Clock source: System Clock
	// Clock value: 16000,000 kHz
	// Mode: Normal top=0xFF
	// OC2A output: Disconnected
	// OC2B output: Disconnected
	// Timer Period: 0,016 ms
	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;
	// Timer/Counter 2 Interrupt(s) initialization
	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;
}

//проиграть мелодию под номером numSong
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);
	}
}

//прерывания таймера Т2
ISR(TIMER2_OVF_vect)
{
	SOUND_Duration();
}

ISR(TIMER2_COMPA_vect)
{
	SOUND_Tone();
}
Реклама
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Портирование проекта, проблема с таймером

Сообщение Demiurg »

Сравнить по даташитам режимы работы 32 и 328 мег. То есть, не просто скопировать как есть код. А понять какие режимы таймера в исходном проекте и как запускать аналогичные режимы на 328 Меге.
Реклама
kote52
Встал на лапы
Сообщения: 120
Зарегистрирован: Пт мар 19, 2021 08:58:45

Re: Портирование проекта, проблема с таймером

Сообщение kote52 »

[uquote="Demiurg",url="/forum/viewtopic.php?p=4467768#p4467768"]Сравнить по даташитам режимы работы 32 и 328 мег. То есть, не просто скопировать как есть код. А понять какие режимы таймера в исходном проекте и как запускать аналогичные режимы на 328 Меге.[/uquote]
Код в любом случае скопирован "как есть", изменен с учетом настройки таймера2 на меге328, режимы применены теже!
Я хотел сказать что автор пишет биты для таймера 0 в регистр таймера 2. Если честно меня смутил ваш ответ, дежурный чтоли...
OKF
Это не хвост, это антенна
Сообщения: 1405
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: Портирование проекта, проблема с таймером

Сообщение OKF »

[uquote="kote52",url="/forum/viewtopic.php?p=4467812#p4467812"]Я хотел сказать что автор пишет биты для таймера 0 в регистр таймера 2.[/uquote]
Ну не красиво, конечно. Ошибся. Автору повезло в том, что в 8535 TCCR0 и TCCR2 совпадают по битам.
Реклама
Эиком - электронные компоненты и радиодетали
kote52
Встал на лапы
Сообщения: 120
Зарегистрирован: Пт мар 19, 2021 08:58:45

Re: Портирование проекта, проблема с таймером

Сообщение kote52 »

OKF писал(а):Ну не красиво, конечно. Ошибся. Автору повезло в том, что в 8535 TCCR0 и TCCR2 совпадают по битам.
Я почему не могу эту шарманку завести? Нашел на github.com реализацию этой же шарманки играет на тиньке13 :shock:
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1405
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: Портирование проекта, проблема с таймером

Сообщение OKF »

[uquote="kote52",url="/forum/viewtopic.php?p=4467872#p4467872"]Я почему не могу эту шарманку завести?[/uquote]
Ну кто ж его знает... Видать, просветление не наступило.)
Реклама
Ответить

Вернуться в «AVR»