Это прописная истина, которая вечна.edm2007 писал(а):константин_KoSS_89
P.S. А можно просто прикрутить к контроллеру обиженную женщину. Уверен, гадать на что и когда она обиделась Вы будете очень долго. Тут любой генератор случайностей отдыхает.
BASCOM AVR в вопросах и ответах
- Реклама
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Этого контроллера мало?Tankor писал(а):ATMega328.
Это столько кода написали или есть какие-то данные, типа картинок, шрифтов и т. д.?
Пара картинок есть, но они маленькие. Шрифты "доделываю"родные.Мурик писал(а):Этого контроллера мало?Tankor писал(а):ATMega328.![]()
![]()
Это столько кода написали или есть какие-то данные, типа картинок, шрифтов и т. д.?
- Вложения
-
- Новая папка.rar
- (14.25 КБ) 203 скачивания
привет, а есть у кого код для софтового шима? с коментариями, так чтоб разобраться.
20 каналов хочу сделать
20 каналов хочу сделать
Здравствуйте.
Если Вы знаете как работает аппаратный ШИМ, то запросто напишете программный на одном таймере. Другое дело, что контроллер только и будет занят этой задачей. Лучше посмотрите в сторону BAM.
Если Вы знаете как работает аппаратный ШИМ, то запросто напишете программный на одном таймере. Другое дело, что контроллер только и будет занят этой задачей. Лучше посмотрите в сторону BAM.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Реклама
а можно поподробнее, я новичек в этом деле, как работает шим в курсе а вот как организовать его на 20 каналов не представляю 
Примитивно об аппаратной ШИМ: таймер молотит от 0 до максимального значения. При каждом увеличении счетного регистра его значение сравнивается со значением в регистре сравнения. Если значение счетного регистра достигло значения в регистре сравнения, то на выводе OC выставляется 1 (или 0 - зависит от того, прямой или инверсный режим настроен). При переполнении счетного регистра вывод OC сбрасывается в 0 (или выставляется в 1, опять же). Таким образом, при неизменной частоте меняется скважность. Что и требуется.
Настройте и запустите таймер по переполнению, заведите переменную счетчика (которую будете увеличивать в обработчике таймера - это будет счетный регистр), заведите 20 переменных со значениями яркости каждого канала (это будут регистры сравнения) и в обработчике сравнивайте значение счетчика со значениями каналов. Если счетчик таймера не достиг значения яркости, то на выводе выставляете 0, если равен или больше - 1. Если счетчик переполнился - сбрасываем все каналы в 0. Получится инверсный режим. Как сделать прямой, догадаться не трудно...
Настройте и запустите таймер по переполнению, заведите переменную счетчика (которую будете увеличивать в обработчике таймера - это будет счетный регистр), заведите 20 переменных со значениями яркости каждого канала (это будут регистры сравнения) и в обработчике сравнивайте значение счетчика со значениями каналов. Если счетчик таймера не достиг значения яркости, то на выводе выставляете 0, если равен или больше - 1. Если счетчик переполнился - сбрасываем все каналы в 0. Получится инверсный режим. Как сделать прямой, догадаться не трудно...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
спасибо, на досуге попробую 
Думал, как бы и пример показать, и дать возможность самому написать, особо не давая готовое. И решил, а собственно, пусть это будет, во-первых, 8 каналов. А во-вторых - на Си.
Код можно неплохо оптимизировать, но тогда наглядность исчезнет, а я именно эту цель преследовал. Ну и главное - все работает (хоть и на фото сложно яркость светодиодов передать):

Жду ответ от Вас, уже на баскоме.
Спойлер
Код: Выделить всё
//*****************************************[ОПИСАНИЕ ПРОГРАММЫ]************************************************
//
// Микроконтроллер: ATMEGA8A
// Частота: 4MHz
//
// SoftPWM 8-channel (0 - максимальная яркость, 255 - светодиод погашен)
//*************************************[ПОДКЛЮЧАЕМЫЕ ФАЙЛЫ И МАКРОСЫ]******************************************
#define F_CPU 4000000UL // тактовая частота
#include <avr/io.h> // работа с AVR
#include <avr/interrupt.h> // работа с прерываниями
#define DDR_LED DDRD // порт светодиодов
#define PORT_LED PORTD
#define LED1 PD7
#define LED2 PD6
#define LED3 PD5
#define LED4 PD4
#define LED5 PD3
#define LED6 PD2
#define LED7 PD1
#define LED8 PD0
//*****************************************[ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ]*********************************************
uint8_t counter = 0; // счетный регистр таймера
uint8_t bright[8] = {40, 70, 100, 150, 180, 200, 220, 250}; // значения яркости 8-ми каналов
//*********************************************[ПРЕРЫВАНИЯ]****************************************************
ISR(TIMER0_OVF_vect) // обработчик таймера 0 по переполнению
{
if (++counter == 255) // если счетчик переполнился
{
counter = 0; // сбрасываем его
PORT_LED = 0xFF; // и гасим все светодиоды
}
else // в ином случае, проверяем, какой светодиод пришло время зажечь
{
if (counter >= bright[0]) PORT_LED &= ~(1 << LED1);
if (counter >= bright[1]) PORT_LED &= ~(1 << LED2);
if (counter >= bright[2]) PORT_LED &= ~(1 << LED3);
if (counter >= bright[3]) PORT_LED &= ~(1 << LED4);
if (counter >= bright[4]) PORT_LED &= ~(1 << LED5);
if (counter >= bright[5]) PORT_LED &= ~(1 << LED6);
if (counter >= bright[6]) PORT_LED &= ~(1 << LED7);
if (counter >= bright[7]) PORT_LED &= ~(1 << LED8);
}
}
//********************************************[ОСНОВНОЙ ЦИКЛ]**************************************************
int main(void)
{
DDR_LED = 0xFF; // весь порт на выход
PORT_LED = 0xFF; // все светодиоды погашены (управляются 0)
TCCR0 |= ((0 << CS02) | (0 << CS01) | (1 << CS00)); // таймер 0: прескаллер - 1
TIMSK |= (1 << TOIE0); // прерывание по переполнению
sei(); // глобальное разрешение прерываний
while(1) // пустой основной цикл
{
}
}
//*******************************************[КОНЕЦ ПРОГРАММЫ]*************************************************
Жду ответ от Вас, уже на баскоме.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Сообщения: 602
- Зарегистрирован: Пн дек 29, 2008 01:40:28
- Откуда: (Украина, г. Стаханов, Луганская обл.) теперь Кемерово :)
edm2007 Скажите а отладочная у вас случайно не самодельная, если да можно печаткой поделится.
Самодельнее некуда.
Но увы, канула в вечность. Шаблон для фоторезиста где-то был... На самом деле отладочная плата это очень просто. Делаем модули из того что есть (и того что нужно) на одной плате. А так как представления о нужности у каждого разные, то и плата у каждого своя.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
edm2007 круто!а такая ардуина http://www.ilyichevsk.org/2010/06/metab ... b-usb.html будет работать в BASCOM AVR?если да то какой программатор выбрать в программе?
думаю поставить атмега 168
думаю поставить атмега 168
Каким будете шить, тот и выбирайте. Это по сути просто МК с обвязкой, а USB реализовано программно:pavel1979 писал(а):если да то какой программатор выбрать в программе?
Metaboard - Arduino-совместимая плата с USB, но без USB-чипа. USB реализовано в микропрограмме ATmega, код основан на драйвере V-USB от Objective Development (на этом драйвере основаны все реализации протокола USB на AVR)
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
Спасибо!буду искать варианты....надоело каждый раз травить новую плату...
Как вариант.pavel1979 писал(а):буду искать варианты
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
- Сообщения: 66
- Зарегистрирован: Сб янв 28, 2006 01:01:04
Как вывести зеркально байт? Есть команда или надо программно решать?
- Сообщения: 9
- Зарегистрирован: Ср дек 12, 2012 23:51:21
bumbum писал(а):Как вывести зеркально байт? Есть команда или надо программно решать?
Toggle Переменная_byte
- Сообщения: 66
- Зарегистрирован: Сб янв 28, 2006 01:01:04
Это инвертирование, а надо зеркально- развернуть относительно центра )sasha_1973 писал(а):bumbum писал(а):Как вывести зеркально байт? Есть команда или надо программно решать?
Toggle Переменная_byte
- Сообщения: 9
- Зарегистрирован: Ср дек 12, 2012 23:51:21
Это инвертирование, а надо зеркально- развернуть относительно центра
Поменять полубайты местами?
Поменять полубайты местами?


