Не работает ШИМ на ATMEGA168

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 134
Зарегистрирован: Вс дек 28, 2008 18:07:28
Откуда: Москва

Сообщение Алексей bird »

Привет, коллеги!
Есть проект на 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;

int main(void)
{
	PORTB = 0x00;
	DDRB=0b00001110; // установка PortB пины 0,1,2 выходы
	TIMSK0 |= (1 << TOIE0); // включить прерывание по переполнению таймера
	TIMSK0 |= (1 << OCIE0A); 
	TCCR0B = 0b00000001; // настройка таймера, делитель выкл
	
	sei();               // разрешить прерывания
	
	

	while (1)       
	{
	lev_red=255;lev_green=200;lev_blue=20;	//яркость каждого светодиода в RGB
		
	}
}

ISR (TIMER0_OVF_vect)  //обработка прерывания по переполнению таймера
{
	//PORTB = 0x02;
	
		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 не вижу
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Происходил сброс контроллера.
Таймер не верно инициализирован.
Строку

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

TIMSK0 |= (1 << OCIE0A);
удалить.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 134
Зарегистрирован: Вс дек 28, 2008 18:07:28
Откуда: Москва

Сообщение Алексей bird »

удалить.
странно, а в коде для Атмега8 данная строка есть и работать не мешает. Вечером проверю в железе, хотя в симуляторе переменная "counter" начала увеличиваться.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Алексей bird писал(а):странно, а в коде для Атмега8 данная строка есть и работать не мешает.
Этого бита в меги8 физически нет. При компиляции вылетит ошибка.
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 134
Зарегистрирован: Вс дек 28, 2008 18:07:28
Откуда: Москва

Сообщение Алексей bird »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3325056#p3325056"]
Алексей bird писал(а):странно, а в коде для Атмега8 данная строка есть и работать не мешает.
Этого бита в меги8 физически нет. При компиляции вылетит ошибка.[/uquote]
несовсем так, бит есть, но относится он к таймеру1(четвёртый бит регистра TIMSK), вот я и по не внимательности и не заметил этого, когда переносил код на другой МК
Реклама
Модератор
Аватара пользователя
Сообщения: 19055
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

в Атмега8 нет регистра TIMSK0, а есть просто TIMSK.
и бита OCIE0A в Атмега8 нет.
поэтому обязательно компилятор будет ругаться.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 134
Зарегистрирован: Вс дек 28, 2008 18:07:28
Откуда: Москва

Сообщение Алексей bird »

[uquote="Starichok51",url="/forum/viewtopic.php?p=3325251#p3325251"]в Атмега8 нет регистра TIMSK0, а есть просто TIMSK.
и бита OCIE0A в Атмега8 нет.
поэтому обязательно компилятор будет ругаться.[/uquote]
а кто-то утверждает, что он там есть?
Написал же в первом и последующий постах, что делал перенос кода на другой МК, из-за невнимательности взял из кода лишний "настроечный бит" регистра. Ведь регистр TIMSK в меге8 он один, сразу на все таймеры.
Модератор
Аватара пользователя
Сообщения: 19055
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

ладно, с регистром и битом разобрались.

если у тебя не используется прерывание по сравнению, его НЕЛЬЗЯ разрешать.
даже если обработчика прерывания нет, сравнение все равно происходит, и делается переход на соответствующий вектор, а дальше делался фактически рестарт всей прошивки.
поэтому строку
TIMSK0 |= (1 << OCIE0A);
следует удалить.
Алексей bird писал(а):в коде для Атмега8 данная строка есть и работать не мешает.
значит, для АТМеги8 у тебя был обработчик прерывания по сравнению, поэтому строка и не мешала работать...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Ответить

Вернуться в «AVR»