Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

AVR ADC Sorunu

Başlatan FxDev, 26 Mayıs 2010, 18:52:44

FxDev

ADC0 kanalından okuma yapmaya çalışıyorum fakat bir türlü while'dan aşağı düşmüyor.
O satırı dilip yerine gecikme versem de ADC çevrimi başlamamış olarak görüyor acaba sorunum nedir?

#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"

int main(void)
{
	int deger;
	PORTB=0x00;
	DDRB=0xFF;

	lcd_init();

	ADMUX=0xC0;		// Sağa dayalı, 2.56V referans, kanal 0 seçili
	ADCSRA=0x83;	// Clk: 125kHz, ADC Açık

	lcd_yaz("Sicaklik Degeri");

	for(;;)
	{
		ADCSRA|=0x40;
		while(ADCSRA & 0x40);

		deger=(int)(ADCH*256+ADCL);	// Hesaplama yapılıyor
		lcd_gotoxy(2,6);						// Okunan değer LCD'ye yazılıyor
		veri_yolla(deger/1000+48);
		veri_yolla((deger%1000)/100+48);
		veri_yolla((deger%100)/10+48);
		veri_yolla(deger%10+48);
		_delay_ms(50);
	}
}



gevv

#2
yeni dökümanlar ekledim sanırım bu http://extremeelectronics.co.in/avrtutorials/pdf/adc.pdf  iş görür

---------------------------
Atmel ADC Example

http://www.c51c51.com/index.php?lay=show&ac=article&Id=480897

/*--------------------------------------------------------------------------
adcMain.c

--------------------------------------------------------------------------*/
/******************************************************************************
This function Initializes all values required to run the AD converter.
******************************************************************************/

void Init_ADC( void )
{
 ADCF |= 0xFF;  //Sets all channels for available input
 ADCLK |= 0x1F;  //Sets clock to second slowest value
 ADCON |= 0x20;  //Enables the ADC
 ADCON |= 0x80;      //Sets QUIETM bit for Accurate conversion (10bit)
}


/******************************************************************************
This function reads a channel and starts the AD conversion
******************************************************************************/
unsigned int Read_ADC( unsigned char channel )
{
    unsigned int result=0x00;
 ADCON &= ~0x07;                 //Clear channel bits
 ADCON|=0x20;     //Enable ADC Mode ADEN
 ADCON |= 0x07 & channel;  //Sets channel to be read in ADCON
 ADCON=ADCON&0xef;             //Clear ADEOC
 ADCON |= 0x8;     //Start Conversion
 while( ADCON & 0x8 );   //Waiting until end of conversion.
 result=ADDH;
 result=result<<2;
 result=result&0xfffc;
 result=result|(ADDL&0x03);
 return(result);
 //return( ((unsigned) ADDH << 2) | (ADDL & 3) );
}
/******************************************************************************
Main Function.  Read each channel and outputs the converted value
******************************************************************************/

void main( void )
{
 unsigned char i=0;

 CKCON=0x00;   //12 Clock Per Machine Cycle
/*------------------------------------------------
Setup the serial port for 1200 baud at 16MHz.
------------------------------------------------*/
    SCON  = 0x50;          /* SCON: mode 1, 8-bit UART, enable rcvr      */
    TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */
    TH1   = 248;                /* TH1:  reload value for 9600 baud @ 16MHz   */
    TR1   = 1;                  /* TR1:  timer 1 run                          */
    TI    = 1;                  /* TI:   set TI to send first char of UART    */

 Init_ADC();

    while(1)
    {
  printf("Channel %u = %4u\r", (unsigned)i,Read_ADC( i ));
 }
}
 

gevv

bir tanede "Atmel ADC Example" ekledim :) http://www.c51c51.com/index.php?lay=show&ac=article&Id=480897

yine sorun varsa belki derleyici programlarda bir sorun vardır  yada gözden kaçan bir ayar vb
 

gevv

kod içinde adc ile ilgili bir bölüm var belki iş görür  http://www.shedai.net/yildiz/gzs.html

ayrıca  güzel bir uygulamamış :)

Ortamın Aydınlığının Mikro İşlemci Kontrolüyle Belirlenmesi



 

controller

AVR için yazdığım bir adc kütüphanesi, test etmiştim çalışıyordu.

#define ADC_REF_AREF 0x00
#define ADC_REF_AVCC 0x40
#define ADC_REF_INT  0xC0

unsigned char ADC_REF_TYPE;

void adc_init(unsigned char ADC_REF)
{
	PORTA = 0x00;
	DDRA = 0x00;
	ADCSRA = 0x87;
	ADC_REF_TYPE = ADC_REF;
}

unsigned int read_adc(unsigned char adc_channel)
{
	ADMUX = ADC_REF_TYPE | adc_channel;
	ADCSRA |= 0x40;
	while ((ADCSRA & 0x10) == 0);
	return ADC;
}
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

controller

Ben kütüphaneyi ATMEGA8535 ile fiziksel devre üzerinde denemiştim. Az önce de proteus da ATMEGA16 ile denedim çalışıyor.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

Elektroemre

#7
FxDev hocam kendi kullandığım ADC kütüphanesi aşağıdadır. ATmega8 ile gerçek hayatta çatır çatır çalışıyor isis'de denemedim. Şuan çalışmakta olan bir projemde sorunsuz kullanılmakta. Eğer simulasyonda çalışmazsa isis'den şüphelenmek lazım. Kodlar kesinlikle çalışıyor.

Ayrıca küçük bi ayrıntı önemli:
AVCC pinini proteusta +5V'a bağlayıp deneyin.

Umarım işinize yarar.
ADC.h
void ADCInit(void);
unsigned int ADCOku(unsigned char Kanal);


ADC.c
#include <avr/io.h>
#include <util/delay.h>
#include "ADC.h"

void ADCInit(void)
{
	ADCSRA=0x83;
}

unsigned int ADCOku(unsigned char Kanal)
{
	ADMUX= Kanal | 0b11010000;
	ADCSRA|=0x47; 
	while ((ADCSRA & 0x10)==0);
	ADCSRA|=0x10;
	return ADCW;

}


Saygılar...

PROTECH_

Alıntı yapılan: Elektroemre - 26 Mayıs 2010, 21:45:23
Ayrıca küçük bi ayrıntı önemli:
AVCC pinini proteusta +5V'a bağlayıp deneyin.

Datasheetde de yazıyor avcc ye gerilim verilmediği takdirde adc çalışmaz.
Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

Elektroemre

FxDev hocam sizin için projeyi isis'de simule ettim. ATmega8 ile de çalışıyor benim kodlar.
6 kanalıda kullanıyorum, o an için 4 tanesi  ekranda işlenmiş halde. Kontrol ettim değerler olması gerektiği gibi.
Sürüm 7.5sp3 (bu tür durumlar sürüm yada kullandığınız kürek ile ilgili olabiliyor mesela bazı kürekler PIC'lerde HPWM'de sorun çıkarıyormuş...)

ekran görüntüsü:

M_B


Merhaba Hocam;
Altaki linkteki Atmega8 Adc uygulaması 7.6 Sp4 calısıyor ( Bendeki proteusta )


http://winavr.scienceprog.com/example-avr-projects/programming-avr-adc-module-with-winavr.html
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet