[C] ATmega8, ADC, LCD proszę o pomoc

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
muster
Użytkownik
Posty: 132
Rejestracja: 01 mar 2006, 20:46
Lokalizacja: POLSKA
Kontakt:

[C] ATmega8, ADC, LCD proszę o pomoc

Post autor: muster » 05 sie 2009, 12:19

Kod: Zaznacz cały

//procedury obsługi LCD
//z kursu w EdW
//instrukcje opóźnienia
int main(void)
{
	//----------------------------------------------
	// Inicjacja - uwaga: uproszczona, może wymagać 
	// zmian przy zmianie przyporządkowania portów
	DDR(LCD_DPORT) = 1<<LCD_E | 1<<LCD_RS | 
		0x0F<<LCD_D4;
	
	LCDinit();
	TCCR2=(1<<WGM20)|(0<<WGM21)|(1<<CS20)|(0<<CS21)|(0<<CS22)|(0<<COM20)|(1<<COM21); 
	ADMUX = 0xC0; //2,56V wewnętrzne; ADC0
	ADCSRA = (1<<ADEN)|(1<<ADSC)|(0<<ADFR)|(0<<ADIE); //włączony, włączone przerwania, prescale =2 
	DDRB = 0xff;
	//OCR2 = 0xff; 
	int aaa; 
	int bbb; 
	// Koniec inicjacji
	//----------------------------------------------
	
	// \/ Bez tego, czasami zerowanie z poziomu programatora
	// \/ powoduje śmieci na wyświetlaczu. 
	LCDcls();
	LCDstr("hello");
    while(1)
	{
	
	ADMUX = ADMUX & 0xfc;//przełącz na kanał 2
	ADMUX |= 1<<MUX1; 
	ADCSRA |= 1<<ADSC; //zacznij
	while(ADCSRA&(0x01<<ADSC)) {};  //czkaj koniec konwersji
    aaa = ((ADCH*256) + ADCL)*5;
    aaa = aaa/2;
    ADMUX = ADMUX & 0xf8;//przełącz na kanał 0 
	ADCSRA |= 1<<ADSC; //zacznij
    while(ADCSRA&(0x01<<ADSC)) {};  //czkaj koniec konwersji
    bbb = ((ADCH*256) + ADCL)*5; //w mV
	bbb=bbb/2;
	
	
	LCDcls();
	LCDstr("ADC=");
	
	char swynik[10];

	LCDstr(itoa(nap, swynik, 10));
	LCDstr("mV");
	OCR2 = 1;
	czekaj(500);
	}
	return 0;
}
Ma ciągle próbkować na zmiana kanal 2 i 0, a potem wyświetlić wartość z kanału 0 na LCD.
Wyświetla tylko jedną wartość, która nie odpowiada napięciu na ADC0, po zmianie napięcia na ADC0, nie zmienia się wartość na wyświetlaczu.
Proszę o pomoc.

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 05 sie 2009, 13:47

Gdzie jest przepisanie wartości aaa lub bbb do zmiennej nap?
Inna sprawa, zamiast pisać aaa = ((ADCH*256) + ADCL)*5; czytelniej będzie aaa=ADCW*5, być może nawet szybciej:)
To samo ADMUX = ADMUX & 0xf8; lepiej wygląda ADMUX &=0xf8; I w ogóle po co pisać dwa działania:
ADMUX = ADMUX & 0xfc;//przełącz na kanał 2
ADMUX |= 1<<MUX1;
Wystarczy tylko to drugie, jeśli nie masz zamiaru korzystać później z innych kanałów.

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 05 sie 2009, 15:34

Byc moze sie myle, ale odczytuje sie najpierw ADCL, a potem ADCH.
WEdlug mnie zmieniajac linie:
bbb = ((ADCH*256) + ADCL)*5; //w mV
na
bbb = (ADCL + (ADCH*256) )*5; //w mV
poprawisz ten blad. Albo jak wspominal kolega, od razu ADCW

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 05 sie 2009, 17:25

Właśnie najbardziej mi się podoba jak młodzi programiści nadają zmiennym nazwy klasy "aaa"," bbb", x itd. itp. :grin: Tak jak by problemem było nazwać ją np. wynik_adc i już wiadomo o co chodzi i do czego służy. Pół biedy jak program tak jak tu ma parę linijek, ale jak takich zmiennych jest z 10-20 i program większy, to kompletna masakra się robi.

muster
Użytkownik
Posty: 132
Rejestracja: 01 mar 2006, 20:46
Lokalizacja: POLSKA
Kontakt:

Post autor: muster » 06 sie 2009, 8:46

Dziękuje za pomoc.
Byc moze sie myle, ale odczytuje sie najpierw ADCL, a potem ADCH.
Karta katalogowa ATmega8:
When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently,
if the result is left adjusted and no more than 8-bit precision is required, it is
sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH.

ODPOWIEDZ