|
Прерываени и перенос массива, Пишим прогу под ATmega8 |
|
|
|
Feb 25 2010, 05:33
|
Участник

Группа: Участник
Сообщений: 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); } } }
|
|
|
|
|
 |
Ответов
|
Feb 25 2010, 10:58
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Feb 26 2010, 03:21
|
Участник

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

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

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Feb 26 2010, 10:36
|
Участник

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

|
Цитата(Сергей Борщ @ Feb 26 2010, 11:08)  Ну сделайте же вы проверку UDRE перед передачей или боритесь дальше с ветряными мельницами - вам жалко пары команд? Код while(!(UCSRA & (1<<UDRE))) ; UDR=a[0]; Делал проверку UDRE как вы и писали а результата не было ни какого, вот и забил на нее, вот только щас вы ответили на мой вопрос что переменные и масив мне надо было обьявит при помощи volatile uint8_t вот где у меня была ошибка, буду проверять надеюсь сработает
|
|
|
|
Сообщений в этой теме
Rom20 Прерываени и перенос массива Feb 25 2010, 05:33 demiurg_spb Ну что тут можно сказать:
1. Изучите ключевое слов... Feb 25 2010, 07:58  _Pasha Цитата(Rom20 @ Feb 26 2010, 06:21) могу п... Feb 26 2010, 07:09   Rom20 Цитата(_Pasha @ Feb 26 2010, 10:09) А чег... Feb 26 2010, 08:15    Сергей Борщ Цитата(Rom20 @ Feb 26 2010, 10:15) КодUDR... Feb 26 2010, 08:48 SSerge Комментировать исходную программу, полагаю, большо... Feb 26 2010, 09:09
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|