AVR-C Analog Read

OP #3431498
Lesenswert?

Hallo!
Ich wollte ein Potentiometer an einem Pin auslesen (Pin ADC0).
Ich habe nach diesem Tutorial gearbeitet: 
http://creativeelectron.net/blog/2009/09/avr-how-to-take-analog-input-in-avr/
Die an PORTB angeschlossene LED leuchtet aber nicht, woran liegt das?

LG, Martin
#3431515
Lesenswert?

Es soll aber nicht lustig sein.
Es soll dir veranschaulichen, dass wir hier keine Hellseher sind und du 
mit ein paar mehr Informationen rüber kommen musst.

zb deinem Programm.
Nicht irgendein Programm von irgendeiner Website, sondern dein konkretes 
Programm, welches auf deinem µC läuft.
OP #3431528
Lesenswert?

Mein Programm:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include "lcd-routines.h"
4

5
int main(void)
6
{
7
  DDRB = 0xff;
8
  lcd_init();
9

10
  ADMUX=(1<<REFS0)|(1<<ADLAR);
11

12
  ADCSRA=(1<<ADEN)|(1<<ADPS2);
13

14
    lcd_setcursor(0, 1);
15
  lcd_string("Loading...");
16
  _delay_ms(1000);
17
  lcd_clear();
18

19
    while (1)
20
    {
21
      ADCSRA|=(1<<ADSC);
22
      lcd_clear();
23
      lcd_setcursor(0, 1);
24
    lcd_data(ADCH);
25
        PORTB = ADCH;
26
        _delay_ms(100);
27

28
    }
29
    return 0;
30
}
#3431546
Lesenswert?

Weils wurscht ist
1
int main()
2
{
3
  char buffer[10];
4

5
....
6

7
    while (1)
8
    {
9
      ADCSRA|=(1<<ADSC);
10
      while( ADCSRA & ( 1 << ADSC ) )   // warte drauf, dass der ADC fertig wird
11
        ;
12

13
      sprintf( buffer, "%4d", ADCH );
14
      lcd_setcursor(0, 1);
15
      lcd_string( buffer );
16

17
      PORTB = ADCH;
18
      _delay_ms(100);
19
    }
20
}
Gast #3431560
Lesenswert?

Bei Kaspertheater ruft der Kasper: "Seid ihr denn auch alle da"?
Bevor das "Ja" nicht erschallt, macht er nicht weiter.

Ich weiß nicht mit welchem Publikum/µP Du sprichst und somit auch nicht 
ob die Initialisierung OK ist, aber ich weiß als höflicher Programmierer 
fragt man vor jeder A/D-Wandler Abfrage: "Bist Du auch fertig"? Wird 
diese Höflichkeit ignoriert, darfst Du Dich nicht wundern, wenn Du 
Blödsinn aus den Registern kitzelst. Manche A/D-Wandler wollen auch 
gestartet bzw. erneut gestartet werden.
OP #3431714
Lesenswert?

Habe ich gefunden, hier:
1
Table 22-1. Analog Comparator Multiplexed Input
2
ACME   ADEN   MUX2..0   Analog Comparator Negative Input
3
0     x     xxx     AIN1
4
1     1     xxx     AIN1
5
1     0     000     ADC0
6
1     0     001     ADC1
7
1     0     010     ADC2
8
1     0     011     ADC3
9
1     0     100     ADC4
10
1     0     101      ADC5
11
1     0     110     ADC6
12
1     0     111     ADC7
Ich bin nun noch kein Profi...
Ich verstehe nicht ganze wie ich diese Tabelle zu lesen habe bzw. wie 
ich den MUX nun richtig setzte...sry...aber könnte mir jemand das 
verraten?
#3431718
Lesenswert?

Martin Fischer schrieb:
> Habe ich gefunden, hier:
>
> Table 22-1. Analog Comparator Multiplexed Input
> ACME   ADEN   MUX2..0   Analog Comparator Negative Input
> 0     x     xxx     AIN1
> 1     1     xxx     AIN1
> 1     0     000     ADC0
> 1     0     001     ADC1
> 1     0     010     ADC2
> 1     0     011     ADC3
> 1     0     100     ADC4
> 1     0     101      ADC5
> 1     0     110     ADC6
> 1     0     111     ADC7
>
> Ich bin nun noch kein Profi...

Mann muss ja auch kein Profi sein, um Werte aus einer Tabelle ablesen zu 
können.

Du willst den ADC1 benutzen?
Dann sind die Bits MUX2 bis MUX0 auf 0, 0, 1 zu setzen. (MUX2 auf 0, 
MUX1 auf 0, MUX0 auf 1)
001, welches, oh Wunder, genau der Binärrepräsentierung für 1 
entspricht.
#3431739
Lesenswert?

Ich bezweifle, dass du in den letzten Wochen deine Hausaufgaben gemacht 
hast, und in Theorie und Praxis (vor allen Dingen Praxis) gelernt hast, 
wie man einzelne Bits auf 1 bzw. auf 0 setzt, bzw. dass man 0 Bits nicht 
explizit setzen muss, wenn man sowieso dem Register als ganzes etwas 
zuweist.
#3432061
Lesenswert?

Martin Fischer schrieb:
> Eine Frage noch...wie kann ich mehrere Analoge Signale gleichzeitig
> messen?
> Mit diesem Code geht das ja nicht weil halt immer nur ein bestimmter
> Port gelesen wird...?

Wie du im Datenblatt lesen könntest, hat der AVR nur EINEN ADC. Also 
kann immer nur eine Spannung zur Zeit gemessen werden. Welche, wird mit 
einem Multiplexer davor (daher ADMUX) bestimmt.

> Ich habe sehrwohl Hausaufgaben gemacht, hatte nur grade eine Verwirrung
> wie man Bits auf 0 setzt, sry, danke aber

Und warum setzt du die Bits da oben überhaupt auf 0? Die sind nach einem 
Reset auf 0, müssen also bei Bedarf nur auf 1 gestellt werden. Außer du 
willst im Programm öfter hin und her schalten.
OP #3432066
Lesenswert?

Ja, mit auf 0 setzen meine ich sie gar nicht setzen. Wenn ich sie von 1 
zu 0 setzen mag, muss ich sie ja nur löschen, oder? Und kann ich in dem 
While-Loop des Programms einfach sämtliche Angaben ändern...muss danach 
dann noch ein kurzes Delay wegen dem Hochfahren des ADC?
Und was passiert wenn ich das, was gesetzt ist (auf 1) nochmal 
setze..bleibt es 1 oder verschiebt es sich dann nochmal wegen dem 
Shift-Operator?
#3432075
Lesenswert?

Martin Fischer schrieb:
> Ja, mit auf 0 setzen meine ich sie gar nicht setzen.
Ein Bit ist entweder 1 oder 0. Fangen wir jetzt bei Adam und Eva an?


> Wenn ich sie von 1
> zu 0 setzen mag, muss ich sie ja nur löschen, oder?
Ja

> Und kann ich in dem
> While-Loop des Programms einfach sämtliche Angaben ändern...
Du setzt die Register auf die Werte welche du willst. Das geht 
jederzeit.

> muss danach
> dann noch ein kurzes Delay wegen dem Hochfahren des ADC?
Es steht im Datenblatt auch was dazu. Vor allem was das Ändern des ADC 
Kanals und die 1. Messung nach dem Einschalten oder die Änderung der 
Referenzspannung betrifft. Lesen bildet.

> Und was passiert wenn ich das, was gesetzt ist (auf 1) nochmal
> setze..bleibt es 1 oder verschiebt es sich dann nochmal wegen dem
> Shift-Operator?
Bleibt auf 1.
Aber du hast doch echt nix kapiert. Überleg dir doch mal selber was wann 
passiert. Der Shift Operator ist doch nur eine Konstante zur 
Ausführungszeit. Der Shiftet doch zur Laufzeit nix.

gruß cyblord

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren