Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: FxDev - 26 Mayıs 2010, 18:52:44

Başlık: AVR ADC Sorunu
Gönderen: FxDev - 26 Mayıs 2010, 18:52:44
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);
}
}

Başlık: Ynt: AVR ADC Sorunu
Gönderen: gevv - 26 Mayıs 2010, 18:55:47
umarım işe yarar hocam


ADC with the Atmega128

http://www.engr.sjsu.edu/bjfurman/courses/ME106/ME106pdf/A2D_ATmega128.pdf

------------------------

http://extremeelectronics.co.in/avrtutorials/pdf/adc.pdf

--------------------------

http://trickel.org/thomas/skc/Engg/ENGG_110/Project%203%20Temperature%20Sensor.doc

------------------------------------

http://privat.schreiner-home.info/hardware/fahrradlichtohneschalter/fahrrad.c.pdf


--------------------------------

http://www4.cs.umanitoba.ca/~jacky/Teaching/Courses/COMP_4550-RealTimeSystems/current/Lectures/L08_AD.pdf
Başlık: Ynt: AVR ADC Sorunu
Gönderen: gevv - 26 Mayıs 2010, 19:03:27
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 ));
}
}
Başlık: Ynt: AVR ADC Sorunu
Gönderen: gevv - 26 Mayıs 2010, 19:07:26
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
Başlık: Ynt: AVR ADC Sorunu
Gönderen: gevv - 26 Mayıs 2010, 19:15:37
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



Başlık: Ynt: AVR ADC Sorunu
Gönderen: controller - 26 Mayıs 2010, 19:59:45
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;
}
Başlık: Ynt: AVR ADC Sorunu
Gönderen: controller - 26 Mayıs 2010, 21:37:30
Ben kütüphaneyi ATMEGA8535 ile fiziksel devre üzerinde denemiştim. Az önce de proteus da ATMEGA16 ile denedim çalışıyor.
Başlık: Ynt: AVR ADC Sorunu
Gönderen: Elektroemre - 26 Mayıs 2010, 21:45:23
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...
Başlık: Ynt: AVR ADC Sorunu
Gönderen: PROTECH_ - 26 Mayıs 2010, 21:54:53
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.
Başlık: Ynt: AVR ADC Sorunu
Gönderen: Elektroemre - 26 Mayıs 2010, 23:55:23
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ü:
(http://img324.yukle.tc/images/69172605a.jpg)
Başlık: Ynt: AVR ADC Sorunu
Gönderen: M_B - 28 Mayıs 2010, 23:45:42

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 (http://winavr.scienceprog.com/example-avr-projects/programming-avr-adc-module-with-winavr.html)