ja bih sada baš....

stanje
Zatvorena za pisanje odgovora.
kazi joj...sta ona tu potura mene :lol:

pa zbog bataka :hahaha:

:jede: odlični su đabo, svaki ti dao.

Nego, ko prvi nađe bug dobije veliku Milka čokoladu!

Kod:
#include <avr/io.h>

#include <avr/interrupt.h>

#include <util/delay.h>



#ifndef F_CPU

//define cpu clock speed if not defined

#define F_CPU 16000000

#endif

//set desired baud rate

#define BAUDRATE 57600

//calculate UBRR value

#define UBRRVAL ((F_CPU/(BAUDRATE*16UL))-1)

#define SET_SS() PORTB&=~(1<<PB0)
#define RESET_SS() PORTB|=(1<<PB0)

long unsigned int rawdata; //mlx raw data recieved via spi
long unsigned int ext_longangle; //extracted angle im 32 bits precision
unsigned int ext_angle_new=0; //extracted angle in 16 bits precision
unsigned char datas[7];
char poruka[] = "Zdravo! Ugao je:\n";

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

void USART_writestr(char *str)
{
	while ( *str!='\0')
	{
		USART_writechar(*str ) ;
		str++;
	}
}

void InitSPI(void)
{
	DDRB = ((1<<PB0)|(1<<PB3)|(1<<PB5));	 // Set MOSI , SCK , and SS output
	 		// SPI initialization
			// SPI Type: Master
			// SPI Clock Rate: 250 kHz
			// SPI Clock Phase: Cycle Start
			// SPI Clock Polarity: Low
			// SPI Data Order: MSB First
	SPCR = ((1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<SPR1));
	SPSR=0x00;
}


char spi(char byte)
{
	SPDR = byte;					//Load byte to Data register
	while(!(SPSR & (1<<SPIF)));         	// Wait for transmission complete 
	byte=SPDR;
	return byte;

}

void USART_Init()

{
	//Set baud rate

	UBRRL=UBRRVAL;		//low byte

	UBRRH=(UBRRVAL>>8);	//high byte

	//Set data frame format: asynchronous mode, even parity, 1 stop bit, 8 bit size

	UCSRC=(1<<URSEL)|(0<<UMSEL)|(1<<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

	sei();
}



unsigned int MLXread(void)
{
    unsigned int x;
    //read MLX data until valid data obtained 
        //MLX select
        SET_SS();
        //wait for MLX to initialize transfer
        _delay_us(6);
        //send startbytes
        spi(0x55);		
        spi(0x55);
		USART_writechar('A');
        //wait for  MLX internal angle calculatins
        _delay_us(16);
        //DATA byte 1
        x=spi(0x00);   
        _delay_us(13);
        //DATA byte 2
        x=(x<<8)|spi(0x00);      
        RESET_SS();
    return x;
} 


ISR(USART_RXC_vect)

{

	cli();

	unsigned char Temp;

	//Store data to temp

	Temp=UDR;
	if(Temp=='A')
		{
			USART_writestr(poruka);
			rawdata = MLXread(); //read sensor
			USART_writestr(poruka);			
			ext_longangle = (21972*((long unsigned int)(rawdata)>>2))/10000; //angle calculation in integer aritmetic
            ext_angle_new =(unsigned int)ext_longangle;
			for(int i=5;i>-1;i--) //five digits number for string conversion
					{
						if(i==3) //add dot after 2 decimal digits  
						{
							datas[i]='.';
							i--;
						}
						switch(ext_angle_new%10)
						{
							case 0:
								datas[i]='0';
							break;
							case 1:
								datas[i]='1';
							break;
							case 2:
								datas[i]='2';
							break;
							case 3:
								datas[i]='3';
							break;
							case 4:
								datas[i]='4';
							break;
							case 5:
								datas[i]='5';
							break;
							case 6:
								datas[i]='6';
							break;
							case 7:
								datas[i]='7';
							break;
							case 8:
								datas[i]='8';
							break;
							case 9:
								datas[i]='9';
							break;		
						}
						ext_angle_new=ext_angle_new/10;
					}
					datas[6]='\0';
			
		}
	sei();
}


int main(void)

{

	USART_Init();
	InitSPI();
	RESET_SS();
	while(1);

	//nothing here interrupts are working

	return 0;

}
 
stanje
Zatvorena za pisanje odgovora.

Back
Top