ATtiny85 ile 3 kanal ADC, RGB kontrolü

Başlatan Cemre., 14 Ocak 2013, 17:10:48

Cemre.

Arkadaşlar daha önce bu devreyi pic işlemciyle kurup çalıştırmayı başarmıştım ve istediğim frekans değerlerine ulaşmıştım.
https://www.picproje.org/index.php/topic,40015.msg294356.html#msg294356


Yeni yeni atmel'de led yakıp söndürüyorum vs, attiny85le bu devreyi çok küçük hale getirebileceğimi düşündüm ve yazdım derledim ancak, frekansım 3hz-4hz gibi değerlerde dolanıyor, benim ihtiyacım olan ise insan gözünün algılayamayacağı değerler, 100hz gibi yani.


      //////////////////////////////
      //////////////////////////////
      //           ATMEL          //
      //         ATTiny85         //
      //        RGB  DENEME       //
      //    Hüseyin Cemre Yılmaz  //
      //////////////////////////////
      //////////////////////////////


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


uint16_t read_adc(unsigned char adc_input){
ADMUX=adc_input | 0x00; // cevrime basla
ADCSRA|=0x40;          // cevrim islemi bitene kadar bekle
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW; 
}


void MCU_init(void){
//Giris/Cikis ayarlari
PORTB   = 0x00;
DDRB   = 0b00001011; //PORTB'yi cikis yap
}


void ADC_init(){ 
ADCSRA    |= (1 << ADEN);      // Enable ADC 
ADMUX    |= (0 << REFS0);       // Set ADC reference to VCC
ADMUX    |= (0 << REFS1);       // Set ADC reference to VCC 
ADCSRA    |= (1 << ADPS2) | ( 1 << ADPS1);   // Prescaler 64, 125kHz ADC sample rate @ 8MHz
ADMUX    |= (1 << ADLAR);      // Left shift ADC result    
ADCSRA    |= (1 << ADSC);       // Start Converstion 


}


//Ana Program Fonksiyonu
int main(void){
MCU_init();      //islemciyi hazirla
ADC_init();      //ADC enable
int adc0;
int adc1;
int adc2;
int i;
      while(1){
         for(i=0;i<=1023;i++){
            adc0=read_adc(0);
            if(adc0>=i){
            PORTB   |= _BV(0);
            }else{
            PORTB   &= ~_BV(0);   
            }
            adc1=read_adc(1);
            if(adc1>=i){
            PORTB   |= _BV(1);
            }else{
            PORTB   &= ~_BV(1);
            }
            adc2=read_adc(2);
            if(adc2>=i){
            PORTB   |= _BV(3);
            }else{
            PORTB   &= ~_BV(3);
            }
         }
      }
}


Alıntı Yap
ISIS simulasyonunu ve C kodlarını burdan indirebilirsiniz.
http://yadi.sk/d/mxg1ebJ41rN8J

Kabil ATICI

#1
Bunu gerçek devre üzerinde denedin mi?

Zamanlama konusunda sıkıntın varsa asm kullan derim. Bir benzerini bilgisiyar üzerinden kontrol (RS232) , Kristal frekansı 3,6864MHz. Bakmak istersen,
http://elektronikvelemciler.blogspot.com/2010/02/atmega8-ve-rs232-ile-3-renkli-led-modul.html
C derlendiği zaman kodları biraz şişiriyor...

Böyle bir sistemde 8 bitlik ADC çözünürğü yeterli oluyor. 3 renk ile 24 bitlik bir renk derinliğine sahip oluyorsun.

Hatta adc'leri sürekli okutmana gerek yok. Timer kullanarak belirli zaman aralıklarında okutman yeterli.
ambar7

Cemre.

Hayır gerçek devre üzerinde denemedim. Yorumunuz için teşekkürler ancak asm kodlamayla ilgili hiç bilgim yok. Buna da yeni yeni alışmaya çalışıyorum  :)

mehmet

Pwm için timer kesmesi kullanmazsanız bu
istediğniz şekilde çalışmaz.
Bir timer kesme içinden pwm oluşturun.
ADC den belli zamnlarda da veri okuyup
bu pwm dizine aktarın.
Timer kesmesini 16bit seçerseniz daha
geniş ayar ve hassaiyet yapmanıza olanak
verilecektir.
If ve for döngüleri çok fazla zaman kaybı
yaratmaktadır.
Daha önemli bir durum daha var; derleme
sırasında optimizasyon. Normalde boyut
azaltmaya ayarlanmıştır. Bunu hız seçeneğine göre
ayarlamanız çevrimi hızlandıracaktır ama daha
fazla yer kaplayacaktır. Siz ATTiniy85 kullanıyorsunuz
bu iş için bellek sorunu yaşamazsınız.

Saygılar...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Cemre.

#4
İlgilendiğiniz için teşekkürler ancak bu söylediklerinizi yapmama yardımcı olacak bir kaç küçük örnek yol gösterebilir misiniz?




// optimizasyondan kasıt bu sanırım hangi değer daha doğru peki?

# Optimization level, can be [0, 1, 2, 3, s].
#     0 = turn off optimization. s = optimize for size.
OPT = ??