mal eine zusammengestellte hilfe.
winavr-c-programm:
Code:#include <stdio.h> #include <stdlib.h> #include <avr/io.h> #include <stdint.h> #include <string.h> #include <avr/pgmspace.h> #include "adc.h" #define delay_us_(us) _delayFourCycles_( ( ( 1*(F_CPU/4000) )*us)/2005 ) static inline void _delayFourCycles_(uint16_t z) { uint16_t i; for (i=0; i<z; i++) asm volatile("nop"); } static inline void delay_ms_(uint16_t z) { uint16_t i; for (i=0; i<z; i++) delay_us_(999); } int main(void) { uint16_t x=0; char buffer[7]; ADCinit; ADCprescaler_16; //Aktivierung des ADC, festlegen eines Prescalers von 16 while (1) { ADCchannel_1; //Aktivierung des Pins , an ihm soll die zu messende Spannung liegen ADCstart; //Start einer Konvertierung x=getadc(); itoa( x , buffer, 10); //routine zum senden an ein display oder RS232 delay_ms_(200); } }
die adc.h :
Code:#define ADCchannel_init DDRA=0x00 // ADC Port als Eingang deklarieren #define ADCinit ADCSRA|=_BV(ADEN) // Teilt dem Board mit das der jeweilige Port für ADC verwendet wird #define ADCdisable ADCSRA &=~_BV(ADEN) // machs das vorherige wieder rückgänig #define ADCstart ADCSRA|=_BV(ADSC) // startet eine konvertierung auf dem gewünschten Kannal/Pin #define ADCfree ADCSRA|=_BV(ADATE) // schaltet den freilaufenden Modus ein #define ADCvintern ADMUX|=_BV(REFS0) // interne Spannungsversorgung #define ADCinterrupt_on ADCSRA|=_BV(ADIE) // ADC interrupt wird freigeschalten #define ADCprescaler_2 ADCSRA |=_BV(ADPS0) // gewünschter Teilungsfaktor/Prescaler #define ADCprescaler_4 ADCSRA|=_BV(ADPS1) #define ADCprescaler_8 ADCSRA=_BV(ADPS1) | _BV(ADPS0) #define ADCprescaler_16 ADCSRA|=_BV(ADPS2) #define ADCprescaler_32 ADCSRA=_BV(ADPS2) | _BV(ADPS0) #define ADCprescaler_64 ADCSRA=_BV(ADPS2) | _BV(ADPS1) #define ADCprescaler_128 ADCSRA=_BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0) #define ADCprescaler_reset ADCSRA = ~_BV(ADPS2) & ~_BV(ADPS1) & ~_BV(ADPS0) #define ADCchannel_1 //gewünschter Kannal z.B bei ATmega32 PINA0 - PINA7 #define ADCchannel_2 ADMUX|=_BV(MUX0) // bei nicht freilaufen muss ADCchannel_x vor #define ADCchannel_3 ADMUX|=_BV(MUX1) // ADCstart kommen dann kann man mit getadc() der #define ADCchannel_4 ADMUX= _BV(MUX1) | _BV(MUX0) // Adcwert des gewählten Kannals auslesen #define ADCchannel_5 ADMUX|=_BV(MUX2) #define ADCchannel_6 ADMUX= _BV(MUX2) | _BV(MUX0) #define ADCchannel_7 ADMUX= _BV(MUX2) | _BV(MUX1) #define ADCchannel_8 ADMUX= _BV(MUX2) | _BV(MUX1) | _BV(MUX0) #define ADCchannel_reset ADMUX= ~_BV(MUX2) & ~_BV(MUX1) & ~_BV(MUX0) uint16_t getadc(void) { while (ADCSRA & _BV(ADSC)) {} return ADC; }







Zitieren

Lesezeichen