Witam
Jestem w trakcie pisania softu dla urządzenia które będzie kontrolowało 2 napięcia. Wykorzystuje multiplexowanie portów A/C Atmegi
PC2 i PC4.
Problem w tym, że nie dokonuje się odświeżanie bufora ADC który zmierzony został z PC4.
kod programu:
Czy ktoś ma jakiś pomysł dlaczego nei ma odświeżania wartości z PC4??
Kanał PC2 chodzi super, PC4-za 1 razem odczyta wartość prawdziwą ,ale nadal pozostaje ona w buforze.
proszę o pomoc
dzięki
Poprawiłem tytuł - Regulamin. [c_p]
Jestem w trakcie pisania softu dla urządzenia które będzie kontrolowało 2 napięcia. Wykorzystuje multiplexowanie portów A/C Atmegi
PC2 i PC4.
Problem w tym, że nie dokonuje się odświeżanie bufora ADC który zmierzony został z PC4.
kod programu:
//*****************************************************************************
//
//
//*****************************************************************************
/*biblioteki*/
#include <avr/io.h>
//#include <avr/delay.h>
#include "const_bit.h"
#include "wait.h"
unsigned int adc_data = 0;
#define t1 0
#define LED1 BIT0
#define LED2 BIT7
#define LED3 BIT6
#define LED4 BIT5
#define PORT_LED1 PORTB
#define PORT_LED2 PORTD
#define PORT_LED3 PORTD
#define PORT_LED4 PORTD
#define PORT_LED234 PORTD
#define BUZER BIT1
#define PORT_BUZER PORTC
//------------------------------------------------------------------------------
// Tester
//------------------------------------------------------------------------------
//#################################### Test
void test2(void)
{
int x;
ADMUX &= ~7;
ADMUX |= 2; //kanał
ADCSRA |= _BV(ADSC); //Start
while (ADCSRA & _BV(ADSC) ) {}// czekaj na koniec konwersji
adc_data = ADCW; // pobrano wartosc ADC
PORT_LED1 = LED1; //CZYSC LEDY
if( adc_data>778) // >3.8V
{
PORT_LED1 &= ~LED1; wait_ms(t1); PORT_LED1 |= LED1; wait_ms(t1);
}
else if(adc_data>737) // >3.6V
{
PORT_LED1 &= ~LED1; wait_ms(t1); PORT_LED1 |= LED1; wait_ms(t1);
PORT_LED1 &= ~LED1; wait_ms(t1); PORT_LED1 |= LED1; wait_ms(t1);
}
else if(adc_data>717) // >3.5V
{
PORT_LED1 &= ~LED1; wait_ms(t1); PORT_LED1 |= LED1; wait_ms(t1);
PORT_LED1 &= ~LED1; wait_ms(t1); PORT_LED1 |= LED1; wait_ms(t1);
PORT_LED1 &= ~LED1; wait_ms(t1); PORT_LED1 |= LED1; wait_ms(t1);
}
else if(adc_data>676) // >3.3V
{
PORT_LED1 &= ~LED1; wait_ms(t1); PORT_LED1 |= LED1; wait_ms(t1);
PORT_LED1 &= ~LED1; wait_ms(t1); PORT_LED1 |= LED1; wait_ms(t1);
PORT_LED1 &= ~LED1; wait_ms(t1); PORT_LED1 |= LED1; wait_ms(t1);
PORT_LED1 &= ~LED1; wait_ms(t1); PORT_LED1 |= LED1; wait_ms(t1);
}
else //brak baterii
{
PORT_LED1 &= ~LED1; wait_ms(t1); PORT_LED1 |= LED1; wait_ms(t1);
PORT_LED1 &= ~LED1; wait_ms(t1); PORT_LED1 |= LED1; wait_ms(t1);
PORT_LED1 &= ~LED1; wait_ms(t1); PORT_LED1 |= LED1; wait_ms(t1);
PORT_LED1 &= ~LED1; wait_ms(t1); PORT_LED1 |= LED1; wait_ms(t1);
PORT_LED1 &= ~LED1; wait_ms(t1); PORT_LED1 |= LED1; wait_ms(t1);
PORT_LED1 &= ~LED1; wait_ms(t1); PORT_LED1 |= LED1; wait_ms(t1);
}
}
//#################################### Test Baterii 2
void test4(void)
{
int x;
ADMUX = 4; //kanał
ADCSRA |= _BV(ADSC); //Start
while (ADCSRA & _BV(ADSC) ) {}// czekaj na koniec konwersji
adc_data = ADCW; // pobrano wartosc ADC
PORT_LED2 = LED2+LED3+LED4; //CZYSC LEDY
if( adc_data>778) // >3.8V
{
PORT_LED2 &= ~LED2; wait_ms(t1); PORT_LED2 |= LED2; wait_ms(t1);
}
else if(adc_data>737) // >3.6V
{
PORT_LED2 &= ~LED2; wait_ms(t1); PORT_LED2 |= LED2; wait_ms(t1);
PORT_LED2 &= ~LED2; wait_ms(t1); PORT_LED2 |= LED2; wait_ms(t1);
}
else if(adc_data>717) // >3.5V
{
PORT_LED2 &= ~LED2; wait_ms(t1); PORT_LED2 |= LED2; wait_ms(t1);
PORT_LED2 &= ~LED2; wait_ms(t1); PORT_LED2 |= LED2; wait_ms(t1);
PORT_LED2 &= ~LED2; wait_ms(t1); PORT_LED2 |= LED2; wait_ms(t1);
}
else if(adc_data>676) // >3.3V
{
PORT_LED2 &= ~LED2; wait_ms(t1); PORT_LED2 |= LED2; wait_ms(t1);
PORT_LED2 &= ~LED2; wait_ms(t1); PORT_LED2 |= LED2; wait_ms(t1);
PORT_LED2 &= ~LED2; wait_ms(t1); PORT_LED2 |= LED2; wait_ms(t1);
PORT_LED2 &= ~LED2; wait_ms(t1); PORT_LED2 |= LED2; wait_ms(t1);
}
else //brak baterii
{ PORT_LED2 &= ~LED2; wait_ms(t1); PORT_LED2 |= LED2; wait_ms(t1);
PORT_LED2 &= ~LED2; wait_ms(t1); PORT_LED2 |= LED2; wait_ms(t1);
PORT_LED2 &= ~LED2; wait_ms(t1); PORT_LED2 |= LED2; wait_ms(t1);
PORT_LED2 &= ~LED2; wait_ms(t1); PORT_LED2 |= LED2; wait_ms(t1);
PORT_LED2 &= ~LED2; wait_ms(t1); PORT_LED2 |= LED2; wait_ms(t1);
PORT_LED2 &= ~LED2; wait_ms(t1); PORT_LED2 |= LED2; wait_ms(t1);
}
}
//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
void adc_init(void)
{
// Wybranie wewnętrznego żródła napięcia odniesienia
ADMUX |= _BV(REFS0);
ADMUX |= _BV(REFS1);
// Wybranie sposobu zapisu wyniku z wyrównaniem do lewej (osiem starszych bitów wyniku w rejestrze ADCH)
ADMUX |= _BV(ADLAR);
// Zezwolenie na konwersję
ADCSRA |= _BV(ADEN);
// Wybranie częstotliwości dla taktowania przetwornika (1/8 częstotliwosci zegara kontrolera)
ADCSRA |= _BV(ADPS0);
ADCSRA |= _BV(ADPS1); //
}
//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
int main (void)
{
DDRB = 0XFF;
DDRD = 0XFF;
PORTB = 0XFF;
PORTD = 0XFF;
adc_init();
for (;;) {
test2();
wait(1);
test4();
wait(1);
}
}
Czy ktoś ma jakiś pomysł dlaczego nei ma odświeżania wartości z PC4??
Kanał PC2 chodzi super, PC4-za 1 razem odczyta wartość prawdziwą ,ale nadal pozostaje ona w buforze.
proszę o pomoc
dzięki
Poprawiłem tytuł - Regulamin. [c_p]
