WinAVR + Atmega8 = USB устройство
-
alexey6522
- Встал на лапы
- Сообщения: 149
- Зарегистрирован: Чт июл 28, 2011 18:12:28
WinAVR + Atmega8 = USB устройство
Всем привет! Возможно данная тема уже обсуждалась, искал но ничего подходящего для себя не нашёл. Хочу собрать устройство которое будет общаться с ПК через USB порт. Переходник с COM на USB не хочется покупать, сами понимаете лишние затраты и зависеть от дополнительных переходников не хочется. В общем собрал простенький 2-х разрядный счетчик на 7-ми сегментном индикаторе, теперь я хочу получать данные с этого счетчика на ПК написанную на С++ builder, как получать данные с USB и отображать их на ПК в своей программе с помощью каких библиотек я так понимаю придется писать свой драйвер для работы с моим устройством на ПК?
- Вложения
-
- индикация.rar
- (20.82 КБ) 205 скачиваний
- Реклама
-
alexey6522
- Встал на лапы
- Сообщения: 149
- Зарегистрирован: Чт июл 28, 2011 18:12:28
Re: WinAVR + Atmega8 = USB устройство
Подумал и решил отказаться от затеи ввиду сложности. Решил перейти на виртуальный COM порт
http://kibermaster.net/upravlenie-elekt ... pyami-che/
конечно можно использовать и FT232
В общем задача та же, с устройства передавать данные на ПК, только уже через RS232
http://kibermaster.net/upravlenie-elekt ... pyami-che/
конечно можно использовать и FT232
В общем задача та же, с устройства передавать данные на ПК, только уже через RS232
-
alexey6522
- Встал на лапы
- Сообщения: 149
- Зарегистрирован: Чт июл 28, 2011 18:12:28
Re: WinAVR + Atmega8 = USB устройство
Люди помогите послать данные из МК на ПК, счетчик считает от 0 до 99 мне необходимо послать эти данные на ПК через COM порт, слушаю программой terminal client видел в инете что-то подобное но на PIC контроллере и написанной программой на ASM
Вот код моей программы
Вот код моей программы
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
/* -A-
F B
-G-
E C
-D-
*/
// составляем из сегментов цифры
#define N0 (0x3F) //0
#define N1 (0x06) //1
#define N2 (0x5B) //2
#define N3 (0x4F) //3
#define N4 (0x66) //4
#define N5 (0x6D) //5
#define N6 (0x7D) //6
#define N7 (0x07) //7
#define N8 (0x7F) //8
#define N9 (0x6F) //9
unsigned char indikator[10]={N0, N1, N2, N3, N4, N5, N6, N7, N8, N9};
unsigned char y=0; //переменная y
void export_data (unsigned int data)
{
unsigned char i; //переменная i
for (i=0;i<16;i++) {
if ((data&0x8000)==0x00){
PORTD&=~_BV(PD5); //Выставляем биты данных на PD5 (DATA канал)
}
else {
PORTD|=_BV(PD5);
}
PORTD|=_BV(PD6); //Импульс на SH_CP (запись)
PORTD&=~_BV(PD6);
data<<=1;
}
PORTD|=_BV(PD7); //Импульс на ST_CP (защелка - вывод на индикатор записанных данных)
PORTD&=~_BV(PD7);
}
int main(void)
{
unsigned int DS=0; //переменная DS
unsigned int i=0, j=0; //переменная i, j
PORTD=0x00; //Первоначально устанавливаем на всех выходах 0
DDRD=0xff; //установить PD0-PD2 как выходы
DDRD&=~_BV(PD0); //устанавливаем PD0 как ввод
while (1) //Бесконечный цикл
{
DS=(indikator[i] << 8) | indikator[j]; //Закодированное число в 16hex системе исчисления
export_data(DS); //Отправляем данные на сдвиговый регистр
if (j>=9)
{
j = 0;
if (i>=9) // Если i > 9 то обнуляем
i=0;
else i++;
}
else j++;
_delay_ms(300); //пауза 300 мс.
}
}
- SubDia
- Держит паяльник хвостом
- Сообщения: 995
- Зарегистрирован: Сб апр 02, 2011 17:59:22
- Откуда: Город-герой Севастополь
Re: WinAVR + Atmega8 = USB устройство
А теперь инициализируете UART, и каждый раз после смены чисел на индикаторе включаете передатчик, и выдаете в порт два байта: первую и вторую цифру.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )

MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )

-
alexey6522
- Встал на лапы
- Сообщения: 149
- Зарегистрирован: Чт июл 28, 2011 18:12:28
Re: WinAVR + Atmega8 = USB устройство
Вот добавил к основному коду, но он не хочет мне передавать цифры, только буквы обрамленные одинарными кавычками
По идеи USART_vSendByte(DS); команда должна отправлять на порт значение от 0 до 9, а вместо этого крякозыбра, хотя буквы нормально передаются если записать как
USART_vSendByte('B');
Код: Выделить всё
// Define baud rate
#define USART_BAUD 9600
#define USART_UBBR_VALUE ((F_CPU/USART_BAUD/16)-1)
void USART_vInit(void) {
// Set baud rate
UBRRH = (uint8_t)(USART_UBBR_VALUE>>8);
UBRRL = (uint8_t)USART_UBBR_VALUE;
// Set frame format to 8 data bits, no parity, 1 stop bit
UCSRC = (0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)|(1<<URSEL);
// Enable receiver and transmitter
UCSRB = (1<<RXEN)|(1<<TXEN);
}
void USART_vSendByte(uint8_t u8Data) {
// Wait if a byte is being transmitted
while((UCSRA&(1<<UDRE)) == 0);
// Transmit data
UDR = u8Data;
}
int main(void)
{
// Initialise USART
USART_vInit();
while (1) //Бесконечный цикл
{
DS=(indikator[i] << 8) | indikator[j]; //Закодированное число в 16hex системе исчисления
export_data(DS); //Отправляем данные на сдвиговый регистр
if (j>=9)
{
j = 0;
if (i>=9) // Если i > 9 то обнуляем
i=0;
else i++;
}
else j++;
USART_vSendByte(DS);
_delay_ms(200); //пауза 300 мс.
}
}
USART_vSendByte('B');
- Реклама
- SubDia
- Держит паяльник хвостом
- Сообщения: 995
- Зарегистрирован: Сб апр 02, 2011 17:59:22
- Откуда: Город-герой Севастополь
Re: WinAVR + Atmega8 = USB устройство
Кракозябры вроде черных и белых смайликов, ромбиков, сердечек и точечек?
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )

MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )

- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Re: WinAVR + Atmega8 = USB устройство
а почему не само число ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
-
alexey6522
- Встал на лапы
- Сообщения: 149
- Зарегистрирован: Чт июл 28, 2011 18:12:28
Re: WinAVR + Atmega8 = USB устройство
Да, такое чувство, что при попытке передать 0x31 я получаю ASCII символ но не цифру 1
Re: WinAVR + Atmega8 = USB устройство
Дак посылай их командой:alexey6522 писал(а):По идеи USART_vSendByte(DS); команда должна отправлять на порт значение от 0 до 9, а вместо этого крякозыбра, хотя буквы нормально передаются если записать как
USART_vSendByte('B');
USART_vSendByte('5');
всё то же будет нормально отображаться.
Не надо путать число 0, и символ "0"!
Символу "0" соответствует шеснадцатиричное число 0х30.
- SubDia
- Держит паяльник хвостом
- Сообщения: 995
- Зарегистрирован: Сб апр 02, 2011 17:59:22
- Откуда: Город-герой Севастополь
Re: WinAVR + Atmega8 = USB устройство
Да, тут с ASCII кодами наколка. 
Действительно стоящий совет выше - отправлять символ, а не число, благо в данном случае можно обойтись малой кровью.
У меня, например, все хуже - моя программа под винду принимает от контроллера два байта, после чего должна их отобразить в виде цифры в определенном окне. =)
Кстати, интересный момент по поводу типа данных. Интересно, зачем используется тип uint8_t, а не unsigned char, к примеру..
ЗЫ.
Действительно стоящий совет выше - отправлять символ, а не число, благо в данном случае можно обойтись малой кровью.
У меня, например, все хуже - моя программа под винду принимает от контроллера два байта, после чего должна их отобразить в виде цифры в определенном окне. =)
Кстати, интересный момент по поводу типа данных. Интересно, зачем используется тип uint8_t, а не unsigned char, к примеру..
ЗЫ.
Аццкому коду "0x31" как раз и будет соответствовать символ "1".alexey6522 писал(а):Да, такое чувство, что при попытке передать 0x31 я получаю ASCII символ но не цифру 1
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )

MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )

-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: WinAVR + Atmega8 = USB устройство
Не надо путать символ '0' и строку "0"!Kotische писал(а):Не надо путать число 0, и символ "0"!
Символу "0" соответствует шеснадцатиричное число 0х30.
Строка "0" состоит из символа '0' и числа 0.
Re: WinAVR + Atmega8 = USB устройство
А зря отказались, ничего сложного. Вот посмотрите тут. Все подробно описано, есть примеры и, главное, все реально работает.alexey6522 писал(а):Подумал и решил отказаться от затеи ввиду сложности. Решил перейти на виртуальный COM порт
http://kibermaster.net/upravlenie-elekt ... pyami-che/
конечно можно использовать и FT232
В общем задача та же, с устройства передавать данные на ПК, только уже через RS232
-
alexey6522
- Встал на лапы
- Сообщения: 149
- Зарегистрирован: Чт июл 28, 2011 18:12:28
Re: WinAVR + Atmega8 = USB устройство
Я ценю то что вы ответили и хотите что бы я попробовал все-таки на USB сделать свое устройство. К сожалению я изучаю Atmega8 + WinAVR, для меня Visual studio это темный лес в котором нужно разбираться заново. Приведите мне пример для mega8 на WinAVR.Bird55
Вот у меня вопрос, в чем разница если я буду использовать микруху FT232 и так же подключу все к USB а команды буду посылать как на COM? Какова скорость у USB HID? Я понимаю сейчас большинство устройств даже обычный принтер сделан на USB HID?! Сколько у меня останется пространства для реализации основной программы для МК если зашью USB HID в него
-
alexey6522
- Встал на лапы
- Сообщения: 149
- Зарегистрирован: Чт июл 28, 2011 18:12:28
Re: WinAVR + Atmega8 = USB устройство
Дело в том что мне не надо какую-то фиксированную цифру отправить, если вы обратили внимние то у мне написан счетчик от 0 до 99 считает и мне нужно отправить на ком порт число которое содержится в переменной DSKotische
Re: WinAVR + Atmega8 = USB устройство
ну так преобразуй число в строку
хотя бы функцией sprintf(...)
а потом строку в порт выводи.
хотя бы функцией sprintf(...)
а потом строку в порт выводи.
Re: WinAVR + Atmega8 = USB устройство
Драйвер не нужен.alexey6522 писал(а):как получать данные с USB и отображать их на ПК в своей программе с помощью каких библиотек я так понимаю придется писать свой драйвер для работы с моим устройством на ПК?
Прочитайте эту статью http://www.radioman-portal.ru/pages/1698/index.shtml
Или посмотрите ее оригинал в журнале Радио №4, 2011 г.
-
alexey6522
- Встал на лапы
- Сообщения: 149
- Зарегистрирован: Чт июл 28, 2011 18:12:28
Re: WinAVR + Atmega8 = USB устройство
Что-то не получается преобразовать в строку передается буква С вместо 0x31 или же если пробовать передать просто '9' буквы распознаются нормально, может кто-нибудь уже запустит пример и опробует, чем говорить будто на разных языкахKotische
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: WinAVR + Atmega8 = USB устройство
alexey6522, так бы чтоли сделать, ведь всё уже готово:
Код: Выделить всё
...
while (1) //Бесконечный цикл
{
DS=(indikator[i] << 8) | indikator[j]; //Закодированное число в 16hex системе исчисления
USART_vSendByte(i+'0'); USART_vSendByte(j+'0'); // Отправляем число
export_data(DS); //Отправляем данные на сдвиговый регистр
...
-
alexey6522
- Встал на лапы
- Сообщения: 149
- Зарегистрирован: Чт июл 28, 2011 18:12:28
Re: WinAVR + Atmega8 = USB устройство
Не спорю, данные передаются, но почему-то цифр я там не вижу когда слушаю порт, вместо них буквыIfoR
- Вложения
-
- Безымянный.JPG
- (40.32 КБ) 486 скачиваний
- IfoR
- Поставщик валерьянки для Кота
- Сообщения: 2029
- Зарегистрирован: Сб ноя 15, 2008 10:09:56
- Откуда: г. Тула
- Контактная информация:
Re: WinAVR + Atmega8 = USB устройство
Может быть, не синхронизирована скорость передачи? Хотя не очень-то похоже. Или может какие нить другие параметры передачи? 
Последний раз редактировалось IfoR Пт авг 12, 2011 20:50:16, всего редактировалось 1 раз.



