Доброго времени суток, подскажите в CVAVR_2.05.3 стандартной библиотеке glcd.h можно как-нибудь графику, ну линию например одну стереть, не очищая весь экран glcd_clear()'ом?
Здравствуйте! Помогите пожалуйста с таймерами на атмеге8. Есть код, который посредством 16-ти битного таймера считает длительность импульса. Эту величину нужно выводить на дисплей 1602. Как правильно организовать задержку в выборке значений и выводе их на экран, ато дисплей не сможет обновляться с частотой в несколько килогерц ...
Код:
#include <mega8.h> long a=0,b=0,c=0;
interrupt [TIM1_CAPT] void timer1_capt_isr(void) { if(a==0) //считываем таймер в "a" { a=ICR1; } else //находим разницу { b=ICR1; c=b-a; TCNT1=0x00; a = 0; #asm("cli") } }
void main(void) { PORTB=0x01; DDRB=0x00;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 125,000 kHz // Mode: Normal top=0xFFFF // Input Capture on Rising Edge // Input Capture Interrupt: On TCCR1A=0x00; TCCR1B=0xC3; TCNT1=0x00; ICR1=0x00;
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт апр 01, 2014 18:31:42
Модератор
Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4575 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Цитата:
Эту величину нужно выводить на дисплей 1602. Как правильно организовать задержку в выборке значений и выводе их на экран, ато дисплей не сможет обновляться с частотой в несколько килогерц
Хотелось бы без delay, мало ли что потом в код дописать нужно будет... А можно ли сделать так: 1) Включаем 16-ти битный таймер. Делаем замер. Отключаем таймер. 2) Включаем 8-ми битный таймер. Делаем 15 циклов (около 0.5сек).Отключаем таймер. 3) Выводим данные на дисплей. Не будет ли проблем из-за постоянного включения и отключения таймеров?
А если считать 10-50 длительностей, находить среднее и тогда не нужно будет слишком часто выводить на экран данные и цифры так сильно скакать не будут. А так классическая задержка i=10000; while (i) i--;
_________________ Купи два беляша и собери из них кошку Labor est etiam ipse voluptas Труд уже сам по себе есть наслаждение (*Формула любви) Ave novie-nostra ales Если один человек построил - другой завсегда разобрать может....(*Формула Любви).
1. для чего вы в прерывании делаете запрет прерываний? при выходе из обработчика они все равно разрешатся автоматически... 2. чем не устраивает такой алгоритм опроса и вывода:
Код:
int get_dlit(void); // эта функция возвращает длительность импульса
Можно в принципе... Просто хотел таймер присобачить, ато что он без дела висит...
ARV писал(а):
для чего вы в прерывании делаете запрет прерываний?
Это где?
ARV писал(а):
чем не устраивает такой алгоритм опроса и вывода
Delay злая вещь. Пока просто тахометр у меня, но возможно в будущем придётся дополнить код какими-либо наворотами, а там от такой задержки может плохо стать Тоесть с включением/отключением таймеров лучше не баловаться?
для чего вы в прерывании делаете запрет прерываний?
Это где?
это там:
isx писал(а):
Код:
#include <mega8.h> long a=0,b=0,c=0;
interrupt [TIM1_CAPT] void timer1_capt_isr(void) { if(a==0) //считываем таймер в "a" { a=ICR1; } else //находим разницу { b=ICR1; c=b-a; TCNT1=0x00; a = 0; #asm("cli") // ВОТ ИМЕННО ТУТ } }
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Delay злая вещь. Пока просто тахометр у меня, но возможно в будущем придётся дополнить код какими-либо наворотами, а там от такой задержки может плохо стать Тоесть с включением/отключением таймеров лучше не баловаться?
сами по себе всякие вещи не злые и не добрые, злыми или добрыми их делают люди.
во всяком случае задержка по таймеру мало чем лучше задержки функцией. никто не запретит вам все ваши навороты делать как раз по прерываниям, а результаты этих наворотов выводить неспеша по задержкам...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Хотелось бы без delay, мало ли что потом в код дописать нужно будет... А можно ли сделать так: 1) Включаем 16-ти битный таймер. Делаем замер. Отключаем таймер. 2) Включаем 8-ми битный таймер. Делаем 15 циклов (около 0.5сек).Отключаем таймер. ...
2) Зачем выключать таймер ? сделайте его на какой-то элементарный шаг к примеру 10 миллисекунд и внутри его увеличивайте счётчик а в главном цикле смотрите на этот счётчик.(Или вообще этот счётчик в ваше прерывание(где замер делаете) запихать если такое возможно)
Код:
interrupt [TIM1_CAPT] void timer1_capt_isr(void) { counter++; } void main(void){ int result; while(1){ result = get_dlit(); // получаем if(counter>100){ out_to_lcd(result); // выводим 1 раз в секуну counter=0; } } }
судя по всему у вас проблема не с переменной, а с выражением, результат вычисления которого вы заносите в переменную. код в студию - экстрасенсы в отпуске...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
А как всё таки убрать мирцание LCD? убирал lcd_clear(), моргать перестал. Всплыла другая проблема! vol=0 vol=1... и т.д. до vol=10, далее крутим назад vol=90 vol=80...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 64
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения