[an error occurred while processing this directive]
|
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.1d Standard
Automatic Program Generator
© Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.ro
e-mail:office@hpinfotech.roProject :
Version :
Date : 17.05.2005
Author : Yuri Ryzhenko
Company :
Comments:
Chip type : ATtiny2313
Clock frequency : 7,372800 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 32Восьмиканальный программный ШИМ
Таймер 0 использует для тактирования частоту основного тактового генератора
Каждые 256 тактов происходит переполнение таймера и соответственно прерывание
Каждое прерывание увеличивает на 1 основной 8 разрядный счетчик ШИМ. Полный
цикл ШИМ - 256 входов в прерывание. По переполнению основного счетчика ШИМ
происходит сброс и начинается новый цикл. Таким образом несущая частота ШИМ
= Fclk/256/256 = 112 Гц при частоте основного генератора 7,372800 MHz.
Что бы увеличить несущую частоту ШИМ, можно предустанавливать таймер на
большее чем 0 значение.Значения ШИМ передаются в ШИМ из промежуточного буфера с каждым новым циклом
ШИМ. Значения в промежуточный буфер передаются с каждым успешным приемом
кадра из USART. Прием кадра в USART описан в начале процедуры обработки
прерывания по приему USART.Таймер 1 сбрасывает в "0" ШИМ если в USART не приходит информация в течении
0,5 сек.
*****************************************************/#include
#include// Declare your global variables here
register char rx_buf[11];
register char im_buf[8];
register char out[8];
register char PWM=0;
void main(void)
{
// Declare your local variables here
char i;// Crystal Oscillator division factor: 1
CLKPR=0x80;
CLKPR=0x00;// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xFF;// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 921,600 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x01;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 115,200 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x82;// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 115200
UCSRB=0x98;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=0x03;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
// Сброс промежуточного и рабочего буферов ШИМ
for (i=0;i<8;i++)
{
out[i]=0;
im_buf[i]=0;
}// Проверочное включение всех индикаторов на 3 сек при включении
PORTB|=255;
delay_ms(3000);
PORTB&=0;// Global enable interrupts
#asm("sei")while (1)
{
};
}
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char CRC;TCNT1=0; //Зануление таймера "Сброса при отсутствии сигнала"
//Сдвиг содержимого приемного буфера
rx_buf[0]=rx_buf[1];
rx_buf[1]=rx_buf[2];
rx_buf[2]=rx_buf[3];
rx_buf[3]=rx_buf[4];
rx_buf[4]=rx_buf[5];
rx_buf[5]=rx_buf[6];
rx_buf[6]=rx_buf[7];
rx_buf[7]=rx_buf[8];
rx_buf[8]=rx_buf[9];
rx_buf[9]=rx_buf[10];
rx_buf[10]=UDR;//Проверяем целость кадра и передаем в массив ШИМ
if (rx_buf[0]==0x11) //Первая часть преамбулы есть?
{
if (rx_buf[1]==0x22) //Вторая часть преамбылы есть?
{
CRC=0;
CRC^=rx_buf[2]; //Вычисляем контрольную сумму ТОЛЬКО ИНФОРМАЦИОННЫХ байт
CRC^=rx_buf[3];
CRC^=rx_buf[4];
CRC^=rx_buf[5];
CRC^=rx_buf[6];
CRC^=rx_buf[7];
CRC^=rx_buf[8];
CRC^=rx_buf[9];
if (CRC==rx_buf[10]) //Контрольная сумма совпадает?
{
im_buf[0]=rx_buf[2]; //Перенос приемного буфера в промежуточный буфер
im_buf[1]=rx_buf[3];
im_buf[2]=rx_buf[4];
im_buf[3]=rx_buf[5];
im_buf[4]=rx_buf[6];
im_buf[5]=rx_buf[7];
im_buf[6]=rx_buf[8];
im_buf[7]=rx_buf[9];
}
}
}
}// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PWM++;
if (PWM>=out[0]) PORTB&=0B11111110;
if (PWM>=out[1]) PORTB&=0B11111101;
if (PWM>=out[2]) PORTB&=0B11111011;
if (PWM>=out[3]) PORTB&=0B11110111;
if (PWM>=out[4]) PORTB&=0B11101111;
if (PWM>=out[5]) PORTB&=0B11011111;
if (PWM>=out[6]) PORTB&=0B10111111;
if (PWM>=out[7]) PORTB&=0B01111111;
if (PWM==0) /*С началом нового цикла берем новые значения для ШИМ
из промежуточного буфера*/
{
PORTB=0xFF;
out[0]=im_buf[0];
out[1]=im_buf[1];
out[2]=im_buf[2];
out[3]=im_buf[3];
out[4]=im_buf[4];
out[5]=im_buf[5];
out[6]=im_buf[6];
out[7]=im_buf[7];
}
}
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Полный сброс всего если в порт ничего не приходит
char i;
for (i=0;i<8;i++)
{
out[i]=0;
im_buf[i]=0;
}
}
E-mail: info@telesys.ru