Страница 1 из 1

Atmega8 и программный шим

Добавлено: 05 фев 2012, 23:35
Zalognik
Помогите пожалуйста написать код на С для AVR Studio 4 чтоб шим был на всех ножках кроме PD2, PD3, PB6, PB7 для ATmega8 чтоб был в виде - задал скажем 24 - будет 24из255 на заданой ноге, а на других - другие заданые значения. Заранее спасибо за помощь.
Изображение

Re: Atmega8 и программный шим

Добавлено: 06 фев 2012, 08:22
AntonChip
Сделал для порта В, для остальных таким же примером попробуй.

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

#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);
}
}