////////////////// ///////////////////////////////////////// /////////////////////////////
////////////////////////////// START SOFTWARE UART /////////////////////////////////////
///////////////////////////////////// ///////////////////////////////////////// //////////
unsigned char baud_delay_one=216;//this variable are only used for tune baudrate
unsigned char baud_delay_one_and_half=184;//this variable are only used for tune baudrate
char bit_count=0;
char uart_rx_byte=0;
char uart_status=0;
#define idle 0
#define transmitting 1
#define receiving 2
#define received_data_pending 3
#define start_bit 4
void init_timer0(){ //TIMER0 initialize for software uart
TIMSK |= (1<<TOIE0); //ENABLE 0-TIMER0 OVERFLOW INTERRUPT
TCCR0 = (0x04); //NORMAL MODE,INTERNAL CLK,PRESCALER=1:256
TCNT0=baud_delay_one; //1 bit length for 9600bps (104us) at 12Mhz crystal
sei(); // Interrupt Enabled GLOBALLY
}
ISR(TIMER0_OVF_vect) {
unsigned char sreg = SREG;
cli(); // Disable Global interrupt
TCNT0=baud_delay_one; //1 bit length for 9600bps (104us) at 12Mhz crystal
bit_count++;
SREG = sreg;
}
void uart_send_byte(char send_byte){
TCNT0=baud_delay_one;
bit_count=0;
while(1){
if(bit_count==0){output_port4 &=~(1<<utx);}
if((bit_count>0) && (bit_count<9)){
if(send_byte & (1<<(bit_count-1))){output_port4 |= (1<<utx);} else{output_port4 &=~(1<<utx);}
}
if(bit_count==9){output_port4 |= (1<<utx);}
if(bit_count>9){break;}
}
}
void uart_sent_string(char send_string[]){
unsigned char i=0; // iterating variable
unsigned char LENGHT = 0;// length of the word
for(i=0;i<500; i++){
if(send_string[i] == '