Skocz do zawartości
bieri13

Atmega328 brak odczytu z ADC

Pomocna odpowiedź

Cześć,

Mam problem z wyświetlaniem pomiarów z potencjometru i czujnika temperatury podłączonych do ADC atmegi328.
Gdy odczytywałem wartości z poszczególnych portów - albo z PC2 albo z PC3 wyniki były poprawne.
Natomiast gdy chciałem zaimplementować kod z tej strony: http://mikrokontrolery.blogspot.com/2011/03/adc-multipleksowanie.html i wyświetlać wartości pomiarów z dwóch portów jednocześnie już tak kolorowo nie było. Pomiarów brak (same zera) i na dodatek w drugiej linii wyświetlacza LCD wartość pomiaru powinna być na pozycji (7, 1) a jest na samym początku (1,1) .  W pierwszej linii na 7 pozycji jest wartość "0".
Dodatkowo obie wartości "0" delikatnie przygasają w zależności od _delay_ms(500);.
Prosiłbym o pomoc w ukierunkowaniu gdzie robię błąd?

#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include "lcdpcf8574/lcdpcf8574.h"
#include "pcf8574/pcf8574.h"

#define wej_2 PC2
#define wej_3 PC3

volatile uint16_t adc2; //zmienna
volatile uint16_t adc3;

volatile uint8_t wejscie=2;	//zmienna do zmiany wejścia, początkowo pc2

int main(void)
{
	char wynik[]="       "; //bufor tekstowy, 
	lcd_init(LCD_DISP_ON);
	lcd_home();
	lcd_led(0);

		//Inicjalizacja ADC
		ADMUX = (1<<REFS0)	//wybor 5V napiecia odniesienia
				|(1<<ADLAR)	//wyrownanie wyniku do lewej
				|wejscie;	//wybor wejscia poczatkowego
		
		ADCSRA = (1<<ADEN)	//wlaczenie adc
				|(1<<ADPS2) //ustawienie preskalera na 128
				|(1<<ADPS1)
				|(1<<ADPS0)
				|(1<<ADSC)	
				|(1<<ADATE);  
		
		//Inicjalizacja Timera
		TIMSK0 |= (1<<TOIE0);	//przerwanie overflow przepelnienie timera
		TCCR0A |= (1<<CS01);	//zrodlem CLK preskaler 8 (2000000 Hz)  
		TCNT0 = 155;			//poczatkowa wartosc licznika

		DDRC &=~ (1<<wej_2);	//ustawienie pinow wejsciowych adc
		DDRC &=~ (1<<wej_3);

		sei();	//Globalne uruchomienie przerwań 
		
	for (;;)
	{
		lcd_gotoxy(7, 0);		//Ustawienie kursora w pozycji 
		lcd_puts("     ");		//Czyszczenie poprzednij wartości
		itoa(adc3,wynik,10);	//konwersja wyniku do tablicy char
		lcd_gotoxy(7, 0);		//Ustawienie kursora w pozycji 
		lcd_puts(wynik);		//Wyświetlenie wyniku
		
		lcd_gotoxy(7, 1);		//Ustawienie kursora w pozycji
		lcd_puts("     ");		//Czyszczenie poprzednij wartości
		itoa(adc2,wynik,10);	//konwersja wyniku do tablicy char
		lcd_gotoxy(7, 1);		//Ustawienie kursora w pozycji
		lcd_puts(wynik);		//Wyświetlenie wyniku
		
		_delay_ms(500);         //opóźnienie
	}		
}


ISR(TIMER0_OVF_vect)
{
	//Przerwanie przepełnienia Timer0
	
	switch(wejscie)
	{
		case 2://gdy PC2
		adc2=ADCH;     //odczytaj tylko starszy bajt pomiaru
		break;
		
		case 3://gdy PC3
		adc3=ADCH;     //odczytaj tylko starszy bajt pomiaru
		break;				
	}
	
	if(wejscie<3)
	wejscie++;
	else
	wejscie=2;
	
	ADMUX = 0;  //kasowanie rejestru
	
	ADMUX  =   (1<<ADLAR) |(1<<REFS0)| wejscie; //Ustawianie nowych wartości
	
	TCNT0 = 155;  //Początkowa wartość licznika
}

 

Udostępnij ten post


Link to post
Share on other sites

        Chyba tego brakuje:    |(1<<ADFR)      //tryb Free run  

 

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...