Страница 1 из 2
Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 13:08:14
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];
}
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 13:24:20
igor-x
переслать младший и старший байты отдельно, а после приема собрать в int
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 13:31:54
CheerfulCalf
igor-x писал(а):переслать младший и старший байты отдельно, а после приема собрать в int
Так у меня же 1 байт..
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 13:35:49
ploop
Так вы посылаете байт или символ?
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 13:40:18
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;
}
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 13:43:45
ploop
Я не знаю, как работает эта фигня (да ещё с виртуальным терминалом), но предполагаю, что отсылает она символы. Так что отобразить надо принятый байт минус 32, тогда на символах 0-9 получите число.
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 13:49:00
CheerfulCalf
Так?
i=atoi(ReceivedByte-32);
он теперь показывает 0 (возможно) и 1, а остальное тоже как 0...
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 13:50:27
ploop
Что такое atoi?
Просто i = ReceivedByte-32
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 13:52:49
CheerfulCalf
с atoi в int перевожу.. а так опять не работает, даже 1 не показывает ((
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 13:53:54
ploop
Можете дать описание этой функции?
Перепишите свою вот так и не парьтесь:
Код: Выделить всё
inline void upd7segment(unsigned char number)
{
//if((number<0)||(number>9)) number=0;
PORTB=d2led[number];
}
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 14:01:07
CheerfulCalf
так тоже не работает...
из википедии
Функция atoi (ASCII to integer, из ASCII в целое число) в языке программирования Си используется для приведения (конвертации) строки в числовой вид.
int atoi(const char *str)
Аргумент str означает строку, представленную в виде массива символов, содержащего символы знакового целого (тип int) числа. Строка должна быть нуль-терминированной, то есть оканчиваться символом «\0». Когда atoi() получает строку без числовых последовательностей, то в этом случае возвращает ноль (0). Если строка содержит корректную последовательность цифр, представляющих число 0, то также возвращается 0, при этом по возвращаемому числу невозможно определить содержит ли строка корректное число или нет.
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 14:03:15
ploop
А, смотрю, что-то знакомое.
Нет, вам надо работать именно с числами, строк тут нет. Тут тупо байты.
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 14:16:05
igor-x
CheerfulCalf писал(а):Так у меня же 1 байт..
так в теме обозначено int ? или под инт можно чтото другое быть? = 2 байта
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 14:20:21
ploop
int ему нужен под upd7segment() как я понял.
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 14:21:55
CheerfulCalf
ploop писал(а):int ему нужен под upd7segment() как я понял.
да
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 14:31:38
ploop
Код: Выделить всё
ISR(USART_RXC_vect)
{
char ReceivedByte;
ReceivedByte = UDR;
PORTB=d2led[ReceivedByte - 32];
UDR = ReceivedByte;
}
И всё.
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 14:41:36
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
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 14:46:34
ploop
и в терминале набираю от 0 до 9, то портБ принимает такие значения
Обратите внимание на пятый бит - он всегда включен, т.е. 32 из числа не вычиталось. Мистика, или вы что-то не так делаете.
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 14:53:39
CheerfulCalf
ploop писал(а):Мистика, или вы что-то не так делаете.
Даже не знаю...
сделал конечно бред полный
Код: Выделить всё
i=ReceivedByte-32;
i &= ~(0x10);
newMode = i;
upd7segment(i);
но зато теперь работает )
Re: Как прочитать int из AVR USART ?
Добавлено: Чт июн 07, 2012 14:55:51
ploop
А вот так?
Код: Выделить всё
ISR(USART_RXC_vect)
{
unsigned char ReceivedByte;
ReceivedByte = UDR;
PORTB=d2led[ReceivedByte - 32];
UDR = ReceivedByte;
}
ReceivedByte сделать
unsigned char