Энкодер + Программный шим + atmega8
Написал Zalognik дата Пн, 06/11/2012 - 17:47
Всем привет.
Собрал я регулятор тремя светодиодами по схеме:
Только подключена лента светодиодная на 12В через ULN2003.
Частота 8МГц внутренняя.
Программа:
// Принцип работы энкодера. Управляем RGB светодиодом с помощью энкодера #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> volatile char pwm_counter,pwm_r,pwm_g,pwm_b, button = 0; // Обработчик прерывания int0 ISR(SIG_INTERRUPT0) {_delay_us(50); if((PIND & (1 << PD2))==0) {_delay_us(50); if((PIND & (1 << PD0))==0) { if(button == 0) // уменьшаем красный цвет { pwm_r--; if(pwm_r < 1) pwm_r = 1; } if(button == 1) // уменьшаем зеленый цвет { pwm_g--; if(pwm_g < 1) pwm_g = 1;} if(button == 2) // уменьшаем синий цвет { pwm_b--; if(pwm_b < 1) pwm_b = 1; } } else { if(button == 0) // увеличиваем красный цвет { pwm_r++; if(pwm_r > 64) pwm_r = 64; } if(button == 1) // увеличиваем зеленый цвет { pwm_g++; if(pwm_g > 64) pwm_g = 64; } if(button == 2) // увеличиваем синий цвет { pwm_b++; if(pwm_b > 64) pwm_b = 64; } } } GIFR = (1< 63) { PORTB = 0x00; pwm_counter = 0; } if (pwm_counter > pwm_r) PORTB |= (1 << PB0); if (pwm_counter > pwm_g) PORTB |= (1 << PB1); if (pwm_counter > pwm_b) PORTB |= (1 << PB2); } // Главная функция int main (void) { DDRB |= (1 << PB5)|(1 << PB4)|(1 << PB3)|(1 << PB2)|(1 << PB1)|(1 << PB0); // выходы PORTB = 0x00; DDRD |= (0 << PD2)|(0 << PD1)|(0 << PD0); // входы PORTD |= (1 << PD2)|(1 << PD1)|(1 << PD0); // подключаем подтягивающие резисторы TIMSK |= (1 << TOIE0); // разрешение прерывания по таймеру0 TCCR0 |= (1 << CS00); MCUCR |= (0 << ISC00)|(1 << ISC01); // прерывание по заднему фронту INT0(по спаду импульса) GIFR |= (1 << INTF0); // очищаем флаг внешнего прерывания GICR |= (1 << INT0); // разрешаем внешние прерывания INT0 sei(); //глобально разрешаем прерывания pwm_r = 64; // начальные установки цветов, min яркость pwm_g = 64; pwm_b = 64; while(1) { if((PIND & (1 << PD1))==0) // если нажата кнопка { while((PIND & (1 << PD1))==0){} // ждем отпускания кнопки button++; _delay_ms(100); if(button == 3) button = 0; } if(button == 0) PORTB |= (1 << PB3); if(button == 1) PORTB |= (1 << PB4); if(button == 2) PORTB |= (1 << PB5); } }
Сразу скажу что код не мой и не могу разобратса почему не работает.
Устройство собрано и замыканий и непропая нигде нету.
»
Так а что программа должна
Так а что программа должна делать? зачем два 3х цветных светодиода?
И что именно происходит когда включаешь устройство?
Управление тремя независимыми
Управление тремя независимыми светодиодными лентами. При включении загораются на максимум. Крутишь энкодер - меняется яркость 1 ленты. Нажимаешь на энкодер - включается другой светодиод (сигнализирует о ленте номер два) и меняется яркость другой ленты. Ну и так 3 раза и дальше по кругу.
Ты контроллер какой брал? Тот
Ты контроллер какой брал? Тот что в схеме? Просто иногда люди полагают что если ATmega8 и ATmega88 в одном и том же корпусе то и в средине все одинаково. Бывают различия в регистрах, и все что касается прерываний и тд тп может меняться от МК к МК. И для старта советую все-таки собрать как и на схеме, без лент. Что бы исключить вероятность того, что ты сделал ошибки при подключении лент.
Контроллер atmega8A. Все
Контроллер atmega8A. Все собрал по схеме и понимаю различия между двумя этими контроллерами. Пробовал с простыми светодиодами бел uln-ки - пока глухо. Ищу :(