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
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
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.
"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.
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
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.
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.
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
@ 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
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.
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.
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
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
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?
@ 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
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.