atmega8 usart seri veri hatalı gidiyor

Başlatan forumsad, 02 Haziran 2011, 22:57:07

forumsad

aşagıdaki örnek kodu derledim isisde simülasyon yaptım
free serial port monitör ile giden veriyi inceledim

veri bozuk gidiyor

bu atmega8 ile seri haberleşme konusunda sağlıklı bilği bulamıyorum bir hocamız bu konuya bir el atsada bizi aydınlatsa bir örnek uygulama yapsa

minnettar olurum....

saygılarımla

ferdem

Ben kodunu göremedim. Zamanında kullandığım programı buraya yazıyorum.
Programın amacı şuydu: atmega8 bilgisayardan gelen seri veriyi SPI ile gönderiyor, SPI ile aldığını da seri olarak bilgisayara gönderiyor. Bilgisayarın seri portunu kullanarak SPI haberleşme yapmak için kullanmıştım.
/*
 picproje.org
 fatiherdem.net
 RX den gelen veriyi SPI ile gönderir
 SPI den gelen veriyi TX ile gönderir
 Atmega8 @ 1MHz
 */

#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>

char SPI(char cData);


#define F_CPU 1000000  // 1 MHz
#define DDR_SPI DDRB
#define DD_MOSI 3
#define DD_SCK 5

#define BAUDRATE 9600
//calculate UBRR value
#define UBRRVAL ((F_CPU/(BAUDRATE*16UL))-1)



void USART_Init()
{
	//Set baud rate
	UBRRL=UBRRVAL;		//low byte
	UBRRH=(UBRRVAL>>8);	//high byte
	//Set data frame format: asynchronous mode,no parity, 1 stop bit, 8 bit size
	UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|
		(0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0);
	//Enable Transmitter and Receiver and Interrupt on receive complete
	UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
	//enable global interrupts
	//set_sleep_mode(SLEEP_MODE_IDLE);
	sei();
	DDRD|= (1 << PD1);
	DDRD|= ~(1 << PD0);
}

void USART_Transmit( unsigned int data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Copy ninth bit to TXB8 */
UCSRB &= ~(1<<TXB8);
if ( data & 0x0100 )
UCSRB |= (1<<TXB8);
/* Put data into buffer, sends the data */
UDR = data;
}


void SPI_MasterInit(void)
{
/* Set MOSI, SS and SCK output,  all others input */
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR);
}

char SPI(char cData){
unsigned char data;
data=0xCC;
	SPDR = cData;
	/* Wait for transmission complete */
	while(!(SPSR & (1<<SPIF)));

	//if(cData==0xFF || cData==0xFE){
		data = SPDR;
		USART_Transmit(data);

	//}
	return data;
	//_delay_ms(15);
}


ISR(USART_RXC_vect)
{

	DDRB |= (1 << PB0);
	//define temp value for storing received byte
	uint8_t Temp;
	//Store data to temp
	Temp=UDR;
	//USART_Transmit(Temp);
	SPI(Temp);



	if (Temp==0xAA){
		PORTB |= (1 << PB2); // CS HIGH
	}
	if (Temp==0xBB){
		PORTB &= ~(1 << PB2); // CS LOW
	}


	PORTC ^= (1 << PC5); //seri data geldi, C5 i toggle et


}

int main(void) {

//**********Port Init*************
  //define c5 as output
  DDRC |= (1 << PC5);
  DDRB |= (1 << PB0);
  DDRB |= (1 << PB2);

  SPI_MasterInit(); //MOSI ve SCK cikis olarak ayarlandi
  USART_Init(); 	//TX pini cikisa ayarlandi





  while(1){


	  PORTB |= (1 << PB0); // switch on
	  _delay_ms(100);
	  PORTB &= ~(1 << PB0); // switch off
	  _delay_ms(100);
  }

return 0;
}

forumsad

SADECE  RX-TX kullanarak veri gönderme olayını adım adım inceleyebilirmiyiz hatam olursa lütfen düzeltin



ilk adım:
UCSRA=0x00;   //registeri sıfırla
ilk olarak UCSRA registerini incelersek;
[IMG]http://www.hizliupload.com/img/26223469641314595804.jpg[/img] Hizliupload.com

Bit 7 – RXC: USART Receive Complete
Bit 6 – TXC: USART Transmit Complete
Bit 5 – UDRE: USART Data Register Empty
Bit 4 – FE: Frame Error
Bit 3 – DOR: Data OverRun
Bit 2 – PE: Parity Error
Bit 1 – U2X: Double the USART transmission speed
Bit 0 – MPCM: Multi-processor Communication Mode

burdaki bitleri biraz daha açık olarak anlatabilirmisiniz.....

forumsad

birinci için cevap alamadık bu sitede kimse atmel bilmiyor sanırım ben kendimce devam edeyim...


ikinci olarak
UCSRB=0x18;   yi inceleyelim

[IMG]http://www.hizliupload.com/img/28742599499294705436.jpg[/img] Hizliupload.com

Bit 7 – RXCIE: RX Complete Interrupt Enable
Bit 6 – TXCIE: TX Complete Interrupt Enable
Bit 5 – UDRIE: USART Data Register Empty Interrupt Enable
Bit 4 – RXEN: Receiver Enable
Bit 3 – TXEN: Transmitter Enable
Bit 2 – UCSZ2: Character Size
Bit 1 – RXB8: Receive Data Bit 8
Bit 0 – TXB8: Transmit Data Bit 8

UCSRB=0x18-----11000

burda bit3 ve 4 ü set etmiş buda anladığım kadarıyla  veri gönderme ve ve alma aktif ediliyor