реклама на сайте
подробности

 
 
> Внешние переменные при обработке прерываний, Помогите найти косяк
Zloy_Paulik
сообщение Mar 31 2011, 11:10
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 31-03-11
Пользователь №: 64 024



Я только начинаю программировать AVR , поэтому сильео не пинайте.
МК ATMega 16. К 5-му биту регистра А подключена кнопка. В ненажатом состоянии на ножку подается высокий уровень. Для отсеживания нажатий на кнопку я хочу использовать флаг, который устанавливается в обработчике прерываний от таймера и сбрасывается в основном цикле программы после выполнения нужных мне действий. Вся проблема в том, что будучи сброшенным один раз этот флаг уже в 1 не устанавливается. Точнее говоря устанавливается, но только в теле функции обработки прерывания, а в ф-ию main передается ноль. Где косяк? Уже всю голову сломал.

Собственно программа

#include <avr/io.h>
#include <string.h>
#include <stdio.h>
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>



unsigned char temp;
extern int key_pressed=0;
extern int i_Regim=0;



extern void Timer_init (void) { // инициализация таймера опроса кнопок

TCCR1A = 0x00;
TCCR1B = (0 << CS12)|(1 << CS11)|(0 << CS10)|(1 << WGM12); //предделитель clk/8, режим таймера СТС
TCNT1=0x00;
OCR1A=780*3; // выбор коэффициента деления
TIMSK = (1 << OCIE1A); // разрешение прерывания по совпадению

temp = 0b00000000; // Присвоение начального значения

asm ("sei"); // Разрешение прерываний


}



ISR (TIMER1_COMPA_vect) { // обработка прерывания от таймера 1

// обработка нажатия кнопки "Режим"
if (!bit_is_set(PINA,5)) temp++; //начало антидребезг
else if (!(temp==0)) temp--;

if (temp > 10) {
temp=0; // конец антидребезга
key_pressed=1;
i_Regim++; // переходим к следующему режиму
}




}


int main( void ){



PORTA = 0x00; // сброс порта А
DDRA= 0x00; // все выводы порта - входы

PORTD = 0x00; // сброс порта D
DDRD= 0xFF; // все выводы порта D - выходы


i_Regim=0; // устанавливаем режим номер 0 - "работа"

Timer_init (); // инициализация таймера для работы с кнопками

key_pressed=1; // для первоначального отображения информации

while( 1 ){ // основной цикл

if (key_pressed) {

PORTD=i_Regim; // ЭТА СТРОЧКА НЕ ВЫПОЛНЯЕТСЯ !!!
key_pressed=0;
}
} // конец основного цикла


return 0;
} // конец main



Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Pasha
сообщение Mar 31 2011, 19:19
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Все выполняется. протез7.7сп2 б.9089
На нехватку ресурсов не матюкаиццо sm.gif, т.е. все в самом что ни на есть реальном времени
Go to the top of the page
 
+Quote Post
Zloy_Paulik
сообщение Mar 31 2011, 20:58
Сообщение #3





Группа: Новичок
Сообщений: 5
Регистрация: 31-03-11
Пользователь №: 64 024



Цитата(_Pasha @ Mar 31 2011, 22:19) *
Все выполняется. протез7.7сп2 б.9089
На нехватку ресурсов не матюкаиццо sm.gif, т.е. все в самом что ни на есть реальном времени


У меня идентичный Протеус. То есть Вы хотите сказать, что строчка "PORTD=i_Regim; " у Вас выполняется? Если да, то значит дело не в алгоритме, а в Протеусе и мне надо разбираться в настройках последнего.
Go to the top of the page
 
+Quote Post
nk@
сообщение Apr 1 2011, 04:12
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 8-12-09
Пользователь №: 54 138



Цитата(Zloy_Paulik @ Mar 31 2011, 23:58) *
У меня идентичный Протеус. То есть Вы хотите сказать, что строчка "PORTD=i_Regim; " у Вас выполняется? Если да, то значит дело не в алгоритме, а в Протеусе и мне надо разбираться в настройках последнего.

bb-offtopic.gif Прошу прощения, но подмыло...
У меня создается впечатление, что Вы, уважаемые, не свой код отлаживаете, а тестируете Протеус smile3046.gif Вот Вы не знаете, в чем проблема - в Вашей программе или это глюки Протеуса. Вопрос: и зачем такой инструмент нужен?
Лично я всегда отлаживаю в "железе" и никогда не пользовался симуляторами, типа Протеуса. Сперва я пользовался только самодельным программатором, стареньким осциллографом, и COM-портом. Если у чипа нет UART, но есть хоть одна свободная нога, использовал программный UART (а что делать?). Потом, когда поделки превратились в изделия, купил себе JTAGICE, хотя пользуюсь им в последнее время крайне редко, в основном с маленькими камешками - сильно выручает debugwire. Не буду говорить про мозг, как основную тулзовину при отладке sm.gif
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Apr 1 2011, 05:35
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(nk@ @ Apr 1 2011, 07:12) *
bb-offtopic.gif Прошу прощения, но подмыло...
У меня создается впечатление, что Вы, уважаемые, не свой код отлаживаете, а тестируете Протеус smile3046.gif Вот Вы не знаете, в чем проблема - в Вашей программе или это глюки Протеуса. Вопрос: и зачем такой инструмент нужен?

Для отладки без глюков biggrin.gif
Там глюков намного меньше, чем кажется. Просто новое ничего на нем не надо осваивать. Ввиду полной неясности картины.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01427 секунд с 7
ELECTRONIX ©2004-2016