Как прочитать int из AVR USART ?

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Чт мар 22, 2012 13:25:31
Откуда: Odense, Danmark

Сообщение CheerfulCalf »

В чём проблема?

Код: Выделить всё

static unsigned char d2led[]={0x3F,0x6,0x5b,0x4F,0x66,0x6D,0x7D,0x7,0x7f,0x6F};

int main(void)
{
   //Проверяю терминал, всё нормально показывает
   USART_putstring("POEHALI! ");
   _delay_ms(100);

   //Для проверки дисплея показываю числа, всё отображается нормально.
   int i;
   for (i=0; i<10; i++)
   {
      upd7segment(i);
      _delay_ms(500);
   }
   while(1)
   {
   }
}

ISR(USART_RXC_vect) 
{ 
   char ReceivedByte; 
   ReceivedByte = UDR;
   uint8_t i = 0;
   i = (i<<8) + ReceivedByte;
   // надо показать полученное число (0...9) на дисплее. Ничего не показывает.
   upd7segment(i);
   // хотя назад в ком уходит правильное
   UDR = i;
}

inline void upd7segment(int16_t number)
{
	//if((number<0)||(number>9)) number=0;
	PORTB=d2led[number];		
}
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

Сообщение igor-x »

переслать младший и старший байты отдельно, а после приема собрать в int
Реклама
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Чт мар 22, 2012 13:25:31
Откуда: Odense, Danmark

Сообщение CheerfulCalf »

igor-x писал(а):переслать младший и старший байты отдельно, а после приема собрать в int
Так у меня же 1 байт..
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Так вы посылаете байт или символ?
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Чт мар 22, 2012 13:25:31
Откуда: Odense, Danmark

Сообщение CheerfulCalf »

Ммм... вот так я делаю
Изображение
код такой. на экране всегда ноль, что бы не послал...

Код: Выделить всё

ISR(USART_RXC_vect) 
{ 
   char ReceivedByte; 
   ReceivedByte = UDR; // Fetch the received byte value into the variable "ByteReceived" 
   uint8_t i = 0;
   //i = (i<<8) + ReceivedByte;
   i=atoi(ReceivedByte);
   newMode = i;
   upd7segment(i);
   UDR = ReceivedByte;
}
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Я не знаю, как работает эта фигня (да ещё с виртуальным терминалом), но предполагаю, что отсылает она символы. Так что отобразить надо принятый байт минус 32, тогда на символах 0-9 получите число.
Реклама
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Чт мар 22, 2012 13:25:31
Откуда: Odense, Danmark

Сообщение CheerfulCalf »

Так?
i=atoi(ReceivedByte-32);
он теперь показывает 0 (возможно) и 1, а остальное тоже как 0...
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Что такое atoi?
Просто i = ReceivedByte-32
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Чт мар 22, 2012 13:25:31
Откуда: Odense, Danmark

Сообщение CheerfulCalf »

с atoi в int перевожу.. а так опять не работает, даже 1 не показывает ((
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Можете дать описание этой функции?

Перепишите свою вот так и не парьтесь:

Код: Выделить всё

inline void upd7segment(unsigned char number)
{
   //if((number<0)||(number>9)) number=0;
   PORTB=d2led[number];      
}
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Чт мар 22, 2012 13:25:31
Откуда: Odense, Danmark

Сообщение CheerfulCalf »

так тоже не работает...

из википедии
Функция atoi (ASCII to integer, из ASCII в целое число) в языке программирования Си используется для приведения (конвертации) строки в числовой вид.

int atoi(const char *str)
Аргумент str означает строку, представленную в виде массива символов, содержащего символы знакового целого (тип int) числа. Строка должна быть нуль-терминированной, то есть оканчиваться символом «\0». Когда atoi() получает строку без числовых последовательностей, то в этом случае возвращает ноль (0). Если строка содержит корректную последовательность цифр, представляющих число 0, то также возвращается 0, при этом по возвращаемому числу невозможно определить содержит ли строка корректное число или нет.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

А, смотрю, что-то знакомое.
Нет, вам надо работать именно с числами, строк тут нет. Тут тупо байты.
Мудрый кот
Аватара пользователя
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

Сообщение igor-x »

CheerfulCalf писал(а):Так у меня же 1 байт..
так в теме обозначено int ? или под инт можно чтото другое быть? = 2 байта
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

int ему нужен под upd7segment() как я понял.
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Чт мар 22, 2012 13:25:31
Откуда: Odense, Danmark

Сообщение CheerfulCalf »

ploop писал(а):int ему нужен под upd7segment() как я понял.
да
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Код: Выделить всё

ISR(USART_RXC_vect)
{
   char ReceivedByte;
   ReceivedByte = UDR;
   PORTB=d2led[ReceivedByte - 32];
   UDR = ReceivedByte;
}
И всё.
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Чт мар 22, 2012 13:25:31
Откуда: Odense, Danmark

Сообщение CheerfulCalf »

и так не работает...
если я дела так

Код: Выделить всё

ISR(USART_RXC_vect) 
{ 
   char ReceivedByte; 
   ReceivedByte = UDR; // Fetch the received byte value into the variable "ByteReceived" 
   uint8_t i = 0;
   i=ReceivedByte-32;
   UDR = ReceivedByte;
   PORTB=i;
}
и в терминале набираю от 0 до 9, то портБ принимает такие значения

0=0x00010000
1=0x00010001
2=0x00010010
3=0x00010011
4=0x00010100
5=0x00010101
6=0x00010011
7=0x00010111
8=0x00011000
9=0x00011001
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

и в терминале набираю от 0 до 9, то портБ принимает такие значения
Обратите внимание на пятый бит - он всегда включен, т.е. 32 из числа не вычиталось. Мистика, или вы что-то не так делаете.
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Чт мар 22, 2012 13:25:31
Откуда: Odense, Danmark

Сообщение CheerfulCalf »

ploop писал(а):Мистика, или вы что-то не так делаете.
Даже не знаю...
сделал конечно бред полный

Код: Выделить всё

   i=ReceivedByte-32;
   i &= ~(0x10);
   newMode = i;
   upd7segment(i);
но зато теперь работает )
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

А вот так?

Код: Выделить всё

ISR(USART_RXC_vect)
{
   unsigned char ReceivedByte;
   ReceivedByte = UDR;
   PORTB=d2led[ReceivedByte - 32];
   UDR = ReceivedByte;
}
ReceivedByte сделать unsigned char
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»