40 lines
1.1 KiB
C
40 lines
1.1 KiB
C
#include <avr/io.h>
|
||
#include "adc_probe_ext.h"
|
||
|
||
void adc_init(void)
|
||
{
|
||
// Vcc as reference, select ADC2 (MUX = 0b010)
|
||
ADMUX = (0 << REFS1) | (0 << REFS0) | // VCC as reference
|
||
(0 << ADLAR) | // Right adjust result
|
||
(0b010); // ADC2
|
||
|
||
// Enable ADC, prescaler = 64 (assuming 8 MHz → ADC freq = 125 kHz)
|
||
ADCSRA = (1 << ADEN) | // Enable ADC
|
||
(1 << ADPS2) | (1 << ADPS1); // Prescaler = 64
|
||
}
|
||
|
||
uint16_t adc_read(uint8_t channel)
|
||
{
|
||
// Set channel (0–7), keeping the other bits in ADMUX
|
||
ADMUX = (ADMUX & 0xF8) | (channel & 0x07);
|
||
|
||
ADCSRA |= (1 << ADSC); // Start conversion
|
||
while (ADCSRA & (1 << ADSC))
|
||
; // Wait for conversion to finish
|
||
|
||
return ADC; // Return 10-bit result
|
||
}
|
||
|
||
uint8_t is_device_connected(void)
|
||
{
|
||
uint16_t value = adc_read(2); // ADC2 = PA2
|
||
|
||
// Zakładamy 5V Vcc → 2.5V = około 512
|
||
if (value > 400 && value < 600)
|
||
{
|
||
return 1; // Podłączone (w granicach tolerancji)
|
||
}
|
||
|
||
return 0; // Odłączone (napięcie bliskie 0 lub 5V)
|
||
}
|