FAQ | Points | Add... | Recent posts | Search | Register | Log in


Problem z przetwornikiem A/C Atmega8 [C]


Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> AVR Microcontrollers -> Problem z przetwornikiem A/C Atmega8 [C]
Author
Message
jaros85
Poziom 17
Poziom 17


Joined: 11 Dec 2006
Posts: 400
Location: Łódź

Post#1 Post from the author of the topic 07 Mar 2010 18:51   

Problem z przetwornikiem A/C Atmega8 [C]


Witam oto mój kod obsługi przetwornika A/C i niestety jest problem w terminalu odbieram tylko same jedynki.

Code:
#define F_CPU 8000000
#define UART_BAUD   4800
#define UBRR   (F_CPU/(16ul*UART_BAUD)-1)

#include <avr/io.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdlib.h>





//Inicjalizacja UARTU
void USARTInit(unsigned int ubrr)
{
UBRRH = (ubrr>>8);
UBRRL = (unsigned char) ubrr;
//Włączenie nadawania i odbioru oraz przerwania dla odbioru
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
//Włączono dostęp do ubbh ustawiono 8 bitów danych parzystość oraz 2 bity stopu
UCSRC=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)|(1<<UPM1)|(1<<USBS);
sei();
}
//Wysłanie pojedynczego znaku
void nadajznak (char dana1)
{
while(!(UCSRA & (1<<UDRE)));
UDR=dana1;
}

//Zliczanie liter w wyrazie i wysyłanie ich do funkcji nadajznak
void nadajstring (char *dana)
{
int dlugosc,i=0;
dlugosc = strlen(dana);
for(i=0;i<dlugosc;i++)
   {
   nadajznak(dana[i]);
   }
}

//Odbieranie znaku przez UART
SIGNAL (SIG_UART_RECV)
{
nadajznak(UDR);
}




volatile unsigned int value=0x00;

SIGNAL(SIG_ADC)                       
{
  value = ADCL;
  PORTB = ~(value>>2);
}

int main(void)
{
  char wyslij[10];
  USARTInit(UBRR);
  DDRB = 0xFF;

  ADCSR = (1<<ADEN)|(1<<ADIE)|(1<<ADFR)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0);
                                 
   ADMUX=(0<<REFS1)|(0<<REFS0)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
 
  sei();

  while(1)
  {
   itoa(value,wyslij,2);
    nadajstring(wyslij);
    nadajznak(32);
  }
}


Połączenia są następujące do wejścia PC0 jest podłączony opornik 10kohm i do niego potencjometr którym reguluje napięcie z zakresu od 0 do 5V.

Proszę o pomoc co może być nie tak
Back to top
   
michalko12
Poziom 22
Poziom 22


Joined: 20 Nov 2004
Posts: 1551
Location: Gdzieś koło wawy

Post#2 07 Mar 2010 19:35   

Re: Problem z przetwornikiem A/C Atmega8 [C]


A co z bitem ADSC?
Code:


SIGNAL(SIG_ADC)                       
{
  value = ADCL;
  PORTB = ~(value>>2);
  ADCSR |= (1<<ADSC);

}


Poprawka;
Nie zauwazyłem że masz ustawiony ADC Free Running Select

To jeszcze napisz co masz na pinie AREF
bo masz ustawione REFS1=0 i REFS0=0
Back to top
   
Google

Google Adsense


Post# 07 Mar 2010 19:35   





Back to top
   
tmf
Poziom 24
Poziom 24


Joined: 12 Aug 2009
Posts: 4307
Location: Katowice

Post#3 07 Mar 2010 20:01   

Re: Problem z przetwornikiem A/C Atmega8 [C]


Tak sie dzieje bo czytasz tylko ADCL. Zeby dokonac kolejnego przetworzenia musisz wczesniej odczytac ADCH. Albo po prostu caly ADC.
Back to top
   
jaros85
Poziom 17
Poziom 17


Joined: 11 Dec 2006
Posts: 400
Location: Łódź

Post#4 Post from the author of the topic 07 Mar 2010 20:15   

Re: Problem z przetwornikiem A/C Atmega8 [C]


Na pinie AREF jest kondensator 100nF połączony z masą.

Trochę zmieniłem kod.
W pętli while nic niema a w obsłudze przerwań jest taki kod:
Code:
SIGNAL(SIG_ADC)                       
{
  char wyslij[10];
  value = ADCL;
  PORTB = value;
  itoa(value,wyslij,2);
  nadajstring(wyslij);
  nadajznak(10);
  nadajznak(13);
}


Ale tak czy inaczej jest w terminalu osiem jedynek

Preskaler jest oczywiście dobrze ustawiony ?
Code:
(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)
8MHz/64=125kHz

Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 07 Mar 2010 20:15   





Back to top
   
michalko12
Poziom 22
Poziom 22


Joined: 20 Nov 2004
Posts: 1551
Location: Gdzieś koło wawy

Post#5 07 Mar 2010 20:25helpful post - solution   

Re: Problem z przetwornikiem A/C Atmega8 [C]


jaros85 wrote:
Na pinie AREF jest kondensator 100nF połączony z masą.

Trochę zmieniłem kod.
W pętli while nic niema a w obsłudze przerwań jest taki kod:
Code:
SIGNAL(SIG_ADC)                       
{
  char wyslij[10];
  value = ADCL;
  PORTB = value;
  itoa(value,wyslij,2);
  nadajstring(wyslij);
  nadajznak(10);
  nadajznak(13);
}


Ale tak czy inaczej jest w terminalu osiem jedynek

Preskaler jest oczywiście dobrze ustawiony ?
Code:
(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)
8MHz/64=125kHz


No to masz jeszcze dwa błędy jeden to ten co Ci tmf napisał a drugi to to że nie masz napiecia referencyjnego

Ustaw REFS0 =1
i procedura przerwania z pierwszego przykładu powinna tak wygladać
Code:
SIGNAL(SIG_ADC)                       
{
  value = ADCL;
  ADCH;
  PORTB = ~(value>>2);
}

Back to top
   
jaros85
Poziom 17
Poziom 17


Joined: 11 Dec 2006
Posts: 400
Location: Łódź

Post#6 Post from the author of the topic 08 Mar 2010 00:51   

Re: Problem z przetwornikiem A/C Atmega8 [C]


Dzięki michalko12 rzeczywiście wystarczyło ustawić bit REFS0 =1

Teraz już wszystko śmiga.

Procedura obsługi przerwania wygląda następująco:
Code:
SIGNAL(SIG_ADC)                       
{
  char wyslij[10];
  value = ADC;

  PORTB = ~(value>>2);
  itoa(value,wyslij,2);
  nadajstring(wyslij);
  nadajznak(10);
  nadajznak(13);
}


Mam jeszcze jedno pytanie mogę sczytać całą wartość rejestru ADC jak to jest wyżej ale jak chce sczytać oddzielnie ADCL i ADCH to jest problem.
Próbowałem tak:

Code:
value = ADCH;
value=value<<8;
value=ADCL;


Ale niestety nie działa. Jak to można inaczej w jednej zmiennej zapisać ?
Back to top
   
michalko12
Poziom 22
Poziom 22


Joined: 20 Nov 2004
Posts: 1551
Location: Gdzieś koło wawy

Post#7 08 Mar 2010 08:40helpful post - solution   

Re: Problem z przetwornikiem A/C Atmega8 [C]


Jest to spowodowane złą kolejnością odczytu. Odczytując ADCL jako drugi blokujesz dostęp do tego rejestru przetwornikowi.


Quote:
The ADC generates a 10-bit result which is presented in the ADC Data Registers, ADCH and
ADCL. By default, the result is presented right adjusted, but can optionally be presented left
adjusted by setting the ADLAR bit in ADMUX.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, to ensure that the content of the Data
Registers belongs to the same conversion. Once ADCL is read, ADC access to Data Registers
is blocked. This means that if ADCL has been read, and a conversion completes before ADCH is
read, neither register is updated and the result from the conversion is lost. When ADCH is read,
ADC access to the ADCH and ADCL Registers is re-enabled.



To co napisałeś jest oczywiście bez sensu
Code:
value = ADCH;
value=value<<8;
value=ADCL;


rozumiem:
Code:
value = ADCH;
value=value<<8;     //value <<= 8;
value |=ADCL;

lub
Code:
value = ADCH<<8 | ADCL; // jeśli value jest 16b


ale jeśli chcesz odczytać rejestr i nigdzie go nie zapisywać wystarczy podać jego nazwę.

Code:
value = ADCL;
ADCH;

Back to top
   
Google

Google Adsense


Post# 08 Mar 2010 08:40helpful post - solution   





Back to top
   
jaros85
Poziom 17
Poziom 17


Joined: 11 Dec 2006
Posts: 400
Location: Łódź

Post#8 Post from the author of the topic 08 Mar 2010 09:11   

Re: Problem z przetwornikiem A/C Atmega8 [C]


Dzięki michalko12
Back to top
   
Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> AVR Microcontrollers -> Problem z przetwornikiem A/C Atmega8 [C]
Page 1 of 1
Similar topics
problem z przetwornikiem ads1100 ( 16 bit ) i2c (1)
Problem z przetwornikiem A/C 12-bit ADS7822 ! (7)
Problem z przetwornikiem MCP3208 (3)
atmega32, problem z przetwornikiem (24)
Problem z przetwornikiem ADC (2)
89C4051 - problem z przetwornikiem A/C (34)
pomiar napięcia przetwornikiem w atmega8 (11)
Problem z przetwornikiem A/D w ATMega8. Zle dane? [SOLVED] (11)
atmega32, problem z przetwornikiem na kwarcu 14,745MHz (9)

Page generation time: 0.099 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed