Forum: Mikrocontroller und Digitale Elektronik Adc soll Led zum leuchten bringen Bascom


von Patrick (Gast)


Lesenswert?

Hallo ihr lieben ich stelle mich wohl zu blöd an (mal wieder).
Ich weiß wie man über adc den Pin aus liest und auf einem lcd display 
anzeigt (oder glaube das zu wissen) aber ich schaffe es nicht je nach 
Spannung die gemessen wird, eine led zum leuchten zu bringen.

Es soll wie folgt aussehen 9 Leds, umso niedrieger die spannung ist umso 
mehr leds sind ausgeschaltet. Die gemessene spannung ist Min 0 V und max 
5 V.
Ich hoffe das ihr mir helfen könnt den Bascom code zu schreiben und 
bitte auch eine erklärung dazu.

MFG Patrick

Das hier ist der Bascom code den ich gefunden habe, der aber leider nur 
die lcd anzeige steuert.

$regfile = "m16def.dat"
$crystal = 16000000
Config Adc = Single , Prescaler = Auto , Reference = AVCC
Start Adc
Const Ref = 5 / 1024
Dim Raw As Word
Dim V As Single
Do
Raw = Getadc(0)
V = Raw * Ref
Print "RAW: " ; Raw ; Spc(3) ; V ; "V"
Wait 1
Loop

von Klaus D. (kolisson)


Lesenswert?

Also,,,,...  ich mag ja Bascon Leute aber ich habe das Gefühl,
das du total den arsch auf hast... (Verzeihung aber das war das Gefühl)

Allein deine Frage nach 9 Stück Led lässt mir den Hut hochfliegen.
Nimm also bitte 8 oder 16. Das ist so Uso bei Computern.
Danach wird es einfach:

alle Led mit Vorwiderstand an portB

$regfile = "m16def.dat"
$crystal = 16000000
Config Adc = Single , Prescaler = Auto , Reference = AVCC
Start Adc  <---  das kannst du dir sparen

dim adcword as word

config portb.0 = output
config portb.1 = output
config portb.2 = output
config portb.3 = output
config portb.4 = output
config portb.5 = output
config portb.6 = output
config portb.7 = output



Do
wait 1
adcword = getadc(x)  <- x ist der port den du benutzt
shift adcword right, 2   <- in ein byte packen
portb = adcword


loop
end

von Patrick (Gast)


Lesenswert?

Tut mir leid das dir das missfaelt aber der Artikel wurde auf dem Handy 
getipp. Prinzipiellt ist es doch eh egal wieviele leds ich benutze. Kann 
man deinen code auch durch eine if then schleife ersetzen, wenn ja wie 
saehe das aus. Der sinn soll sein das die leds bei bestimmten werten 
leuchten und nicht  nur wenn die spannung sinkt.

If adcword >= 3 then portb.0 = 1
Elseif adcword >= 3,2 then portb.1 = 1
....
End if

Danke im vorraus und bitte entschuldigt den verhunsten post und die 
gross und kleinschreibun, mal klappt sie auf dem handy und meistens 
nicht.

von Eumel (Gast)


Lesenswert?

"Nimm also bitte 8 oder 16. Das ist so Uso bei Computern."

Höre bitte nie nie wieder auf irgendetwas aus dem Mund dieses Menschen.
Darüber hinaus solltest du Bascom an den Nagel hängen und was 
anständiges lernen.

von Klaus D. (kolisson)


Lesenswert?

Patrick schrieb:
> Der sinn soll sein das die leds bei bestimmten werten
> leuchten und nicht  nur wenn die spannung sinkt.
>
> If adcword >= 3 then portb.0 = 1
> Elseif adcword >= 3,2 then portb.1 = 1
> ....
> End if

Genauso kann es klappen.. da hast du recht.
Wenn du das dann noch über "Case" machst wirds einfacher.

gesetzt den Fall du hast die shift right,2 verwendet , werden ja die
1024 Werte in 256 Werte ungesetzt.

Wenn du nun eine Select Case Konstruktion verwendest wäre es so:



do
wait 1
adcword = getadc (x)
shift adcword, right, 2

select case adcword
case adcword =0
portb = 0
case adcword >0
portb.0 = 1
case adcword > 10
portb.1 = 1

** und so weiter

else
porta.1 = 1 'ein beispiel

end select


loop
end

Nun hast du aber das Problem, das die Ports zwar angemacht werden aber 
niemals zurückgestellt werden.
Dazu bietet sich dann ein Timer an, der nach x Millisekunden alles 
wieder auf null stellt.


Gruss Klaus

von guenther (Gast)


Lesenswert?

Eumel schrieb:
> "Nimm also bitte 8 oder 16. Das ist so Uso bei Computern."

Zunächst einmal heisst es USUS, nicht USO. Was gibt es an der 
Anforderung des TE, 9 LEDs zu verwenden, zu kritisieren? Sicher sind 8 
einfacher anzusprechen, aber danach wurde hier nicht gefragt!

> Höre bitte nie nie wieder auf irgendetwas aus dem Mund dieses Menschen.
> Darüber hinaus solltest du Bascom an den Nagel hängen und was
> anständiges lernen.

Bla, Bla, Bla... Und wieder ein unbeirrbarer Jünger der "Westboro Church 
of C". Oder einer anderen frickeligen und unbrauchbaren 
"Programmiersprache", welche man nur verwenden kann, wenn einem das 
Ergebnis bzw. die Funktion des Programms egal ist. Auch hier wieder: Der 
TE hat nicht nach einer subjektiven Empfehlung einer Programmiersprache 
gefragt.

Es ist schlicht unverständlich, weshalb die Welt heutzutage voll mit 
irgendwelchen gutmenschenhaften Weltverbesserern ist, die fest davon 
überzeugt sind, jedem Ihre Meinung mitteilen zu müssen, aber letzlich 
von nichts eine Ahnung haben.

von Michael H. (mueckerich)


Lesenswert?

Klaus De lisson schrieb:
> aber ich habe das Gefühl,
> das du total den arsch auf hast...

Benehmen Jungs, Benehmen wäre gefragt. ;-)

Der Weg über die Select Anweisung den dir Klaus beschrieben hat, ist 
sicherlich zielführend und einfach. Bitte beachte allerdings, dass die 
Ports auch wieder rückgesetzt werden müssen falls sich der ADC Wert 
"nach unten" ändert. Entweder in jedem "Select" Fall den (die) nicht zu 
setzten Ports eine 0 zuweisen oder aber vor dem "Select Case" alle Ports 
rücksetzen und dann nur die Benötigten Ports setzen.
Bezüglich der Auswahl von Programmiersprachen, das ist wie dein Steak, 
der eine will es englisch, der ander medium und der nächste liebt es 
totgekocht. Lass dich da nicht von irgendwelchen radikalen 
Glaubensbrüdern beirren. Nimm das was für Dich am einfachsten und 
zweckmäßigsten erscheint.
Ich nehm mal an dass Du in dem Thema uC recht neu bist aber da macht 
nichts, jeder hat mal angefangen.

von Patrick (Gast)


Lesenswert?

Ich danke euch allen für die hilfe, im prinzip habe ich gemerkt das ich 
fast alles richtig gemacht habe, ich habe nur nicht daran gedacht das 
die werte zwichen 0 und 1024 sind ich hatte mit anderen werten 
gerechnet.

Ich benutze bascom weil ich es einfacher finde so kann ich lesen und 
sehen was die befehle beweirken sollen.

Ich programmieren erst seit ein paar Wochen komme aber gut vorran.

eine Frage habe ich noch.

Wie schaffe ich es jetzt die 1024 auf z.b. 5 Volt zu bringen so das ich 
das nicht jedesmal umrechnen muss.

das ergebniss soll sein

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Dim A As Word
Start Adc


Do

Wait 1
A = Getadc(7)
If A >= 3 Then
Led1 = 1
Else
Led2 = 0
End If             / soll nur ein Beispiel sein ich möchte aber das ich 
hier die einzelnen volt beträge eingeben kann.

laut meiner rechnung sind 0,1 Volt 20,48 steps

5 v --- 1024 steps             /50
0,1 V - 20,48 steps

von Falk B. (falk)


Lesenswert?

@  Patrick (Gast)

>Wie schaffe ich es jetzt die 1024 auf z.b. 5 Volt zu bringen so das ich
>das nicht jedesmal umrechnen muss.

Mit etwas Prozentrechung, wie sie immer beim AD-Wandler verwendet 
wird.

U_ein = ADC * 5 / 1024

Hier muss man den Datentyp single (Fließkommazahl) verwenden.

MFG
Falk

von Patrick (Gast)


Lesenswert?

tut mir leid wie gesagt ich beschäftige mich nich nicht so lange mit 
microkontrollern.

von Karl H. (kbuchegg)


Lesenswert?

Patrick schrieb:

> eine Frage habe ich noch.
>
> Wie schaffe ich es jetzt die 1024 auf z.b. 5 Volt zu bringen so das ich
> das nicht jedesmal umrechnen muss.

Die Frage ist eher:
Was bringt es dir, wenn du dir zuerst die Volt ausrechnest?

Ob du jetzt die 9 LED abhängig von einem Wert 0 bis 5 sukzessove 
einschaltest, oder im anderen Fall bei Werten von 0 bis 1023 ist gehupft 
wie gesprungen.

Im ersten Fall wird jeweils alle 5 / 9 = 0.555 Volt eine LED 
dazugeschaltet. Im zweiten Fall wird bei allen Vielfachen vom ADC, also 
bei 1023 / 9 = 113 eine LED dazugeschaltet.

Ob du jetzt zuerst die Volt ausrechnest und dann mittels

   Volt / 0.555

die Anzahl der zu leuchtenden LED bestimmst, oder ob du gleich den ADC 
Wert nimmst und mittels

   ADC / 113

diese Anzahl bestimmts, schenkt sich also nichts. Nur dass du im ersten 
Fall noch sinnlos rundherum rechnest um dann doch beim gleichen Ergebnis 
zu landen.

von Patrick (Gast)


Lesenswert?

Die sache ist aber nun die das ich das lernen möchte, sprich wenn ich 
das jetzt so stehen lasse weiß ich nachher falls ich etwas anderes 
machen möchte nicht wie ich es hinbekomme. da dieser Forum post schon 
einmal steht, denke ich das es sinvoller ist das hier weiter zu erfragen 
statt nen extra post zu machen, da mir dir anleitungen aus dem buch

Ulli Sommer
Mikrocontroller
programmieren mit
Bascom Basic
Messen, Steuern, Regeln und Robotertechnik

leider nicht so weiter geholfen habe wie ich es mir erhofft habe.

von Patrick (Gast)


Lesenswert?

hier noch der Ausschnitt aus dem Buch:

Beispiel: ADC.bas
' Bascom ADC
$regfile = "m88def.dat"
$crystal = 16000000
$baud = 19200
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc
Const Ref = 5 / 1024
Dim Raw As Word
Dim V As Single
Do
Raw = Getadc(0)
V = Raw * Ref
Print "RAW: " ; Raw ; Spc(3) ; V ; "V"
Wait 1
Loop
End

von Falk B. (falk)


Lesenswert?

@  Patrick (Gast)

>hier noch der Ausschnitt aus dem Buch:

Der ist goldrichtig und enthält alles was du brauchst.
Wo liegt dann das Problem?

von Patrick (Gast)


Lesenswert?

Es tut mir leid ich habe es gerade selber gesehen ich habe mich da wohl 
ein wenig verlesen bitte entschuldigt die 3 Unsinnigen post 
umgeschrieben sollte es dann so aussehen.

 $regfile = "m16def.dat"
 $framesize = 16 
'Stackanweisungen, die eigentlich nur bei größeren Programmen
 $swstack = 16                                              'wirklich 
nötig werden
 $hwstack = 16
 $crystal = 16000000

 Config Portd.5 = Output
 Config Portd.6 = Output

 Config Porta.0 = Output
 Config Porta.1 = Output
 Config Porta.2 = Output
 Config Porta.3 = Output
 Config Porta.4 = Output
 Config Porta.5 = Output
 Config Porta.6 = Output

 Config Pina.7 = Input


 Led1 Alias Porta.0
 Led2 Alias Porta.1
 Led3 Alias Porta.2
 Led4 Alias Porta.3
 Led5 Alias Porta.4
 Led6 Alias Porta.5
 Led7 Alias Porta.6
 Led8 Alias Portd.6
 Led9 Alias Portd.5



Config Adc = Single , Prescaler = Auto , Reference = Avcc

Dim A As Word
Dim X As Single
Start Adc
Const V1 = 5 / 1024

Do

Wait 1
A = Getadc(7)
X = A * V1
If X > 4 Then
Led1 = 1
Else
Led2 = 0
End If                      /als Beispiel

Loop

von Karl H. (kbuchegg)


Lesenswert?

Patrick schrieb:
> Die sache ist aber nun die das ich das lernen möchte, sprich wenn ich
> das jetzt so stehen lasse weiß ich nachher falls ich etwas anderes
> machen möchte nicht wie ich es hinbekomme. da dieser Forum post schon
> einmal steht, denke ich das es sinvoller ist das hier weiter zu erfragen

Sei mir nicht böse.
Aber diese Formel ist nichts anderes als:

   100 Äpfel kosten 23 Euro 50
   wieviel kosten 28 Äpfel?

Sowas solltest du immer und überall ausrechnen können und auch wissen, 
wie du das ausrechnest. Grundschulkinder können das.

  1024 verschickte SMS   kosten    5 Euro
    n  verschickte SMS   kosten    wieviel

So vielleicht klarer, was du ausrechnen willst, wenn du die Spannung 
(wieviel) aus dem gemessenen Wert (n) ausrechnest?

von MirkoB (Gast)


Lesenswert?

Patrick schrieb:
> Config Porta.0 = Output
>  Config Porta.1 = Output
>  Config Porta.2 = Output
>  Config Porta.3 = Output
>  Config Porta.4 = Output
>  Config Porta.5 = Output
>  Config Porta.6 = Output
>
>  Config Pina.7 = Input

kann man auch kürzen:
Config PortA   = Output
Config Pina.7  = Input

...oder noch kürzer:
DDRA=&b01111111

von Walter S. (avatar)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Grundschulkinder können das.

als du zur Grundschule gegangen bist schon, heute braucht man dazu das 
Abi

von Falk B. (falk)


Lesenswert?

@  Patrick (Gast)

>umgeschrieben sollte es dann so aussehen.

Der Anfang ist OK, die Auswertung nicht. Und gewöhn dir eine solide 
Formatierung des Quelltextes an. Eher so
1
Do
2
3
  Wait 1
4
  A = Getadc(7)
5
  X = A * V1
6
7
  If X > 0.5 Then Led1 = 1 Else Led1 = 0
8
  If X > 1.0 Then Led2 = 1 Else Led2 = 0
9
  If X > 1.5 Then Led3 = 1 Else Led3 = 0
10
  If X > 2.0 Then Led4 = 1 Else Led4 = 0
11
  If X > 2.5 Then Led5 = 1 Else Led5 = 0
12
  If X > 3.0 Then Led6 = 1 Else Led6 = 0
13
  If X > 3.5 Then Led7 = 1 Else Led7 = 0
14
  If X > 4.0 Then Led8 = 1 Else Led8 = 0
15
  If X > 4.5 Then Led9 = 1 Else Led9 = 0
16
17
Loop

MfG
Falk

von Patrick (Gast)


Lesenswert?

Danke für den tipp Frank das werde ich mir zu Herzen nehmen.

@ karl heinz danke für die info in der Grundschule hätte der Lehrer 
jetzt zu dir gesagt Theama verfehlt.

Das ich den dreizatz benutz habe ist doch Wurst es ging nur um die Frage 
wie Bascom die Formel haben möchte allerdings habe ich mir die frage ja 
selber beantwortet. Es ging nur darum einen Multiplikator zu finden 
statt jeden einzelnen wert auszurechnen. Sicher kann ich das aber es 
macht die Gechichte doch nur länger und undeutlich.

Ein Forum ist nicht dafür gedacht sich über andere Leute lustig, sondern 
um unwissenen Mit seinem eigenen Wissenstand zu bereichern.

Und dieser ist bei mir (thema Bascom) sehr niedrig.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.