roboforum.ru

Технический форум по робототехнике.

Помогите с UART

Помогите с UART

AlexNail » 30 мар 2011, 13:15

Добрый день.
Нужна помощь, не могу разобраться с UARTом. Какой код в С (я использую кодевижн) нужно написать для Тини2313, что бы посылать данные с терминала на уарт и считывать эти данные на терминале, самый простой вариант строка в несколько символов.
Прочел кучу материала и не могу разобраться. тока учусь :))

Re: Помогите с UART

Radist » 30 мар 2011, 13:47

"Неправильно ты, дядя Федор, вопрос задаешь" :)
Не видно собственной работы. Правильный вопрос будет таким: я тут код написал, вот он в тегах, только он не работает, потому что происходит вот это, а должно происходить вот то. Гляньте где ошибка, пожалуйста.
Вам тут же скажут про симуляцию в Протеусе, про номер урока курса авр, а потом и на ошибку в коде. А когда вопрос звучит не как вопрос, а как: у меня не получается, сделайте за меня - я бы даже не почесался :) .

Re: Помогите с UART

AlexNail » 30 мар 2011, 14:07

Radist писал(а):"Неправильно ты, дядя Федор, вопрос задаешь" :)
Не видно собственной работы. Правильный вопрос будет таким: я тут код написал, вот он в тегах, только он не работает, потому что происходит вот это, а должно происходить вот то. Гляньте где ошибка, пожалуйста.
Вам тут же скажут про симуляцию в Протеусе, про номер урока курса авр, а потом и на ошибку в коде. А когда вопрос звучит не как вопрос, а как: у меня не получается, сделайте за меня - я бы даже не почесался :) .

в том то все и дело, мастер в кодевижн создал заготовку, а дальше я не могу сообразить :))
я не могу понять как инициализировать уарт на прием и передачу?

Re: Помогите с UART

galex1981 » 30 мар 2011, 14:10

Если я не ошибаюсь то мастер Кодевижн оздает заготовку на прием/передачу символа.

Re: Помогите с UART

yak-40 » 30 мар 2011, 14:11

AlexNail писал(а):я не могу понять как инициализировать уарт на прием и передачу?

Как раз в даташите в разделе USART есть примеры инициализации.

Re: Помогите с UART

AlexNail » 30 мар 2011, 14:47

galex1981 писал(а):Если я не ошибаюсь то мастер Кодевижн оздает заготовку на прием/передачу символа.

Все верно, он инициализирован. Но теперь, что нужно прописать в коде, что бы он принимал и отсылал полученые данные?

Re: Помогите с UART

yak-40 » 30 мар 2011, 15:39

AlexNail писал(а): что нужно прописать в коде, что бы он принимал и отсылал полученые данные?

Даташит 118 страница пример передачи данных, 121 пример приёма.

Re: Помогите с UART

AlexNail » 30 мар 2011, 15:45

yak-40 писал(а):
AlexNail писал(а): что нужно прописать в коде, что бы он принимал и отсылал полученые данные?

Даташит 118 страница пример передачи данных, 121 пример приёма.

я прописываю этот код, а компилятор выдает ошибку. кричит что то по поводу while, его там не должно быть. эти функции я прописываю перед void main. правильно?

Re: Помогите с UART

setar » 30 мар 2011, 15:46

main - это основная программа.
все циклы должны быть в ней, или в вызываемых функциях.

Re: Помогите с UART

AlexNail » 30 мар 2011, 15:58

setar писал(а):main - это основная программа.
все циклы должны быть в ней, или в вызываемых функциях.

Короче я запутался. У меня не получаеться. Нужен код для примера, я так быстрее разберусь. Спасибо.

Re: Помогите с UART

setar » 30 мар 2011, 16:02

приведи свой код

Re: Помогите с UART

AlexNail » 30 мар 2011, 16:16

setar писал(а):приведи свой код

Код: Выделить всёРазвернуть
#include <tiny2313.h>
// Standard Input/Output functions
#include <stdio.h>



#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7   
       
        unsigned char USART_R(void)
            {
                While(!(UCSRA&(1<<RXC)));
                return UDR;
            }

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

// 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


// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;

// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=In
// State6=P State5=P State4=P State3=P State2=P State1=1 State0=P
PORTD=0x02;
DDRD=0x02;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 4000,000 kHz
// Mode: Fast PWM top=0x03FF
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// 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=0xA3;
TCCR1B=0x09;


TCNT1H=0xFC;
TCNT1L=0x01;

ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;

OCR1BH=0x00;     
OCR1BL=0x00;   

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
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=0x18;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=0x19;

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

while (1)
      {   
         
               
      };
}

Re: Помогите с UART

dccharacter » 30 мар 2011, 16:29

Чувак, я знаю, почему у тебя ничего не отправляется и ничего не принимается!!!!!!!!!!!!!!!!!!!

Добавлено спустя 8 минут 14 секунд:
http://piclist.ru/learning_PIC24_2/lear ... C24_2.html

Урок

Один из главных вопросов, который может придти на ум после первого урока, - а что же произойдёт, когда выполнится весь код функции main()? На самом деле не произойдёт ничего особенного: микроконтроллер просто "сбросится", и вся программа выполнится снова... и снова... Потому что компилятор сразу после кода функции main() помещает специальную команду программного сброса.
Во встраиваемых приложениях нам нужно, чтобы программа выполнялась бесконечно с момента включения питания и до его выключения. А если мы позволяем программе полностью выполняться, сбрасываться и снова выполняться, то это как раз похоже на такую организацию приложения, при которой программа выполняется, пока на микроконтроллер подается питание. Но такой вариант может работать только в некоторых ограниченных случаях, и, выполняя программу в таком "цикле", вы делаете её весьма ущербной. Достигнув конца программы и выполнив сброс, микроконтроллер окажется в самом начале кода, и ему придётся выполнять всю инициализацию, включая код C0. И как бы ни была коротка инициализационная часть, это сделает "цикл" неполноценным: в самом деле, нет никакой необходимости в инициализации всех SFR-регистров и глобальных переменных при каждом выполнении программы, и это, конечно же, замедлит приложение. Поэтому лучше заняться разработкой особого, т.н. "главного цикла" приложения. Давайте рассмотрим основные варианты организации циклов на языке Си.

Re: Помогите с UART

AlexNail » 30 мар 2011, 16:56

dccharacter писал(а):Чувак, я знаю, почему у тебя ничего не отправляется и ничего не принимается!!!!!!!!!!!!!!!!!!!

Добавлено спустя 8 минут 14 секунд:
http://piclist.ru/learning_PIC24_2/lear ... C24_2.html


Я тоже знаю, потому что я нифига не могу вьехать. :)) Поэтому я и прошу пример кода, для дальнейшего изучения и пробы. Спасибо.

Re: Помогите с UART

dccharacter » 30 мар 2011, 17:00

Пример по ссылке, которую тебе лень читать:

Код: Выделить всёРазвернуть
#include <p24fj128ga010.h>
#define DELAY  16000
main()
{
// инициализация управляющих регистров
TRISA = 0xff00;     // Выводы 0..7 порта PORTA настраиваем как выходы
T1CON = 0x8030;     // TMR1 включен, предделитель 1:256, Tclk/2

// главный цикл приложения
while(1)
{
   // 1. Включаем выводы 0-7 и ждём 1/4 секунды
   PORTA = 0xff;
   TMR1 =  0;          // обнуляем счётчик
   while (TMR1 < DELAY) { } // просто ждём

   // 2. Выключаем все выводы и ждём 1/4 секунды
   PORTA = 0x00;
   TMR1 =  0;            // обнуляем счётчик
   while ( TMR1 < DELAY) { } // просто ждём

  } // главный цикл
} // main


Rambler\'s Top100 Mail.ru counter