| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
HI-TECH PIC выход из прерывания
10.12.2011, 09:44
|
|
|
Вид на жительство
Регистрация: 07.09.2007
Адрес: Дерёвня Ишимбай
Сообщений: 419
Сказал спасибо: 65
Сказали Спасибо 136 раз(а) в 87 сообщении(ях)
|
HI-TECH PIC выход из прерывания
В программе настроено прерывание от АЦП и TMR0. В TMR0 обрабатывается результат АЦП, а в бесконечном цикле основной программы осуществляется индикация. При выходе из прерывания очень часто возникает ситуация установки случайного числа. МК PIC16F877A.
Прерывание:
|
PHP код:
|
interrupt void tajm(void)
{
//------------------------------------------
if (T0IF & T0IE)
{
if (ADGO==0 && ADIF==0)
{
ADGO=1;
}
T0IF=0;
GIE=1;
}
//------------------------------------------
if (ADIF && ADIE)
{
ADIF=0;
GIE=1;
}
|
Цикл:
|
PHP код:
|
while(1==1) // Запуск бесконечного цикла
{
INDIC[0]=123;
switch (NOCIFR)
{
case 0: CIFRA=lsd; break;
case 2: CIFRA=msd; break;
case 4: CIFRA=bsd; break;
}
switch (CIFRA) // Заходит в прерывание здесь
{ // ABCDEFGP
case 0: PORTC=0b11000000; break; // Выходит тут, и устанавливает 0
case 1: PORTC=0b11111001; break;
case 2: PORTC=0b10100100; break;
case 3: PORTC=0b10110000; break;
case 4: PORTC=0b10011001; break;
case 5: PORTC=0b10010010; break;
case 6: PORTC=0b10000010; break;
case 7: PORTC=0b11111000; break;
case 8: PORTC=0b10000000; break;
case 9: PORTC=0b10010000; break;
}
switch (NOCIFR)
{
case 0: RB7=0; RB6=1; RB5=1; break;
case 1: RB7=1; RB6=1; RB5=1; break;
case 2: RB7=1; RB6=0; RB5=1; break;
case 3: RB7=1; RB6=1; RB5=1; break;
case 4: RB7=1; RB6=1; RB5=0; break;
case 5: RB7=1; RB6=1; RB5=1; break;
}
NOCIFR++;
if (NOCIFR›6)
{
NOCIFR=1;
displ_d=INDIC[0];
msd=bsd=dst=0;
lsd=displ_d;
while (lsd›=10)
{
if((lsd-10)›=0)
{
msd++; lsd-=10;
}
if((msd-10)›=0)
{
bsd++;
msd-=10;
}
if((bsd-10)›=0)
{
dst++;
bsd-=10;
}
}
}
}
|
PS: На данный момент код индикации упростил и добавил его в прерывание, но хотелось бы индикацию оставить за пределами прерывания, да и выяснить надо откуда ошибка появилась.
Последний раз редактировалось Slava-martyn; 10.12.2011 в 09:59.
|
|
|
|
Сказали "Спасибо" Slava-martyn
|
|
|
11.12.2011, 01:00
|
|
|
Гражданин KAZUS.RUN
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
А это зачем???
Сообщение от Slava-martyn
|
|
|
  
|
|
|
|
11.12.2011, 02:49
|
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
|
Re: HI-TECH PIC выход из прерывания
|
|
|
|
11.12.2011, 15:30
|
|
|
Вид на жительство
Регистрация: 07.09.2007
Адрес: Дерёвня Ишимбай
Сообщений: 419
Сказал спасибо: 65
Сказали Спасибо 136 раз(а) в 87 сообщении(ях)
|
Re: HI-TECH PIC выход из прерывания
Почти
|
PHP код:
|
while(1==1) // Запуск бесконечного цикла
{
switch (CIFRA) // Заходит в прерывание здесь
{ // ABCDEFGP
case 0: PORTC=0b11000000; break; // Выходит тут, и устанавливает PORTC=0b11000000; вне зависимости от значения CIFRA !!!
case 1: PORTC=0b11111001; break;
}
|
В архиве программа и модель. На 6 секунде высвечивает 003, при этом (перед этим) входит в прерывание примерно в:
|
PHP код:
|
msd=bsd=dst=0;
lsd=displ_d;
while (lsd›=10)
{
|
выходит в строчке INDIC[0]=123;
Вопрос как и почему это происходит?
Последний раз редактировалось Slava-martyn; 11.12.2011 в 16:08.
|
|
|
|
Сказали "Спасибо" Slava-martyn
|
|
|
12.12.2011, 01:13
|
|
|
Гражданин KAZUS.RUN
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: HI-TECH PIC выход из прерывания
См. пост#2
|
|
|
|
Эти 2 пользователя(ей) сказали Спасибо Bill за это сообщение:
|
|
|
12.12.2011, 16:08
|
|
|
Вид на жительство
Регистрация: 07.09.2007
Адрес: Дерёвня Ишимбай
Сообщений: 419
Сказал спасибо: 65
Сказали Спасибо 136 раз(а) в 87 сообщении(ях)
|
Re: HI-TECH PIC выход из прерывания
И точно!  Если убрать GIE=1 в прерывании таймера, то всё работает как надо.
|
Цитата:
|
|
Возврат из обработки прерываний выполняется по команде RETFIE, при этом происходит установка бита GIE в 1, что позволяет обработать любое отложенное прерывание.
|
Делал по образцу http://www.pcports.ru/articles/pic7.php
|
|
|
|
Сказали "Спасибо" Slava-martyn
|
|
|
12.12.2011, 18:54
|
|
|
Гражданин KAZUS.RUN
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Прежде чем что-то написать,
нужно подумать для чего это необходимо, да необходимо ли это вообще. Или нет?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
Использование HI - TECH для PIC контроллеров
|
ST_Senya |
Микроконтроллеры, АЦП, память и т.д |
27 |
22.10.2010 18:45 |
|
Прерывания PIC
|
milssky |
Микроконтроллеры, АЦП, память и т.д |
12 |
10.10.2010 13:31 |
|
Вход в прерывания для PIC микроконтроллеров
|
dimmich |
Микроконтроллеры, АЦП, память и т.д |
4 |
06.12.2009 17:17 |
|
Изучение HI-TECH C для PIC
|
ST_Senya |
Микроконтроллеры, АЦП, память и т.д |
7 |
26.09.2009 20:36 |
|
выход из прерывания
|
vrt90 АЛЕКСАНДР |
Микроконтроллеры, АЦП, память и т.д |
5 |
05.10.2004 12:18 |
Часовой пояс GMT +4, время: 17:49.
|
|