Forum: Compiler & IDEs analogen Ports beim Mege 8 und Mega 16


von GCCDow (Gast)


Lesenswert?

Wie spricht man denn die analogen Ports beim Mege 8 und Mega 16 an? Hat
jemand ein Beispiel?

von Peter Fleury (Gast)


Angehängte Dateien:

Lesenswert?

Siehe Beispiel Anhang.

von GCCDow (Gast)


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;
  }

}

von Fiffi (Gast)


Lesenswert?

Hallo GCCDow,

>Sieht ja reichlich komplex aus für eine einfache analoge Messung.

Ich glaube du hast noch keinen komplexen Code gesehen ...


Gruß

Fiffi

von GCCDow (Gast)


Lesenswert?

Hi
gibt es auch ein Beispiel das etwas besser erklärt wird?

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

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

von Fiffi (Gast)


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

von Malte Marwedel (Gast)


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.

von GCCDow (Gast)


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?

von Fiffi (Gast)


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

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.