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);
}
}
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
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 ));
}
}
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
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
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;
}
Ben kütüphaneyi ATMEGA8535 ile fiziksel devre üzerinde denemiştim. Az önce de proteus da ATMEGA16 ile denedim çalışıyor.
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...
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.
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)
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)