Помогите пожалуйста написать код на С для AVR Studio 4 чтоб шим был на всех ножках кроме PD2, PD3, PB6, PB7 для ATmega8 чтоб был в виде - задал скажем 24 - будет 24из255 на заданой ноге, а на других - другие заданые значения. Заранее спасибо за помощь.
Atmega8 и программный шим
Модератор: boogyman
- AntonChip
- Администратор
- Сообщения: 265
- Зарегистрирован: 24 дек 2011, 22:11
- Откуда: Киров
- Контактная информация:
Re: Atmega8 и программный шим
Сделал для порта В, для остальных таким же примером попробуй.
Код: Выделить всё
#include <avr/interrupt.h>
#include <avr/io.h>
volatile char pwm_counter, pwm_1, pwm_2,pwm_3, pwm_4 ,pwm_5, pwm_6;
/*** прерывание по переполнению Т0 ***/
ISR (TIMER0_OVF_vect)
{
if (pwm_counter++ > 254)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > pwm_1)
PORTB |= (1 << PB0);
if (pwm_counter > pwm_2)
PORTB |= (1 << PB1);
if (pwm_counter > pwm_3)
PORTB |= (1 << PB2);
if (pwm_counter > pwm_4)
PORTB |= (1 << PB3);
if (pwm_counter > pwm_5)
PORTB |= (1 << PB4);
if (pwm_counter > pwm_6)
PORTB |= (1 << PB5);
}
/*** процедура задержки в микросекундах ***/
void delay_us(unsigned char time_us)
{ register unsigned char i;
for(i = 0; i < time_us; i++) // 4 цикла
{ asm (" PUSH R0 "); // 2 цикла
asm (" POP R0 "); // 2 цикла
// 8 циклов = 1 us для 8MHz
}
}
/*** процедура задержки в миллисекундах ***/
void delay_ms(unsigned int time_ms)
{ register unsigned int i;
for(i = 0; i < time_ms; i++)
{ delay_us(250);
delay_us(250);
delay_us(250);
delay_us(250);
}
}
/*** переход цветa ***/
void rgb (unsigned int time)
{
for (char a = 0; a<255; a++)
{
pwm_1 = 254 - a;
pwm_2 = 254 - a;
pwm_3 = 254 - a;
pwm_4 = 254 - a;
pwm_5 = 254 - a;
pwm_6 = 254 - a;
delay_ms(time);
}
for (char a = 0; a<255; a++)
{
pwm_1 = a;
pwm_2 = a;
pwm_3 = a;
pwm_4 = a;
pwm_5 = a;
pwm_6 = a;
delay_ms(time);
}
}
int main (void)
{
DDRB = (1 << PB5)|(1 << PB4)|(1 << PB3)|(1 << PB2)|(1 << PB1)|(1 << PB0);
// PB3,2,1 - выходы
TIMSK |= (1 << TOIE0);
// разрешение прерывания
TCCR0 |= (0 << CS02)|(0 << CS01)|(1 << CS00);
// без предделителя
sei();// глобальное разрешение прерываний
while(1)
{
rgb(5);
}
}