Usb интерфейс

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Alerr
Встал на лапы
Сообщения: 146
Зарегистрирован: Вт май 03, 2011 20:01:23

Re: Usb интерфейс

Сообщение Alerr »

Данные мк пока мне нее доступны(
Так что работаю с чем есть пока..
Alerr
Встал на лапы
Сообщения: 146
Зарегистрирован: Вт май 03, 2011 20:01:23

Re: Usb интерфейс

Сообщение Alerr »

Вот попытался переделать проект из winavr под codevision, но т.к. не понял что там творится-> запустить не смог, сам код:

/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 09.10.2011
Author : NeVaDa
Company : Administrator
Comments:


Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 4,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>
#include <usbconfig.h>
// Declare your global variables here




static void hardwareInit(void)
{
unsigned char i, j;

PORTB = 0xff; /* activate all pull-ups */
DDRB = 0; /* all pins input */
PORTC = 0xff; /* activate all pull-ups */
DDRC = 0; /* all pins input */
PORTD = 0xfa; /* 1111 1010 bin: activate pull-ups except on USB lines */
DDRD = 0x07; /* 0000 0111 bin: all pins input except USB (-> USB reset) */
j = 0;
while(--j){ /* USB Reset by device only required on Watchdog Reset */
i = 0;
while(--i); /* delay >10ms for USB reset */
}
DDRD = 0x02; /* 0000 0010 bin: remove USB reset condition */
/* configure timer 0 for a rate of 12M/(1024 * 256) = 45.78 Hz (~22ms) */
TCCR0 = 5; /* timer 0 prescaler: 1024 */
}

/* ---------- */

#define NUM_KEYS 17

/* The following function returns an index for the first key pressed. It
* returns 0 if no key is pressed.
*/
static unsigned char keyPressed(void)
{
unsigned char i, mask, x;

x = PINB;
mask = 1;
for(i=0;i<6;i++){
if((x & mask) == 0)
return i + 1;
mask <<= 1;
}
x = PINC;
mask = 1;
for(i=0;i<6;i++){
if((x & mask) == 0)
return i + 7;
mask <<= 1;
}
x = PIND;
mask = 1 << 3;
for(i=0;i<5;i++){
if((x & mask) == 0)
return i + 13;
mask <<= 1;
}
return 0;
}

/* ---------- */
/* ---------- USB interface ---------- */
/* ---------- */

static unsigned char reportBuffer[2]; /* buffer for HID reports */
static unsigned char idleRate; /* in 4 ms units */

PROGMEM char usbHidReportDescriptor[35] = { USB report descriptor
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x25, 0x65, // LOGICAL_MAXIMUM (101)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0 // END_COLLECTION
};

#define MOD_CONTROL_LEFT (1<<0)
#define MOD_SHIFT_LEFT (1<<1)
#define MOD_ALT_LEFT (1<<2)
#define MOD_GUI_LEFT (1<<3)
#define MOD_CONTROL_RIGHT (1<<4)
#define MOD_SHIFT_RIGHT (1<<5)
#define MOD_ALT_RIGHT (1<<6)
#define MOD_GUI_RIGHT (1<<7)

#define KEY_A 4
#define KEY_B 5
#define KEY_C 6
#define KEY_D 7
#define KEY_E 8
#define KEY_F 9
#define KEY_G 10
#define KEY_H 11
#define KEY_I 12
#define KEY_J 13
#define KEY_K 14
#define KEY_L 15
#define KEY_M 16
#define KEY_N 17
#define KEY_O 18
#define KEY_P 19
#define KEY_Q 20
#define KEY_R 21
#define KEY_S 22
#define KEY_T 23
#define KEY_U 24
#define KEY_V 25
#define KEY_W 26
#define KEY_X 27
#define KEY_Y 28
#define KEY_Z 29
#define KEY_1 30
#define KEY_2 31
#define KEY_3 32
#define KEY_4 33
#define KEY_5 34
#define KEY_6 35
#define KEY_7 36
#define KEY_8 37
#define KEY_9 38
#define KEY_0 39

#define KEY_F1 58
#define KEY_F2 59
#define KEY_F3 60
#define KEY_F4 61
#define KEY_F5 62
#define KEY_F6 63
#define KEY_F7 64
#define KEY_F8 65
#define KEY_F9 66
#define KEY_F10 67
#define KEY_F11 68
#define KEY_F12 69

static const uтышптув char keyReport[NUM_KEYS + 1][2] PROGMEM = {
/* none */ {0, 0}, /* no key pressed */
/* 1 */ {MOD_SHIFT_LEFT, KEY_A},
/* 2 */ {MOD_SHIFT_LEFT, KEY_B},
/* 3 */ {MOD_SHIFT_LEFT, KEY_C},
/* 4 */ {MOD_SHIFT_LEFT, KEY_D},
/* 5 */ {MOD_SHIFT_LEFT, KEY_E},
/* 6 */ {MOD_SHIFT_LEFT, KEY_F},
/* 7 */ {MOD_SHIFT_LEFT, KEY_G},
/* 8 */ {MOD_SHIFT_LEFT, KEY_H},
/* 9 */ {MOD_SHIFT_LEFT, KEY_I},
/* 10 */ {MOD_SHIFT_LEFT, KEY_J},
/* 11 */ {MOD_SHIFT_LEFT, KEY_K},
/* 12 */ {MOD_SHIFT_LEFT, KEY_L},
/* 13 */ {MOD_SHIFT_LEFT, KEY_M},
/* 14 */ {MOD_SHIFT_LEFT, KEY_N},
/* 15 */ {MOD_SHIFT_LEFT, KEY_O},
/* 16 */ {MOD_SHIFT_LEFT, KEY_P},
/* 17 */ {MOD_SHIFT_LEFT, KEY_Q},
};

static void buildReport(uchar key)
{
/* This (not so elegant) cast saves us 10 bytes of program memory */
*(int *)reportBuffer = pgm_read_word(keyReport[key]);
}

unsigned char usbFunctionSetup(uchar data[8])
{
usbRequest_t *rq = (void *)data;

usbMsgPtr = reportBuffer;
if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){ /* class request type */
if(rq->bRequest == USBRQ_HID_GET_REPORT){ /* wValue: ReportType (highbyte), ReportID (lowbyte) */
/* we only have one report type, so don't look at wValue */
buildReport(keyPressed());
return sizeof(reportBuffer);
}else if(rq->bRequest == USBRQ_HID_GET_IDLE){
usbMsgPtr = &idleRate;
return 1;
}else if(rq->bRequest == USBRQ_HID_SET_IDLE){
idleRate = rq->wValue.bytes[1];
}
}else{
/* no vendor specific requests implemented */
}
return 0;
}

/* ---------- */

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

while (true)
{
uchar key, lastKey = 0, keyDidChange = 0;
uchar idleCounter = 0;

wdt_enable(WDTO_2S);
hardwareInit();
odDebugInit();
usbInit();
sei();
DBG1(0x00, 0, 0);
for(;;){ /* main event loop */
wdt_reset();
usbPoll();
key = keyPressed();
if(lastKey != key){
lastKey = key;
keyDidChange = 1;
}
if(TIFR & (1<<TOV0)){ /* 22 ms timer */
TIFR = 1<<TOV0;
if(idleRate != 0){
if(idleCounter > 4){
idleCounter -= 5; /* 22 ms in units of 4 ms */
}else{
idleCounter = idleRate;
keyDidChange = 1;
}
}
}
if(keyDidChange && usbInterruptIsReady()){
keyDidChange = 0;
/* use last key and not current key status in order to avoid lost
changes in key status. */
buildReport(lastKey);
usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
}
}

};
}




/*#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>

#include "usbdrv.h"
#include "oddebug.h" */

/* ---------- hardware I/O abstraction ---------- */

/* pin assignments:
PB0 Key 1
PB1 Key 2
PB2 Key 3
PB3 Key 4
PB4 Key 5
PB5 Key 6

PC0 Key 7
PC1 Key 8
PC2 Key 9
PC3 Key 10
PC4 Key 11
PC5 Key 12

PD0 USB-
PD1 debug tx
PD2 USB+ (int0)
PD3 Key 13
PD4 Key 14
PD5 Key 15
PD6 Key 16
PD7 Key 17
*/


Разьясните, что тут такое делается?!
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Usb интерфейс

Сообщение Мурик »

Alerr писал(а):Вот попытался переделать проект из winavr под codevision, но т.к. не понял что там творится-> запустить не смог, сам код
Софтовый USB это не какая-то там мигалка светодиодом, которую легко перенести с одной среды программирования в другую, а так же портировать между разными языками программирования.
Здесь все намного сложнее и вряд ли кто-то будет копаться в исходниках чтобы запустить ваш проект - многа букаф, в т. ч. на асме, в особенности в подключаемых файлах.
Аватара пользователя
DrWatson
Опытный кот
Сообщения: 890
Зарегистрирован: Вт янв 20, 2009 14:49:08
Откуда: Гондурас, Мурманск

Re: Usb интерфейс

Сообщение DrWatson »

В описалове же сказано, что исходники предназначены для компиляции в avr-gcc или winavr. Проще освоить их, чем "впихивать" все это в CVAVR.
- Если вы такие умные, то почему тогда строем не ходите?
ἓν οἶδα ὅτι οὐδὲν οἶδα (с) Σωκράτης
Alerr
Встал на лапы
Сообщения: 146
Зарегистрирован: Вт май 03, 2011 20:01:23

Re: Usb интерфейс

Сообщение Alerr »

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

Re: Usb интерфейс

Сообщение Мурик »

Alerr писал(а):Похоже придется(.. Думал, что профессионалам не составит труда найти основную "мысль" программы и изложить в codvisione....
За бесплатно ради вас никто не будет перепахивать несколько тысяч строк кода и отлаживать в железе.
Alerr
Встал на лапы
Сообщения: 146
Зарегистрирован: Вт май 03, 2011 20:01:23

Re: Usb интерфейс

Сообщение Alerr »

Да зачем перепахивать?! Нужно-то всего разьяснить принцип работы девайса, а дальше дело программиста, т.е. какбы мое...
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Usb интерфейс

Сообщение Мурик »

Alerr писал(а):Нужно-то всего разьяснить принцип работы девайса
Ссылку на статью в журнале (где все подробно написано) давал выше.
Если там не понятно, то вам сюда http://www.usb.org
Alik221
Встал на лапы
Сообщения: 103
Зарегистрирован: Пн сен 13, 2010 14:37:38

Re: Usb интерфейс

Сообщение Alik221 »

Если USB аппаратный, например AT90USB82, то хороший пример кода для нее есть в примерах исходников (некое устройство с 2-мя интерфейсами и 3-мя конечными точками). Или вот мой предыдущий проект на CVAVR (во вложениях) - переделанный с пояснениями - подключение джойстика от денди к компьютеру на контроллере AT90USB82.

А с программными USB дела не имел.

Насчет драйвера на стороне компьютера - лучше работать с устройствами типа HID. А драйвера писать не так-то просто. Написал, поставил, чуть что - синий экран. Сам неделю писал драйвер под USB (USB термометр).. И к тому, же кроме драйвера надо писать: файл INF для установки драйвера; программу для работы с драйвером.
Вложения
джойстик.rar
(119.66 КБ) 184 скачивания
Николай Щербаков
Родился
Сообщения: 9
Зарегистрирован: Пт окт 21, 2011 13:31:45
Откуда: Казахстан

Re: Usb интерфейс

Сообщение Николай Щербаков »

Alerr писал(а):Научился я счелкать по клавишам в кодвижене и .... не понимаю как реализовать код в кодвижене((((
Кто-нибудь имеет примерный, самый простой код на кодвижен. да и вообще как можно адаптировать те, другие коды, под кодвижен??

и еще что не понятно.. где что у usb шнура???? вот смотрю я на него спереди внутрь, контакты, 4 шт. внизу, кто из них куда должен подключаться????



Добрый день.
http://progbook.ru/delphi/572-agurov-in ... iya-i.html
http://www.proklondike.com/books/coding ... rface.html
Закрыто

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