[C] Przetwornik analogowo-cyfrowy 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
adi19887
-
Posty: 52
Rejestracja: 22 mar 2010, 23:48
Lokalizacja: Poznań

[C] Przetwornik analogowo-cyfrowy atmega8

Post autor: adi19887 » 16 lis 2013, 19:17

Witam serdecznie,

Jestem już lekko zrezygnowany moimi próbami, proszę jedynie o sprawdzenie kodu:

Kod: Zaznacz cały

#define F_CPU 16000000UL

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


#define LED2 PB0    //definicja LED2 (do którego pinu podłączony LED2)
//#define KLAWISZ PC0 //definicja KLAWISZ (do którego pinu podłączony klawisz)
#define ADCIN PC0   //definicja ADCIN (wejście ADC)

int main(void)
{
  
  ADCSRA =   (1<<ADEN) //ADEN: ADC Enable (uruchomienie przetwornika)
			   |(1<<ADPS0)  //ADPS2:0: ustawienie preskalera, preskaler= 128
			   |(1<<ADPS1)
			   |(1<<ADPS2); 

  ADMUX  =   (1<<REFS0); //REFS1:0: Reference Selection Bits //AVcc with external capacitor. 
			 
  //ustawienie wejśc/wyjść
 DDRB  |=(1<<LED2); //Ustawienie pinów sterujących diodami jako wyjścia
 DDRC &=~ (1<<ADCIN);   //Ustawienie Wejścia ADC
 PORTC  |= (1<<LED2);    //stan wysoki     
 volatile uint16_t temp;
  while(1)//pętla główna 
		  {
				_delay_ms(100);
				ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
 
				while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
				temp=ADCW;
			  if(temp<=512)
				  {
					PORTC  &=~ (1<<LED2);
					
				  }
			  else if(temp>512)
				  {
					PORTC  |= (1<<LED2);
					
				  }
			 
			}
  }
Chciałem po prostu przetestować ADC w atmedze. Działanie jest proste: regulacja 10-bitowa mniej niz połowa zakresu potencjometru wyłącza diodę a ponad połowa ją załącza. Do wejścia atmegi PC0 podłączam środkową nóżkę potencjometru 100k i reguluję napięcie od 0 do 4.93 V (nap. zasilania). Dioda LED zielona podłączona jest przez rez. 470om do anody i katodą do masy. Niestety dioda się nie załącza. W tym miejscu jest problem bo nie wiem dlaczego. Kod którego używałem jest przecież sprawdzony. Gdzie może leżeć przyczyna?

Jony130
Moderator
Posty: 3170
Rejestracja: 11 sie 2005, 16:33
Lokalizacja: wrocław

Post autor: Jony130 » 16 lis 2013, 19:23

A wideo Mirka o ADC widziałeś?

adi19887
-
Posty: 52
Rejestracja: 22 mar 2010, 23:48
Lokalizacja: Poznań

Post autor: adi19887 » 17 lis 2013, 13:17

Nie widziałem, jednak chętnie obejrzę. Pod jakim adresem szukać ?

Jony130
Moderator
Posty: 3170
Rejestracja: 11 sie 2005, 16:33
Lokalizacja: wrocław

Post autor: Jony130 » 17 lis 2013, 14:00

To jeszcze nie znasz tej strony?
http://mirekk36.blogspot.com/2013/06/pr ... acych.html

I zauważywszy, że definiujesz diodę pot port B a potem w programie ustawiasz i zerujesz prot C. Tak samo masz zamieszane z rejestrem kierunku DDR.

adi19887
-
Posty: 52
Rejestracja: 22 mar 2010, 23:48
Lokalizacja: Poznań

Post autor: adi19887 » 17 lis 2013, 18:17

Tak i takiego świeżego spojrzenia mi brakowało... Nie zauważyłem i zaraz sprawdzę.

Awatar użytkownika
dondu
Użytkownik
Posty: 211
Rejestracja: 24 maja 2005, 9:47
Lokalizacja: Śląskie
Kontakt:

Post autor: dondu » 18 lis 2013, 8:15

Witaj.

Przerobiłeś program z "Drzaśkowego pamiętnika": http://mikrokontrolery.blogspot.com/201 ... ienie.html
Trzeba było się autora zapytać.

Zanim jednak o programie pokaż schemat lub opisz dokładnie jak jest podłączony mikrokontroler. Intuicja mi mówi, że nieprawidłowo.

Dodatkowo:
1. Czy dioda jest poprawnie podłączona (kierunek) - sprawdzałeś prostym programem?
2. Nie definiuj F_CPU w kodzie z tych powodów: http://mikrokontrolery.blogspot.com/201 ... iowac.html
3. Skróciłeś warunek o jeden przedział w stosunku do oryginalnego programu, ale nie potrzebnie sprawdzasz:
else if(temp>512)
wystarczy:
else
Wprawdzie to nie ma większego znaczenia, ale staraj się poprawnie używać else dla końcowego przedziału sprawdzania liczb.

Drobiazg: Zamiast ADCW stosuj po prostu ADC.

EDIT:
Nie zauważyłem, że Jony130 wskazał Ci już problem pomieszania portów. Reszta nadal aktualna.

ODPOWIEDZ