Skocz do zawartości

Atmega328 brak odczytu z ADC


bieri13

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
}

 

Link do komentarza
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.