Przetwornik A/D Atmega8

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
kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Przetwornik A/D Atmega8

Post autor: kaliska5 » 24 sty 2010, 12:23

Witam.Po długiej przerwie wróciłem do zabawy z mikroprocesorami i mam problem z przetwornikiem analogowo-cyfrowym w Atmega8. Nie chce kopiować kogoś kodu wiec siedzę z nota katalogowa i próbuje sam coś zdziałać. Wyszło mi coś takiego ale nie działa.

Kod: Zaznacz cały

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

ISR(ADC_vect)   
{
   volatile unsigned char liczba1 ,liczba2;
   liczba1 = ADCL; 
   liczba2 = ADCH;
   PORTB = liczba1;   
}

int main(void)                       
{
	for(;;)
{
DDRD=255;
PORTD=0;
ADMUX = (1<<REFS0)|(1<<MUX2);     
ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADFR)|(1<<ADSC)|(1<<ADPS0)|(1<<ADPS1);

sei(); 
_delay_ms(50);  
}            
  


}
Co jest źle? Przepraszam za zamieszanie brakło ustawienia portu B. Proszę o usuniecie postu

Awatar użytkownika
RcTomek
Moderator
Posty: 243
Rejestracja: 27 wrz 2007, 21:15
Lokalizacja: Głogów / Wrocław

Post autor: RcTomek » 24 sty 2010, 15:06

A dlaczego cała konfiguracja portu i ADC jest w pętli nieskończonej? Takie rzeczy, łącznie z sei(), powinieneś umieścić przed for(;;){}. Ustaw port B jako wyjście, bo chyba o to chodzi? Na końcu funkcji main brakuje return 0.

kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Post autor: kaliska5 » 25 sty 2010, 17:23

Nie chce zakładać nowego tematu wiec napisze w starym . Mam problem dalej z tym przetwornikiem napisałem prosty program wyświetlający zawartość ADC na 3 wyświetlaczach 7seg.Niestety nie działa w porządku wyświetlają sie rożne badziewia.
Nie mogę się doszukać błędu.

Kod: Zaznacz cały

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

volatile char cyfra[10] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x2, 0x78, 0x0, 0x10,};



volatile int wysw; 
volatile int setki;
volatile int dziesiatki;
volatile int jednosci;
volatile unsigned char mlodszapolowka ,starszapolowka , wynikadc;


int main(void)                       
{
		DDRD=255;
		PORTD=255;
		DDRB=255;
		ADMUX = (1<<ADLAR)|(1<<REFS0)|(1<<MUX2);     
		ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADFR)|(1<<ADSC)|(1<<ADPS0)|(1<<ADPS1);
		TCCR1B |= (1 << WGM12); // tryb CTC
		OCR1A = 30000; 
		TCCR1B |= (1 << CS10); 
		TIMSK |= (1 << OCIE1A); 
		sei();
		
  for (;;)
{
	wynikadc=starszapolowka;
	jednosci = wynikadc % 10;
	wynikadc = wynikadc /10;
	dziesiatki = wynikadc;
	wynikadc = wynikadc /10;
	setki= wynikadc /10;

}
return 0;
}     

  
ISR(ADC_vect)   
{
mlodszapolowka = ADCL;
starszapolowka = ADCH;
}
ISR(TIMER1_COMPA_vect)
{
	switch(wysw)
	{
		case 0:
		        PORTD = 0b1111110;
			PORTB=cyfra[setki];
			wysw++;
			break;
			
		

		case 1:
		
			PORTD = 0b1111101;
			PORTB = cyfra[dziesiatki];
			wysw++;
			break;
		
		case 2:
			
			PORTD = 0b1111011;			
			PORTB = cyfra[jednosci]; 
			wysw=0;
			break;
			
	}
}

Awatar użytkownika
bsw
Użytkownik
Posty: 100
Rejestracja: 14 kwie 2008, 13:13
Lokalizacja: Małopolska
Kontakt:

Post autor: bsw » 26 sty 2010, 12:47

1. sprawdz na poczatek pojedyncze cyfry bez multiplekcowania czy wartosci sa ok - moze cos zle podlaczyles.
2. z kodu widac ze na pewno masz "duchy" (przenosi sie poprzednia cyfra na nastepny wyswietlacz) - musisz wygaszac wyswietlacz zanim przelaczysz na nastepny.

kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Post autor: kaliska5 » 26 sty 2010, 18:18

No wiec wyswietlanie pojedynczych liczb dziala bez problemu.Duchów i innych zjaw :wink: nie widze na wyswietlaczu , segmenty dziesiatek i jednosci wyswietlaja normalnie. Problemu szukam w funkcji

Kod: Zaznacz cały

        jednosci = wynikadc % 10;
	wynikadc = (wynikadc - jednosci) / 10;
	dziesiatki = wynikadc % 10;
	wynikadc = (wynikadc - dziesiatki) / 10;
	setki= wynikadc % 10; 
Te przeliczenia podesłał mi kolega bo moje do niczego się nie nadawały.

Problem rozwiązany. Nie wiem jak to możliwe ale 1 i 3 segment miały ze sobą zwarcie i wyświetlało się na nich to samo cały czas. wymieniłem wyświetlacz na inny i działa. Dziękuje za pomoc.

ODPOWIEDZ