www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Attiny45 - problem branja dveh ADC-jev

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
jozzze2000
Član
Član



Pridružen-a: Pet 25 Nov 2011 8:36
Prispevkov: 167
Aktiv.: 1.11
Kraj: Novo mesto

PrispevekObjavljeno: Čet Mar 31, 2016 3:24 pm    Naslov sporočila:  Attiny45 - problem branja dveh ADC-jev Odgovori s citatom

Poizkušam uporabiti Attiny45 za branje dveh ADC-jev. Če berem ločeno vsakega posebej (torej enega v kodi ne uporabim) oba delujeta kot pričakovano.

V kombinaciji, ko potrebujem branje obeh, se branje enega ne izvede (v tem primeru ADC1 - Funkcija "BranjeVolt1").
Mi lahko kdo pomaga rešiti uganko?

Spodaj je relevantna koda:

Koda:
#define F_CPU 8000000UL

volatile float voltage_on_bit1, before_adcl1, voltage_on_bit2, before_adcl2, ocr_value;

void PortInit(void)
{
       DDRB  = 0b00000001; // 1 -> output port;   //  0 -> input port
       PORTB = 0b00001000; // pull-up
}

void ADC_init(void)
{
         ADMUX =
         (1 << ADLAR) |     // left shift result
         (0 << REFS1) |     // Sets ref. voltage to VCC, bit 1
         (0 << REFS0) |     // Sets ref. voltage to VCC, bit 0
         (0 << MUX3)  |     // use ADC2 for input (PB4), MUX bit 3
         (0 << MUX2)  |     // use ADC2 for input (PB4), MUX bit 2
         (1 << MUX1)  |     // use ADC2 for input (PB4), MUX bit 1
         (0 << MUX0);       // use ADC2 for input (PB4), MUX bit 0

         ADCSRA =
         (1 << ADEN)  |     // Enable ADC
         (1 << ADPS2) |     // set prescaler to 64, bit 2
         (1 << ADPS1) |     // set prescaler to 12864, bit 1
         (1 << ADPS0);      // set prescaler to 12864, bit 0
         
         ADCSRA |= (1 << ADSC);  // Start  A2D Conversions
 
}

void BranjeVolt1(void)            // ADC1
{
       ADMUX=1;                   // Set  to ADC1
       _delay_ms(30);

       ADCSRA |= (1 << ADSC);  // Start A2D Conversions
       while(!(ADCSRA & 0x10)); // wait for it
       before_adcl1 = ADCL;
       voltage_on_bit1 = ((ADCH * 0xff) + before_adcl1)/204.8;
       ocr_value = 20 * voltage_on_bit1;
}

void BranjeVolt2(void)            // ADC2
{
       ADMUX=2;                   // Set  to ADC2
       _delay_ms(30);

       ADCSRA |= (1 << ADSC);  // Start A2D Conversions
       while(!(ADCSRA & 0x10)); // wait for it
       before_adcl2 = ADCL;
       voltage_on_bit2 = 6*((ADCH * 0xff) + before_adcl2)/204.8;          //*6 zaradi delilnika na vhodu.
       
}

int main(void)
{
       PortInit();
       ADC_init();
       PWM_Init();

       stevec = stevec_start;
       plus = 0;
       
       while (1)
       {
             BranjeVolt2();
             _delay_us(50);
             

             if (voltage_on_bit2 < 10)
             {
                    FMH();
             }
             else if (voltage_on_bit2<13)
             {
                    if (bit_is_clear (PINB, 3))
                    {
                           OCR0A = 190;
                    }
                    else
                    {
                           OCR0A = 0;
                    }
             }
             else
             {
                    if (bit_is_clear (PINB, 3))
                    {
                           OCR0A = 190;
                    }
                    else
                    {
                           /*   TA KODA NORMALNO DELUJE IN UTRIPA, KO SO IZPOLNJENI POGOJI
                           OCR0A=250;
                           _delay_ms(200);
                           OCR0A=0;
                           _delay_ms(100);
                           */
                           BranjeVolt1();
                           OCR0A = ocr_value;
                           _delay_us(30);
                           
                    }                   
             }
       }
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group