Hallo, ich bin langsam am verzweifeln...
Die SuFu hat leider auch nicht zur Lösung beigetragen, lediglich das
Problem konnte ich eingrenzen...
Also: Ich habe hier einen Mega8 auf nem STK500 und progge mit
AVRStudio4.
Ziel ist es den ADC zu verwenden eine Spannung einzulesen und dann über
3 LEDs auszugeben in welchem Drittel sich die Spannung befindet.
Also etwa so:
LED1 = 0...1/3*5V
LED2 = 1/3*5...2/3*5V
LED3 = 2/3*5...5V
Dazu habe ich den GND, VCC und ADC0 auf ein ProjectBoard geführt und
folgende Schaltung gesteckt:
VCC
--
| 10K-Poti
| /
---
| |
| | --- ADC0
| |
---
|
|
--
GND
Also ein einfacher Spannungsteiler mit einem 10K-Poti.
Dazu habe ich folgenden Code:
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 | #include <stdint.h>
|
4 | #include <stdlib.h>
|
5 |
|
6 |
|
7 | int main (void) {
|
8 |
|
9 | int sample,i,value;
|
10 | DDRB=0xFF; // alle Pins an PORTB als Ausgabeport
|
11 | ADMUX=( 1 << REFS0 )|( 0 << MUX0 )|( 0 << MUX1 )|( 0 << MUX2 )|( 0 << MUX3 );
|
12 | // Referenz also VCC und als Eingang ADC0 ausgewählt
|
13 | ADCSRA=( 1 << ADEN )|( 0 << ADFR )|( 0 << ADPS0 )|( 0 << ADPS1 );
|
14 | // AD-Wandler Enabled, Freerunnning aus, keinen Prescaler
|
15 | while(1)
|
16 | {
|
17 | sample=0;
|
18 | for(i=0;i<5;i++)
|
19 | {
|
20 | ADCSRA = (1<<ADSC); //single conversion mode ein
|
21 | while(ADCSRA & ADSC); //warten bis konvertierung abgeschlosen
|
22 | sample+=ADCW; //aufsummierung der samplewerte
|
23 | }
|
24 | value=(sample/5); //aritmethisches mittel der samplewerte
|
25 | //value=700; // Wenn ich hier einen Wert vorgebe, dann wird auch am Mega8 die richtige LED wie erwartet beschaltet
|
26 | if (value<300) {
|
27 | PORTB = ( 1 << PB0 )|( 0 << PB1 )|( 0 << PB2 );
|
28 | }
|
29 | else if (value>=300&& value<600) {
|
30 | PORTB = ( 0 << PB0 )|( 1 << PB1 )|( 0 << PB2 );
|
31 | }
|
32 | else {
|
33 | PORTB = ( 0 << PB0 )|( 0 << PB1 )|( 1 << PB2 );
|
34 | }
|
35 | }
|
36 |
|
37 | while(1) {
|
38 | // "leere" Schleife;
|
39 | }
|
40 |
|
41 | // wird nie erreicht
|
42 | return 0;
|
43 | }
|
Nun ist es aber leider so, dass die Variable sample bzw dann auch value
stets den Initialwert behält, also null. Kommentiere ich die Zeile
wiede ein, so wird auch die richtige LED beschaltet, somit scheint der
Teil zumindest zu funktionieren.
Aber der muC liest halt einfach keine Werte ein, daher vermute ich mal,
dass mein Fehler irgendwie in der For-Schleife, also in dem Abschnittt
1 | ADCSRA = (1<<ADSC); //single conversion mode ein
|
2 | while(ADCSRA & ADSC); //warten bis konvertierung abgeschlosen
|
3 | sample+=ADCW; //aufsummierung der samplewerte
|
zu finden sein sollte...
Vielleicht kann ja mal jemand drüber schaun was ich falsch mache,...
...denn das der Mega8 defekt sein soll, will/kann ich irgendwie nicht
glauben... (andere Programme führt er nämlich tadellos aus, nur mit dem
ADC hab ich mich scheinbar verkracht.)
Danke schon mal im Voraus, ich bin für jeden Tipp dankbar.
Grüße Santigua