Ersteinmal Danke an alle,
ich habe den Plan jetzt ein wenig abgeändert, so das ich über ein Poti
(an PC0 bzw. ADC0) die LED's ansteuern kann.
Genau genommen, soll der gemessene Wert Binär auf PB0-PB5 ausgegeben
werden, also in binärer Zählweise 000001, 000010, 000011,... 111111 usw.
Diesmal habe ich versucht mich an dem AVR-GCC Tutorial zu orientieren.
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe
Hier mal meine Gedanken zu dem Code.
Teilungsfaktor:
Unter "Configuration Options" habe ich die Frequenz auf 8MHz gestellt
(AVR Studio)
Also komme ich auf:
Tfmin = 8000000/200000 Hz=40
Tfmin = 8000000/50000 Hz=160
Daraus ergibt sich für ADPS = 110
ADEN: Einschalten; Ja
ADSC: Messvorgang starten; Ja
ADFR: Free Running Modus; Ja
ADIF: Interrupt; Nein
ADIE: Interrupt; Nein
ADPS2: Ja
ADPS1: Ja
ADPS0: Nein
Durch den "Free Running Modus", sollten nun also ständig Werte in das
"ADC Data Register" geschrieben werden, wobei ADCL die ersten 8 Bit
wieder gibt und ADCH die letzten beiden Bit wieder gibt, also 9 und 10.
Ich habe ich mir die Hilfsvariable "mess" erstellt, in die ich über den
Bitweise verschieben Operator beide Werte hinein geschrieben habe.
Da ich nur 6 LED's angeschlossen habe, wollte ich den Wert noch auf 6
Bit runter rechnen.
10 Bit ergeben max 1027
6 Bit ergeben max 63
1027/63 = 16,3 also teile ich "mess" durch 17.
Daraus habe ich Code erstellt:
1 | #include <avr/io.h>
|
2 |
|
3 |
|
4 | int main(void)
|
5 | {
|
6 | int mess; // ADC Data Register // ADCL und ADCH
|
7 | DDRB = 0b00111111; // Ausgabe des ADC-Messwertes
|
8 |
|
9 | // ADC-Konfiguration
|
10 |
|
11 | /*
|
12 | * ADEN (ADC Enable) : ADC aktivieren
|
13 | * ADSC (ADC Start Conversion) : Messvorgang starten
|
14 | * ADFR (ADC Free Run select) : 1 = "Free Running Modus; 0 = "Single Convention"
|
15 | * ADIF (ADC Interrupt Flag): Für den Interrupt Modus
|
16 | * ADIE (ADC Interrupt Enable) : Für den Interrupt Modus
|
17 | * ADPS2 (ADC Prescaler Select Bits): Teilungsfaktor
|
18 | * ADPS1 (ADC Prescaler Select Bits): Teilungsfaktor
|
19 | * ADPS0 (ADC Prescaler Select Bits): Teilungsfaktor
|
20 | */
|
21 |
|
22 | ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADPS2) | (1<<ADPS1);
|
23 |
|
24 |
|
25 | while(1)
|
26 | {
|
27 | mess = ADCL;
|
28 | mess += (ADCH<<8);
|
29 | mess = (mess/16); // Auf 6 Bit reduzieren
|
30 | PORTB = mess;
|
31 | }
|
32 | }
|
Funktionieren tut es leider immer noch nicht, aber evtl. komme ich der
Sache ja näher.
Es leuchten immer alle LED's.
Ich gehe jetzt schlafen, evtl. fällt ausgeschlafen ja noch etwas ein.
Ich bin für jeden Hinweis dankbar. :)
Viele Grüße
Timo