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

 
 
> Прерываени и перенос массива, Пишим прогу под 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
Ответов
SSerge
сообщение Feb 26 2010, 09:09
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Комментировать исходную программу, полагаю, большого смысла нет. Вам для начала нужно отделить друг от друга два уровня в программе:
нижний - работа с регистрами UART, приём и передача отдельных байт
и верхний - работа с символьной строкой.
Ниже минимальный интерфейс в традициях языка С, аналогично функциям getchar/putchar, про них в любом учебнике написано. Это реализация самая простая, без использования прерываний (при инициализации бит RXCIE устанавливать не надо).
При желании можете реализовать работу с UART-ом по прерываниям, но начать лучше с этого и потом двигаться от простого к сложному.
CODE

#ifndef EOF
#define EOF (-1)
#endif
int Uputchar( int data )
{
while ( !( UCSRA & (1<<UDRE)) )
; // ждём готовности передатчика
return UDR = data; // записали data в регистр передатчика
// и, для бОльшей похожести на putchar(),
// возвращаем это-же значение как результат функции
}

int Ugetchar( void )
{
if ( UCSRA & (1<<RXC) )
return UDR; // возвращаем байт, принятый приёмником
else
return EOF; // если приёмник ничего пока не принял, то возвращаем EOF
}

Теперь, пользуясь только Ugetchar(), принимаете символы один за другим и собираете из них строку.
Что с этой строкой дальше делать - это уже Ваша забота.
Для вывода тоже используете только Uputchar(), и нет необходимости на этом уровне задумываться как работает UART.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post



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

 


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


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