|
Прерываени и перенос массива, Пишим прогу под 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:15
|
Участник

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

|
Цитата(_Pasha @ Feb 26 2010, 10:09)  А чего гадать, если можно листинг посмотреть? CODE #include <stdio.h> #include <stdlib.h> #include "main.h" #include <avr/interrupt.h> uint8_t a[30]; uint8_t i=0,b=0; ISR (USART_RXC_vect) { PORTA=0xFF; _delay_ms(200); a[i]=UDR;
_delay_us(10); UDR=a[i]; _delay_ms(10); if (a[i]=='$') { UDR='\r'; _delay_ms(1); UDR='\n'; _delay_ms(1); UDR=i+48; //<<вот в этом месте выкидывает верное значение i
} else { i++; } }
void usart() { //натсраиваем скорость 19200 бот/c UBRRL=25; UBRRH=0; // настраиваем приемник передатчик UCSRB=(1<<RXEN) |(1<<TXEN)|(1<<RXCIE); // 8 бит данных UCSRC=(1<<UCSZ0) |(1<<UCSZ1)|(1<<URSEL);
}
void main() { sei(); usart(); DDRA=0x80; while(1) { PORTA=0; _delay_ms(200); UDR=i+48; //<<здесь же i все время равно 0 и из прерываний он не пересылает значени i _delay_ms(10); UDR=a[i]+48; _delay_ms(20); PORTA=0xFF; _delay_ms(200); if (a[i]=='$') { PORTA=0xFF; _delay_ms(200); _delay_ms(200); _delay_ms(200); _delay_ms(200); _delay_ms(200); _delay_ms(200); _delay_ms(200); большинство задержек поставлено специально для отладки т.к. виду отладку по меганию светодиода
Сообщение отредактировал rezident - Feb 26 2010, 22:20
Причина редактирования: Уменьшение видимого размера цитаты исходника.
|
|
|
|
|
Feb 26 2010, 08:48
|

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

|
Цитата(Rom20 @ Feb 26 2010, 10:15)  Код UDR=i+48; //<<здесь же i все время равно 0 и из прерываний он не пересылает значени i И будет равно, пока вы не объявите i как volatile uint8_t i. То же самое и с a[]. Все правильно. И массивы тут не при чем.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
Rom20 Прерываени и перенос массива Feb 25 2010, 05:33 demiurg_spb Ну что тут можно сказать:
1. Изучите ключевое слов... Feb 25 2010, 07:58  Сергей Борщ Цитата(Rom20 @ Feb 26 2010, 05:21) Нет UD... Feb 26 2010, 08:08   Rom20 Цитата(Сергей Борщ @ Feb 26 2010, 11:08) ... Feb 26 2010, 10:36    demiurg_spb Цитата(Rom20 @ Feb 26 2010, 13:36) только... Feb 26 2010, 16:32 SSerge Комментировать исходную программу, полагаю, большо... Feb 26 2010, 09:09
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|