Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите с кодом пожалуйста.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ps1x
Вот такой вот код, по идее должен подсчитывать длину 1 пришедшего импульса нулевого уровня и записывать в еепром. Прерывание настроено на спад. Импульс точно есть и точно больше 100 us по длине. Что не так???
Код
int i;
char run=1;
eeprom int dat1=0;

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{                      
if (run)
{
while (!PORTB.6)
{      
delay_us(10);
i++;
}
run=0;
}      
dat1=i;
}
SasaVitebsk
Цитата(ps1x @ Oct 31 2006, 23:58) *
Вот такой вот код, по идее должен подсчитывать длину 1 пришедшего импульса нулевого уровня и записывать в еепром. Прерывание настроено на спад. Импульс точно есть и точно больше 100 us по длине. Что не так???
Код
int i;
char run=1;
eeprom int dat1=0;

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{                      
if (run)
{
while (!PORTB.6)
{      
delay_us(10);
i++;
}
run=0;
}      
dat1=i;
}


Обычно делается не так, а если ещё точнее, то так вообще не делается. smile.gif
Прерываеия существуют для того, чтобы освобождать процессор от задержек. А Вы прямо в прерывании её вставляете.
Обычно прерывание настраивается по срезу импульса (или наоборот) и там инициализируется таймер, а по фронту снимается значение таймера. Учитывая, что значение реакции на прерывание почти одинаковое, то получается более-менее точно.
ps1x
Цитата(SasaVitebsk @ Nov 1 2006, 00:56) *
Цитата(ps1x @ Oct 31 2006, 23:58) *

Вот такой вот код, по идее должен подсчитывать длину 1 пришедшего импульса нулевого уровня и записывать в еепром. Прерывание настроено на спад. Импульс точно есть и точно больше 100 us по длине. Что не так???
Код
int i;
char run=1;
eeprom int dat1=0;

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{                      
if (run)
{
while (!PORTB.6)
{      
delay_us(10);
i++;
}
run=0;
}      
dat1=i;
}


Обычно делается не так, а если ещё точнее, то так вообще не делается. smile.gif
Прерываеия существуют для того, чтобы освобождать процессор от задержек. А Вы прямо в прерывании её вставляете.
Обычно прерывание настраивается по срезу импульса (или наоборот) и там инициализируется таймер, а по фронту снимается значение таймера. Учитывая, что значение реакции на прерывание почти одинаковое, то получается более-менее точно.

Да я понимаю но ведь работать должен код по идее? smile.gif
otrog
Код
while (!PORTB.6)

Наверно должно быть
Код
while (!PINB.6)
=GM=
Цитата(ps1x @ Oct 31 2006, 20:58) *
Вот такой вот код, по идее должен подсчитывать длину 1 пришедшего импульса нулевого уровня и записывать в еепром. Прерывание настроено на спад. Импульс точно есть и точно больше 100 us по длине. Что не так???

У вас переменная i не определена на входе в прерывание. Кроме того, независимо от значения переменной run может меняться переменная dat1.
Вам уже сказали, что такой код не рекомендуется использовать в прерывании. Мало того, что программная задержка, так еще и долгая запись в еепром. Но если очень хочется, то вот поправленный код
Код
int i;
char run=1;
eeprom int dat1=0;

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
i=0;                      
if (run)
{
while(!PINB.6)
{      
delay_us(10);
i++;
}
dat1=i;
run=0;
}      
}
ps1x
Цитата(=GM= @ Nov 1 2006, 14:43) *
Цитата(ps1x @ Oct 31 2006, 20:58) *

Вот такой вот код, по идее должен подсчитывать длину 1 пришедшего импульса нулевого уровня и записывать в еепром. Прерывание настроено на спад. Импульс точно есть и точно больше 100 us по длине. Что не так???

У вас переменная i не определена на входе в прерывание. Кроме того, независимо от значения ......
Код
int i;
char run=1;
eeprom int dat1=0;

.....


Огромное спасибо smile.gif я както забыл совсем про PINB smile.gif smile.gif smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.