All pastes #1451256 Raw Edit

Mine

public text v1 · immutable
#1451256 ·published 2009-06-07 23:07 UTC
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;
    }
  }
}