Forum: Mikrocontroller und Digitale Elektronik ADC und Codevision


von Andre (Gast)


Lesenswert?

Hay Leute

Ich versuche einen ADC mitz Codevision auszulesen und Spannung anzeigen 
zu lassen mein problem ist das er mir auf dem Display nur dies anzeigt

read_adc(0)
kommt das 255

wenn ich das ganze dann mal mit gleichung probiere also so

(read_adc(0)*5.0)/1024.0
dann bekomm ich dies 24779

Ich habe am AVCC eine Spannung von 5V Anliegen.


Wie müsste ich das machen bzw berechnen das ich auf meine 5V oder 5000mV 
komme.?


MFG: Andre

von Kai (Gast)


Lesenswert?

es fehlen ein paar wichtige Angaben:
machst du eine 8 oder 10 Bit ADC?
Weil du was von 255 schreibst, tippe ich mal auf 8 Bit
was hast du als Refernzspannung angegeben? Benutzt du die interne 
Referenz?
Diese hat 2,54V, deine Spannung sollte also zwischen 0...2,54V liegen

von Andre (Gast)


Lesenswert?

ÄÄÄHHHMMM

Ja also ich mache dies im 8Bit Modus.

Aber bitte Frag mich jetzt mal nicht was ich als Refernzspannung nehme 
wo stelle ich die ein oder wo lege ich diese Fest.?

Mfg. Andre

von Johannes M. (johnny-m)


Lesenswert?

Glaubst Du wirklich, ohne Dein Programm zu sehen, kann Dir hier 
irgendjemand helfen?

von Andre (Gast)


Lesenswert?

Nein das war mir schon fast klar Sorry.

#include <mega128.h>
#include <delay.h>
#include <math.h>

#include "glcd_befehle.c"

#define ADC_VREF_TYPE 0x60

// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here
char text[16];

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=In Func1=In 
Func0=In
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=T State1=T 
State0=T
PORTC=0x00;
DDRC=0xF8;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTD=0x00;
DDRD=0x00;

// Port E initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTE=0x00;
DDRE=0x00;

// Port F initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTF=0x00;
DDRF=0x00;

// Port G initialization
// Func4=In Func3=In Func2=In Func1=In Func0=In
// State4=T State3=T State2=T State1=T State0=T
PORTG=0x00;
DDRG=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
ASSR=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: Timer 3 Stopped
// Mode: Normal top=FFFFh
// Noise Canceler: Off
// Input Capture on Falling Edge
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
// Timer 3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
ETIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 1000,000 kHz
// ADC Voltage Reference: AVCC pin
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x87;

//Zum Initialisieren des GLCD
glcd_init_display();

while (1)
      {

 sprintf(text,"%03u",read_adc(0));  //0.004883
 glcd_printstring(4,10,text);

 sprintf(text,"%03u",read_adc(0)*0.004883);  //0.004883 
read_adc*5V/1024
 glcd_printstring(4,20,text);

      delay_ms(50);
      };
}

von Kai F. (kai-) Benutzerseite


Lesenswert?

die Referenzspannung stellst du ein wenn du im Codevision Code Generator 
den ADC an schaltest. Da stellst du bei Volt. Ref Int, cap. on AREF ein 
und schließt einen Kondensator von AREF nach GND (100nF)
jetzt kannst du Spannungen zwischen 0 bis 2,54V messen. Andere Frage: 
hat es einen Grund warum du nicht den 10 Bit Modus benutzt?
Und was für ein LCD ist da angeschlossen?

von Andre (Gast)


Lesenswert?

Wie stelle ich denn, den 10bit Modus im Codevision ein.?

Das LCD ist ein selbst geschriebenes von mir für den t6963c Controller.



MFG: Andre

von Kai F. (kai-) Benutzerseite


Lesenswert?

der 10 Bit Modus ist der default Modus (nicht bei 8 Bit den Haken 
setzen)
Dann gibt er dir einen Wert zwischen 0 und 1024 raus.
Nochwas: Wenn du zB 0 bis 5V messen willst, brauchst du einen 
Spannungsteiler idealerweise mit zwei gleichen Widerständen. (zB 10k)

von crazy horse (Gast)


Lesenswert?

1023

von Andre (Gast)


Lesenswert?

genau 1023 zeigt er mir an.

Okay das funktioniert wunderbar und wie sieht nun die berechnung zum 
anzeigen der Spannung aus.?


MFG: Andre

von Kai F. (kai-) Benutzerseite


Lesenswert?

jaja.... mea maxima culpa ;)

von Kai F. (kai-) Benutzerseite


Lesenswert?

verrätst du uns bitte mal welchen Spannungsbereich du messen willst? 
Raten ist zwar lustig, aber naja...

von Andre (Gast)


Lesenswert?

einfach zum testen reichen mir von 0-5V.

von crazy horse (Gast)


Lesenswert?

tja, der gute alte Dreisatz...
Was da vor dir liegt, kann rechnen. Wirklich.

von Karl H. (kbuchegg)


Lesenswert?

Andre wrote:
> genau 1023 zeigt er mir an.
>
> Okay das funktioniert wunderbar und wie sieht nun die berechnung zum
> anzeigen der Spannung aus.?

1023 Äpfel kosten 5 Euro.
Wieviel kosten x Äpfel?

von Andre (Gast)


Lesenswert?

Ja bin schon voll gaga.
wer rechnen kann ist klar im vorteil.

MFG: Andre

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.