Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATTINY2313 и UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
jin_jin
Народ помогите пожайлуста разобраться.
Надо посылать посылки по 3 байта в ком порт.
Когда отсылаю в UART
putchar('g');
или
putchar(71);

то в компе в отладочной програмее для ком порта приходит все что угодно но только не мой код

очень много ошибок идет
к ком порту подключен через max232
кварц на 4Mhz
com1 9600 8n1

КАК правильно отсылать байты в этот UART????? помогите разобраться


ПОЛНЫЙ листинг


#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)

#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

#include <stdio.h>



void main(void)
{

#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;


//USICR=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x48;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=0x19;


ACSR=0x80;


#asm("sei")

while (1)
{
putchar(71);
delay_ms(1000);


};
}







да и еще
кварц на 4 мгц

дело в том что в порт приходит байт но не соответствуетт кодировке. А если отсылаю три байта и каждый раз разные прошиваю то при чтении они практически не отличаются
к примеру отсылай с мк
50 100 200 (3 байта)
66 144 222 ()

получай в ком порте
111 239 255
111 200 255
Палыч
Fuse CKDIV8 надеюсь убран (т.е. значение =1)?
jin_jin
Извините за тупой ворос а что делает это Fuse CKDIV8

И как посмотреть чему равен Fuse CKDIV8
в Codevision при выборе прочитать fuse пишет ошибку
Палыч
Цитата(jin_jin @ Mar 31 2008, 11:16) *
Извините за тупой ворос а что делает это Fuse CKDIV8


Запрограммированный CKDIV8 (а, с завода он приходит запрограммированным) делит тактовую на 8, т.е. все выглядит так, как если бы у Вас был бы подключен кварц на 4:8=0,5 МГц.
jin_jin
то что делит на 8 это видно по DIV
а как узнать что там 1 или 0 в этом фузе
defunct
Цитата(jin_jin @ Mar 31 2008, 13:00) *
то что делит на 8 это видно по DIV

Когда всякие странности возникают - играйтесь со скоростью ком порта на компе.
Понижайте, повышайте, до тех пор пока не словите то, что ожидается.

Имея реальную и желаемую скорости, не трудно будет найти насколько МК отстает / опережает.


Цитата
а как узнать что там 1 или 0 в этом фузе

Простите, а чем вы шьете ваш MK? Вот через то, что шьете и можно узнать.
jin_jin
Я уже все скоростя перепробывал от 100 до 115200

дело в том что когда отсылаю командой
Putchar (..);
то в порт приходит байт на скорости 9600 но не тот что надо

а если делаю через

void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<USBS)|(3<<UCSZ0);
}

void USART_Transmit( unsigned char data )
{
while ( !( UCSRA & (1<<UDRE)) )
;
UDR = data;
}

USART_Transmit('5');


то приходят одни 00
Палыч
Цитата(jin_jin @ Mar 31 2008, 14:21) *
дело в том что когда отсылаю командой
Putchar (..); то в порт приходит байт на скорости 9600 но не тот что надо
Обычно, это - несовпадение скоростей передатчика и приемника. Скорость передатчика (реальная) легко определяется осциллографом: достаточно зациклить передачу какого-либо байта (например, 0х55 - тогда можно увидеть каждый импульс и определить его длительность).
jin_jin
Дело в том что под руками нет пока осцилографа отдал на поверку.
Как еще можно решить проблему.

Вроде стоит элементарная задача передать в порт 3 байта а решить уже не могу 3 день.

И еще вопрос правильно ли я указа скорость

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x48;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=0x19;


и с таймерами ничего не надо делать??
vet
ну, это же code wizard настройки сгенерировал - выходит, правильно.
таймеры здесь ни при чём.
проверили состояние fuse-битов?
jin_jin
я и имел в виду кодевизион...

А как проверить состояние Fuse битов??
vet
как - уже писали выше (постинг #6).
jin_jin
Я собрал универсальный программатора с Kievsat
JonisProg

программой пользуюсь PonyProg

в ponyprog выбираю Configuration and securitybits там стоит галочка на CKDIV8
Палыч
Цитата(jin_jin @ Mar 31 2008, 14:58) *
программой пользуюсь PonyProg
в ponyprog выбираю Configuration and securitybits там стоит галочка на CKDIV8
В Поне галка - это ноль, т.е. запрограммирован. Имхо, галку с CKDIV8 нужно убрать!
jin_jin
спасибо . сейчас уже убрал и попробую подсоединить

Отсылаю вот это

delay_ms(1000);
putchar(71);
delay_ms(1000);
putchar(0x47);

и получаю

000032 15:17:26.000 FD ý
000033 15:17:26.468 FF ÿ
000034 15:17:26.953 FD ý
000035 15:17:27.421 FF ÿ
000036 15:17:27.890 FF ÿ
000037 15:17:28.375 FD ý
000038 15:17:28.843 FF ÿ
000039 15:17:29.312 FD ý
000040 15:17:29.796 FD ý
000041 15:17:30.265 FD ý
000042 15:17:30.734 FF ÿ
000043 15:17:31.218 FF ÿ
000044 15:17:31.687 FF ÿ
000045 15:17:32.156 FD ý
000046 15:17:32.640 FF ÿ
000047 15:17:33.109 FF ÿ
000048 15:17:33.593 FD ý
000049 15:17:34.062 FF ÿ
000050 15:17:34.531 FF ÿ
000051 15:17:35.015 FF ÿ
000052 15:17:35.484 FD ý
000053 15:17:35.953 FD ý
000054 15:17:36.437 FF ÿ
000055 15:17:36.906 FF ÿ
000056 15:17:37.375 FF ÿ
000057 15:17:37.859 FD ý
000058 15:17:38.328 FF ÿ
000059 15:17:38.796 FD ý
000060 15:17:39.281 FD ý
000061 15:17:39.750 FD ý


Я правильно отсылаю настроики в эту процедуру???
USART_Init(9600);


void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<USBS)|(3<<UCSZ0);
}
megachip
Цитата(jin_jin @ Mar 31 2008, 15:38) *
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<USBS)|(3<<UCSZ0);

В приемной программе надо не забыть указать 2 стопа.

В конфиге проекта похоже надо указать 4 Мгц.
jin_jin
000123 15:47:34.515 CC C8 ми
000124 15:47:34.515 CC C8 ми
000125 15:47:34.906 CC C8 ми
000126 15:47:34.906 CC C8 ми
000127 15:47:34.906 CC C8 ми
000128 15:47:34.906 CC C8 ми
000129 15:47:35.281 CC C8 ми
000130 15:47:35.281 CC C8 ми


Все стало принимать стабильно 2 байта которые отсылаю но только если в компе скорость выставить 300 Baud

а в проге устанавливаю 9600

USART_Init(9600);

#asm("sei")

while (1)
{
delay_ms(100);
USART_Transmit(80);

delay_ms(100);
USART_Transmit(90);

};


и почему приходит МИ если по таблице (80 это P) а (90 это Z)


и как это все настроить на скорости 9600
мне кажется что я не правильно засылаю настройку USART_Init(9600);
Палыч
Цитата(jin_jin @ Mar 31 2008, 15:38) *
Я правильно отсылаю настроики в эту процедуру???
USART_Init(9600);

void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<USBS)|(3<<UCSZ0);
}




Параметр baud - шестнадцатибитное значение, которое заносится в UBRR (не путать со скоростью передачи/приема !). Если не можите расчитать его сами, то взять его нужно из таблиц 56-59 даташита.
jin_jin
что то я в дадашите смотрю нету таблиц на этих страницах

и еще когда я отправляю

delay_ms(1000);
USART_Transmit(0x50);
delay_ms(100);
USART_Transmit(0x51);
delay_ms(100);
USART_Transmit(0x52);

то получаю что 1 и 3 одинаковый байт

000027 16:03:55.781 C8 C9 C8
000028 16:03:56.343 C8 C9 C8
000029 16:03:56.906 C8 C9 C8



Привожу полный листинг измененный который хоть 2 байта правильно выдает на скорости 300 baud в компе


#include <tiny2313.h>
#include <delay.h>

#define RXEN 4
#define TXEN 3
#define USBS 3
#define UCSZ0 1

#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 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 USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<USBS)|(3<<UCSZ0);
}
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;
}


void main(void)
{

#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

DDRA=0x00;

PORTB=0x00;
DDRB=0x2A;

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: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
//UCSRA=0x00;
//UCSRB=0x48;
//UCSRC=0x06;
//UBRRH=0x00;
//UBRRL=0x19;

ACSR=0x80;

USART_Init(9600);

#asm("sei")

while (1)
{
delay_ms(1000);
USART_Transmit(0x50);
delay_ms(100);
USART_Transmit(0x51);
delay_ms(100);
USART_Transmit(0x52);

};
}
Палыч
Цитата(jin_jin @ Mar 31 2008, 16:04) *
что то я в дадашите смотрю нету таблиц на этих страницах
Это - не сномера страниц, а номера таблиц... Для Fosc=4МГц из таблицы 57 находим, что для скорости 9600 бод значение UBRR = 25 (или 51 для U2X=1)
jin_jin
Извините не так понял точно в таблице 25 сейчас попробую

Вот это теперь приходит при настрйк5е порта 9600

000042 16:16:05.953 FE FF FE þÿþ
000043 16:16:06.531 FE FE FE þþþ
000044 16:16:07.093 FE FF FE þÿþ
000045 16:16:07.671 FE FF FE þÿþ



может я не правильно отправляю

USART_Transmit(0x50);
delay_ms(100);
USART_Transmit(0x51);
delay_ms(100);
USART_Transmit(0x52);



УРАААА yeah.gif заработало из за не внимательности в настройке Baud отослал USART_Init(25); а надо USART_Init(0x25);

теперь отсылаю while (1)
{
delay_ms(1000);
USART_Transmit('A');
delay_ms(100);
USART_Transmit('B');
delay_ms(100);
USART_Transmit('C');
delay_ms(100);
USART_Transmit(55);
delay_ms(100);
USART_Transmit(99);
};

и вот что в ком порте вижу

000104 16:25:46.953 41 42 43 37 63 ABC7c
000105 16:25:47.609 41 42 43 37 63 ABC7c
000106 16:25:48.281 41 42 43 37 63 ABC7c
000107 16:25:48.937 41 42 43 37 63 ABC7c
000108 16:25:49.609 41 42 43 37 63 ABC7c
000109 16:25:50.281 41 42 43 37 63 ABC7c
000110 16:25:50.937 41 42 43 37 63 ABC7c
000111 16:25:51.609 41 42 43 37 63 ABC7c
000112 16:25:52.265 41 42 43 37 63 ABC7c
000113 16:25:52.937 41 42 43 37 63 ABC7c
000114 16:25:53.593 41 42 43 37 63 ABC7c
000115 16:25:54.265 41 42 43 37 63 ABC7c
000116 16:25:54.937 41 42 43 37 63 ABC7c
000117 16:25:55.593 41 42 43 37 63 ABC7c
000118 16:25:56.265 41 42 43 37 63 ABC7c
000119 16:25:56.921 41 42 43 37 63 ABC7c
000120 16:25:57.593 41 42 43 37 63 ABC7c
000121 16:25:58.250 41 42 43 37 63 ABC7c
000122 16:25:58.921 41 42 43 37 63 ABC7c

Только теперь ком порт настроен на 14400 ставлю 9600 байты теряются можете мне это объяснить
Палыч
Цитата(jin_jin @ Mar 31 2008, 16:26) *
заработало из за не внимательности в настройке Baud отослал USART_Init(25); а надо USART_Init(0x25);
Черти-что... Правильно было бы записать USART_Init(25), а не USART_Init(0x25). Вы уверены, что у Вас кварц на 4МГц? У меня складывается впечатление, что кварц все-таки 6МГЦ...
defunct
Цитата(Палыч @ Mar 31 2008, 16:03) *
Черти-что... Правильно было бы записать USART_Init(25), а не USART_Init(0x25). Вы уверены, что у Вас кварц на 4МГц? У меня складывается впечатление, что кварц все-таки 6МГЦ...

Судя по тому что афтар пишет, что работает на 14400 и делитель 0x25 == 37 (вместо 25).

получается что кварц - 4Mhz * (14400 / 9600 * 37 / 25) = 8Mhz

либо кварц таки 4Mhz но установлен бит U2X.
Палыч
Цитата(defunct @ Mar 31 2008, 17:25) *
либо кварц таки 4Mhz но установлен бит U2X.
Ага. Либо микроконтроллер работает от внутреннего RC-генератора на 8МГц!

Автор! Fuses - в студию! Особено интересно значения CKSEL3..0!
jin_jin
Кварц точно на 4 MHz я уже и другой ставил

бит U2X точно не установлен я когда генерировал в Codevision то 2 скорость не включал галочку





Fuse

Галочки стоят на
SUT0
CKSEL3
CKSEL1
CKSEL0

на остальных отключено
Палыч
Цитата(jin_jin @ Apr 1 2008, 09:29) *
Галочки стоят на SUT0 CKSEL3 CKSEL1 CKSEL0 на остальных отключено


Если - это Пони, т.е. галочка - ноль (запрограммирован), то CKSEL = 0100, что в соответствии с DS (Rev. I) таблица 2 на странице 25 соответсвует "Calibrated internal RC Oscillator 8MHz". Для переключения на кварц 4 МГц необходимо (см. таблица 4 на стр. 26) убрать галку с CKSEL3.

"Тщательнее надо" даташиты читать...

jin_jin
Большое спасибо сейчас попробую

Палыч Большое спасибо все заработало на скорости 9600
USART_Init(25) правильно

Теперь попробую связать это все дело через ИРДА
jin_jin
Народ помогите еще с одним вопросиком
Мне надо пекредавать на скорости на 300 600 1200 Baud
Что мне надо записать в UBRP на эти скоростя
А то в таблице по даташиту минимальное 2400

Кварц 4 Mhz
Палыч
Цитата(jin_jin @ Apr 1 2008, 13:50) *
Мне надо пекредавать на скорости на 300 600 1200 Baud. Что мне надо записать в UBRP на эти скоростя? Кварц 4 Mhz
Формула простая

UBRR= (Fosc / ( 16 * baud) ) - 1 для U2X=0

UBRR= (Fosc / ( 8 * baud) ) - 1 для U2X=1

Для Вашего случая Fosc= 4000000, baud= 300 или 600 или 1200
Well_Di
Цитата(jin_jin @ Mar 31 2008, 15:39) *
Дело в том что под руками нет пока осцилографа отдал на поверку.
Как еще можно решить проблему.

Вроде стоит элементарная задача передать в порт 3 байта а решить уже не могу 3 день.

И еще вопрос правильно ли я указа скорость

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x48;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=0x19;
и с таймерами ничего не надо делать??


Попробуй вместо :
UBRRH=0x00;
UBRRL=0x19;
Отослать
UBRRH=0x00;
UBRRL=0x1А;- это немного изменит делитель

Мне помогло
jin_jin
Это получается что для 300
UBRP= (4000000/4800)-1 = 832
это надо перевести в 16 систему = 340

Вот так правильно будет??

USART_Init(340);
Well_Di
пардон wacko.gif не заметил второй страницы.
Палыч
Цитата(jin_jin @ Apr 1 2008, 14:07) *
Это получается что для 300
UBRP= (4000000/4800)-1 = 832
это надо перевести в 16 систему = 340
Вот так правильно будет??
USART_Init(340);
Вычислено - верно. Но, зачем переводить?

Правильно будет

USART_Init(832); или, что тоже самое USART_Init(0x340);
jin_jin
Спасибо большое
jin_jin
C устройством разобрался собрал на передачу и прием по ИК
Проблема следующая работает не более чем на 2 метра.
Как можно усилить сигнал предатчика ИК
Пробовал стандартные схемы усиления на 2 транзисторах результат тот же 2 метра и все.
На какое максимальное расстояние можно передавать по ИК связи??
Палыч
Цитата(jin_jin @ Apr 2 2008, 09:29) *
На какое максимальное расстояние можно передавать по ИК связи??
Вы меня удивляете... Пульт от телевизора Panasonic (тот же ИК) переключает с метров так десяти. Имхо, все дело в излучателе (излучающем ИК-диоде) и, возможно, скорости передачи.
jin_jin
Мы и сами сидим удивляемся.
Пульт принимает наша банка с расстоянии 5-8 метров
Мы уже и с разных схем передатчик пробовали на 2 на 1 транзисторе
максимум 2 метра получается
Излучаем с частотой 36 кГц скорость 1200 Baud
Может кто что посоветовать
Палыч
Цитата(jin_jin @ Apr 2 2008, 10:01) *
Мы уже и с разных схем передатчик пробовали на 2 на 1 транзисторе
Может, все-таки, не число транзисторов менять, а тип ИК-диода...
jin_jin
Может кто-нибудь мне подсказать в следующем вопросе.
Можно ли через UART передавать байты с частотой 36 кГц не используя внешний генератор
Чтобы как в RC-5.
Палыч
Цитата(jin_jin @ Apr 4 2008, 08:17) *
Можно ли через UART передавать байты с частотой 36 кГц не используя внешний генератор. Чтобы как в RC-5.
Генератор можно взять и внутренний - на таймере. Выходы ОСn таймера и Тх USART объединить внешней логикой.
jin_jin
Если не затруднит можно ли по подробнее что за OCn таймер и как это связать с Usart
Палыч
Цитата(jin_jin @ Apr 4 2008, 09:23) *
можно ли по подробнее что за OCn таймер и как это связать с Usart
ОСn - это не таймер, это - Output Compare pin - один из выходов таймера. В t2313 два таймера и у каждого два Output Compare pin: для таймера 0 - OC0A, OC0B, соответственно для таймера 1 - OC1A, OC1B. Соответствующей настройкой таймера можно получить на OCn некоторую частоту (например, 36 кГц, или около того). Вот Вам и не потребуется внешний генератор. Промодулировать сигнал этого генератора сигналом с Тх USART прийдется внешней обвязкой - это уж придумайте сами - как Вам сподручнее будет сделать.
jin_jin
А как настроить прваильно таймер на частоту 36кГц??
Палыч
Цитата(jin_jin @ Apr 4 2008, 09:54) *
А как настроить прваильно таймер на частоту 36кГц??
Сначала определитесь с таймером: таймер0 или таймер1. В даташите для каждого таймера есть подраздел "Output Compare Unit" в котором всё подробно написано. Есть даже формулы определения частоты, которая получится на выходе: для таймера0 - на стр. 72, таймера1 - стр. 99. Несложными математическими преобразованиеми этих формул легко получить значения регистров.
jin_jin
Таймер0 буду использовать. Что то пытался сделать через CodeVisionGenerator выставить значения но что то не получилось

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 15,625 kHz
// Mode: Normal top=FFh
// OC0A output: Toggle on compare match
// OC0B output: Disconnected
TCCR0A=0x40;
TCCR0B=0x04;
TCNT0=0x24;
OCR0A=0x24;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 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;

Вся проблема в том что у меня проблема с английским.
А даташит на инглише. Если не затруднит вы можtnt помочь расчитать значение таемера на 36 кГц
Палыч
Цитата(jin_jin @ Apr 4 2008, 10:27) *
Таймер0 буду использовать. Что то пытался сделать через CodeVisionGenerator выставить значения но что то не получилось
Надеюсь Вы не забыли настроить соответствующую ногу на вывод? В DDB3 - занести единицу.

Цитата(jin_jin @ Apr 4 2008, 10:27) *
Вся проблема в том что у меня проблема с английским.А даташит на инглише.
Найдите в сети перевод или книгу по AVR, но сверяйтесь с оригинальным текстом.
jin_jin
порт В настроен на выход. Так что то и не разобрался что надо занести в эти регистры чтобы частота была 36

с этой формулой не могу понять что за коэфициент N 1 8 64 256

Что надо занести в настройки для частоты 36кГц

TCCR0A
TCNT0
OCR0A
vet
Вам не 36, а 72 кГц нужна, бо выход OCn инвертируется по совпадении таймера.
Прочитайте любой перевод любого даташита AVR для общего представления о таймерах, все детали отлично настроит CodeWizard.
jin_jin
Что то я еще больше запутался почему 72 если можно по подробнее
Палыч
Цитата(jin_jin @ Apr 4 2008, 10:51) *
с этой формулой не могу понять что за коэфициент N 1 8 64 256
Это - прескалер (выбираем значение N=1)
Цитата(jin_jin @ Apr 4 2008, 10:51) *
Что надо занести в настройки для частоты 36кГц TCCR0A TCNT0 OCR0A
TCCR0A(В) - No prescaling, CTC mode, Toggle OC0A (какие значения регистров А и В этому соответcтвуют - определитесь сами)
TCNT0 - не принципиально
OCR0А - 0x37 (OCR0L= 0x37 OCR0H=0) , что для кварца 4МГц даёт 36036Гц

P.S. Забыл, что таймер 0 - восьмибитный...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.