Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: pwr_24 - 19 Mayıs 2020, 12:14:26

Başlık: ATMEGA168PB MULTIPLE ADC
Gönderen: pwr_24 - 19 Mayıs 2020, 12:14:26
Merhaba arkadaşlar. ATmega 168pb MCU ile tek kanal adc ölçümünü yapıp lcd ekrana yazdırıyorum. Çok kanallı ölçmek istediğimde ise debugtan takip ettiğim kadarıyla Conversation başlamıyor. Komutlar aşağıda ilgilenirseniz sevinirim.


#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <avr/interrupt.h>
#include "lcd.h"

#define  TRUE 1

volatile uint8_t adc_flag;
uint8_t low_bits;
uint16_t ten_bits;

void GPIO_SET(void)
{
DDRC&=~(1<<PORTC4);
DDRC&=~(1<<PORTC5);
}

void ADC_SET(void)
{
ADMUX|=(1<<REFS0);
ADCSRA|=(1<<ADIE)|(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2);
ADCSRA|=(1<<ADEN);
}

void ADC_START_CONVERSATION(void)
{
ADCSRA|=(1<<ADSC);
}

int main(void)
{
adc_flag=0;
InitLCD(LS_BLINK|LS_ULINE);
LCDClear();
LCDWriteStringXY(0,0,"X:");
LCDWriteStringXY(0,1,"Y:");
GPIO_SET();
ADC_SET();
sei();
ADC_START_CONVERSATION();

while(TRUE)
{
if (adc_flag==1)
{
low_bits=ADCL;
ten_bits=(ADCH<<8|low_bits);

switch (ADMUX)
{
case (0x44):
LCDWriteIntXY(3,0,ten_bits,4);
ADMUX=0x45;
break;

case (0x45):
LCDWriteIntXY(3,1,ten_bits,4);
ADMUX=0X44;
break;

default:
break;
}

}

adc_flag=0;
ADC_START_CONVERSATION();
}
return 0;

}

ISR(ADC_vect)
{
adc_flag=1;
}