Hallo,
ich habe ähnlich nach diesen Schaltbild (Anhang) ein drei Kanal Ohmmeter
mit je 3x3 PNP aufgebaut.
Nun gibt es aber ein Problem mit den Sketch. Und zwar schaltet der
Arduino nicht die PNP durch, sondern bleibt immer bei den Setup PNP der
mit einer Variable als Startwert definiert wurde:
channel = 0;
channel2 = 0;
channel3 = 0;
Ich habe auch schon andere Sketch mit der Funktion "Switch" erstellt,
aber das selbe Problem wie wenn ich die PNP mit einer if Schleife
ansteuere.
Sobald die Bedinungsschleife erfüllt würden ist:
1
if(volt_bit1<341&&channel<2){
2
channel++;
3
}
4
5
6
if(volt_bit1>853&&channel>0){
7
channel--;
8
}
Kann man am Printout sehen dass der Kanal sich ändert:
Aber leider schaltet der PNP dazu nicht, das kann man über die Abfrage
von "volt_bit1" festestellen. Die Kanallogik ändert sich zwar aber der
PNP reagiert nicht:
1
if(channel==0){
2
digitalWrite(CH1,HIGH);
3
digitalWrite(CH2,HIGH);
4
digitalWrite(CH3,LOW);
5
}
6
7
if(channel==1){
8
digitalWrite(CH1,HIGH);
9
digitalWrite(CH2,LOW);
10
digitalWrite(CH3,HIGH);
11
}
12
13
if(channel==2){
14
digitalWrite(CH1,LOW);
15
digitalWrite(CH2,HIGH);
16
digitalWrite(CH3,HIGH);
17
}
Defekt sind die PNP nicht. Denn wenn die Kanalvariable geändert wird:
channel = 0;
channel2 = 0;
channel3 = 0;
Dann wird dementsprechen ein anderer PNP angesteuert. Ich habe es
Anfangs mit "Switch" versucht, war aber das selbe Problem:
1
switch(n){
2
case0:
3
digitalWrite(CH0,LOW);
4
digitalWrite(CH1,HIGH);
5
digitalWrite(CH2,HIGH);
6
digitalWrite(CH3,HIGH);
7
break;
8
case1:
Ich versteh nicht warum die funktionierende Schaltlogik nicht angenommen
wird:
1
if(volt_bit1<341&&channel<2){
2
channel++;
3
}
4
5
6
if(volt_bit1>853&&channel>0){
7
channel--;
8
}
Die sollte doch ganz klar diese Bedingung schalten lassen:
1
if(channel==0){
2
digitalWrite(CH1,HIGH);
3
digitalWrite(CH2,HIGH);
4
digitalWrite(CH3,LOW);
5
}
Der ausgelesene Kanal (Schaltlogik) ändert sicht, aber nicht die
tatsächliche Schaltung des jeweiligen PNP.
Irgendwie werde ich aus der Programmiersprache C nicht schlau...
Hier mal der komplette Sketch:
Joel L. schrieb:> ich habe ähnlich nach diesen Schaltbild (Anhang) ein drei Kanal Ohmmeter> mit je 3x3 PNP aufgebaut.>> Nun gibt es aber ein Problem mit den Sketch. Und zwar schaltet der> Arduino nicht die PNP durch, sondern bleibt immer bei den Setup PNP der> mit einer Variable als Startwert definiert wurde
Nein, ich will hier nicht mit dir diskutieren, wie man aus 9
pnp-Transistoren ein Ohmmeter baut oder so. Aber mir fällt auf, wie
nebulös du deine Probleme beschreibst.
Was ist denn nun anders, als du es dir vorgestellt hast?
a) schalten die betreffenden Portpins nun (mit dem Voltmeter meßbar) auf
die gewünschten Pegel? Wenn ja, dann liegt es an der Verschaltung deiner
Transistoren oder daran, daß du beim Bestücken in die verkehrte Tüte
gegriffen hast.
b) kommst du mit der Programmierung nicht klar, so daß die Funktionen
zum Schalten der Portpins nicht oder falsch aufgerufen werden? Wenn ja,
dann versuche mal zu verstehen, was welche Ausdrücke in C zu welchem
Verhalten führen.
W.S.
So richtig Ahnung, was Du da zu machen versuchst, hab ich nach Deinem
verworrenen Post ehrlich gesagt auch nicht, aber eins sticht mir bei
Deinem Sketch direkt ins Auge:
Du liest Deine Meßwerte ein, wechselst dann eventuell den Meßbereich und
anschließend berechnest Du Dein Ergebnis aus dem originalen Meßwert aber
für den ggf. veränderten Bereich.
Joel L. schrieb:> uint16_t volt_bit1 = analogRead(A3);> uint16_t volt_bit2 = analogRead(A4);> uint16_t volt_bit3 = analogRead(A5);
Wozu soll das sein?
Lt. Schaltplan benutzt Du A1.
Der Code stimmt doch vorn und hinten nicht!
Erstell Dir erstmal in Worten einen Programmablaufplan, erst dann kann
man nämlich danach programmieren.
Schlechte Profis erstellen gerne mal den PAP im Kopf, aber soweit bist
Du noch lange nicht.
Gute Profis nehmen auch erstmal Papier und stift.
Peter D. schrieb:> Joel L. schrieb:>> uint16_t volt_bit1 = analogRead(A3);>> uint16_t volt_bit2 = analogRead(A4);>> uint16_t volt_bit3 = analogRead(A5);>> Wozu soll das sein?
Drei Kanal Ohmmeter mit jeweils 3x3 PNP und somit drei analogen
Messkanälen, hier also A3 - A5.
Einfach die Beispielschaltung bildlich mit drei multiplizieren. Auf der
Beispielschaltung sieht man nur einen Messkanal.
Inzwischen bin ich etwas weiter:
https://www.arduinoforum.de/arduino-Thread-Autorange-Ohmmeter-mit-Taktung?pid=99693#pid99693
Hast Du bedacht, daß es bei 100k ne ganze Weile braucht, ehe die 100nF
auf den Endwert umgeladen sind?
Ich würde die Bereichsumschaltung erstmal nur für einen Eingang
entwickeln, also nicht alles auf einmal. Teilaufgaben programmieren und
testen sich erheblich leichter.
Und ruhig in Funktionen unterteilen, nicht alles als Spaghetticode
hintereinander klatschen.
Und ist es wirklich so schwer, einen stimmenden Schaltplan zu zeichnen?
Papier, Bleistift und Smartphone sind doch schon erfunden.
Peter D. schrieb:> Hast Du bedacht, daß es bei 100k ne ganze Weile braucht, ehe die 100nF> auf den Endwert umgeladen sind?
Ohne angeschlossenen Widerstand ist der Kondensator spätestens nach ~
sechs Sekunden entladen.
> Ich würde die Bereichsumschaltung erstmal nur für einen Eingang> entwickeln, also nicht alles auf einmal. Teilaufgaben programmieren und> testen sich erheblich leichter.
Habe ich auch schon gemacht. Schlauer bin ich dadurch nicht geworden.
Der Microcontroller macht was er will und die Fehler sind alle nicht
reproduzierbar. Auch wenn ich im Ausschlussverfahren jede Code Zeile
teste.
Zum Glück bin ich nie Programmierer geworden. Eigentlich sollte man
erwarten das Befehle eben funktionieren. Dem scheint aber nicht so zu
sein.
>> Und ist es wirklich so schwer, einen stimmenden Schaltplan zu zeichnen?> Papier, Bleistift und Smartphone sind doch schon erfunden.
Eigentlich nicht. Aber warum den Schaltplan nicht einfach mal drei
nehmen?
Jeder Analoge Kanal geht über drei parallele und unterschiedliche
Referenzwiderstände, geschaltet jeweils durch einen PNP, auf Plus.
Undist nichts anderes als ein simpler Spannungsteiler mit schaltbaren
Referenzwiderständen. So schwierig ist der Schaltplan nun eigentlich
auch wieder nicht. Das kann man sich doch bildlich sehr einfach
vorstellen. Ist doch keine "Raketentechnik" hier.
Joel L. schrieb:> Habe ich auch schon gemacht. Schlauer bin ich dadurch nicht geworden.
Ja, das kann ich dir bestätigen.
> Der Microcontroller macht was er will und die Fehler sind alle nicht> reproduzierbar. Auch wenn ich im Ausschlussverfahren jede Code Zeile> teste.
Ähem... nö. Der Mikrocontroller macht, was du ihm programmiert hast -
und nicht, was du eigentlich beabsichtigt hast.
W.S.
Joel L. schrieb:> Scheint wohl benötigt zu werden
paßt aber immer noch nicht zu:
Joel L. schrieb:> uint16_t volt_bit1 = analogRead(A3);> uint16_t volt_bit2 = analogRead(A4);> uint16_t volt_bit3 = analogRead(A5);
So ein MC ist ja nicht dumm. Er führt alle Fehler genau so aus, wie Du
sie hinschreibst.
Peter D. schrieb:> So ein MC ist ja nicht dumm. Er führt alle Fehler genau so aus, wie Du> sie hinschreibst.
Der war gut, das ist genau nicht Fall. Ansonsten wären Fehler
reproduzierbar und leicht per Ausschlussverfahren zu finden.
Ein Mikrokontroller ist dumm oder kann man dem etwa beibringen
selbstständig zu lernen?
Peter D. schrieb:> Joel L. schrieb:>> uint16_t volt_bit1 = analogRead(A3);>> uint16_t volt_bit2 = analogRead(A4);>> uint16_t volt_bit3 = analogRead(A5);
Wie betreits angemerkt, misst du laut Deinem Schaltplan aber an A1, A2,
A3.
Was stimmt denn nun?
Joel L. schrieb:> Ein Mikrokontroller ist dumm oder kann man dem etwa beibringen> selbstständig zu lernen?
Ja, kann man. Nennt sich Künstlichen Intelligenz (KI)
Uwe
Uwe B. schrieb:> Joel L. schrieb:>>> Ein Mikrokontroller ist dumm oder kann man dem etwa beibringen>> selbstständig zu lernen?>> Ja, kann man. Nennt sich Künstlichen Intelligenz (KI)>> Uwe
Aha, dann müsste es ja im Autonomes fahren schon Level fünf erreicht
haben und ich muss in der Stadt nicht selber steuern.
Irgendwie ist die Realität wohl eine andere. Lassen wir es, hier kommt
sowie so nichts sinnvolles mehr und bezüglich der falschen Aussage
Zitat:
"ein Mikrokontroller macht genau das was man programmiert hat"
Dann können die angeblichen Experten ja hier folgenden Sachverhalt
klären:
Nach der der Programmierung muss bei einem "volt_image" von > 853 bit
und "ch_ number" == 0 die Variable "ch_number" eindeutig auf den Wert 0
sein.
Und bei einem volt_image < 341 bit und "ch_number" == 2 die Variable
"ch_number" auf den Wert 2 sein.
siehe Code.
1
if(flag==0){
2
ch_number=0;
3
ch_number2=3;
4
ch_number3=3;
5
ch_select(ch_number);
6
ch_select2(ch_number2);
7
ch_select3(ch_number3);
8
9
}
10
11
if(flag==0&&volt_image<341&&ch_number==0){
12
ch_number=1;
13
ch_number2=3;
14
ch_number3=3;
15
ch_select(ch_number);
16
ch_select2(ch_number2);
17
ch_select3(ch_number3);
18
19
}
20
21
if(flag==0&&volt_image<341&&ch_number==1){
22
ch_number=2;
23
ch_number2=3;
24
ch_number3=3;
25
ch_select(ch_number);
26
ch_select2(ch_number2);
27
ch_select3(ch_number3);
28
}
29
30
if(flag==0&&volt_image<341&&ch_number==2){
31
ch_number=2;
32
ch_number2=3;
33
ch_number3=3;
34
ch_select(ch_number);
35
ch_select2(ch_number2);
36
ch_select3(ch_number3);
37
}
38
39
if(flag==0&&volt_image>853&&ch_number==2){
40
ch_number=1;
41
ch_number2=3;
42
ch_number3=3;
43
ch_select(ch_number);
44
ch_select2(ch_number2);
45
ch_select3(ch_number3);
46
}
47
48
if(flag==0&&volt_image>853&&ch_number==1){
49
ch_number=0;
50
ch_number2=3;
51
ch_number3=3;
52
ch_select(ch_number);
53
ch_select2(ch_number2);
54
ch_select3(ch_number3);
55
}
56
57
if(flag==0&&volt_image>853&&ch_number==0){
58
ch_number=0;
59
ch_number2=3;
60
ch_number3=3;
61
ch_select(ch_number);
62
ch_select2(ch_number2);
63
ch_select3(ch_number3);
64
}
65
66
67
if(flag==1){
68
ch_number=3;
69
ch_number2=0;
70
ch_number3=3;
71
ch_select(ch_number);
72
ch_select2(ch_number2);
73
ch_select3(ch_number3);
74
}
75
76
77
if(flag==2){
78
ch_number=3;
79
ch_number2=3;
80
ch_number3=0;
81
ch_select(ch_number);
82
ch_select2(ch_number2);
83
ch_select3(ch_number3);
84
}
Und siehe da der angeblich richtig schlaue Mikrocontroller soll machen
was programmiert wurde, dann frage ich mich mal warum denn die Variable
"ch_number" -> ständig zwischen den Wert 0 (number_0) und 2 (number_2)
springt.
38 Temp_1 0.00ohm 10 number_0 bit_933 Temp_2 0ohm number_3
38 Temp_1 0.00ohm 01 number_2 bit_95 Temp_2 0ohm number_3
38 Temp_1 0.00ohm 10 number_0 bit_932 Temp_2 0ohm number_3
38 Temp_1 0.00ohm 01 number_2 bit_95 Temp_2 0ohm number_3
38 Temp_1 0.00ohm 10 number_0 bit_933 Temp_2 0ohm number_3
38 Temp_1 0.00ohm 01 number_2 bit_95 Temp_2 0ohm number_3
39 Temp_1 0.00ohm 10 number_0 bit_933 Temp_2 0ohm number_3
39 Temp_1 0.00ohm 01 number_2 bit_95 Temp_2 0ohm number_3
Nach der Programmierung müsste bei (number_0) und bit_933 durch die
Bedingung:
1
if(flag==0&&volt_image>853&&ch_number==0){
2
ch_number=0;
3
ch_number2=3;
4
ch_number3=3;
5
ch_select(ch_number);
6
ch_select2(ch_number2);
7
ch_select3(ch_number3);
8
}
Der Wert auf 0 (number_0) sein und drüfte nicht gar nicht auf 2
(number_2) springen.
Da wir hier ja bei Compiler und IDE sind, wollte ich darauf hinweisen,
dass der Arduino in C++ programmiert wird.
In C++ können Funktionen benutzt werden, und es braucht nicht sämtlicher
Code in einer loop() stehen.
Durch Verwendung von Funktionen könnte die sehr ähnlichen Abschnitte des
Codes sinnvoll strukturiert werden, so dass auch erfahrene Programmierer
den Code verstehen können.
Durch die Copy&Paste Hölle steige z.B. ich nicht durch.
Bei Google findet man schnell:
https://www.cpp-tutor.de/part1/funktionen.htmlhttps://itp.uni-frankfurt.de/~hanauske/VPROG/V4/Funktionen.html
Das könnte ein Anfang sein.
Joel L. schrieb:> siehe Code.
Woher kommt denn nun wieder diese ominöse "volt_image"?
Was ist denn so schwer daran: "vollständigen Code als Anhang".
Joel L. schrieb:> Nach der der Programmierung muss bei einem "volt_image" von > 853 bit> und "ch_ number" == 0 die Variable "ch_number" eindeutig auf den Wert 0> sein.
Es ist doch ganz einfach. Wenn da nicht das Vermutete rauskommt, dann
hat eben eine der 3 Variablen nicht den von Dir gedachten Wert.
Dein "dürfte" und "müßte" läßt die CPU völlig kalt und bringt Dich
keinen Schritt weiter.
Mit der ganzen Spaghettiprogrammierung machst Du Dir das Leben nur
unnötig selber schwer. Nebenbei sieht da auch kein anderer durch. Teile
und herrsche, d.h. machs erstmal nur für einen Eingang.
Und Du hast immer noch keinen Programmablaufplan erstellt.
Und nict vergessen: Nach der Umschaltung des Messbereiches warten:
10 x 100k Ohm x 100 nF
Das gibt 0.1 Sekunden
(Ich habe darauf verzichtet, das Umschalten im Code zu suchen.)
Joel L. schrieb:> ich habe ähnlich nach diesen Schaltbild (Anhang) ein drei Kanal Ohmmeter> mit je 3x3 PNP aufgebaut.
Kurze Zwischenfrage:
- Welchen Wert nimmt Vref an?
- Welchen Wert haben die Steuerspannungen D5 ... D13?
- Wie hoch ist Vref belastbar?
Jester schrieb:> Kurze Zwischenfrage:> - Welchen Wert nimmt Vref an?> - Welchen Wert haben die Steuerspannungen D5 ... D13?> - Wie hoch ist Vref belastbar?
Joel hat sein Problem mit dieser (blödsinnigen) Schaltung lösen können:
Er hat den falschen Port ausgelesen. (Wie Peter D schon feststellte)
In einem Arduinoforum hat er auch stolz berichtet.
Uwe