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.
|