- Labornetzteil AliExpress         
Ergebnis 1 bis 6 von 6

Thema: ADC im Atmega128 ->kontinuierliche Wandlung?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    11.02.2005
    Beiträge
    30

    ADC im Atmega128 ->kontinuierliche Wandlung?

    Anzeige

    Powerstation Test
    Hallo,

    folgendes Programm sollte kontinuierlich die anliegende Spannung kontinuierlich in das ADC-Register schreiben. Die "Single-Conversion" funktioniert ohne Probleme, nur die kontinuierliche Wandlung nicht. Was läuft da falsch?

    Vielen Dank.

    #include <avr/io.h> #define channel 0
    #define true 1

    int result;

    int main (void)
    {

    ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
    ADMUX = channel; ADMUX |= (1<<REFS1) | (1<<REFS0);
    ADCSRA |= (1<<ADFR); ADCSRA |= (1<<ADSC);

    while(true) { {
    result = ADC;
    }
    }

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Ort
    Untersöchering(Bayern,Alpenvorland)
    Alter
    37
    Beiträge
    215
    Sieht irgendwie komisch aus dein Code müsste aber Funktionieren. Was bringt der Compiler für Fehlermeldungen?
    Meine Verbesserung währe:
    Code:
    #include <io.h>
    
    int result;
    
    int main(void)
    {
       ADCSRA = (1<<ADEN) | (1<<ADFR) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); 
       ADMUX = (1<<REFS1) | (1<<REFS0);
       ADCSRA |= (1<<ADSC);
       for(;;)
       {
           while(!(ADCSRA & (1<<ADIF)));   // Wartet bis ADIF gesetzt
           {
                 result=ADC;
                 ADCSRA|=(1<<ADIF);
           }
       }
    }
    Gruß Muraad
    PS: du hast bei deiner while(true) Anweisung eine { Klammer zu viel, vielleicht liegts daran.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    11.02.2005
    Beiträge
    30
    Hi,
    ich habe deinen code ausprobiert, und es funktioniert auch nicht. das problem ist nicht, dass der compiler einen error meldet, sondern das bei result=ADC kein wert in result geschrieben wird. ist sowohl bei meinem als auch deinem code immer 0.

    gruß

    stefan

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2004
    Ort
    Karlsruhe
    Beiträge
    223
    Warum machst du das nicht in einem Interrupt? Also ein Hardware-Timer der die ADC auslöst. Im ADC-IRQ dann das auslesen. Damit hast du dann auch ne ziemlich regelmäßige Ausführung garantiert, auch wenn mehr in dein Programm kommt.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Ort
    Untersöchering(Bayern,Alpenvorland)
    Alter
    37
    Beiträge
    215
    Probier mal:
    result = ADCL;
    result += (ADCH<<;
    Gruß Muraad
    EDIT:
    wie witzig der macht nen smily draus. statt dem smily steht da:
    8 )
    EDIT: Danke Kijon. ich habs bei dem bisschen Code vergessen. Ist aber schon besser

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991
    Hi,
    dafür gibts doch den Code Tag
    Code:
    result = ADCL;       
    result += (ADCH<<8);
    MfG Kjion

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen