MEGA8515L 8xШИМ на CodevisionAVR

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
bal-bes
Родился
Сообщения: 4
Зарегистрирован: Вс июн 19, 2011 08:57:21

MEGA8515L 8xШИМ на CodevisionAVR

Сообщение bal-bes »

Добрый день! Вот не пойму и все... Помогите с кодом

Есть мега8515л на PORTC светодиоды. на PORTA кнопки.
Бегающие огни и тд все могу, а вот плавное свечение/гашение нескольких светодиодов не - то есть нажал кнопку PORTA.x в PORTC.x началось плавное изменение яркости. Еще нажатие - пауза- яркость не меняется. таким образом на всех светодиодах разная яркость. аппаратный шим знаю - не то. прошу код на С для CODEVISIONAVR с комментариями где использутся хитрые Сишные ~!<<+= и тд. азы расписывать не надо. знаю хорошо паскаль а с си борюсь вот........ заранее спасибо!!!!!
Реклама
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: MEGA8515L 8xШИМ на CodevisionAVR

Сообщение vovik15 »

если я правильно понял,то вам нужно ввыжать 8 каналов шим?
в вашей меге есть апаратный шим,если я не ошибаюсь 4х канальный,вот его и используйте
Реклама
bal-bes
Родился
Сообщения: 4
Зарегистрирован: Вс июн 19, 2011 08:57:21

Re: MEGA8515L 8xШИМ на CodevisionAVR

Сообщение bal-bes »

Ну да, там есть 3 аппаратных, с ними все понятно, но я хочу разобраться именно с программным ШИМ и что-бы в один момент времени скважность во всех каналах могла быть разной.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: MEGA8515L 8xШИМ на CodevisionAVR

Сообщение Engineer_Keen »

Программный ШИМ делается просто. Заводим n+1 переменных (n-количество каналов ШИМ, n+1 - счетчик). По какому-нибудь таймеру прибавляем к счетчику единицу. Сравниваем его сначала с нулем, если равно - все пины порта в 1. Потом по очереди сравниваем с n-переменными, если какая-либо из n меньше (или равна), соответствующую ножку в 0. Чтобы все ноги работали в фазе и не было пиков при нулевом значении, выводить данные в порт нужно после всех сравнений (результаты сравнений хранить во временной переменной, ее потом и выводить). В Сях не очень разбираюсь, на асме работало.
Реклама
Эиком - электронные компоненты и радиодетали
bal-bes
Родился
Сообщения: 4
Зарегистрирован: Вс июн 19, 2011 08:57:21

Re: MEGA8515L 8xШИМ на CodevisionAVR

Сообщение bal-bes »

Спасибо Engineer_Keen!!! Алгоритм я знаю, делал на паскале. Блин, с 94 года писал на паскаль-делфи, но это не для атмел. коряво и не оптимально. вот разбираюсь в Си поэтому и прошу исходник на Codevision. Тяжело переучиваться........мда :shock:
Реклама
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: MEGA8515L 8xШИМ на CodevisionAVR

Сообщение vovik15 »

держи

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

//использован внутрений осцилятор на 4мгц
#include <mega8515.h>
#include <delay.h>

#define Aup (~PINA)&(1 << 0) //a++
#define Adn (~PINA)&(1 << 1) //a--

#define Bup (~PINA)&(1 << 2) //b++
#define Bdn (~PINA)&(1 << 3) //b--

unsigned char count; //cчсетчик
unsigned char A,B; //канал 1 и 2


// ПРЕРВАНИЕ ОТ TMR0
interrupt [TIM0_OVF] void timer0 (void)
{
TCNT0 = 210; //чтобы частота была больше
count++; //++ по переполнению таймера
if(count == 0) PORTC = 0xff; //если 0 все линии в 1
if(A<= count) PORTC.0 = 0; //выключаем первый канал
if(B<= count) PORTC.1 = 0; //выключаем втрой канал
}

void main(void)
{
PORTA=0x00;//обнуляем
DDRA=0b11110000; 
PORTB=0x00;//обнуляем
DDRB=0xFF; //все на выход
PORTC=0x00;//обнуляем
DDRC=0xFF; //все на выход
PORTD=0x00;//обнуляем
DDRD=0xFF; //все на выход
PORTE=0x00;//обнуляем
DDRE=0x07; //все на выход

//подготовка TMR0
TCCR0 = 0b00000010; //1:8,normal
TCNT0 = 210; //обнуляем счетный регистр
OCR0=0x00;//обнуляем регистр сравнния
TIMSK=TIMSK|=0b00000010; //разрешаем перрывание TOIE

#asm("sei"); //разрешаем прерывания глобально
ACSR=0x80; //выключаем компаратор

A = 128; //50% по умолчанию
B = 128; //50% по умолчанию
while(1){

//опрос кнопок
//первый канал
if (A > 0) {if (Adn ) A --;}
if (A <=254) {if (Aup)  A++;}

//второй канал
if (B > 0)  {if (Bdn) B --;}
if (B <=254){if (Bup)  B++;}

delay_ms(10); //пауза

} //конец бесконечного цикла
}






Реклама
bal-bes
Родился
Сообщения: 4
Зарегистрирован: Вс июн 19, 2011 08:57:21

Re: MEGA8515L 8xШИМ на CodevisionAVR

Сообщение bal-bes »

Спасибо!!!! пойду ковырять..........
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: MEGA8515L 8xШИМ на CodevisionAVR

Сообщение ploop »

Чтобы частота была побольше, можно использовать не 8-разрядный ШИМ, а поменьше.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»