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

Модератор: boogyman

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

Сообщение:#1  Сообщение Zalognik » 05 фев 2012, 22:35

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

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

Сообщение:#2  Сообщение AntonChip » 06 фев 2012, 07:22

Сделал для порта В, для остальных таким же примером попробуй.

Код: Выделить всё
#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);
}
}
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 202
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров


Вернуться в Микроконтроллеры AVR

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

cron
Rambler's Top100