|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
jozzze2000 Član
Pridružen-a: Pet 25 Nov 2011 8:36 Prispevkov: 167 Aktiv.: 1.10 Kraj: Novo mesto
|
Objavljeno: Čet Mar 31, 2016 3:24 pm Naslov sporočila: Attiny45 - problem branja dveh ADC-jev |
|
|
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 |
|
|
|
|
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: 74 dni
Powered by phpBB © 2001, 2005 phpBB Group
|