[an error occurred while processing this directive]
Вот, может и громоздко, но работает. Для Tiny2313.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Altair 24 октября 2005 г. 10:48
В ответ на: В прерывании от таймера крутишь счетчик. В основном теле постоянно анализируешь этот счетчик каждым ШЫМ каналом. Дошло до нужного - ШЫМ включился. При переполнении счетчика все каналы в ноль. И по новой. отправлено Altair 24 октября 2005 г. 10:44


/*****************************************************
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.ro

Project :
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: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru