ADC ATmega88PA Ergebnis immer gleich

Gast #2227069
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.
Gast #2227112
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren