Wie spricht man denn die analogen Ports beim Mege 8 und Mega 16 an? Hat jemand ein Beispiel?
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; } }
Hallo GCCDow,
>Sieht ja reichlich komplex aus für eine einfache analoge Messung.
Ich glaube du hast noch keinen komplexen Code gesehen ...
Gruß
Fiffi
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
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
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.