Gast
#76038
Wie spricht man denn die analogen Ports beim Mege 8 und Mega 16 an? Hat jemand ein Beispiel?
|
Anzeige
|
analogen Ports beim Mege 8 und Mega 16
Gast
#76038
Wie spricht man denn die analogen Ports beim Mege 8 und Mega 16 an? Hat jemand ein Beispiel?
Gast
#76039
Siehe Beispiel Anhang.
Gast
#76040
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
#76041
Hallo GCCDow,
>Sieht ja reichlich komplex aus für eine einfache analoge Messung.
Ich glaube du hast noch keinen komplexen Code gesehen ...
Gruß
Fiffi
Gast
#76042
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
Gast
#76043
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
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
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
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 schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|