/*****************************************************
Project : PWM half-bridge controller
Version : 
Date    : 27.05.2009
Author  : OneTech                  
Company : OneTech                         


Chip type           : ATtiny13
Clock frequency     : 9,600000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 16
*****************************************************/

#include <tiny13.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x20

unsigned char c; 

interrupt [PCINT0] void pin_change_isr(void)
{
};

unsigned char read_adc(void)
{
ADMUX=ADC_VREF_TYPE|1;
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
};

void PWM_set(unsigned char PWM_data)
{   
    if (PWM_data>=255)
    {
        PWM_data=255;
    };
    OCR0A=PWM_data;
    OCR0B=PWM_data^255;
};

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out 
// State5=T State4=T State3=T State2=T State1=0 State0=0 
PORTB=0x00;
DDRB=0x03;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 9600,000 kHz
// Mode: Phase correct PWM top=FFh
// OC0A output: Non-Inverted PWM
// OC0B output: Inverted PWM
TCCR0A=0xB1;
TCCR0B=0x01;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0xFF;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: On
GIMSK=0x20;
MCUCR=0x00;
PCMSK=0x10;
GIFR=0x20;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;

// ADC initialization
// ADC Clock frequency: 600,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: None
// Only the 8 most significant bits of
// the AD conversion result are used
// Digital input buffers on ADC0: Off, ADC1: Off, ADC2: Off, ADC3: Off
DIDR0&=0x03;
DIDR0|=0x3C;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x84;

// Global enable interrupts
#asm("sei")
PINB.3=1;
delay_ms(500); 

while (PINB.3==0) {


if (c<=254) {

c++;

    }
else  {

c=255;    
    };



    delay_ms(10);    
    PWM_set(c);
    read_adc();


};

}
