www.mikrocontroller.net

Forum: Compiler & IDEs ADC-Messung an mehreren Ports


Autor: subguru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich versuche gerade an meinem atmega168 abwechselnd die Ports ADC6 und 
ADC7 einzulesen.

So aktiviere ich das ganze:
ADMUX |= (1<<REFS1) | (1<<REFS0); 
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); 
// ADC On | ADC Start | Irq after Compare | Irq On | Prescale 128   

und so versuche ich das Ganze zuzuweisen:
SIGNAL(SIG_ADC) {
      
  switch(ADMUX & 0x07) {
     case 0x06:   adc0_value = ADCW; 
                  ADMUX |= 0x07;break;
     case 0x07:   adc1_value = ADCW; 
                  ADMUX |= 0x06;break;
     default:     ADMUX |= 0x06;break;
    } 
    
    ADCSRA |= (1<<ADSC);
 }

Mein Problem ist, er springt nur einmal den Port 0x06 an.
Den Port 0x07 aktualisiert er aber regelmäßig und korrekt.

An was kann denn das liegen?

Danke im Voraus!

Autor: Anon Ymous (avion23)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich mag diese Bitschreibweise nicht. Benutz doch (1 << ADblahblah).

Wenn ADMUX einmal 0x07 geworden ist, wird es nie wieder 0x06 werden. Du 
löschst kein bit.

Autor: Michael Steinbauer (Firma: Steinbauer Electronics GmbH) (captain-stone)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo subguru (komischer Vorname),

schau Dir doch mal das Tutorial an:

http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC

und ich erinnere mich an einen Tread vor kurzem:

Beitrag "ADC: Zweiter Kanal misst nicht"

Sonst bringt die Suchfunktion bei den Foren auch ganz viel brauchbares.

Michael ;-)

Autor: subguru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh ja, vielen Dank!!!

Ich ging davon aus er setzt mir die Bits so wie ich sie angebe. Da fehlt 
mir wohl die Praxis ;-)

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

subguru schrieb:
> Oh ja, vielen Dank!!!
>
> Ich ging davon aus er setzt mir die Bits so wie ich sie angebe. Da fehlt
> mir wohl die Praxis ;-)

Was hat das mit Praxis zu tun? ;-)

Schreib es doch mal nicht verkürzt:
     default:     ADMUX |= 0x06;break;

     default:     ADMUX = ADMUX | 0x06;

Wenn jetzt in ADMUX bereits 0x07 steht und mit 0x06 oder verknüpft wird, 
was ändert sich dann wohl?

   00000111
OR 00000110
------------
   00000111

Gruß aus Berlin
Michael

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
subguru schrieb:
> Ich ging davon aus er setzt mir die Bits so wie ich sie angebe.
Er setzt sie schon, aber er lässt die anderen Bits gesetzt.
So wäre das besser:
     case 0x06:   adc0_value = ADCW; 
                  ADMUX = 0x07; break;
     case 0x07:   adc1_value = ADCW; 
                  ADMUX = 0x06; break; // diese Zeile könntest du sogar ganz weglassen ;-)
     default:     ADMUX = 0x06; break;

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Lothar Miller schrieb:
> subguru schrieb:
>> Ich ging davon aus er setzt mir die Bits so wie ich sie angebe.
> Er setzt sie schon, aber er lässt die anderen Bits gesetzt.
> So wäre das besser:
>
>      case 0x06:   adc0_value = ADCW;
>                   ADMUX = 0x07; break;
>      case 0x07:   adc1_value = ADCW;
>                   ADMUX = 0x06; break; // diese Zeile könntest du sogar
> ganz weglassen ;-)
>      default:     ADMUX = 0x06; break;
> 

auch diese Lösung führt nicht unbedingt zum gewünschten Ergebnis,
in ADMUX sind noch andere Bits, REFS0, REFS1 und ADLAR beim Mega8 als 
Beispiel.

Die würden dann mit auf 0 gesetzt...

Richtig wäre:

      default:     ADMUX = (ADMUX & 0xF8) | 0x06; break;
Noch besser wäre eine Maske zu definieren:

#define MUX_MASK 0b11111000 // MUX-Bits auf 0
#define MUX6     0b00000110
#define MUX7     0b00000111

und dann
      default:     ADMUX = (ADMUX & MUX_MASK) | MUX6; break;

oder ähnlich.
Die Definitionen ins passende Headerfile gepackt und man hat bei 
Umbauten nur eine Stelle zum Ändern.

PS: meine Fehler bitte durch C-Programmierer korrigieren,
ich mache immernoch sehr wenig C und viel Assembler...

Gruß aus Berlin
Michael

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.