mikrocontroller.net

Forum: Analoge Elektronik und Schaltungstechnik Ausgabe einer gemessenen Spannung auf drei LED's


Autor: Thomas E. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Freunde!

Ich möchte ein Analogsignal (0-5V) über den A/D-Wandler eines Attiny26 
senden und dann auf drei LED's den Pegel des Analogsignals ausgeben:
Led1 (grün) = 0-4V
Led2 (gelb) = 4-4,5V
Led3 (rot) = 4,5-5V

Bis jetzt habe ich folgendes herausgefunden:
Der Attiny 26 hat 5 analoge Eingänge mit A/D-Wandler. Diese liegen auf
PA0 (ADC0)
PA1 (ADC1)
PA2 (ADC2)
PA4 (ADC3)
PA5 (ADC4).
Den Port PA4 (ADC3) möchte ich für mein Vorhaben nutzen, von PA7, PA6 
und PA5 sollen die LED's angesteuert werden.

Weiteres habe ich aus dem Datenblatt herausgelesen, dass das 
Analogsignal mit 10 Bit binär gewandelt werden, demzufolge ergibt das 
eine Zahl von 0 (0V) bis 1023 (+5V).

Um den Analogeingan zu verwenden, muss ich folgendes in den Code 
schreiben:
Config Adc = Single , Prescaler = Auto   
Start Adc

Ich denke, bis hierher habe ich richtig gelegen.

Doch nun komme ich zum Problem:
Wie realisiere ich die Abfrage dieses Analogsignals und gebe das dann an 
die drei LED's weiter?

Würde mich über Hilfe freuen. Es muss kein ganzes Programm sein, sondern 
nur kleine Code-Ausschnitte und Denkanstöße.
Wenn geht, schreibt mir das bitte in Basic, da ich Bascom nutze und mit 
C nicht vertraut bin.

Besten Dank bereits im Vorraus,
Thomas

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas E. wrote:

> Der Attiny 26 hat 5 analoge Eingänge mit A/D-Wandler.

Nö, es sind 11 Pins als analoger Eingang möglich.

> Um den Analogeingan zu verwenden, muss ich folgendes in den Code
> schreiben:
>
Config Adc = Single , Prescaler = Auto
> Start Adc
>
> Ich denke, bis hierher habe ich richtig gelegen.

Das kann Dir nur ein Bascom-Experte sagen.
Ich programmiere immer nach Datenblatt, da steht kein Bascom drin.


> Wie realisiere ich die Abfrage dieses Analogsignals und gebe das dann an
> die drei LED's weiter?

- Eingang auswählen
- Referenz auswählen
- ADC-Takt auswählen
loop:
- Wandlung starten
- Warten bis Wandlung fertig
- ADC auslesen und mit Deinen 3 Bereichen vergleichen
- goto loop

Und bau ne Hysterese ein, sonst flackern die LEDs an den Bereichsgrenzen 
ständig.

> Wenn geht, schreibt mir das bitte in Basic, da ich Bascom nutze und mit
> C nicht vertraut bin.

Ich kann kein Basic.


Peter

Autor: Thomas E. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab es jetzt mal so versucht, allerdings tut sich nix.
$regfile = "Attiny26.dat"
$crystal = 1000000


Config Pina.4 = Input                                       'Eingang Analogsignal
Config Porta.5 = Output                                     'Grüne LED
Config Porta.6 = Output                                     'Gelbe LED
Config Porta.7 = Output                                     'Rote LED

Led1 Alias Porta.7                                          'Led1=rote LED
Led2 Alias Porta.6                                          'Led2=gelbe LED
Led3 Alias Porta.5                                          'Led3=grüne LED

Config Adc = Single , Prescaler = Auto                      'Config A/D-Wandler
Start Adc                                                   'Starte A/D-Wandler

Dim X As Word                                               'Definiere Variable X als Word (16Bit)


Do

   X = Getadc(4)                                            'Auslesen Variable X

   If X = 800 Then                                          'Wenn X = 800 (ca. 4,5V???) dann schalte LED ein, sonst aus
      Led3 = 0
   Else
      Led3 = 1
   End If

Loop

End

Kann mir jemand weiterhelfen?

LG
Thomas

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was glaubst Du, wie groß die Wahrscheinlichkeit ist, dass X (also Dein 
ADC-Ergebnis) wirklich exakt den Wert 800 annimmt? Die Abfrage wirst 
Du wohl ein bisschen anders gestalten müssen, zumal Du ja wohl nicht 
willst, dass die LED nur leuchtet, wenn der Wert tatsächlich exakt 800 
ist... Da ich von BASCOM keine Ahnung habe, kann ich zum Programm an 
sich nix weiter sagen...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>   If X = 800 Then                                          'Wenn X = 800 > 
Led3 = 0
>   Else
>      Led3 = 1
>   End If

Es ist ziemlich unwahrscheinlich, dass deine Eingangsspannung
exakt 4.5V und damit der ADC Wert exakt 800 beträgt.
Du willst wahrscheinlich eher:

   If X > 800 Then                                          'Wenn X =
      Led3 = 0
   Else
      Led3 = 1
   End If

Autor: Thomas E. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, also ein Denkfehler meinerseits.

Allerdings leuchtet jetzt die LED bei mir dauerhaft.
(Zur Anmerkung: Ausgang0=LED leuchtet, Ausgang1=LED dunkel)

Anscheinend liegt der Fehler irgendwo in der Kalibirerung.

Thomas

Autor: Thomas E. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe den Fehler gefunden, es war etwas falsch angesteckt.

Wenn ich den Eingang des A/D-Wandlers jetzt offen lasse, ist die LED 
dunkel, angeschlossen an die Betriebsspannung leuchtet sie, verlöscht 
aber auch bei herunterfahren auf 2,8V nicht. Selbst bei einem Wert 
>1000.

Wer weiß Rat?

Thomas

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du ADC3 nutzt, dann X = Getadc(3) eingeben.

Werte vergleichen kann man auch so:
If X < xxx Then Led1 = 0 Else Led1 = 1 ' untere Grenze
If X => xxx And Wert < xxx Then Led2 = 0 Else Led2 = 1 ' Mittelwert
If X => xxx Then Led3 = 1 Else Led3 = 0

Für xxx sind natürlich die gewünschten Werte einzutragen.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Natürlich sollte die letzte Zeile so lauten:
If X => xxx Then Led3 = 0 Else Led3 = 1

Autor: Thomas E. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider bekomme ich beim Kompilieren dieser Zeilen

If Spannung < 600 Then Led1 = 0 Else Led1 = 1               ' untere 
Grenze
If Spannung => 800 And < 1000 Then Led2 = 0 Else Led2 = 1   ' Mittelwert
If Spannung => 1000 Then Led3 = 1 Else Led3 = 0

folgende Fehlermehldung:
3 parameters expected in File....

Da dürfte also irgendetwas faul sein.

Thomas

Autor: Jörg B. (manos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas E. wrote:
> Config Pina.4 = Input
> Config Porta.5 = Output
Ist das wirklich so in Basic, dass es da beim Pin-Ausgang Portx heißt 
und nicht poutx (fände ich logischer)?

Thomas E. wrote:
> If Spannung => 800 And < 1000 Then Led2 = 0 Else Led2 = 1   ' Mittelwert
schreib mal vor das < 1000 auch noch ein Spannung... :)

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das eine Fingerübung oder Teil einer größeren Anwendung? Wenn es nur 
darum geht, LEDs nach Spannung zum Leuchten zu bringen, täte ich 
Analogkomparatoren nehmen. Oder ist das zu einfach?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas E. wrote:

Ohne jetzt BASCOM Spezialist zu sein

>
> If Spannung < 600 Then Led1 = 0 Else Led1 = 1               ' untere
> Grenze

Da fällt mir nichts spezielles auf.

> If Spannung => 800 And < 1000 Then Led2 = 0 Else Led2 = 1   ' Mittelwert

=>  gibt es in den wenigsten Sprachen (Ich kenn keine). Die
Operation spricht sich als 'größer gleich' und wird folgerichtig
als >= geschrieben.

Autor: Der da (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du darfst in einer zeilen bei bascom nur eine operation setzten

If Spannung < 600 Then
 Led1 = 0
  Else
   Led1 = 1               ' untere Grenze
end if


hast du aber nur einen bedingung

if spannung < 600 then led = 0

dann brauchst du kein end if

benutze die hilfe im bascom und du kommst schnell weiter

mfg: der da

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht:
If Spannung >= 800 And < 1000 Then Led2 = 0 Else Led2 = 1
sondern:
If Spannung >= 800 And Spannung < 1000 Then Led2 = 0 Else Led2 = 1

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.