роботы робототехника микроконтроллеры


 Страниц (1): [1]   

> Без описания
ems2811 Post Id


Рядовой


Сообщений всего: 15
Дата рег-ции: Сент. 2011  



Здравствуйте. Пишу для манипулятора программу и столкнулся с такой проблемой:
Приходят не верные данные от терминала, посылка от контроллера идёт нормально. Если не использовать прерывание, а в цикле опрашивать наличие флага принятого байта, то всё работает правильно. Пишу в Atmel Studio 6, виртуализация в proteus. Кварц на 8 МГц. Код программы:
CODE:
#include <avr/io.h>
#include <avr/interrupt.h>

ISR(USART_RXC_vect)
{
char tmp=UDR;
sendpc(tmp);
}

void sendpc(char *text){
for (int i=0;i<strlen(text);i++){
while( ( UCSRA & ( 1 << 5 ) ) == 0 );
UDR=text[i];
}
}

void main(void)
{
//pin config
DDRA=0xC0;
PORTA=0x00;
DDRB=0xFF;
PORTA=0x00;
DDRC=0xFF;
PORTC=0x00;
DDRD=0xFF;
PORTD=0x00;

//USART config 38400 bps 8 data bits, no parity, 1 stop
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;
sei();

sendpc("ready \r\n");
while(1)
{
//TODO:: Please write your application code
}
}
 
 Top
elmot Post Id



Гуру


Сообщений всего: 1141
Дата рег-ции: Дек. 2010  



1. Почему не работает
В обработчике Вы передаете в sendpc вместо адреса символьной строки сам символ.
т.е. получив букву 'А'(код 65), пытаетесь передать не 'А', а то, что лежит в памяти мк по адресу 65.

2. Плохой код
Цитата:
for (int i=0;i<strlen(text);i++)

strlen на каждом шаге цикла сканирует строку на предмет терминатора - нулевого байта. В данном конкретном примере не слишком критично, тк все равно все упирается в медленный uart, но надо привыкать писать код оптимальнее.

Рекомендую почитать книжку по С и форматам данных в нем.
 
 Top
ems2811 Post Id


Рядовой


Сообщений всего: 15
Дата рег-ции: Сент. 2011  



Спасибо, разобрался. Но появился новый вопрос:
Не могу понять разницы: численный одномерный массив и такой же только символьный ведут себя по-разному. Символьный выведет 5 символов (как-то в первый элемент попадает 2 символа (оба)), а числовой только 3, будто второй элемент массива пуст, хотя при выводе из каждой ячейки отдельно все нормально.
CODE:

int buffer[2];
int j=0;

ISR(USART_RXC_vect)
{
buffer[j]=UDR;
j++;
if(j==2){
j=0;
sendpc(buffer);
sendpc(&buffer[0]);
sendpc(&buffer[1]);
}
}

void sendpc(char text[]){
int len=strlen(text);
for (int i=0;i<len;i++){
while( ( UCSRA & ( 1 << 5 ) ) == 0 );
UDR=text[i];
}
}

(Отредактировано автором: 14 Апреля, 2013 - 14:29:30)

 
 Top
elmot Post Id



Гуру


Сообщений всего: 1141
Дата рег-ции: Дек. 2010  



Конечно по-разному себя ведут. В символьном массиве размер элемента - символ, т.е. 1 байт, в intовом - зависит от платформы. На 8мибитным МК - 2 байта.
т.е
CODE:
.
(int)(& ((char[])100)[100])== 200
(int)(& ((int[])100)[100])== 300
 
 Top
Страниц (1): [1]
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru