rendered paste body#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
//variables
define portio PIND
#define portiow PORTD
#define rxled PD7
#define rele PD6
#define btnsw PD5
#define triac PD4
#define MAX_BUFFSIZE 3
#define TRUE 1
#define FALSE 0
unsigned char receiveChar(void )
{
unsigned char ch = UDR;
return ch;
}
void sendChar(char data)
{
while( !(UCSRA&(1<<UDRE)) )
;
// put the data in the USART data register
UDR = data;
UCSRA=UCSRA|0x40;
}
void USART_Flush( void )
{
unsigned char dummy;
while ( UCSRA & (1<<RXC) )
dummy = UDR;
}
void usartInit(unsigned int ubrr)
{
cli(); // disable interrupts while adjusting baudrate
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(1<<TXCIE)|(0<<UDRIE)|(0<<UCSZ2);
UCSRC = (1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)|(0<<UCPOL);
UBRRH = (unsigned char) (ubrr>>8);
UBRRL = (unsigned char) ubrr;
sei(); // Enable interrupts
}
/*
short int usart_val = 0; //value for usart address validity
volatile unsigned int usartin = 0; //value for usart character
volatile unsigned char usart[3];
volatile unsigned char usart1[3];
int usart2[3];
int usart3[3];
*/
volatile unsigned char usart1[MAX_BUFFSIZE];
unsigned char rx_count = 0;
volatile unsigned char GotMessage = FALSE;
short int ovf0cnt = 0; //value for timer0 cycle
short int int0cnt = 0;
volatile unsigned int timer = 0;
volatile unsigned char timer_flag = FALSE;
short int i = 0; //value for pwm storing
volatile short int btnsw_right = 0;
int count = 0;
int main (void)
{
TIMSK |= (1<<TOIE1 | 1 << TOIE0); //enable interrupt from Timer0
MCUCR |= (1<<ISC00 | 1<<ISC01);
TCCR0 = (1<<CS02 | 0<<CS01 | 0<<CS00);
TCCR2 = 0x61; //set TCCR2 to the above values (0x01100001b)
OCR2 = 0x00; //set OCR2 to overflow at XX
DDRB = 0x08; //as of right now, only enable the PWM pin as output
DDRD = (1 << PD7 | 1 << PD6 | 0<<PD5 | 1<<PD4 | 0<<PD2);
PORTD |= (1 << PD5 | 1<<PD4);
usartInit(51);
//PORTD = 1<<PD6;
while(1)
{
if((btnsw_right == 0) && ((portio & (1<<btnsw))))//0x20)))
btnsw_right = 1;
if(GotMessage){
switch(usart1[1])
{
case '1': portiow |= (1 << rele); break;
case '2': portiow &= ~(1 << rele); break;
case '3': timer_flag = TRUE; break;
case '4': timer_flag = TRUE; break;
}
GotMessage = rx_count = FALSE;
}
}
}
ISR(TIMER0_OVF_vect)
{
if (++ovf0cnt == 4)
{
if((btnsw_right == 1) && (!(portio & (1<<btnsw))))
{
portiow ^= (1 << rele);
btnsw_right = 0;
}
ovf0cnt = 0;
}
if((timer_flag == TRUE) && (timer < 4500))
{
timer++;
// portiow ^= (1 << rxled);
}
else if ((timer >= 4500) && (timer_flag == TRUE))
{
//portiow ^= (1 << rxled);
OCR2 = 0xFF;
if(usart1[1] == '3')
portiow |= (1 << rele);
else if(usart1[1] == '4')
portiow &= ~(1 << rele);
timer = 0;
timer_flag = FALSE;
}
}
ISR(USART_RXC_vect)
{
if((rx_count < MAX_BUFFSIZE) && RXC && !GotMessage)
{
usart1[rx_count++] = receiveChar();
if(rx_count == MAX_BUFFSIZE)
{
sendChar(usart1[1]);
//portiow ^= (1 << rxled);
GotMessage = TRUE;
}
}
}