diff --git a/ard/pins.c b/ard/pins.c index c29069b..a066cfb 100644 --- a/ard/pins.c +++ b/ard/pins.c @@ -137,21 +137,22 @@ unsigned int analog_read(unsigned char pin){ } // TODO: write PWM to digital pins which allow it -void analog_write(unsigned char pin, unsigned int value){ - if(pin > 11){ +void analog_write(unsigned char pin, unsigned char value){ + if(pin != 3 && pin != 5 && pin != 6 && pin != 9 && pin != 10 && pin != 11){ return; } - if(value > 255){ - value = 255; - } + // TODO maybe set pin mode? - /*if(value == HIGH){ - PORTC |= _BV(pin); - } - else{ - PORTC &= ~_BV(pin); - }*/ + // clear timer on compare match + TCCR0A |= _BV(COM0A1)|_BV(WGM01)|_BV(WGM00); + + // set interrupt on overflow and value to compare to + TIMSK0 |= _BV(TOIE0); + OCR0A = value; + + // set timer scaling to 1, which starts the timer + TCCR0B |= _BV(CS00)|_BV(CS02); } // maps A0-A7 to 0-7 @@ -167,3 +168,8 @@ unsigned char map_analog_pin(unsigned char pin){ ISR(ADC_vect){ // required but not used... } + +// fast PWM overflow interrupt handler +ISR(TIMER0_OVF_vect){ + +} diff --git a/ard/pins.h b/ard/pins.h index 150a93c..cb67122 100644 --- a/ard/pins.h +++ b/ard/pins.h @@ -19,6 +19,6 @@ void pin_mode(unsigned char, unsigned char); int digital_read(unsigned char); void digital_write(unsigned char, unsigned char); unsigned int analog_read(unsigned char); -void analog_write(unsigned char, unsigned int); +void analog_write(unsigned char, unsigned char); #endif diff --git a/main.c b/main.c index 37fb760..bfe5944 100644 --- a/main.c +++ b/main.c @@ -33,9 +33,11 @@ void prepare(){ // PWM example pin_mode(A1, INPUT); - pin_mode(3, OUTPUT); + pin_mode(6, OUTPUT); } +unsigned char pwm = 0; + void loop(){ // digital input/output example /*if(digital_read(10) && digital_read(8)){ @@ -54,7 +56,7 @@ void loop(){ // PWM example int analog = map(analog_read(A1), 0, 1023, 0, 255); - analog_write(3, analog); + analog_write(6, analog); char out[15]; sprintf(out, "%d", analog);