Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 01.04.2010, 13:40  
ilya_sh
Прописка
 
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
ilya_sh на пути к лучшему
По умолчанию 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.
ilya_sh вне форума  
Непрочитано 01.04.2010, 13:44  
ilya_sh
Прописка
 
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
ilya_sh на пути к лучшему
По умолчанию Re: Отработка секундного импульса на AVR

И еще.
Всё-таки переменные желательно инициализировать. В твоем случае можно поставить сравнение (см. пример)
Ожидание кварца для запуска критично тока в спец приложениях.
Но я всегда выполняю задержку около 2 сек. - меньше глюков и вопросов, "почему не пашет"
ilya_sh вне форума  
Непрочитано 01.04.2010, 14:37  
begun
Гражданин KAZUS.RU
 
Регистрация: 18.07.2006
Сообщений: 870
Сказал спасибо: 231
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
begun на пути к лучшему
По умолчанию 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;
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 хотя вроде все сделал для расчленения?
begun вне форума  
Непрочитано 01.04.2010, 14:52  
AJScorp
Почётный гражданин KAZUS.RU
 
Аватар для AJScorp
 
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
AJScorp на пути к лучшему
По умолчанию 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.
AJScorp вне форума  
Непрочитано 01.04.2010, 15:07  
ilya_sh
Прописка
 
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
ilya_sh на пути к лучшему
По умолчанию Re: Отработка секундного импульса на AVR

Сообщение от AJScorp Посмотреть сообщение
b увеличится только в одном случае - при запуске программы, когда k==0;
Верно.
Ошибка здесь:
Цитата:
k1=k1+1;
if(k1==1)
тут к1 после запуска проги рвнялась нулю, потом при нажатии кнопки увеличилась на 1. Сравнили с 1 (к1==1), выполнили действие.
а тут:
Цитата:
if(k1›5)
k1=2;
после "дребезга" к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.
ilya_sh вне форума  
Непрочитано 01.04.2010, 15:19  
ilya_sh
Прописка
 
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
ilya_sh на пути к лучшему
По умолчанию Re: Отработка секундного импульса на AVR

Еще лучще, вместо if(k2›5) писать if(k2›delpause), а самой delpause уже играться для получения отличных результатов.
ilya_sh вне форума  
Непрочитано 01.04.2010, 15:25  
ilya_sh
Прописка
 
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
ilya_sh на пути к лучшему
По умолчанию 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.
ilya_sh вне форума  
Непрочитано 01.04.2010, 16:16  
begun
Гражданин KAZUS.RU
 
Регистрация: 18.07.2006
Сообщений: 870
Сказал спасибо: 231
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
begun на пути к лучшему
По умолчанию 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, куда стягиваются профессионалы своего дела.
Однако ,дискусия продолжается . Как все четко работает.
begun вне форума  
Непрочитано 01.04.2010, 17:04  
ilya_sh
Прописка
 
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
ilya_sh на пути к лучшему
По умолчанию Re: Отработка секундного импульса на AVR

На то мы и здесь.
Удачи в дальнейшей работе!
ilya_sh вне форума  
Непрочитано 02.04.2010, 10:57  
Amator1
Прохожий
 
Регистрация: 30.12.2008
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Amator1 на пути к лучшему
По умолчанию 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)
{
}
?
Amator1 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AVR JTAGICE MKII - проблемы firmware... Luxurious AVR 25 20.10.2014 10:50
На WinAVR + AVR Studio c CVAVR Vetal-soft Embedd С 87 03.03.2013 20:31


Часовой пояс GMT +4, время: 10:26.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot