atmega16 usart sorunu?

Başlatan satilla, 10 Temmuz 2012, 16:27:40

satilla

isis'te herhangi bir sorun yok ama devre üzernde herhangi bir çıkış alamıyorum

#include <avr/io.h>
#include <inttypes.h>
#include <stdio.h>
#include <util/delay.h> 

#define gsm_power PORTB.2


char dizi[20]=" ";
unsigned char i;

//This function is used to initialize the USART
//at a given UBRR value
void USARTInit(uint16_t ubrr_value)
{

   //Set Baud rate

   UBRRL = ubrr_value;
   UBRRH = (ubrr_value>>8);

   /*Set Frame Format


   >> Asynchronous mode
   >> No Parity
   >> 1 StopBit

   >> char size 8

   */

   UCSRC=(1<<URSEL)|(3<<UCSZ0);


   //Enable The receiver and transmitter

   UCSRB=(1<<RXEN)|(1<<TXEN);


}


//This function is used to read the available data
//from USART. This function will wait untill data is
//available.
char USARTReadChar()
{
   //Wait untill a data is available

   while(!(UCSRA & (1<<RXC)))
   {
      //Do nothing
   }

   //Now USART has got data from host
   //and is available is buffer

   return UDR;
}


void transmit( unsigned char data )
{
//buffer bosalana kadar bekle
while ( !( UCSRA & (1<<UDRE))) 
;
/* Copy 9th bit to TXB8 */
UCSRB &= ~(1<<TXB8);
if ( data & 0x0100 )
UCSRB |= (1<<TXB8);

UDR = data;
}


void send_string(char *str)
{
   while(*str!=0)
   {
   transmit(*str++);
   }                   
 
}


int main()
{

PORTA  =0x00;
PORTB  =0x00;
PORTC  =0x00;
PORTD  =0x00;

DDRB=0xFD;
PORTB=0x02;


USARTInit(51);    //UBRR = 51


while(1)
   {
 
 
 /*  
//gsm modülü acma
for(i=0;i<20;i++)
_delay_ms(200);
	PORTB|=_BV(2); 
for(i=0;i<20;i++)
_delay_ms(200);
	PORTB&=~_BV(2);
for(i=0;i<30;i++)
_delay_ms(200);
*/




_delay_ms(200);

za:


_delay_ms(300);



sprintf(dizi,"Test Mesaji");
send_string(dizi);
sprintf(dizi,"26");
send_string(dizi);





	goto za;




	  for(;;);

   }
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                                                                 



dahili 8 mhz osc kullanıyorum
veriler hatası gitse bil razıyım ama skop ile bakıyorum usart pinlerinden hiç çıkış yok

zakbay

Sorunun fuse ayarlarından olup olmadığını anlamak için gönderme yaptığınız ana döngüde çıkış olarak ayarladığınız bir pinin durumunu değiştirip dışarıdan gözlemleyebilirsiniz.

ilgili pinde hiç hareket yoksa fuse ayarlarınızı kontrol edin. Pin normal toggle yapıyorsa usart ayarlarını gözden geçirmek gerekebilir.
Tek dostum çalışmak...

satilla

hocam zaten pinde toogle yaptım herhangi bir sorun yok ama
usart'ın tx pininden çıkış alamıyorum

sizde denediğiniz bir kod var mı
sadece hex'de işimi görür

bocek

#3
UCSRC=(1<<URSEL)|(3<<UCSZ0);

burada 3<<UCSZ0 işleminde hata var.
char size 8 bit yapmak için UCSZ'ye 3 (binary 011) yazman gerekli bu doğru ama bu şekilde yazamazsın.
doğrusu:
UCSRC=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);

bunu bir dene bakalım olmazsa örnek bir kod yollayayım.
1 ya da 0. işte 'bit'ün mesele..

satilla

#4
hocam o şekilde bir sorun olacağını sanmıyorum çünkü c kitabındada aynı şekilde bilgi yazıryor ve nitekim aynı kodla çalıştıabildim devreyi

sorun data pinleirni farklı yerden kontrol etmemöiş  :-X

ancak pc tarafından gönderdigim verileri inceliyorum karma karışık birşeyler görünüyor, fakat isiste herşey normal

zakbay

aşağıdaki kodları geçen yıl kullandım çalışıyordu
faydası olur belki bir deneyin

#include <avr/io.h>
#include <avr/pgmspace.h>
#include "UART_routines.h"

//**************************************************
//Function initialize UART0
//desired baud rate: 19200
//actual: baud rate:19231 (0.2%)
//char size: 8 bit
//parity: Disabled
//**************************************************
void USART_init(void)
{
	//seri haberleşme değerlerini burayı açarak girebilirsin
/*	UBRRH = (unsigned char)(ubrr>>8); // Set baud rate
	UBRRL = (unsigned char)ubrr;
	UCSRB = (1<<RXEN)|(1<<TXEN);  // Enable receiver and transmitter
	UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); // Set frame format: 8data, 2stop bit
*/

 /*UCSR0B = 0x00; //disable while setting baud rate
 UCSR0A = 0x00;
 UCSR0C = 0x06;
 UBRR0L = 0x33; //set baud rate lo
 UBRR0H = 0x00; //set baud rate hi
 UCSR0B = 0x98;*/
}
//**************************************************
//Function to receive a single byte
//*************************************************
unsigned char receiveByte( void )
{
//unsigned char USART_Receive( void )

	/* Wait for data to be received */
	while ( !(UCSRA & (1<<RXC)) ); // Wait for incomming data
	/* Get and return received data from buffer */
	return UDR;
}

//***************************************************
//Function to transmit a single byte
//***************************************************
void transmitByte( unsigned char data )
{
	while ( !( UCSRA & (1<<UDRE)) ); /* Wait for empty transmit buffer */
	UDR = data;		/* Put data into buffer, sends the data */
}

//***************************************************
//Function to transmit a string in Flash
//***************************************************
void transmitString_F(char* string)
{
  while (pgm_read_byte(&(*string)))
   transmitByte(pgm_read_byte(&(*string++)));
}

//***************************************************
//Function to transmit a string in RAM
//***************************************************
void transmitString(char* string)
{
    while (*string)
		transmitByte(*string++);
}



// **************************************************************
// ***  UART_ROUTINES HEADER FILE ******** 		
// **************************************************************

#define TX_NEWLINE		{transmitByte(0x0d); transmitByte(0x0a);}

void USART_init(void);
unsigned char receiveByte(void);
void transmitByte(unsigned char);
void transmitString_F(char*);
void transmitString(char*);
Tek dostum çalışmak...

satilla

kaç mhz osc için hocam register ayarları
hiç bir değişiklik yapmadan o donanımlarla kurmak istiyorum devreyi

zakbay

4 mhz de kurup denemişim sadece gönderme kısmı ile çalıştım tek taraflı olarak
Tek dostum çalışmak...