Помощь по CodeVisionAVR+ATiny2313+UART
Помощь по CodeVisionAVR+ATiny2313+UART
Начал изучать микроконтроллеры совсем недавно. Поставил перед собой сразу довольно сложный для новичка проект, в задачу которого входит считывание контроллером кода датчика DS1990 и передача на компьютер(COM-порт), а также передача на МК с ПК некой информации при соответствии этого кода.
Так как есть навыки программирования на С, выбрал CodeVisionAVR в качестве IDE.
Из-за того что на ноутбуке нет физических COM портов, есть вариант использовать старый кабель от телефона. Он сделан на микросхему PL-2303, из чего вытекает первый вопрос: не будет ли с этим проблем, работает ли он как полноценный COM-порт ПК?
В CodeVisionAVR есть генератор кода, в т.ч. там есть вкладка UART/USART. Там вроде бы всё понятно, разобрался. НО не могу найти в сети информации непосредственно по передачи и приёму информации через UART. Какие функции необходимо использовать? Буду очень благодарен за примеры кода.
И последний вопрос, подходит ли мой контроллер(ATiny2313) для поставленной задачи?
Заранее спасибо!)
Так как есть навыки программирования на С, выбрал CodeVisionAVR в качестве IDE.
Из-за того что на ноутбуке нет физических COM портов, есть вариант использовать старый кабель от телефона. Он сделан на микросхему PL-2303, из чего вытекает первый вопрос: не будет ли с этим проблем, работает ли он как полноценный COM-порт ПК?
В CodeVisionAVR есть генератор кода, в т.ч. там есть вкладка UART/USART. Там вроде бы всё понятно, разобрался. НО не могу найти в сети информации непосредственно по передачи и приёму информации через UART. Какие функции необходимо использовать? Буду очень благодарен за примеры кода.
И последний вопрос, подходит ли мой контроллер(ATiny2313) для поставленной задачи?
Заранее спасибо!)
Re: Помощь по CodeVisionAVR+ATiny2313+UART
контроллер подходит любой где есть аппаратный уарт, у вашей тинки он есть, сложного там ничего нет, смотрите даташит, там нужно разрешить работу уарта, выставить скорость, и конфигурацию старт бита... в даташите есть примеры кода для инициализации и передачи инфы.... переходник скорее всего работать не будет если вы будите прослушивать порт терменалом, (точно сказать не могу)... http://easyelectronics.ru/avr-uchebnyj- ... -uart.html но там на асме....
- SubDia
- Держит паяльник хвостом
- Сообщения: 995
- Зарегистрирован: Сб апр 02, 2011 17:59:22
- Откуда: Город-герой Севастополь
Re: Помощь по CodeVisionAVR+ATiny2313+UART
jordan писал(а):переходник скорее всего работать не будет
Не утверждал бы так уверенно. Зависит, вероятно, от переходника - я, например, как раз с помощью переходника и обеспечиваю связь МК и ПК.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )

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

Re: Помощь по CodeVisionAVR+ATiny2313+UART
SubDia писал(а):jordan писал(а):переходник скорее всего работать не будет
Не утверждал бы так уверенно. Зависит, вероятно, от переходника - я, например, как раз с помощью переходника и обеспечиваю связь МК и ПК.
Вот только что прочитал что можно проверить переходник закоротив ноги Rx и Tx, потом передавать инфу из терминала и она должна приходить обратно. Сделал так, все работает. Из чего делаю вывод что переходник рабочий.
jordan писал(а):контроллер подходит любой где есть аппаратный уарт, у вашей тинки он есть, сложного там ничего нет, смотрите даташит, там нужно разрешить работу уарта, выставить скорость, и конфигурацию старт бита...
Ну код отвечающий за это генерируется в CodeWizard при создании проекта.
Интересуют непосредственно функции для приема и отправки информации через UART на языке С.
Re: Помощь по CodeVisionAVR+ATiny2313+UART
SubDia писал(а):jordan писал(а):переходник скорее всего работать не будет
Не утверждал бы так уверенно. Зависит, вероятно, от переходника - я, например, как раз с помощью переходника и обеспечиваю связь МК и ПК.
скорее всего это сомнение а не утверждение, но вы судя по всему разницы не видите...
Код: Выделить всё
UDR = 0xAB; или так UDR = 'k'; если хотите передать символ ASCII...
после присвоения регистру значение сразу же начнется передача если уарт сконфигурирован верно, но нужно помнить что передача будет длится какое то время и нельзя сразу посылать следующие значение, нужно подождать пока закончится передача, для этого в авр есть специальный бит готовности уарта, его нужно проверять перед началом передачи
Re: Помощь по CodeVisionAVR+ATiny2313+UART
просто присваиваете регистру UDR какое нибудь значение, например 0xAB как в моем примере,
или так UDR = 'k'; если хотите передать символ ASCII...
после присвоения регистру значение сразу же начнется передача если уарт сконфигурирован верно, но нужно помнить что передача будет длится какое то время и нельзя сразу посылать следующие значение, нужно подождать пока закончится передача, для этого в авр есть специальный бит готовности уарта, его нужно проверять перед началом передачи
Ясно, спасибо.
а что это за специальный бит? можно пример?
так же интересует возможность передачи целой строки, это реально или только по одному биту передавать?
Re: Помощь по CodeVisionAVR+ATiny2313+UART
Код: Выделить всё
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;
}это пример из даташита на тини2313 станица 120 которую вы почему то ни в какую не хотите читать, там есть все
while ( !( UCSRA & (1<<UDRE)) ) - это ожидание бита готовности UDRE, в регистре UCSRA...
программа зациклится пока бит не выставится в лог единицу, это будет означать, что буфер пуст, и уарт готов передавать новы байт, а не бит как вы там писали, уарт передает побайтно, но есть специальные библиотеки которые служат как раз для того что передавать строчки... можно легко самому обойтись без эти библиотек.
для начала попробуйте например так
Код: Выделить всё
while ( !( UCSRA & (1<<UDRE)) )
UDR='h';
while ( !( UCSRA & (1<<UDRE)) )
UDR='e';
while ( !( UCSRA & (1<<UDRE)) )
UDR='l';
while ( !( UCSRA & (1<<UDRE)) )
UDR='l';
while ( !( UCSRA & (1<<UDRE)) )
UDR='o';
- SubDia
- Держит паяльник хвостом
- Сообщения: 995
- Зарегистрирован: Сб апр 02, 2011 17:59:22
- Откуда: Город-герой Севастополь
Re: Помощь по CodeVisionAVR+ATiny2313+UART
jordan писал(а):скорее всего это сомнение а не утверждение, но вы судя по всему разницы не видите...
Ну извините. Всегда считал, что "скорее всего" - это утверждение с большой степенью вероятности правдивости оного.
ЗЫ. ТС, прошу прощения за оффтоп. Прекращаю.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )

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

Re: Помощь по CodeVisionAVR+ATiny2313+UART
Код: Выделить всё
/*****************************************************
Chip type : ATtiny2313
Clock frequency : 4,000000 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 32
*****************************************************/
#include <tiny2313.h>
#include <delay.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// USART Transmitter buffer
#define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE];
#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif
// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index]=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used-
#endif
// Standard Input/Output functions
#include <stdio.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
GIMSK=0x00;
MCUCR=0x00;
TIMSK=0x00;
// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=0x19;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
// Global enable interrupts
#asm("sei")
while (1)
{
};
}Вот такой код генерируется в CVAVR.
Из него понял что можно передавать и принимать данные с помощью функций putchar() и getchar()
Попробовал, работают почему-то только с русскими символами, если английские передавать или цифры то на терминал приходит белиберда((
jordan, пытался и так как вы написали передавать, но вообще ничего на терминал не приходит((
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: Помощь по CodeVisionAVR+ATiny2313+UART
наделайте сами себе своих функций - заодно и разберётесь
Вот такими пользуюсь я.
Под 128мегу правда.
flash unsigned char *point_to_flash - вот этот параметр можно заменить на чтение откуда угодно, хоть с еепром хоть с озу хоть с флеша.
А после цикла можете поставить свои модификаторы строки. Например 0x0D 0x0A для работы с модемами.
Вот такими пользуюсь я.
Под 128мегу правда.
Код: Выделить всё
void OUT_COM0_flash_LENGTH(flash unsigned char *point_to_flash,unsigned char L)
{
unsigned char i;
for (i=0;i<L;i++)
{
while ( !( UCSR0A & (1<<UDRE)) );
UDR0=*point_to_flash++;
};
}; flash unsigned char *point_to_flash - вот этот параметр можно заменить на чтение откуда угодно, хоть с еепром хоть с озу хоть с флеша.
А после цикла можете поставить свои модификаторы строки. Например 0x0D 0x0A для работы с модемами.