diy: простые интересные РАДИОСХЕМЫ сделанные своими руками

» Гость

Мы рады вас видеть. Пожалуйста зарегистрируйтесь или авторизуйтесь!





» ДАТАШИТЫ
Например: TDA1562

» СХЕМЫ


Отметить прочитанными   -   Поиск   -   Правила   -   Новые сообщения

Страница 1 из 11
Модератор форума: Электродыч, Витинари, Sam 
Форум радиолюбителей » СХЕМЫ » МИКРОСХЕМЫ » Как реализовать прерывание по переполнению таймера atmega32a
Как реализовать прерывание по переполнению таймера atmega32a
Вт, 20.12.2016, 13:25 | Сообщение # 1        
com-servic
аватар
  Постов: 1  Offline
Вот код который ниже работает диод мигает (Atmega32a делаю на Atmel Studio 4)
Код

#include <avr/io.h>
#include <avr/interrupt.h>

ISR( TIMER1_OVF_vect )
{
  TCNT1 = 64456; //выставляем начальное значение TCNT1
  if( PINB & ( 1 << PB0 ) ) {
    PORTB &= ~( 1 << PB0 );
  }
  else {
    PORTB |= ( 1 << PB0 );
  }
}

int main()
{
  DDRB = ( 1 << PB0 );  // настраиваем PB0 на выход
  TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10); // настраиваем делитель
  TIMSK |= (1<<TOIE1); // разрешаем прерывание по переполнению таймера
  TCNT1 = 64456;        // выставляем начальное значение TCNT1
  sei();                // выставляем бит общего разрешения прерываний
  while(1);             // вечный цикл
  return 0;
}

Также есть рабочий код где просто на экран 1602А вывожу текст.
Хочу чтобы и текст выводился в бесконечном цикле и по прерыванию диод моргал.

Но когда объединяю эти два кода, то диод не моргает а на экране всякая чушь выводится.

Вот код:

Код

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define RS PC0
#define EN PC1

ISR( TIMER1_OVF_vect )
{
  TCNT1 = 64456; //выставляем начальное значение TCNT1
  if( PINB & ( 1 << PB0 ) ) {
    PORTB &= ~( 1 << PB0 );
  }
  else {
    PORTB |= ( 1 << PB0 );
  }
}

// Функция записи команды в ЖКИ
void lcd_com(unsigned char p)
{
PORTC &= ~(1 << RS); // RS = 0 (запись команд)
PORTC |= (1 << EN);  // EN = 1 (начало записи команды в LCD)
PORTA &= 0x0F; PORTA |= (p & 0xF0); // Выделяем старший нибл
_delay_us(100);
PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
_delay_us(100);
PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD)
PORTA &= 0x0F; PORTA |= (p << 4); // Выделяем младший нибл
_delay_us(100);
PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
_delay_us(100);
}

// Функция записи данных в ЖКИ
void lcd_dat(unsigned char p)
{
PORTC |= (1 << RS)|(1 << EN); // RS = 1 (запись данных), EN - 1 (начало записи команды в LCD)
PORTA &= 0x0F; PORTA |= (p & 0xF0); // Выделяем старший нибл
_delay_us(100);
PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
_delay_us(100);
PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD)
PORTA &= 0x0F; PORTA |= (p << 4); // Выделяем младший нибл
_delay_us(100);
PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
_delay_us(100);
}

// Функция инициализации ЖКИ
void lcd_init(void)
{
DDRC |= (1 << PC1)|(1 << PC0); // PC1, PC0 - выходы
PORTC = 0x00;
DDRA = 0xFF; // порт D - выход
PORTA = 0x00;

_delay_ms(50); // Ожидание готовности ЖК-модуля

// Конфигурирование четырехразрядного режима
PORTA |= (1 << PA5);
PORTA &= ~(1 << PA4);

// Активизация четырехразрядного режима
PORTC |= (1 << EN);
PORTC &= ~(1 << EN);
_delay_ms(5);

lcd_com(0x28); // Шина 4 бит, LCD - 2 строки
lcd_com(0x08); // Полное выключение дисплея
lcd_com(0x01); // Очистка дисплея
_delay_us(100);
lcd_com(0x06); // Сдвиг курсора вправо
_delay_ms(10);
lcd_com(0x0C); // Включение дисплея, курсор не видим
}

// Основная программа
int main (void)
{
unsigned char znak = 0; // определяем переменную
DDRB = ( 1 << PB0 );  // настраиваем PB0 на выход
  TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10); // настраиваем делитель
  TIMSK |= (1<<TOIE1); // разрешаем прерывание по переполнению таймера
  TCNT1 = 64456;        // выставляем начальное значение TCNT1
  sei();   
lcd_init(); // Инициализация дисплея

while (1)
{
//sei();
asm("nop");
lcd_com(0x80); // Вывод в верхнюю левую позицию 1 строки
lcd_dat(znak/100 + '0' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ; // Выделяем сотни
lcd_dat((znak/10)%10 + '0' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ; // Выделяем десятки
lcd_dat(znak%10 + '0' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ; // Выделяем единицы
lcd_dat('=' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ; // Выводим знак равенства
lcd_dat(znak); // Выводим содержимое знакогенератора
_delay_ms(100); // Тут можно поменять задержку вывода символов
lcd_com(0xC0);

lcd_dat('V' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ;
lcd_dat('o' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ;
lcd_dat('l' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ;
lcd_dat('k' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ;
lcd_dat('o' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ;
lcd_dat('v' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ;
lcd_dat('=' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ;
lcd_dat('1' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ;
lcd_dat('5' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ;
lcd_dat(':' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ;
lcd_dat('0' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ;
lcd_dat('4' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ;
lcd_dat(':' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ;
lcd_dat('7' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ;
lcd_dat('6' <img src="/.s/sm/1/wink.gif" border="0" align="absmiddle" alt="wink" /> ;

_delay_ms(100);
znak++; // Следующий символ знакогенератора
}
}

Что в коде не так???

Помогите разобраться...
Форум радиолюбителей » СХЕМЫ » МИКРОСХЕМЫ » Как реализовать прерывание по переполнению таймера atmega32a
Страница 1 из 11
Поиск:
Кто есть кто на форуме радиолюбителей: Администратор Модераторы Друзья Пользователи
Группа вконтакте Канал ютуб Группа в фэйсбук Мобильная версия © 2010-2016, "Радиосхемы". Все права защищены. Почта