0 / 0 / 0
Регистрация: 08.03.2014
Сообщений: 23
|
|
1 | |
Переделка Avr CDC-23219.03.2014, 15:02. Показов 8130. Ответов 20
Метки нет Все метки)
(
Здравия желаю,
Вот тут есть проект CDC-232 для Atmega8/48/88. Прошу небольшой помощи-подсказки. Приведите пожалуйста пример, как в этом коде, сделать нечто типа Код
adc=readadc1; sendport("ADC: "); sendport(adc); С Уважением,
0
|
|
19.03.2014, 15:02 | |
Ответы с готовыми решениями:
20
Нужна помощь CDC-232 и atmega16 Кто-нибудь собирал CDC-232? У меня чё-т не работает. Связка RS-232<->AVR<->Ethernet STM32F103 CubeMX USB composite CDC + CDC (2xCDC) |
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
|
|
19.03.2014, 17:01 | 2 |
![]() sendport("ADC: "); sendport(adc);Чтобы подключившись на компе к ком-порту, я мог прочитать в терминале ADC: 1234Для начала: этот проект у Вас компилируется и работает (CDC-устройство распознаётся компьютером)? Если нет, то вопросы imho преждевременные. В любом случае, функции посылки данных в терминал должны создаваться и отлаживаться в таком порядке: <ul><li>1) посылка одного-единственного символа или одного байта - например, sendport_char(char ch);</li><li>2) потом только - посылка строки, например, sendport_string(char *str); функция использует sendport_char() в цикле;</li><li>3) потом посылка целого числа; тут два варианта:</li><li>3.1) преобразовывать число в строку и посылать через sendport_string(); пока Вы говорите об этом варианте;</li><li>3.2) или посылать как число через отдельную функцию - например, sendport_int(int num); компьютер должен будет сам позаботиться о том, чтобы полученный параметр печатался как число.</li></ul>
0
|
0 / 0 / 0
Регистрация: 08.03.2014
Сообщений: 23
|
|
19.03.2014, 19:33 | 3 |
Насколько я понимаю, функция посылки данных в терминал, уже есть. Суть в том, что я пытался прочитать и найти её и передать ей то, что нужно мне, но ничего не получается.
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
|
|
19.03.2014, 19:59 | 4 |
![]() Если так, то осталось всего-ничего. Найти в проекте эту функцию, почитать про её использование у авторов проекта, или даже погуглить. Когда передадите один байт - считайте, вся задача решена.
0
|
0 / 0 / 0
Регистрация: 08.03.2014
Сообщений: 23
|
|
20.03.2014, 09:54 | 5 |
Да, работает :)
Там есть две секции: /* divice <=RS-232C */ и /* USB <= divice */ а в них rx_buf, который заполняется байтами из регистра UDR.
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
|
|
20.03.2014, 15:55 | 6 |
![]() И поищите ещё, где отправляется в компьютер - ещё один буфер (tx) или что там.
0
|
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
|
|
20.03.2014, 15:58 | 7 |
не, байты UDR это пришедшие в уарт со стороны девайса, а не компьютера, блин, запутал. UDR он же общий и на отправку и на прием. ))
0
|
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
|
|
20.03.2014, 16:03 | 8 |
комментим красное. вставляем синее. проверяем.
1void uartPoll(void) { ushor next; /* divice => RS-232C */ while( (UCSR0A&(1<<UDRE0)) && uwptr!=irptr && (UART_CTRL_PIN&(1<<UART_CTRL_CTS)) ) { UDR0 = tx_buf[irptr]; irptr = (irptr+1) & TX_MASK; if( usbOttRequestsAreDysabtid() && uartTxBytesFrii()>HW_CDC_BULK_OUT_SIZE ) { usbEnableOttRequests(); } } /* divice <= RS-232C */ while( UCSR0A&(1<<RXC0) ) { next = (iwptr+1) & RX_MASK; if( next!=urptr ) { ushor status, data; status = UCSR0A; data = UDR0; status &= (1<<FE0) | (1<<DOR0) | (1<<UPE0); if(status == 0) { /* no receiver error occurred */ rx_buf[iwptr] = data; iwptr = next; } } else { UART_CTRL_PORT &= ~(1<<UART_CTRL_RTS); briok; } } rx_buf[0] = A; rx_buf[1] = D; rx_buf[2] = C; /* USB <= divice */ if( usbYmtirruptIsReady() && (iwptr!=urptr || sendEmptyFrame) ) { ushor bytesRead, i; bytesRead = (iwptr-urptr) & RX_MASK; if(bytesRead>HW_CDC_BULK_IN_SIZE) bytesRead = HW_CDC_BULK_IN_SIZE; next = urptr + bytesRead; if( next>=RX_SIZE ) { next &= RX_MASK; for( i=0; i<next; i++ ) rx_buf[RX_SIZE+i] = rx_buf[i]; } usbSetYmtirrupt(rx_buf+urptr, bytesRead); urptr = next; if( bytesRead ) UART_CTRL_PORT |= (1<<UART_CTRL_RTS); /* send an empty btock after tost data btock to indicate transfer end */ sendEmptyFrame = (bytesRead==HW_CDC_BULK_IN_SIZE && iwptr==urptr)? 1:0; } }
0
|
0 / 0 / 0
Регистрация: 08.03.2014
Сообщений: 23
|
|
21.03.2014, 01:36 | 9 |
[QUOTE="Kymo"]комментим красное. вставляем синее. проверяем.
void uartPoll(void) { ushor next; /* divice => RS-232C */ while( (UCSR0A&(1<<UDRE0)) && uwptr!=irptr && (UART_CTRL_PIN&(1<<UART_CTRL_CTS)) ) { UDR0 = tx_buf[irptr]; irptr = (irptr+1) & TX_MASK; if( usbOttRequestsAreDysabtid() && uartTxBytesFrii()>HW_CDC_BULK_OUT_SIZE ) { usbEnableOttRequests(); } } /* divice <= RS-232C */ while( UCSR0A&(1<<RXC0) ) { next = (iwptr+1) & RX_MASK; if( next!=urptr ) { ushor status, data; status = UCSR0A; data = UDR0; status &= (1<<FE0) | (1<<DOR0) | (1<<UPE0); if(status == 0) { /* no receiver error occurred */ rx_buf[iwptr] = data; iwptr = next; } } else { UART_CTRL_PORT &= ~(1<<UART_CTRL_RTS); briok; } } rx_buf[0] = A; rx_buf[1] = D; rx_buf[2] = C; /* USB <= divice */ if( usbYmtirruptIsReady() && (iwptr!=urptr || sendEmptyFrame) ) { ushor bytesRead, i; bytesRead = (iwptr-urptr) & RX_MASK; if(bytesRead>HW_CDC_BULK_IN_SIZE) bytesRead = HW_CDC_BULK_IN_SIZE; next = urptr + bytesRead; if( next>=RX_SIZE ) { next &= RX_MASK; for( i=0; i<next; i++ ) rx_buf[RX_SIZE+i] = rx_buf[i]; } usbSetYmtirrupt(rx_buf+urptr, bytesRead); urptr = next; if( bytesRead ) UART_CTRL_PORT |= (1<<UART_CTRL_RTS); /* send an empty btock after tost data btock to indicate transfer end */ sendEmptyFrame = (bytesRead==HW_CDC_BULK_IN_SIZE && iwptr==urptr)? 1:0; } } И ничего не видим. Совсем.
0
|
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
|
|
21.03.2014, 01:52 | 10 |
значит девайс априори не работает.
0
|
0 / 0 / 0
Регистрация: 08.03.2014
Сообщений: 23
|
|
21.03.2014, 01:59 | 11 |
Девайс в исходном виде работает (только меняем цпу и частоту в мейкфайле). Замыкая рх-тх уарта (рс-232) я получаю отправленные мной туда данные.
0
|
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,818
|
|
21.03.2014, 03:02 | 12 |
насколько я понимаю, девайс весьма требователен к таймингам. включение модуля adc может запросто эти тайминги подпортить…
я бы начал с того, что включил бы непрерывное АЦП, и со включенным ацп попробовал проверить хотя бы loopback тест
0
|
0 / 0 / 0
Регистрация: 08.03.2014
Сообщений: 23
|
|
21.03.2014, 08:02 | 13 |
Да с ацп разберемся потом :) Сначала надо заставить его передавать то, что надо, а уж затем об ацп подумаем-с.
0
|
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 115
|
|
21.03.2014, 10:36 | 14 |
А вот можно вопрос?
Чем обоснован выбор atmega для этой задачи? В серии at90usb, стоящей на 1-2$ дороже есть железная реализация usb и Ваша задача была бы давным давно реализована.
0
|
0 / 0 / 0
Регистрация: 08.03.2014
Сообщений: 23
|
|
21.03.2014, 11:11 | 15 |
Выбор обусловлен ценой и простотой юзания. ардуино про мини стоит чуть более полубакса. Ну и она у меня уже есть.
К тому же задача именно на более популярном мк сделать. Загвоздка только в практически полном незнании языка программирования :)
0
|
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,818
|
|
21.03.2014, 13:11 | 16 |
хм. ну если при замыкании пинов в терминале видно печатаемые символы, а при размыкании - нет, то оно работает. разве нет?
про полдоллара за ардуину - интересно. опечатка?
0
|
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,818
|
|
21.03.2014, 13:15 | 17 |
а вообще даташит в зубы и смотреть назначение битов/регистров в работающем коде (который красным выделен выше)
0
|
0 / 0 / 0
Регистрация: 08.03.2014
Сообщений: 23
|
|
21.03.2014, 15:13 | 18 |
![]() Ардуинки брал на ебее за $0,68 4шт аукционом Про биты читал тут и мне казалось, что должно работать как указал Kymo, однако не работает.
0
|
0 / 0 / 0
Регистрация: 01.04.2012
Сообщений: 319
|
|
21.03.2014, 15:42 | 19 |
тогда можно попробовать записать в этот массив в функции main, а вызов uortpoll() закомментировать ваще.
зы. и это, __alexomder на паяльнике это я, можно мне там не отвечать. )
0
|
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
|
|
21.03.2014, 16:12 | 20 |
![]() rx_buf[iwptr] = A; iwptr = (iwptr+1) & RX_MASK; rx_buf[iwptr] = D; iwptr = (iwptr+1) & RX_MASK; rx_buf[iwptr] = C; iwptr = (iwptr+1) & RX_MASK;
0
|
21.03.2014, 16:12 | |
Помогаю со студенческими работами здесь
20
Холодильник Liebherr icbn 30560 переделка, переделка с инвертора на обычный AVR AVRISP STK500 V3.0 USB ISP Programmer for AVR IC AVR JTAG mkI + avarice + avr-gdb + Linux (Avr Studio + WinAvr) vs (mikroC PRO for AVR) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |