Ja, ich meinte sicherlich zwischen Vout des Sensors und der Ground.
Zwischen Vout des Sensors und Vin des Sensors kommen auch die richtigen 4.8V
hier nochmal der code in "sauber":
Code:
#include <avr/io.h>
#include <stdlib.h>
#include <string.h>
#include <avr/interrupt.h>
#include "uart_komplett.h" //meine UART
#include "timer1.h" //meine timer funktion, sorgt dafür dass die UART ausgabe nur alle 2 sekunden erfolgt (overflows halt)
//Dinge definieren
#define LED_DDR DDRC //definieren der LED DDR
#define LED_PORT PORTC //defintion des genauen ports für die DDR
#define LED_PORTPIN1 PC1 //definition der roten LED
#define LED_PORTPIN0 PC0 //definition des gruenen LED
//Variablen definieren
uint16_t adc_wert = 0; //Wert des ADC
volatile uint8_t overflowzahl = 0; //zaehlt die overflows, wichtig für den timer und die UART ausgabe (zwei sekunden takt halt)
//Funktionen definieren
void adc_init()
{
uint16_t result; //ergebnis variable festlegen, uint16 wegen 10 bit ergebnis
ADMUX = (1<<REFS1)|(1<<REFS0); //die interne Referenzspannung nehmen
ADCSRA = (1<<ADPS1)|(1<<ADPS0); // Frequenzvorteiler bei 8
ADCSRA |= (1<<ADEN); //ADEN "enabled" ADC
ADCSRA |=(1<<ADSC); //analog zu digital wandlung aktivieren
while (ADCSRA & (1<<ADSC)) // eine "sinnlos" Wandlung durchfuehren um den eventuellen Mist
{ // aus dem Wandler rauszuschmeissen
}
result = ADCW; // das ergebnis der wandlung steht in ADCL und ADCH (sind die Result Register)
//dabei wird immer von ADCL nach ADCH gelesen/
//muss einmal gelesen werden, sonst wird das ergebnis der naechsten wandlung nicht gelesen
}
//Einzelne ADC Messung und "Lesung" des Wertes
uint16_t adc_read (uint8_t channel)
{
ADMUX = (ADMUX & 0b11000000) | (channel & 0b00111111); //kanal waehlen
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while (ADCSRA & (1<<ADSC) )
{
} // s.o.
return ADCW;
} //geb mir das ergebnis, ADCW is das selbe wie result = ADCL, zusaetzlich zu result += (ADCH<<8)
int main(void)
{
LED_DDR |= (1<<LED_PORTPIN1)|(1<<LED_PORTPIN0); //PC1 und PC0 Pins als ausgang festlegen und einschalten
LED_PORT = 0x01; //rote LED an
DDRA = 0x00; //explizit den PortA als Eingang deklarieren
uint16_t adc_wert;
char buffer[20];
usart_init();
timer1_init();
adc_init(0);
sei(); //interrupts aktivieren
adc_wert = adc_read(0); //zuweisung der Wert - Variable der "Auslese-Funktion"
while(1)
{
adc_wert = adc_read(0); //zuweisung der Wert - Variable der "Auslese-Funktion"
if (overflowzahl==1) //UART Uasgabe nur wenn ein Overflow stattfinden
{
sprintf ( buffer, "ADC: %d\r\n", (int)adc_wert ); //string rausgeben, hier leider nur "ADC: 0 "endzeichen""
uart_puts( buffer ); //puts fuer den string
overflowzahl=0; //die zählung der overflows wieder auf 0 setzen, in der ISR fuer den Timer steht drin: "overflowzahl++;", damit die
// if-Bedienung dieser main-loop erfuellt wird
}
}
}
Lesezeichen