2016-12-21 2 views
-1
#define F_CPU 1000000UL 
#include <avr/io.h> 

volatile uint8_t adcvalue; 


int main(void) 
{ 
    DDRA =0x00; 
    DDRC = 0xff; 

// enable adc 
    ADCSRA |= (1<<ADEN); 
// using division factor 8 
    ADCSRA |= (1<<ADPS0) | (1<<ADPS1); 

// enable 8 bit conversion 
    ADMUX |= (1<<ADLAR); 
// take input from PA0 
    ADMUX |= (1<<MUX0); 

    while (1) 
    { 
     // Start conversion 
     ADCSRA |= (1<<ADSC); 

     // wait until conversion is done 
     while (ADCSRA & (1<<ADSC)); 

     // save result to adcvalue 
     adcvalue = ADCH; 

     // show result on 8 leds connected to PORT C 
     PORTC = adcvalue;  
    } 
    return 0; 
} 

Le code ci-dessus prend la valeur analogique de PA0 (avec potentiomètre) et montrer la valeur numérique sur 8 connecté au port leds C. Quand je Simuler le circuit sur Proteus les diodes électroluminescentes sont toujours même quand Je change la valeur du potentiomètre et il y a un message disant "[AVR AD CONVERTER] Valeur de référence = 0".ATmega16 ADC code ne fonctionne pas

Appréciez si vous pouvez m'aider à savoir ce qui ne va pas.

+0

Quelle est votre tension de référence? Quelle est la valeur du Poti? Quelle valeur attendez-vous? Avez-vous mesuré la tension à PA0? Est-il inférieur à votre tension de référence? S'il vous plaît, faites un effort et conservez au moins quelques informations de base. –

Répondre

2
// take input from PA0 
    ADMUX |= (1<<MUX0); 

Thats mal, avec cette ligne que vous prenez PA1/ADC1 comme entrée, non PA0/ADC0

Vérifiez la fiche technique à la page 218: http://www.atmel.com/images/doc2466.pdf

MUX 4..0 00000 PA0 et 00001 est PA1

Vous définissez la valeur de MUX 4..0 à 00001 avec

ADMUX |= (1<<MUX0); 

et donc d'utiliser PA1 comme Source.

Vive

+0

Merci.J'ai corrigé cela mais toujours le même comportement – user247954

+0

Je ne vois pas de différence dans l'initialisation que vous proposez. Corriger serait d'effacer implicitement MUX4..0 pour s'assurer que PA0 est sélectionné. –

+0

Oubliez ça, je pensais que vous avez suggéré de le changer pour la deuxième citation de code. –

0

Je n'ai pas une fiche ici maintenant, donc ce que je vais écrire est en forme générale. sur AVR certains registres partage certaines configurations. Dans votre cas, ADMUX partage le MUX et la conversion 8bit.

Votre instruction:

ADMUX |= (1<<MUX0); 

définit le bit en position haute MUX0 puis il est écrit dans ou sur le registre. Cela signifie que si MUX1, MUX2, MUXN était haut avant que vous les ayez élevés après votre commande.

Une initialisation sûre serait:

ADMUX &= ~(_BV(MUX0)|_BV(MUX1)|_BV(MUXN) 
ADMUX |= (1<<MUX0); 

Le ADMUX de registre de mémoire est avec tous les bits à 0 paramétré en tant que première broche ADC. donc dans votre cas la première instruction:

ADMUX &= ~(_BV(MUX0)|_BV(MUX1)|_BV(MUXN) 

est le seul nécessaire.

0

Pour supprimer le message d'erreur [AVR AD CONVERTER]Reference Value = 0 de Proteus vous devez supprimer les deux lignes dans votre code source suivant:

// enable 8 bit conversion 
ADMUX |= (1<<ADLAR); 
// take input from PA0 
ADMUX |= (1<<MUX0); 

et ajoutez cette ligne à la place

ADMUX = 0b01100000; 

En outre, assurez-vous de connecter 5 VOLT Vcc à la broche AVcc.

diagram