Перейти к содержанию
    

Проблема с авр

Начал изучать авр и не могу разобраться с таймерами к авр на порт д подключен семисегментный индикатор раз в сек он должен увеличивать цифру т.е. от 0 до девяти и так далее в чем ошибка подскажите? Симулирую на протеусе все файлы в архиве. Помогите и подскажите.

seg.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void main()

{

io_init();

timer0_init();

Dig_init();

PORTD = Dig[0];

#asm("sei"); // тут глобально разрешил прерывания

while(1)

{}

}

но в протеусе все равно не вижу то что хочется подскажите чуть развернутее

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2Andrew82

 

Из Вашегоисходника:

void timer0_init()
{
  SREG |= (1 << 7);
  OCR0 = 1;  // Таймер срабатывает каждые 1024 такта. Прерывание каждые
  // 1024*16 тактов.
  TCCR0 |= (1 << WGM01) | (1 << CS00) | (1 << CS02);
  TIMSK |= (1 << OCIE0);
  TIFR |=(1 << 1);
}

 

По порядку

"SREG |= (1 << 7);" - необходимости в такой конструкции нет, хотя и она вполне законна. Лучше было написать sei() или #asm("sei") или __asm__ __volatile__ ("sei" :: ), в зависимости от компилятора.

 

"OCR0 = 1; // Таймер срабатывает каждые 1024 такта. Прерывание каждые 1024*16 тактов." - Непонятно... (С)

 

"TIFR |=(1 << 1);" - Зачем это?

 

"TIMSK |= (1 << OCIE0);" - а вот тут похоже и зарыта собака. Вы включаете прерывание по сравнению, но обрабатываете похоже прерывание по переполнению. Вот это у вас далее по тексту:

interrupt [TIM0_OVF] void timer0_ovf_isr(void)

 

Пожалуйста, указывайте явно, какой используете контроллер и компилятор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

[---skipped---]

 

 

void timer0_init()

{

#asm("sei");

OCR0 = 16; // Таймер срабатывает каждые 1024 такта. Прерывание каждые 1024*16 тактов.

TCCR0 |= (1 << WGM01) | (1 << CS00) | (1 << CS02); //

TIMSK |= (1 << TOIE0);

} так я понимаю будет правильно да? указываю что прерываение по переполнению TOIE0 это 0 бит

переделанный исходник в архиве, кодевижион компилятор и чип мега 16

 

 

Moderator to

Andrew82: избегайте бездумного цитирования постов.

seg.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void timer0_init()

{

#asm("sei");

OCR0 = 16; // Таймер срабатывает каждые 1024 такта. Прерывание каждые 1024*16 тактов.

TCCR0 |= (1 << WGM01) | (1 << CS00) | (1 << CS02); //

TIMSK |= (1 << TOIE0);

} так я понимаю будет правильно да? указываю что прерываение по переполнению TOIE0 это 0 бит

переделанный исходник в архиве, кодевижион компилятор и чип мега 16

 

Да нет, же, вы же хотите получить "Прерывание каждые 1024*16 тактов". Для это и устанавливаете OCR = 16. В строчке "TIMSK |= (1 << OCIE0);" ничего неправильного не было. Только нужно при этом обрабатывать прерывание по сравнинию, но у вас был написан обрботчик по переполнению [TIM0_OVF]. Я в CV не работал, но наверное TIM_OVF означает переполнение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

//Инициализация таймера

// Timer/Counter 0 initialization

// Clock source: System Clock

// Mode: Normal top=FFh

// OC0 output: Disconnected

TCCR0=0x05;

TCNT0=0x16;

OCR0=0x00;

 

 

//Включаем прерывания по ПЕРЕПОЛНЕНИЮ от него

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x01;

 

 

 

 

//функция, которая исполняется с частотой (частота_кварца/1024)/16

//кстати, частота эта будет для 4МГц кварца 244 Гц. далеко не 1....

// Timer 0 overflow interrupt service routine

interrupt [TIM0_OVF] void timer0_ovf_isr(void)

{

// Reinitialize Timer 0 value

TCNT0=0x16;

// Place your code here

 

}

 

 

В кодевизионе это же делается элементарно с помощью мастера!

И с помощью него же по сравнению сделать элементарно.

Хотя некоторые и говорят, что его мастер только калечит головы начинающим программистам МК, с НАЧАЛА он очень помогает, а потом сам перестаёш его пользовать по одной простой причине: переходиш на другой компилятор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все всем спасибо все во внеминательности я то хотел по сравнению, а не по переполнению, спасибо всем откликнувшимся, пойду дальше изучать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...