/****************** Arduino Blink with potentiometer in C ******************/
#include<avr/io.h>
//#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
//#define _SFR_BYTE(n) (n)
long map(long x, long in_min, long in_max, long out_min, long out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
void initPort()
{
DDRB|=(1<<PB2); //PB2 - output pin, led
DDRD =0xff; //A0 - inputpin
}
void initADC( void)
{
ADMUX = 0; //Select channel 0
ADCSRA = 0xC3; //Enable ADC & start 1st dummy
//conversion
//Set ADC module prescalar to 8
//critical for accurate ADC
while (!(ADCSRA & 0x10)); //Check if conversation ready
ADCSRA |= 0x10; //Clear conv rdy flag - set bit
}
int main()
{
Serial.begin(9600);
initPort();
initADC();
while(1)
{
blink();
}
}
void blink()
{
int ledVal = 0;
ReadADC(&ledVal, 0x00);
ledVal = map(ledVal, 1023, 0, 0, 255);
printVal(&ledVal);
// in simulator tinkercad doesnt work :(
TCCR1A = 0xA1; //freq = int osc/64 = 1 MHz/64
//freq = 15.6 kHz
TCCR1B = 0x03; //no clock source division
OCR1BH = 0x00; //Init PWM duty cycle variables
OCR1BL = (unsigned char)(ledVal);
}
void printVal(int *ledVal)
{
Serial.print(*ledVal); // prints 2 decimal places by default
Serial.print('\n');
}
void ReadADC(int * result, unsigned char channel)
{
unsigned int binary_weighted_voltage_low = 0,
binary_weighted_voltage_high = 0; //weighted binary voltage
ADMUX = channel;//Select channel
ADCSRA |= 0x43; //Start conversion
//Set ADC module prescalar
//to 8 critical for
//accurate ADC results
while (!(ADCSRA & 0x10)); //Check if conversion ready
ADCSRA |= 0x10; //Clear Conv rdy flag - set the bit
binary_weighted_voltage_low = ADCL; //Read ADC register
binary_weighted_voltage_high = ((unsigned int)(ADCH << 8)); //Read 8 low bits first
*result = binary_weighted_voltage_low | // send 8 low bits
binary_weighted_voltage_high;
}