Привет, коллеги! Есть проект на ATMEGA8, ШИМ которого удачного работал. Сейчас появилась другая задумка, взял другой МК, а именно ATMEGA168P, взял кусок кода с ШИМом, поправил регистры и опа, а он не работает. Точнее прерывание по переполнению таймера есть, а вот то что в прерывании находится, выполняться не хочет. Вот весь код, который должен включить RGB светодиод:
Код:
#define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include "type_var.h" #define RED PORTB1 #define GREEN PORTB2 #define BLUE PORTB3 uint8_t counter=0; uint8_t lev_red, lev_green, lev_blue; uint8_t buf_lev_ch1, buf_lev_ch2, buf_lev_ch3;
if (++counter==0) //счетчик перехода таймера через ноль { buf_lev_ch1=lev_red; //значения длительности ШИМ buf_lev_ch2=lev_green; buf_lev_ch3=lev_blue; PORTB |=(1<<RED)|(1<<GREEN)|(1<<BLUE); //подаем 1 на все каналы } if (counter==buf_lev_ch1) PORTB&=~(1<<RED); //подаем 0 на канал if (counter==buf_lev_ch2) PORTB&=~(1<<GREEN); //по достижении if (counter==buf_lev_ch3) PORTB&=~(1<<BLUE); //заданной длительности.
}
Если раскомментировать PORTB = 0x02, то светодиод включается, но оставшийся кусок кода не работает, хотя этот же кусок кода в Атмега8 норм работает, а в нём никаких регистров и прочего несовместимого с Атмега168 не вижу
странно, а в коде для Атмега8 данная строка есть и работать не мешает. Вечером проверю в железе, хотя в симуляторе переменная "counter" начала увеличиваться.
странно, а в коде для Атмега8 данная строка есть и работать не мешает.
Этого бита в меги8 физически нет. При компиляции вылетит ошибка.
несовсем так, бит есть, но относится он к таймеру1(четвёртый бит регистра TIMSK), вот я и по не внимательности и не заметил этого, когда переносил код на другой МК
в Атмега8 нет регистра TIMSK0, а есть просто TIMSK. и бита OCIE0A в Атмега8 нет. поэтому обязательно компилятор будет ругаться.
а кто-то утверждает, что он там есть? Написал же в первом и последующий постах, что делал перенос кода на другой МК, из-за невнимательности взял из кода лишний "настроечный бит" регистра. Ведь регистр TIMSK в меге8 он один, сразу на все таймеры.
если у тебя не используется прерывание по сравнению, его НЕЛЬЗЯ разрешать. даже если обработчика прерывания нет, сравнение все равно происходит, и делается переход на соответствующий вектор, а дальше делался фактически рестарт всей прошивки. поэтому строку TIMSK0 |= (1 << OCIE0A); следует удалить.
Алексей bird писал(а):
в коде для Атмега8 данная строка есть и работать не мешает.
значит, для АТМеги8 у тебя был обработчик прерывания по сравнению, поэтому строка и не мешала работать...
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения