WinAVR + Atmega8 = USB устройство

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

WinAVR + Atmega8 = USB устройство

Сообщение alexey6522 »

Всем привет! Возможно данная тема уже обсуждалась, искал но ничего подходящего для себя не нашёл. Хочу собрать устройство которое будет общаться с ПК через USB порт. Переходник с COM на USB не хочется покупать, сами понимаете лишние затраты и зависеть от дополнительных переходников не хочется. В общем собрал простенький 2-х разрядный счетчик на 7-ми сегментном индикаторе, теперь я хочу получать данные с этого счетчика на ПК написанную на С++ builder, как получать данные с USB и отображать их на ПК в своей программе с помощью каких библиотек я так понимаю придется писать свой драйвер для работы с моим устройством на ПК?
Вложения
индикация.rar
(20.82 КБ) 205 скачиваний
Реклама
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

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 устройство

Сообщение alexey6522 »

Люди помогите послать данные из МК на ПК, счетчик считает от 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 устройство

Сообщение SubDia »

А теперь инициализируете UART, и каждый раз после смены чисел на индикаторе включаете передатчик, и выдаете в порт два байта: первую и вторую цифру.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Реклама
Эиком - электронные компоненты и радиодетали
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Re: WinAVR + Atmega8 = USB устройство

Сообщение alexey6522 »

Вот добавил к основному коду, но он не хочет мне передавать цифры, только буквы обрамленные одинарными кавычками

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

// 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(DS); команда должна отправлять на порт значение от 0 до 9, а вместо этого крякозыбра, хотя буквы нормально передаются если записать как
USART_vSendByte('B');
Реклама
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: WinAVR + Atmega8 = USB устройство

Сообщение SubDia »

Кракозябры вроде черных и белых смайликов, ромбиков, сердечек и точечек?
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Реклама
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

Re: WinAVR + Atmega8 = USB устройство

Сообщение Кислый »

а почему не само число ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Re: WinAVR + Atmega8 = USB устройство

Сообщение alexey6522 »

Да, такое чувство, что при попытке передать 0x31 я получаю ASCII символ но не цифру 1
Аватара пользователя
Kotische
Опытный кот
Сообщения: 885
Зарегистрирован: Сб июл 19, 2008 02:16:33
Откуда: Саратов

Re: WinAVR + Atmega8 = USB устройство

Сообщение Kotische »

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 устройство

Сообщение SubDia »

Да, тут с ASCII кодами наколка. :)
Действительно стоящий совет выше - отправлять символ, а не число, благо в данном случае можно обойтись малой кровью.
У меня, например, все хуже - моя программа под винду принимает от контроллера два байта, после чего должна их отобразить в виде цифры в определенном окне. =)
Кстати, интересный момент по поводу типа данных. Интересно, зачем используется тип uint8_t, а не unsigned char, к примеру..
ЗЫ.
alexey6522 писал(а):Да, такое чувство, что при попытке передать 0x31 я получаю ASCII символ но не цифру 1
Аццкому коду "0x31" как раз и будет соответствовать символ "1".
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: WinAVR + Atmega8 = USB устройство

Сообщение BerZerK-ku »

Kotische писал(а):Не надо путать число 0, и символ "0"!
Символу "0" соответствует шеснадцатиричное число 0х30.
Не надо путать символ '0' и строку "0"!
Строка "0" состоит из символа '0' и числа 0.
Аватара пользователя
Bird55
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Вт сен 02, 2008 18:17:29

Re: WinAVR + Atmega8 = USB устройство

Сообщение Bird55 »

alexey6522 писал(а):Подумал и решил отказаться от затеи ввиду сложности. Решил перейти на виртуальный COM порт
http://kibermaster.net/upravlenie-elekt ... pyami-che/
конечно можно использовать и FT232
В общем задача та же, с устройства передавать данные на ПК, только уже через RS232
А зря отказались, ничего сложного. Вот посмотрите тут. Все подробно описано, есть примеры и, главное, все реально работает. :)
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Re: WinAVR + Atmega8 = USB устройство

Сообщение alexey6522 »

Bird55
Я ценю то что вы ответили и хотите что бы я попробовал все-таки на USB сделать свое устройство. К сожалению я изучаю Atmega8 + WinAVR, для меня Visual studio это темный лес в котором нужно разбираться заново. Приведите мне пример для mega8 на WinAVR.
Вот у меня вопрос, в чем разница если я буду использовать микруху FT232 и так же подключу все к USB а команды буду посылать как на COM? Какова скорость у USB HID? Я понимаю сейчас большинство устройств даже обычный принтер сделан на USB HID?! Сколько у меня останется пространства для реализации основной программы для МК если зашью USB HID в него
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Re: WinAVR + Atmega8 = USB устройство

Сообщение alexey6522 »

Kotische
Дело в том что мне не надо какую-то фиксированную цифру отправить, если вы обратили внимние то у мне написан счетчик от 0 до 99 считает и мне нужно отправить на ком порт число которое содержится в переменной DS
Аватара пользователя
Kotische
Опытный кот
Сообщения: 885
Зарегистрирован: Сб июл 19, 2008 02:16:33
Откуда: Саратов

Re: WinAVR + Atmega8 = USB устройство

Сообщение Kotische »

ну так преобразуй число в строку
хотя бы функцией sprintf(...)
а потом строку в порт выводи.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3384
Зарегистрирован: Пн окт 11, 2010 19:00:08

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 устройство

Сообщение alexey6522 »

Kotische
Что-то не получается преобразовать в строку передается буква С вместо 0x31 или же если пробовать передать просто '9' буквы распознаются нормально, может кто-нибудь уже запустит пример и опробует, чем говорить будто на разных языках
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: WinAVR + Atmega8 = USB устройство

Сообщение IfoR »

alexey6522, так бы чтоли сделать, ведь всё уже готово:

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

  ...

  while (1)  //Бесконечный цикл
  {   
    DS=(indikator[i] << 8) | indikator[j]; //Закодированное число в 16hex системе исчисления
      USART_vSendByte(i+'0'); USART_vSendByte(j+'0'); // Отправляем число
    export_data(DS);  //Отправляем данные на сдвиговый регистр
  ...


 
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
alexey6522
Встал на лапы
Сообщения: 149
Зарегистрирован: Чт июл 28, 2011 18:12:28

Re: WinAVR + Atmega8 = USB устройство

Сообщение alexey6522 »

IfoR
Не спорю, данные передаются, но почему-то цифр я там не вижу когда слушаю порт, вместо них буквы
Вложения
Безымянный.JPG
(40.32 КБ) 486 скачиваний
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: WinAVR + Atmega8 = USB устройство

Сообщение IfoR »

Может быть, не синхронизирована скорость передачи? Хотя не очень-то похоже. Или может какие нить другие параметры передачи? :dont_know:
Последний раз редактировалось IfoR Пт авг 12, 2011 20:50:16, всего редактировалось 1 раз.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Закрыто

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