ШИМ на аttiny13a. Не полностью выключается светодиод.
- Войдите на сайт для отправки комментариев
Пт, 19/02/2016 - 13:28
Хотел сделать плавное включение и выключение СД ленты на аttiny13a. Пока эксперементирую на макетной плате с одним маленким светодиодом. Предполагаю применить аппаратный шим. Но я заметил при OCR0A=0x00 СД полностью не выключается.
#define F_CPU 1200000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> int i; int main(void) { DDRB=0b1; PORTB=0x00; TCCR0A=0x83; TCCR0B=0x01; OCR0A=0x00; sei(); while (1) { for (i=0;i<255;i++) { OCR0A=i; _delay_ms(5); } _delay_ms(1000); for (i=255;i>0;i--){ OCR0A=i; _delay_ms(5); } _delay_ms(1000);
правильно. при 255 выключается.
fid, если вы посмотрите в ардуиновскую функцию analogWrite, то увидите что значение 0 функция не передаёт в регистр OCR, а перехватывает и просто записывает в порт лог.0.
dimax, спасибо! работает! Но только не очень понятно если разрешить прерывание по переполнению TCNTO( TIMSK0=0b10) шим не работает. Хотел изменить логику работы СД . Плавно включается ,поработал некоторое время, плавно выключался. Отсчет временени на прерывание по переполнению TCNTO. Или отсчет времени как то по другому делается?
fid, насчёт "если разрешить.." давайте весь скетч где это прописано, но неработает, там много вариантов накосячить, -гадать не буду.
Вот так будет правильно?
fid, ошибка в 44 строке.
Спасибо dimax! Нужно PORTB |= 0;
Моя ошибка была в том,что в примерах для начинающих обычно конфигурационные регистры устанавливаются один раз в начале и дальше в цикле не меняются. Вот я и ошибочно предполагал, что их часто не стоит перезаписывать как и EEPROM
Спасибо dimax! Нужно PORTB |= 0;
Нет, опять неправильно. Я могу конечно написать как надо, но лучше будет если вы самостоятельно поймёте в чём тут ошибка.