Forum: Mikrocontroller und Digitale Elektronik ADC ATmega88PA Ergebnis immer gleich


von 7_of_9 (Gast)


Lesenswert?

Guten Abend,

ich benutze den ADC des ATmega88PA und möchte Vcc als Referenzspannung 
haben (bei mir 4V).
Leider bekomme ich immer den gleichen Wert, er ändert sich nicht, obwohl 
ich die Spannung am ADC0 variiere.
Allerdings bekomme ich den korrekten Wert, wenn ich den Controller nach 
der Spannungsänderung an ADC0 resette.

Es scheint so, als macht er einmal ne ADC-Wandlung und gibt mir dann 
immernur den gleichen Registerinhalt aus.

Ich habe mir zwischenausgaben über UART gemacht, um zu schauen wo es 
hängt, konnte aber nichts erkennen.
Was mich etwas wundert ist aber, dass die Warteschleife gar nicht 
ausgeführt wird, in der ich warte, bis der ADC fertig ist (polling von 
ADSC).

Problem besteht im üprigem an jedem ADC-Kanal.

UART-Ausagabe bei 2V an ADC0 (nach Controller-Reset): 002 003 005 003 
002
wobei 002, 003, 005 zwischenausgaben sind und 003 + 256*002 = 515 der 
ADC-Wert ist.

TNX
7
1
program led_matr_volt1;
2
3
var error: byte;
4
var wert: word;
5
6
procedure ADCinit();
7
begin
8
Soft_UART_Write(0); //sign we are in procedure
9
REFS0_bit :=1; //select Vcc as reference, VCC is 4V
10
ADEN_bit := 1; //enable ADC
11
Soft_UART_Write(1); //sign, we ran through procedure
12
end;
13
14
function readADC(channel: byte):word;
15
var temp,temp2:byte;
16
begin
17
      Soft_UART_Write(2);
18
      MUX0_bit := channel.0;
19
      MUX1_bit := channel.1;
20
      MUX2_bit := channel.2;
21
      MUX3_bit := channel.3; //channel selection
22
      ADSC_bit :=1;//starts conversion
23
      Soft_UART_Write(3);
24
      while ADSC_bit <> 0 do
25
          begin
26
               Soft_UART_Write(4);
27
          end;  //polling till conversion finishs
28
      Soft_UART_Write(5);
29
      temp := ADCH;
30
      temp2 := ADCL;
31
32
      result := temp*256+temp2;
33
end;
34
35
begin
36
  DDRC := 0x00;
37
38
  error := Soft_UART_Init(PORTB, 7, 6, 14400, 0);
39
  delay_ms(1000);
40
  Soft_UART_Write(77);
41
  ADCinit();
42
  while true do
43
  begin
44
       wert := READADC(0);
45
       Soft_UART_Write(lo(wert)); //lower  byte
46
       Soft_UART_Write(hi(wert)); //higher byte
47
       delay_ms(1000);
48
49
  end;
50
end.

von spess53 (Gast)


Lesenswert?

Hi

Wie wäre es, wenn du mal einen vernünftigen Vorteiler für den ADC 
einstellst?

MfG Spess

von holger (Gast)


Lesenswert?

ADCL must be read first, then ADCH.

von 7_of_9 (Gast)


Lesenswert?

@Mr. Spess Also ich muss sagen mit einem prescaler von 128 läufts besser 
;-)
@holger da hast du recht, ich vertausche jedoch immer rechts und links 
ausrichtung.

however es läuft nun!
many tnx

sie werden assimiliert!
7

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.