Acabo de ingresar a la programación de STM8 y estoy tratando de averiguar cómo leer voltajes con su ADC. Esta fue una de mis primeras incursiones en la programación de C incrustada, por lo que los errores de código "nooby" no están completamente descartados aquí. Ya he tenido éxito con el funcionamiento de UART y la funcionalidad GPIO básica, pero parece que no puedo entender qué está pasando con el ADC. Por alguna razón, como lo indica el título, sigo obteniendo el valor máximo de ADC (Vdd = + 3.3V), y los registros de datos dicen 1023, con un poco de fluctuación. He probado diferentes fuentes de voltaje (potenciómetro, función gen. E incluso atando directamente el pin a GND) en vano. El dispositivo en particular que tengo es el STM8S103F3 de 20 pines, y estoy usando SDCC + STM8Flash para programar el dispositivo. Estoy usando un archivo de encabezado personalizado que define las direcciones de registro y he verificado que coincidan con la hoja de datos. Mis configuraciones son las siguientes:
//Code from an example I found online, modified to fit my device
//On the STM8S103F3, AIN0 and 1 are not physically mapped to a pin
//so I'm using AIN2 (PC4). I'm just trying to poll the ADC without
//interrupts. Just reading the values directly.
//***This isn't the entire code here. Just the parts pertaining to the ADC.***
PC_DDR = 0b00000000; //Setting all of Port C to input
PC_CR1 = 0b00000000;
PC_CR2 = 0b00000000; //GPIO config registers set according to the datasheet
ADC_CSR = 0b00000010; //Set ADC channel to 2 for AIN2 (lower 4 bits set channel)
ADC_TDRL = 0b00000100; //Disable Schmitt trigger for channel 2
ADC_CR1 = 0b01000000; //Frequency prescaler = f/8
ADC_CR2 = 0b00001000; //Right-aligning data
ADC_CR3 = 0b00000000; //Disabling buffer
//Then, to poll the ADC by enabling the ADON bit
ADC_CR1 |= 0x00000001; //This was from the example code, what's the difference between 0x and 0b?
ADC_CSR &= 0x01111111; //Not entirely sure what's going on here, but maybe clearing the EOC flag?
while ((ADC_CSR & 0b10000000) == 0); //Waiting for the EOC bit to be set?
result = ((unsigned int)(ADC_DRH * 256) + (unsigned int)ADC_DRL); //Concatenating the upper and lower bytes to form a 10-bit value
Con las configuraciones ADC anteriores, solo obtuve valores que van desde 1023 ... 1016 o menos, sin importar qué voltaje aplique a la entrada. ¿Alguna idea? Gracias!