Servus zusammen,
ich versuche hier seit Stunden das der ADC meines ATTiny24 das macht was
ich will ... jetzt wärs mal interessant wenn sich jemand meinen
relevanten Code anschaut ob da ein grober Fehler drin ist:
1 | void compareValues(void){
|
2 | int adcCh1 = 0x00; //Value Channel 1
|
3 | int adcCh2 = 0x00; //Value Channel 2
|
4 | int waste = 0x00; //discarded HighBytes
|
5 |
|
6 | ADCSRA |= (1<<ADSC); //start conversion
|
7 | while(ADCSRA & (1<<ADSC)){ //wait till conversion finished
|
8 | asm volatile("NOP");
|
9 | }
|
10 |
|
11 | adcCh1 = ADCL; //LowByte einlesen
|
12 | waste = ADCH; //HighByte einlesen (wird nicht berücksichtigt)
|
13 |
|
14 | ADMUX = 0x01; //Kanal 2 einstellen
|
15 | ADCSRA |= (1<<ADSC); //start conversion
|
16 | while(ADCSRA & (1<<ADSC)){ //wait till conversion finished
|
17 | asm volatile("NOP");
|
18 | }
|
19 |
|
20 | adcCh2 = ADCL; //LowByte einlesen
|
21 | waste = ADCH; //HighByte einlesen (wird nicht berücksichtigt)
|
22 |
|
23 | if(adcCh1 > adcCh2){
|
24 | doLED1();
|
25 | }
|
26 | if(adcCh1 < adcCh2){
|
27 | doLED2();
|
28 | }
|
29 | if(adcCh1 == adcCh2){
|
30 | PORTA = PORTA | 0x0C;
|
31 | }
|
32 | }
|
Das ist die Routine in der ich die Werte von Kanal 1 (PA0) und Kanal 2
(PA1) einlese, vergleiche und dann je nachdem welcher größer ist meine
LED 1 oder LED2 einschalte. Allerdings leuchten immer beide LEDs was
bedeuten würde, dass meine Werte gleich sind. Habs aber nachgemessen, es
liegen Werte von 0,9V (PA0) und 1,5V (PA1) an. VREF ist die
Versorguingsspannung (5V), die ADC-Register sollten auch alle richtig
eingestellt sein. Wens aber interessiert (vielleicht liegt der Fahler
aber auch hier) mal meine main()-Routine:
1 | int main(void) {
|
2 | DDRA = 0x0C;
|
3 |
|
4 | ADMUX = 0x00;
|
5 | // DIDR0 = 0xFC;
|
6 | ADCSRA = 0x83;
|
7 |
|
8 | while(1){
|
9 | compareValues();
|
10 | }
|
Bin für jede Hilfe dankbar.
Gruß
Gepi