Вот проект для Тини2313 отличается от Мега8 только названиями регистров таймера. Но на Мега8 работает, а на Тини2313 я так понимаю он зависает, и я подозревая что это из-за увиличения Data Stack Size с 32 до 36. Может кто подскажет как изминить прогу чтобы уложиться в 32?
Code
/*****************************************************
Chip type : ATtiny2313
Clock frequency : 8,000000 MHz
*****************************************************/
#include <tiny2313.h>
#include <delay.h>
#include <stdio.h>
//************************************************************
//Переменные и функции RC5
//************************************************************
unsigned char cnt_bit = 0; //счетчик принятых бит
unsigned char code [14]; //принятый код
unsigned char counter = 0; //"тики" таймера
#define l_min 40 //диапазон для "длинного" (long) интервала в посылке, в "тиках" таймера, 1,28..2,176мс
#define l_max 68
#define s_min 22 //диапазон для "короткого" (short) интервала в посылке, в "тиках" таймера, 0,704..1,088мс
#define s_max 34
bit state = 0; //флаг состояния линии приема
bit error = 0; //флаг ошибки
//переменные структуры посылки, всего 14 бит
unsigned char toggle = 0; //триггерный бит, инвертируется в посылке при нажатии кнопки, при удержании - не инв.!
unsigned char address = 0; //адрес устройства, 5 бит
unsigned char command = 0; //команда (данные), 6 бит
void c_r_c(void){
char i;
for (i=0; i<14; i++) code[i]=0;
}
void c_tim(void){
TCCR0A = 0x00;
TCCR0B = 0x00; //останавливаем таймер
TCNT0 = 0x00; //обнуляем таймер
cnt_bit = 0; //обнуляем счетчик принятых бит
}
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
counter = TCNT0; //сохраяем значение таймера-счетчика
TCNT0 = 0x00; //обнуляем таймер
error = 1; //поставили ошибку - потом сбросим в теле, если все ок
if (cnt_bit == 0){ //старт посылки
TCCR0A = 0x00;
TCCR0B = 0x04; //запускаем таймер, частота 31250кГц (или надо править диапазоны тиков для интервалов)
code [cnt_bit] = !PIND.2; //записываем бит кода, PIND.2 - входная нога, прерывание 0
cnt_bit++; //увеличиваем счетчик принятых бит
state = 1; //ставим флаг, т.к. была 1
}else{ //в других случаях (не первое срабатывание прерывания)
if ((counter>s_min) && (counter<s_max)){ //проверка короткого промежутка
if (state){ //если была 1
state = 0; //обнуляем состояние
error = 0; //и ошибку, т.к. все корректно
} else { //если был 0
state = 1; //ставим флаг, т.к. теперь - 1
code[cnt_bit] = !PIND.2; //записываем данные - состояние линии
cnt_bit++; //увеличиваем счетчик приема
error=0; //обнуляем ошибку, т.к. все корректно
};
};
if ((counter>l_min) && (counter<l_max)){ //проверка длинного промежутка
code[cnt_bit] = !PIND.2; //записываем данные - состояние линии
cnt_bit++; //увеличиваем счетчик приема
error = 0; //обнуляем ошибку, т.к. все корректно
};
if (error == 1){ //если не попали ни в один из промежутков, то
c_tim();
counter = 0; //обнуляем счетчик
c_r_c(); //обнуляем массив принятого кода
};
if (cnt_bit == 14){ //если приняли все 14 бит
c_tim();
toggle = code[2]; //триггер-бит
//формируем переменные адреса и команды
address = (code[3] << 4)|(code[4] << 3)|(code[5] << 2)|(code[6] << 1)|code[7];
command = (code[8] << 5)|(code[9] << 4)|(code[10] << 3 )|(code[11] << 2)|(code[12] << 1)|code[13];
c_r_c(); //обнуляем массив принятого кода
};
};
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
c_tim();
counter = 0; //обнуляем счетчик
c_r_c();
}
//************************************************************
void main(void)
{
// Port B initialization
PORTB=0x00;
DDRB=0x4D;
// Port D initialization
PORTD=0x04;
DDRD=0x00;
// Timer/Counter 0 initialization
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// INT1: Off
GIMSK=0x40;
MCUCR=0x02;
EIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=0x33;
#asm ("sei")
printf("Power_OK \n\r");
while (1)
{
printf("Address: %u ", address);
printf("Comand: %u", command);
printf("\n\r");
}
}