Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
01.04.2010, 13:40
|
|
Прописка
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
|
Re: Отработка секундного импульса на AVR
Сообщение от begun
|
Значит все уже правильно ,и у меня будет четкий интервал секунд?
|
Да, будет четкий на столько, насколько точен сам кварц. Его можно подстроить.
Цитата:
|
а в промежутке между секундами, в прерывании, могу сделать все что захочу?
|
всё, что угодно на время, меньшее 2 интервалов таймера. Поясню. Даже если код выполняется больше 1 сек, таймер всё равно считает и устанавливает флаг переполнения таймера. Как только осуществится выход из прерывания, тут же сработает следующий вход. Но, если в теле прерывания код будет исполняться более 2 сек, то произойдет еще одна установка флага и одно прерывание будет пропущено. Думаю, понятно, что я объяснил?
В реальности это нужно, когда по некоему условию (var = 10, к примеру) нужно выполнить больше кода по времени, чем один интервал таймера, но только, к примеру, один раз из десяти (var = 10).
Цитата:
|
т.е. получается ,что у меня есть возможность не портить точный секундный интервал и сделать 1сек=1000000мксек операцию между секундами??
|
Делать можно столько операций, сколько позволяет интервал таймера (см. выше). Сам интервал не испортишь (тока в случает повторной установки флага), т.к. счетчик таймера работает аппаратно и ты не устанавливаешь при каждом прерывании его значения.
Можно мегу8 поставить на 8МГц (понятно, что только от внутреннего, т.к. на внешнем часовой 32К стоит), тогда за время 1 сек можно в прерывании выполнить 8млн простых инструкций или менее 16млн, если очень осторожно подходить к программированию кода
Последний раз редактировалось ilya_sh; 01.04.2010 в 13:44.
|
|
|
|
01.04.2010, 13:44
|
|
Прописка
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
|
Re: Отработка секундного импульса на AVR
И еще.
Всё-таки переменные желательно инициализировать. В твоем случае можно поставить сравнение (см. пример)
Ожидание кварца для запуска критично тока в спец приложениях.
Но я всегда выполняю задержку около 2 сек. - меньше глюков и вопросов, "почему не пашет"
|
|
|
|
01.04.2010, 14:37
|
|
Гражданин KAZUS.RU
Регистрация: 18.07.2006
Сообщений: 870
Сказал спасибо: 231
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: Отработка секундного импульса на AVR
так,так,так.
значит так, во время прерывания идет счет и на индикаторе меняются цифры 0-9 по кругу.
Теперь в вечном цикле даю команду менять цифру при каждом нажатии на кнопки
те так;
/************************************************** ***
This program was produced by the
CodeWizardAVR V1.25.9 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 30.03.2010
Author : F4CG
Company : F4CG
Comments:
Chip type : ATmega8
Program type : Application
Clock frequency : 4,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
************************************************** ***/
#include ‹mega8.h›
int a,b;
int k1;
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include ‹lcd.h›
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
a++;
if(a==0x0A)
a=0;
lcd_gotoxy(6,0);
lcd_putchar(48+a);
}
void main(void)
{
PORTB=0xFF;
DDRB=0xC8;
PORTC=0x00;
DDRC=0x3F;
PORTD=0x00;
DDRD=0xFF;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x01;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x08;
TCCR2=0x35;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x40;
ACSR=0x80;
SFIOR=0x00;
lcd_init(16);
// Global enable interrupts
#asm("sei")
lcd_gotoxy(6,0);
lcd_putchar(4 ![Горд собой](images/smilies/icon_dovl.gif) ;
while (1)
{
if(PINB.0==0)
{
k1=k1+1;
if(k1==1)
b++;
lcd_gotoxy(6,0);
lcd_putchar(48+b);
if(k1›5)
k1=2;
};
};
}
однако получается белиберда. сразу записывается единица и дальше при быстром нажимании, число не меняется.
ну а когда приходит фронт секунды счет продолжается т.е. нету отработки впромежутке???
как будто все привязано к частоте 32768 хотя вроде все сделал для расчленения?
|
|
|
|
01.04.2010, 14:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: Отработка секундного импульса на AVR
Сообщение от begun
|
число не меняется
|
Если ничего не пропустил в коде, то при таких условиях
Сообщение от begun
|
if(PINB.0==0)
{
k1=k1+1;
if(k1==1)
b++;
lcd_gotoxy(6,0);
lcd_putchar(48+b);
if(k1›5)
k1=2;
};
|
b увеличится только в одном случае - при запуске программы, когда k==0;
Последний раз редактировалось AJScorp; 01.04.2010 в 14:54.
|
|
|
|
01.04.2010, 15:07
|
|
Прописка
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
|
Re: Отработка секундного импульса на AVR
Сообщение от AJScorp
|
b увеличится только в одном случае - при запуске программы, когда k==0;
|
Верно.
Ошибка здесь:
Цитата:
|
k1=k1+1;
if(k1==1)
|
тут к1 после запуска проги рвнялась нулю, потом при нажатии кнопки увеличилась на 1. Сравнили с 1 (к1==1), выполнили действие.
а тут:
после "дребезга" к1 сразу достигла 5 и после установилсь в 2 и так бесконечно. к1 никогда уже не примет значение 1 и условие b++ больше не выполнится.
Я понял, что это сделано для "дребезга"
Тогда добавь:
if(PINB.0==1)
{
k2=k2+1;
if(k2›5)
{
k2=5;
k1=0;
}
};
а в тело предыдущего условия добавь k2=0;
Последний раз редактировалось ilya_sh; 01.04.2010 в 15:17.
|
|
|
|
01.04.2010, 15:19
|
|
Прописка
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
|
Re: Отработка секундного импульса на AVR
Еще лучще, вместо if(k2›5) писать if(k2›delpause), а самой delpause уже играться для получения отличных результатов.
|
|
|
|
01.04.2010, 15:25
|
|
Прописка
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
|
Re: Отработка секундного импульса на AVR
Короче, вот как бы я сделал:
..............
if(PINB.0==0)
{
k1++;
k2=0;
if(k1==1)
{
b++;
lcd_gotoxy(6,0);
lcd_putchar(48+b);
} //нет смысла постоянно выводить символ, если он не меняется...
k1=1; //нет смысла проверять, всё равно обнуляется при отпускании кнопки...
};
if(PINB.0==1)
{
k2++;
if(k2==DelPause)
k1=0
else
if(k2›DelPause)
k2=DelPause;
};
Последний раз редактировалось ilya_sh; 01.04.2010 в 15:29.
|
|
|
|
01.04.2010, 16:16
|
|
Гражданин KAZUS.RU
Регистрация: 18.07.2006
Сообщений: 870
Сказал спасибо: 231
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: Отработка секундного импульса на AVR
да.!да.! конечно, Вы тысячу раз правы!
Из за стольких раздумии уже допускаю глупые ошибки.
Я же не скопировал эту часть кода.
if(PINB.0==1)
k1=0;
запустил отдельно
b++;
PORTC=b;
и к большой моей радости пошла родная !!!!!,отдельно считаются нажатия
в порте C, и сам по себе идет индикация по кругу (0-9)
т.е.
#include ‹mega8.h›
int a,b,k1;
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include ‹lcd.h›
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
a++;
if(a==0x0A)
a=0;
lcd_gotoxy(6,0);
lcd_putchar(48+a);
}
----
----
while (1)
{
if(PINB.0==1)
k1=0;
if(PINB.0==0)
{
k1=k1+1;
if(k1==1)
{
b++;
PORTC=b;
};
if(k1›5)
k1=2;
};
};
}
Я не знаю как выложить протеусовскю программу ,ато бы ее тоже показал.
Слов не нахожу на сколько данный веток форума для меня был ,плодотвотным.Для меня это значительный скачек вперед ,но самое главное ,это чувство гордости за то, что меня и таких как Я, окружают замечательные , душевные люди, щедро делившиеся своими знаниями и опытом.Дай бог Вам здоровья и счастья на благо обшества.
Я к сожалению ,пока особым чем нибудь похвастатья не могу ,мне нечему Вас учить ,но если когда нибудь кому то буду нужен буду очень рад.
Большое спасибо организаторам форума KAZUS, куда стягиваются профессионалы своего дела.
Однако ,дискусия продолжается . Как все четко работает.
|
|
|
|
01.04.2010, 17:04
|
|
Прописка
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
|
Re: Отработка секундного импульса на AVR
На то мы и здесь.
Удачи в дальнейшей работе!
|
|
|
|
02.04.2010, 10:57
|
|
Прохожий
Регистрация: 30.12.2008
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: отработка секундного импульса на AVR
[
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
a++;
if(a==0x0A)
f=0;
lcd_gotoxy(6,0);
lcd_putchar(48+a);
}
А как насчет скобок для функции if(a==0x0A)
{
}
?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:26.
|
|