mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT90USB1287 und ADC


Autor: burnout (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen.

Ich habe ein "mich in den Wahnsinn treibendes Problem" mit meinem ADC im 
oben genannten Mikrocontroller.

Ich möchte 4 Spannungswerte an den Kanälen ADC0-3 nacheinander messen.
Das erste Mal funktioniert es auch super.

Bei ADC_Init() : AREF, ADC Interrupt Enable, ADC Prescaler 64 (8MHZ 
Systemtakt)
Bei ADC_Start(); erster Parameter=ADC Kanal zweiter Parameter=single 
conversion. ADEN=1 ADSC=1

Wenn aber jetzt in der do-while Schleife der ADC Wert gelesen werden 
soll, steht nach jeder Messung 509/510 im ADC Register.
Ich kann mir nicht erklären warum, weil es ja bei der ersten Messung, 
vor Do-while, funktioniert.

Hat jemand ne Idee woran das liegen könnte???
Vielen Dank im Vorraus
Björn
int main(void)
{
    ADC_Init();
    for  (adc_loop = 0; adc_loop < 4; adc_loop++)     
   {
       ADC_Start(adc_loop, 0);
       while(ADCSRA & (1 << ADSC));        
   }

do{
    for  (adc_loop = 0; adc_loop < 4; adc_loop++)     
   {
       ADC_Start(adc_loop, 0);
       while(ADCSRA & (1 << ADSC));       
   }



}while(1);
}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hat jemand ne Idee woran das liegen könnte???

Das liegt an dem Teil vom Code der NICHT zu sehen ist.

Autor: burnout (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Code von ADC_Init
void ADC_Init(void)
{
  ADMUX =    (  (0 << REFS1)    
        |  (0 << REFS0)      // Voltage Reference Selection, set to AREF. refer to datasheet pg. 327
  //      |  (0 << ADLAR)      // ADC Left Adjust Result
  //      |  (0 << MUX4)        
  //      |  (0 << MUX3)
  //      |  (0 << MUX2)        // ADC Channel Selection
  //      |  (0 << MUX1)
  //      |  (0 << MUX0)  
        );
        
  
  ADCSRA |=  (  (0 << ADEN)        // ADC Disabled
        |  (0 << ADSC)        // ADC Conversion Stopped
        |  (0 << ADATE)      // ADC Auto Trigger Disabled
        |  (1 << ADIF)        // ADC Interrupt Flag
        |  (1 << ADIE)        // ADC Interrupt Enabled
        |  (1 << ADPS2)      // ADC Prescaler Bits
        |  (1 << ADPS1)      // set to XTAL freq / 64 = 125kHz
        |  (0 << ADPS0)      // refer to datasheet pg. 329
        );




  /*
  DIDR0 |=  (  (1 << ADC7D)      // Digital Input Disable - Port F
        |  (1 << ADC6D)
        |  (1 << ADC5D)
        |  (1 << ADC4D)
        |  (1 << ADC3D)
        |  (1 << ADC2D)
        |  (1 << ADC1D)
        |  (1 << ADC0D)
        );  */                    
}


Code von ADC-Start()
void ADC_Start(char channel, char mode)
{
  //*************************
  //* Available "channels"  *
  //* channel 0: ADC0      *
  //* channel 1: ADC1       *
  //* channel 2: ADC2       *
  //* channel 3: ADC3       *
  //*************************


  switch (channel)
  {
    case 0:      ADMUX |= ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (0 << MUX0));
            break;  
    case 1:       ADMUX |= ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (1 << MUX0));
            break;
    case 2:      ADMUX |= ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (0 << MUX0));
            break;
    case 3:      ADMUX |= ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (1 << MUX0));
            break;
  }

  //******************************************
  //* Available "modes"                      *
  //* mode 0: single conversion         *
  //* mode 1:  free running mode              *
  //* mode 2: timer/counter0 compare match   *
  //* mode 3: timer/counter0 overflow        *
  //* mode 4: timer/counter1 compare match b *
  //* mode 5: timer/counter1 overflow        *
  //* mode 6: timer/counter1 capture event   *
  //******************************************

  

  switch (mode)
  {  
    case 0:     ADCSRA |= ((0 << ADATE));
            break;
    case 1:      ADCSRA |= ((1 << ADATE));
            ADCSRB |= ((0 << ADTS2) | (0 << ADTS1) | (0 << ADTS0));
            break;
    case 2:      ADCSRA |= ((1 << ADATE));
            ADCSRB |= ((0 << ADTS2) | (1 << ADTS1) | (1 << ADTS0));
            break;
    case 3:      ADCSRA |= ((1 << ADATE));
            ADCSRB |= ((1 << ADTS2) | (0 << ADTS1) | (0 << ADTS0));
            break;
    case 4:      ADCSRA |= ((1 << ADATE));
            ADCSRB |= ((1 << ADTS2) | (0 << ADTS1) | (1 << ADTS0));
            break;
    case 5:      ADCSRA |= ((1 << ADATE));
            ADCSRB |= ((1 << ADTS2) | (1 << ADTS1) | (0 << ADTS0));
            break;
    case 6:      ADCSRA |= ((1 << ADATE));
            ADCSRB |= ((1 << ADTS2) | (1 << ADTS1) | (1 << ADTS0));
            break;
  }
  

      
  ADCSRA |=  (  (1 << ADEN)        // ADC Enable
        |  (1 << ADSC)        // ADC Start Conversion
        );  
        
      
        
}


ADC Interrupt Code:
ISR(ADC_vect)
{  
  adc_result[adc_loop] = ADC;  
}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>    case 0:      ADMUX |= ((0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (0 << MUX1) 
| (0 << MUX0));

So bekommst du gesetze Bits nicht wieder auf Null.
0 oder 1 ist 1.

Autor: burnout (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tatsächlich!
Mist das hab ich total übersehen.
Dann messe ich ja ab Kanal 2 immer das Selbe.
Vielen Dank für deine Hilfe!
Werde gleich mal testen

Autor: burnout (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wow, tolle Sache!
es funktioniert! happy
DANKE!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.