analogen Ports beim Mege 8 und Mega 16

Gast #76040
Lesenswert?
• ▲
▼
Funktioniert das auch auf Mega16? Sieht ja reichlich komplex aus für
eine einfache analoge Messung.

#include<avr/io.h>

int main (void)
{
  DDRB = 0xFF;      // port B output

  int x = 0;

  // Activate ADC with Prescaler 16 --> 1Mhz/16 = 62.5kHz
  ADCSRA = _BV(ADEN) | _BV(ADPS2);

  for (;;) {
    // Select pin ADC0 using MUX
    ADMUX = 0;

    //Start conversion
    ADCSRA |= _BV(ADSC);

    // wait until converstion completed
    while (ADCSRA & _BV(ADSC) ) {}

    // get converted value
    x = ADC;

    // output the higher 8 bits
    PORTB = ~x>>2;
  }

}
Gast #76043
Lesenswert?
• ▲
▼
Hallo GCCDow,

>Was ist denn was? Die "ADCSRA = _BV(ADEN) | _BV(ADPS2)" ;

"_BV()" ist folgendermaßen in der Datei "avr/sfr_defs.h"
definiert:
"#define _BV(bit) (1 << (bit))"

"ADEN" ist mit 7 definiert, und "ADPS2" mit 2.

D.h. "_BV(ADEN)" ergibt "(1 << (7))" und das ergibt 0x80 oder
1000000 binär.

"_BV(ADPS2)" ergibt "(1 << (2))" und das ergibt 0x04 oder 100
binär.


0x80 | (oder) 0x04 ergibt 0x84 oder 10000100 binär.

Reicht daß als Erklärung ?


>für den Einsteiger sind es erst mal etwas wirre Bezeichnungen

Wir haben alle mal klein angefangen ...


Gruß

Fiffi
Gast #76044
Lesenswert?
• ▲
▼
Der folgende Code führt eine Wandlung durch: kanal, ist der zu wandelnde
A/D Anschluss und temp01 ist die Variable für das Ergebnis.

outp(kanal, ADMUX); //Kanal wählen
outp(inp(ADCSR) | BV(ADSC), ADCSR); //setzt das ADSC Bit
while (inp(ADCSR) & BV(ADSC)); //wartet, bis die Wandlung komplett ist
temp01 = ADCW;  //das Ergebnis der Wandlung wird in temp01 geschrieben


Zum A/D Wandler Initialisieren (einmal nach dem Start des MCUs
ausführen) verwende ich folgenden Code:
outp(BV(ADEN) | BV(ADSC) | BV(ADPS0) | BV(ADPS1) | BV(ADPS2), ADCSR);
while (inp(ADCSR) & BV(ADSC));//wartet, bis der erste Konvertierung
komplett ist

Ich hab den Code mit einem AT90S4433 mit 8MHZ getestet. Angenommen, die
Registernamen haben sich nicht geändert, dürfte der Code mit jedem AVR
mit A/D Ports laufen können.

www.mikrocontroller.net/forum/read-1-2718.html#2761
war meine Grundlage für den obrigen Code.
Gast #76045
Lesenswert?
• ▲
▼
Hallo

Danke, die beiden letzten Postings waren schon viel klarer! Aber wozu
muss man den A/D Wandler initialisieren ?

Und gibt es irgendwo ne Doku über die seltsamen Makros im GCC? Wer hat
sich nur so seltsamme Bezeichnungen ausgedacht, da wäre es ja mit
Zahlen verständlicher als mit Makro.

Und welche Zahl kann bei welchem Controller für Kanal stehen?
Gast #76046
Lesenswert?
• ▲
▼
Hallo GCCDow,

>Aber wozu muss man den A/D Wandler initialisieren ?

Lies dir mal das Kapitel "A/D Wandler" in dem Datenblatt deines
AVR's durch ...


>Und gibt es irgendwo ne Doku über die seltsamen Makros im GCC?

Ich finde die Doku auch nicht so toll ...

Es gibt das avr-libc Manual. (Wird von WinAVR mitinstalliert.)
Und dann gibt es irgendwo im Internet noch generelle Hilfe zu GCC.

Meiner Meinung nach müssten viel mehr Beispiele dazu. z.B. einen
Bootloader usw. ...


Gruß

Fiffi

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren