Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
24.05.2007, 17:38
|
|
Частый гость
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Таймер на ATmega16... опять
Очень надеюсь на помощь, заранее спасибо.
Задача в следующем:
Дано: 1. ATmega16 2. DIP переключатель
3. кнопка 4. 7ми сегментный индикатор на два знака
Необходимо собрать таймер.
Переключатели устанавливают множитель паузы
(00 - х0,1сек. ; 01 - х1,0сек. ; 10 - х0,1мин.;
11 - х1,0мин.), таким образом пауза регулируется в пределах 0,1 секунда - 99 минут.
На индикаторы выводится значение паузы.
Кнопкой устанавливается значение паузы (зажимаем кнопку на 3секунды, индикаторы начинают мигать, мы в режиме установки паузы, каждое следующее нажатие прибавляет 1 к значению паузы, после установки нужного значения, зажимаем кнопку на 3 секунды, индикаторы перестают мигать, мы вышли из режима установки паузы).
При появлении нуля на ноге МК, устройство формирует паузу заданную множителем и кнопкой и отображаемую индикаторами; и выдает единицу на ногу МК.
В режиме установки паузы, при появлении нуля на ноге МК пауза не формируется.
Если на ноге МК появился ноль, но через время меньшее времени паузы на ноге опять единица возврат в исходное состояние
Большая просьба ко всем!!! помочь с написанием программы на С (компилятор CodeVision) по заданному алгоритму работы [/img]
-- Прилагается рисунок: --
|
|
|
|
24.05.2007, 19:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Вот посмотрите - avr123.nm.ru/06.htm
и avr123.nm.ru
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
24.05.2007, 21:16
|
|
Частый гость
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Спасибо за Ваш труд уважаемый avr123.nm.ru! Честно изучил его от корки до корки три месяца назад.
Простой вопрос по куску кода:
PC2 - кнопка
PC1 - нога управляющая транзистором (РС1=0 транзистор открыт, РС1=1 транзистор закрыт)
while (1){
if (PINC.2==0)
{PORTC.1^=1;
delay_ms(100);}
else
{PORTC.1=1;}}
1. когда кнопка РС2 нажата транзистор включается с частотой 1/200 ms. когда отжимаем кнопку транзистор должен выключаться сразу, но реально при выполнении строчки delay_ms(100), МК не будет реагировать на изменение состояния PC.2, пока не отработает паузу 100ms. На рисунке симуляция в VMlab: кнопку отпускаю в 322мс а на PC1 единица формируется в 380мс. Как решить эту проблему?
И еще как сделать паузу 10 минут?
-- Прилагается рисунок: --
|
|
|
|
25.05.2007, 11:17
|
|
Прописка
Регистрация: 16.03.2005
Сообщений: 244
Сказал спасибо: 78
Сказали Спасибо 85 раз(а) в 55 сообщении(ях)
|
idmg, а Вы про прерывание от таймера слышали? также то, что Вы предлагаете, дружественным интерфейсом ну уж ни как не назовешь. И такой маленький советик: по меньше слушайте чужих советов, побольше делайте. Иначе будет каша и результата ноль. А для изучения вначале лучше всего просто скопировать чей-то дельный поект и в нем разобраться.
|
|
|
|
25.05.2007, 12:55
|
|
Вид на жительство
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
|
Перед написанием программы, обычно, сперва составляют алгоритм ... и не нужно фыркать:"Задача простая, какой тут алгоритм?!"
Почти все решаемые на контроллерах задачи можно разделить на несколько частей:
- уровень железа (работа с кнопками. индикаторами и др. переферией)
- прикладной уровень (решение самой задачи)
Если полностью алгоритм работы охватить не можете, то делайте по кирпичикам ...
Например научитесь отлавливать короткое/длинное нажатие кнопки, вывод на индикатор данных, чтение установок джамперов и т.д.
Потом, когда фундамент будет готов ... можно и за задержки взяться.
А то получается Вы хотите делать задержки .. а чем Вы стартовать их будете? Кнопка то у Вас не работает - нет для ее обработки кода.
|
|
|
|
25.05.2007, 14:55
|
|
Частый гость
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
С прерываниями все так же мутно, вешал на PD2 (INT0)
кнопку, включал внешнее прерывание INT0
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x00;
MCUCSR=0x00;
GIFR=0x40;
если МК выполняет строчку delay_ms(100) и в этот момент ногу PD2 кнопкой придавили к нулю прерывание-то произойдет, но только тогда когда МК отработает паузу 100мс. Отсюда и вопрос как это можно обойти? как работает функция delay? Как еще можно получить паузы без функции delay? Есть такой апноут AVR133
"Long delay generation" там про каскадирование таймеров, для меня это пока темный лес потому и прошу помощи.
|
|
|
|
25.05.2007, 15:14
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
По поводу пауз: можно сделать ассемблерные вставки:
#аsm
nop
nop
nop
....
#endаsm
команда nop выполнется 1 такт, поэтому зная частоту кварца, можно расчитать задержку. Если знаете ассемблер, то можно делать циклы, тогда можно добиться паузы любой длительности...
По поводу проекта... если выложите его в протеусе постараюсь помочь...
|
|
|
|
25.05.2007, 15:20
|
|
Частый гость
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
ОК к выходным выложу проект в протеусе
|
|
|
|
25.05.2007, 15:41
|
|
Частый гость
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Правильно ли я понимаю что при частоте 1МHz, выполнение выделенного цикла 1 000 000 раз даст задержку 1 секунда, если не учитывать время инкрементирования переменной а?
//Chip type : ATmega16
//Clock frequency : 1,000000 MHz
// PA1 - out; PC1 - button;
#include ‹mega16.h›
unsigned char t=0;
unsigned char a=0;
void main (void){
MCUCSR=0xF0;MCUCSR=0xF0;
PORTA=0xFE;
DDRA=0xFF;
PORTC=0xFF;
DDRC=0xFE;
PORTB=0xFF;
DDRB=0xFF;
PORTD=0xFF;
DDRD=0xE7;
while (1){
if (PORTC.1 ==0) {
t++;}
else{
while (a‹t){
#asm nop;
#endasm
a++;}}
PORTA.1=1;}}
|
|
|
|
25.05.2007, 15:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Сообщение от idmg
|
если МК выполняет строчку delay_ms(100) и в этот момент ногу PD2 кнопкой придавили к нулю прерывание-то произойдет, но только тогда когда МК отработает паузу 100мс.
|
Это не так.
Делэй не запрещает прерывания, они работают нормально.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:15.
|
|