rendered paste body#include <avr/io.h>
#include <avr/interrupt.h>
#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
}
unsigned char usart1[MAX_BUFFSIZE];
unsigned int rx_count = 0;
unsigned char GotMessage = FALSE;
short int ovf0cnt = 0; //value for timer0 cycle
short int int0cnt = 0;
volatile int timer = 0;
volatile short int timer_flag = 0;
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 0x01: portiow |= (1 << rele); break;
case 0x02: portiow &= ~(1 << rele); break;
case 0x03: timer_flag = 1; break;
case 0x04: timer_flag = 1; 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) && (timer < (usart1[1]*100)))
timer++;
else if ((timer >= (usart1[1]*100)) && (timer_flag))
{
if(usart1[0] == 0x03)
portiow |= (1 << rele);
else if(usart1[0] == 0x04)
portiow &= ~(1 << rele);
timer = 0;
timer_flag = 0;
}
}
ISR(USART_RXC_vect)
{
//ISR_RX_Handler(){
portiow ^= (1 << rxled);
if(rx_count < MAX_BUFFSIZE && !GotMessage)
{
usart1[rx_count++] = receiveChar();
if(rx_count == MAX_BUFFSIZE)
{
GotMessage = TRUE;
}
}
}