Forum: Mikrocontroller und Digitale Elektronik AD-Wandler mega169 (Butterfly)


von jabber (Gast)


Lesenswert?

Hallo, ich habe gestern schon den ganzen Tag verucht den Fehler zu 
finden aber ich bekomme es einfach nicht hin.
Vielleicht habt ihr ja ne Idee.

Ich habe das ganze schon vereinfacht zum testen.
Ich will eigentlich alle AD Kanäle messen aber erstmal würde ad0 Pin PF0 
reichen.
Da ich den Butterfly nehme und da der onbord NTC dran ist. Ich bekomme 
aber immer den Wert "1023" kann aber gleichzeitig an Pin PF2 wo 
eigentlich der LDR dran ist Spannungen messen.
Wenn ich dann AD1 nehme und die gleiche Spannung anlege dann bekomme ich 
als  Wert nur "6". Ich kann immer nur an dem pin PF2 messen egal welchen 
Kanal ich wähle.

An der Funktion habe ich nichts geänder und der Aufruf ist ja nichts 
wildes.
1
uint16_t ReadChannel(uint8_t mux)
2
{
3
  uint8_t i;
4
  uint16_t result;
5
 
6
  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler 
7
                               // setzen auf 8 (1) und ADC aktivieren (1)
8
 
9
  ADMUX = mux;                      // Kanal waehlen
10
  ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen 
11
 
12
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
13
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
14
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
15
  while ( ADCSRA & (1<<ADSC) ) {
16
     ;     // auf Abschluss der Konvertierung warten 
17
  }
18
  result = ADCW;  // ADCW muss einmal gelesen werden,
19
                  // sonst wird Ergebnis der nächsten Wandlung
20
                  // nicht übernommen.
21
 
22
  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
23
  result = 0; 
24
  for( i=0; i<4; i++ )
25
  {
26
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
27
    while ( ADCSRA & (1<<ADSC) ) {
28
      ;   // auf Abschluss der Konvertierung warten
29
    }
30
    result += ADCW;        // Wandlungsergebnisse aufaddieren
31
  }
32
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
33
 
34
  result /= 4;                     // Summe durch vier teilen = arithm. Mittelwert
35
 
36
  return result;
37
}
38
 
39
int main(void)
40
{
41
  uint16_t ad0, ad1, ad2;
42
  char ad0_str[10], ad1_str[10], ad2_str[10];
43
while(1)
44
{ 
45
  ad0 = ReadChannel(0); 
46
  ad1 = ReadChannel(1); 
47
  ad2 = ReadChannel(2);
48
49
utoa(ad0,ad0_str,10);
50
utoa(ad1,ad1_str,10);
51
utoa(ad2,ad2_str,10);
52
53
LCD_puts(ad0_str,1);
54
}  
55
}

von jabber (Gast)


Lesenswert?

Ich habe in dem Butterfly GCC code folgendes gefunden.
1
// To save power, the voltage over the LDR and the NTC is turned off when not used
2
    // This is done by controlling the voltage from a I/O-pin (PORTF3)
3
    sbiBF(PORTF, PF3); // mt sbi(PORTF, PORTF3);     // Enable the VCP (VC-peripheral)
4
    sbiBF(DDRF, DDF3); // sbi(DDRF, PORTF3);        
5
6
    sbiBF(ADCSRA, ADEN);     // Enable the ADC
7
8
cbiBF(PORTF,PF3); // mt cbi(PORTF, PORTF3);     // disable the VCP
9
    cbiBF(DDRF,DDF3); // mt cbi(DDRF, PORTF3);  
10
    
11
    cbiBF(ADCSRA, ADEN);      // disable the ADC

Was macht denn sbiBF? Ich kann das nirgends finden und beim Combilieren 
kommt da ein Fehler.

Ich arbeite ja eigentlich garnicht mit dem Butterfly code, also dürfte 
der pin ja nicht disable sein, oder ist das in der Hardware so gebaut 
das die immer disabeld sind?

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.