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

 
 
> Прерываени и перенос массива, Пишим прогу под ATmega8
Rom20
сообщение Feb 25 2010, 05:33
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 10-10-08
Пользователь №: 40 823



Пишу программу по Atmega 8 и вот какая проблема когда оп перерывание принимаю данные в масив и возвращаюсь обратно из прерываний массив оказывается пустой подсажите пожалуйста может что не так с классами памяти и в чем еще может быть проблема
Код
uint8_t a[30]; //глобальное обьявление массива
int i=0,b=0;
//прерываение по флагу RXC
ISR (USART_RXC_vect)
{
    PORTA=0x03;
    _delay_ms(200);
    a[i]=UDR;
    _delay_us(10);
    UDR=a[i];
    if (a[i]==0x0D)
    {
        UDR='\r';
        _delay_ms(1);
        UDR='\n';
        i=0;
    }
    else
    {
        i++;
        b++;
    }
}

Код
void in_1()
{
DDRA=0xFF;
while(1)
{
PORTA=0x00;
UDR=a[0];  //<<<<<вот в этом месте МК в порт ни чего не выкидывает хотя по логике должен выкинуть 0й елемент массива
if (a[i]==0x0D)
{
PORTA=0xFF;
_delay_ms(200);
}
}
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Feb 25 2010, 10:58
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Rom20 @ Feb 25 2010, 07:33) *
<<<<<вот в этом месте МК в порт ни чего не выкидывает хотя по логике должен выкинуть 0й елемент массива
Если действительно "ничего не выкидывает" - значит вы либо не доходите до этого места, либо в этот момент UDR занят передачей. Вы ведь не проверяете его готовность по флагу UDRE. Вполне возможно, что он занят передачей из прерывания.
Массив тут ни при чем - если бы вы получали что-то не то - тогда надо было бы искать в массиве.

А вот тут вы передаете 0x0D дважды:
Код
    UDR=a[i];
    if (a[i]==0x0D)
    {
        UDR='\r';


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Rom20
сообщение Feb 26 2010, 03:21
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 10-10-08
Пользователь №: 40 823



Цитата(Сергей Борщ @ Feb 25 2010, 14:58) *
Если действительно "ничего не выкидывает" - значит вы либо не доходите до этого места, либо в этот момент UDR занят передачей. Вы ведь не проверяете его готовность по флагу UDRE. Вполне возможно, что он занят передачей из прерывания.
Массив тут ни при чем - если бы вы получали что-то не то - тогда надо было бы искать в массиве.

Нет UDR не занят, выкидывая i во время прерывай я получаю его раным числу символов прешедших с пк (следовательно счетчик работает) а возвращаясь из прерывания снова пробую выкинуть i в порт я получаю ноль, отсюда вывад что значение i не переносится из прерываний отсюда могу предположить что это связано с памятью мк
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 26 2010, 08:08
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Rom20 @ Feb 26 2010, 05:21) *
Нет UDR не занят, выкидывая i во время прерывай я получаю его раным числу символов прешедших с пк (следовательно счетчик работает)
Еще раз, на пальцах: запись UDR = data вовсе не означает, что в этот момент байт уже отправился. Он всего лишь записался в буфер передачи и передача началась. Буфер на два байта (об этом подробно написано в даташите). Пока первый байт не будет передан полностью, писать в буфер третий байт не имеет смысла - он будет просто проигнорирован, потому что класть его просто некуда. И об этом тоже написано в даташите. Итого - вы положили в прерывании два символа (добавив \r\n), и выйдя пытаетесь передать третий. Ну сделайте же вы проверку UDRE перед передачей или боритесь дальше с ветряными мельницами - вам жалко пары команд?
Код
while(!(UCSRA & (1<<UDRE)))
  ;
UDR=a[0];


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Rom20
сообщение Feb 26 2010, 10:36
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 10-10-08
Пользователь №: 40 823



Цитата(Сергей Борщ @ Feb 26 2010, 11:08) *
Ну сделайте же вы проверку UDRE перед передачей или боритесь дальше с ветряными мельницами - вам жалко пары команд?
Код
while(!(UCSRA & (1<<UDRE)))
;
UDR=a[0];

Делал проверку UDRE как вы и писали а результата не было ни какого, вот и забил на нее, вот только щас вы ответили на мой вопрос что переменные и масив мне надо было обьявит при помощи volatile uint8_t вот где у меня была ошибка, буду проверять надеюсь сработает
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 26 2010, 16:32
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Rom20 @ Feb 26 2010, 13:36) *
только щас вы ответили на мой вопрос что переменные и масив мне надо было обьявит при помощи volatile uint8_t
Я Вам об этом сразу сказал...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 12:51
Рейтинг@Mail.ru


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