ttiny2313 - soft UART+UART полурабочий код. Помогите добить

Обсуждаем контроллеры компании Atmel.
Ответить
Аватара пользователя
RadioKot
Прорезались зубы
Сообщения: 218
Зарегистрирован: Вс авг 15, 2010 18:03:04

ttiny2313 - soft UART+UART полурабочий код. Помогите добить

Сообщение RadioKot »

Добрый день. Есть тинька 2313. Я реализовал уже мост между родным ее юартом и своим свеженаписанным софтовым юартом. Кому нужно делюсь рабочим кодом для студии. Код рабочий, но если я напишу вот так, то не работает

Код: Выделить всё

int main(void)
{
  uart_init(); 
  USART_Init(11);
  
	sei();
  
	while(1)
             {
              uart_transmit(USART_Receive()); 

              if(glob.u_status == Full){USART_Transmit(glob.u_buffer_rx); glob.u_status = Null; glob.u_buffer_rx = 0;}
             }
}    

а вот так все супер

Код: Выделить всё

int main(void)
{
  uart_init(); 
  USART_Init(11);
  
  uart_transmit(USART_Receive());
	sei();
  
	while(1)
             {
              if(glob.u_status == Full){USART_Transmit(glob.u_buffer_rx); glob.u_status = Null; glob.u_buffer_rx = 0;}
             }
}    
Буду рад помощи, дабы понять в чем мой глюк :) . четвертый день до 5 утра мучаюсь :o спасибо :beer:
и еще есть глюк. Омен в обе стороны начнется только после того как я на родной юарт пошлю любой байт.

весь кодик, ниже протеус и проект студия

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>//Библиотека прерываний
#define F_CPU 4000000UL //12MGz выстовляем частоту проца 12мгц
#include <util/delay.h> // Библиотека работы с паузами в программе ("Delay")

#define Read  1
#define Write 2 
#define Full  3 
#define Null  4 

volatile  struct{
  char u_buffer_rx;
  char u_buffer_tx;
  char u_status;
  char u_bit_cnt;
  }glob;

void uart_init(void);
void uart_transmit(char data);

unsigned char USART_Receive( void );       //Функция приема данных по протоколу USART
void USART_Transmit( unsigned char data ); //Функция передачи данных по протоколу USART

//**************************************************************************

void uart_init(void)
{
  DDRD = (1<<DDD4)|(1<<DDD1);
  PORTD |= (1<<PD4);
  PORTD |= (0<<PD2);
  TCCR0B = 1;           // Клок выбираем             
  MCUCR = (1<<ISC01);   // Устанавливаем прерывание по спаду Int0   
  EIFR = (1<<INTF0);    // Сброс флага прерывания по Int0
  GIMSK = (1<<INT0);    // Включаем прерывания по входу Rx(Int0) 
  glob.u_status = Null; // Обнуляем переменные
  glob.u_buffer_rx = 0;   // Обнуляем переменные
  glob.u_buffer_tx = 0;   // Обнуляем переменные
} 

//**************************************************************************

ISR(INT0_vect) //Сработало прерывание по стартовому биту
{
  TCNT0 = 60;          //начальное значение таймера-счетчика 9600 = 120
  TIFR = (1<<TOV0);    // Сбрасываем флаг переполнения таймера
  TIMSK = (1<<TOIE0);  //разрешение на прерывание по переполнению таймера 0
  GIMSK &= ~(1<<INT0); // Отключаем прерывания по входу Rx	  
  glob.u_bit_cnt = 0;  // Обнуляем переменные
  glob.u_buffer_rx = 0;   // Обнуляем переменные	  
  glob.u_status = Read;// Указываю что мы сейчас ведем чтение с ноги Rx	
  }

//**************************************************************************

ISR(TIMER0_OVF_vect)
{
 TCNT0 = 85;                 //Загружаем новое значение в счетчик 9600 = 170;

  if(glob.u_status == Write) // Начинаем передавать
  {
    if(glob.u_bit_cnt<=7)
	{
	  if(glob.u_buffer_tx&0x01){PORTD |= (1<<PD4);} else {PORTD &= (~(1<<PD4));}
      glob.u_buffer_tx =glob.u_buffer_tx>>1;
    }
    
	if(glob.u_bit_cnt == 8){PORTD |= (1<<PD4);} 
	if(glob.u_bit_cnt == 9){EIFR = (1<<INTF0); GIMSK = (1<<INT0); TIFR = (1<<TOV0); 
	   TIMSK &= ~(1<<TOIE0); glob.u_status = Null;} 
  }

 //-------------------------------------------------------------------------- 
  if(glob.u_status == Read) // Начинаем читать
  { 
    if(glob.u_bit_cnt <= 7)
	{
	   glob.u_buffer_rx = (glob.u_buffer_rx>>1); 
	   if(PIND & (1<<PD2)){glob.u_buffer_rx |=0x80;}
    }                          
    
	if(glob.u_bit_cnt == 7)
    {
      	glob.u_status = Full;  // Указываем что буфер полон и чтение закончено
      	TIFR = (1<<TOV0);      // Сбрасываем флаг переполнения таймера
        TIMSK &= ~(1<<TOIE0);  // Запрещаю прерывание по переполнению таймера 
		EIFR = (1<<INTF0);     // Сброс флага прерывания по Int0
        GIMSK = (1<<INT0);     // Включаем прерывания по входу Rx(Int0) 
    }
  }
  glob.u_bit_cnt++; // Увеличиваем счетчик битов
}
            
//**************************************************************************      
void uart_transmit(char data)
{ 
  glob.u_status = Write;  // Указываю что мы сейчас ведем запись на ногу Тx
  GIMSK &= ~(1<<INT0);    // Отключаем прерывания по входу Rx                  
  glob.u_bit_cnt = 0;            
  glob.u_buffer_tx = data;
  TCNT0 = 85;             //Загружаем новое значение в счетчик 9600 = 170   
  TIFR = (1<<TOV0);       // Сбрасываем флаг переполнения таймера
  TIMSK = (1<<TOIE0);     // Разрешаю прерывание по переполнению таймера 0
  PORTD &= ~(1<<PD4);     // Выдаю стартовый бит
}                                                            

//**************************************************************************
 
void USART_Init( unsigned int baudrate )    //Функция инициализации USART
{
  UBRRH = (unsigned char)(baudrate>>8);
  UBRRL = (unsigned char)baudrate;
  UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
  UCSRB &= ~(1<<TXCIE);
  UCSRB &= ~(1<<UDRIE);
  UCSRC &= ~(1<<UMSEL);
  UCSRC &= ~(1<<UPM1);
  UCSRC &= ~(1<<UPM0);
  UCSRC &= ~(1<<USBS);	

 /* USART_Transmit('-');
  USART_Transmit('T');
  USART_Transmit('E');
  USART_Transmit('S');
  USART_Transmit('T');
  USART_Transmit('-');
  USART_Transmit(0x00);*/
}


//**************************************************************************

unsigned char USART_Receive( void )          //Функция приема данных
{
	while (!(UCSRA & (1<<RXC)));            //Ожидание приема символа
	return UDR;                             //Возврат содержимого буфера приема символа
}

//**************************************************************************

void USART_Transmit( unsigned char data )    //Функция отправки данных
{
	while (!(UCSRA & (1<<UDRE)));           //Ожидание опустошения буфера приема
	UDR = data; //Начало передачи данных			        
}

//**************************************************************************


int main(void)
{
  
  uart_init(); 
  USART_Init(11);

  uart_transmit(USART_Receive()); //glob.u_status = Null; glob.u_buffer = 0;
  
	
	
	
	sei();
  
	while(1)
    {  
	if(glob.u_status == Full){USART_Transmit(glob.u_buffer_rx); glob.u_status = Null; glob.u_buffer_rx = 0;}
    }


}      

Вложения
soft_uart.rar
(55.44 КБ) 191 скачивание
Имею 9 жизней
-----------------------------------------------------------
Прошу не путать меня с тёзкой - "radio-kot"
Реклама
Ответить

Вернуться в «AVR»