Hallo liebe Gemeinde, ich habe vor kurzem wieder angefangen, mich mit dem Thema Mikrocontroller zu befassen und komme auch schon zu einem kleinen Problem. Ich habe zusammen mit einem Arbeitskollegen eine Platine entwickelt. Diese soll über die Analogen Eingänge ADC0 - ADC5 mithilfe eines Spannungs. teilers den angeschlossenen Widerstand messen (Ist ein Meldelinientester für Alarmanlagen) und mit zwei LED's den Zustand der jeweiligen Linie Ausgeben. Zum Beispiel: -bei einem Kurzschluss soll die Rote LED blinken -bei einer offenen Linie (unendlicher Widerstand) soll die Rote LED konstant leuchten, bis diese über einen Reset-Taster wieder zurück gesetzt wird -ist der Widerstand messbar (+/- 5%), leuchtet die Grüne LED Soweit funktioniert das ganze auch wie gewollt. Ich habe nur Probleme mit der Auswertung von Linie 1 und 6. Wenn der ATmega gestartet ist, blinkt die LED (grün) an Pin0 (PCINT17/TXD). Wenn ich den Aufgesteckten Widerstand (an Linie 6) entferne und somit eine offene Linie Simuliere, sollte LED rot von Linie 6 (PCINT16/RXD) aufleuchten. Diese reagiert aber nicht (auch mit, über die Programmierung, abgeschaltetem Seriellen Port). Wenn ich an Linie 1 den Widerstand abziehe, soll dementsprechend die LED's für Linie 1 reagieren (Pin10->PCINT2/SS und Pin11->PCINT3/MOSI) überhaupt nicht, stattdessen leuchtet die LED (grün von Linie 6) konstant. Ich habe mittlerweile herausgefunden, dass es mit der Programmierung nichts zu tun hat (ich habe eine neue Programmierung erstellt, in der nur die LED's nach und nach aufleuchten und sich wieder abschalten). Habt ihr eine Idee was ich übersehen haben könnte oder habt ihr einen passenden Tipp parat? Ich danke schon mal im vorraus für die Antworten.
Sascha W. schrieb: > Ich habe mittlerweile herausgefunden, dass es mit der Programmierung > nichts zu tun hat Na, dann wird es wohl die Schaltung sein :-) Da Du uns beides vorenthältst kann Dir nicht geholfen werden.
> Da Du uns beides vorenthältst kann Dir nicht geholfen werden.
Keine Angst Schaltung und Programmierung kommen jetzt ;-)
1 | // Taster definieren
|
2 | int Reset = 13; |
3 | int Modi = 12; |
4 | int RstStat = 0; |
5 | int ModStat = 0; |
6 | int Zugang_Modi=3000; |
7 | |
8 | // LED definieren
|
9 | int LEDrot[5]; |
10 | int LEDgruen[5]; |
11 | int LEDpause = 50; |
12 | // ------------------
|
13 | |
14 | // Meldegruppen dimensionieren
|
15 | int MG[5]; |
16 | int R1 = 10000.0; // Konstanter Widerstand |
17 | int R2 = 10000.0; // Zu messender Widerstand |
18 | long Messwert; |
19 | float SpannungR2; // Spannung über dem zu messenden Widerstand |
20 | float Widerstand; |
21 | int ML_Start=1; |
22 | int ML_Ende=5; |
23 | // ---------------------------
|
24 | |
25 | // Alarmmeldung oder Auslösung definieren
|
26 | int Alarm[6]; |
27 | |
28 | void setup() |
29 | {
|
30 | //LED den ausgängen zuordnen
|
31 | LEDrot[0] = 10; |
32 | LEDrot[1] = 8; |
33 | LEDrot[2] = 6; |
34 | LEDrot[3] = 4; |
35 | LEDrot[4] = 2; |
36 | LEDrot[5] = 0; |
37 | LEDgruen[0] =11; |
38 | LEDgruen[1] = 9; |
39 | LEDgruen[2] = 7; |
40 | LEDgruen[3] = 5; |
41 | LEDgruen[4] = 3; |
42 | LEDgruen[5] = 1; |
43 | //---------------------------
|
44 | |
45 | Serial.end(); |
46 | |
47 | // Taster als Input setzen
|
48 | pinMode(Reset, INPUT); |
49 | pinMode(Modi, INPUT); |
50 | digitalWrite(Reset, HIGH); |
51 | digitalWrite(Modi, HIGH); |
52 | |
53 | // LEDs den Pins zuordnen und einschalten
|
54 | for (int x = ML_Start; x < ML_Ende; x++) |
55 | {
|
56 | pinMode(LEDrot[x], OUTPUT); |
57 | pinMode(LEDgruen[x], OUTPUT); |
58 | }
|
59 | |
60 | // Analoge Pins für Meldegruppe zuordnen
|
61 | MG[0] = A0; |
62 | MG[1] = A1; |
63 | MG[2] = A2; |
64 | MG[3] = A3; |
65 | MG[4] = A4; |
66 | MG[5] = A5; |
67 | |
68 | LED_Test(); |
69 | }
|
70 | |
71 | void LED_Test() |
72 | {
|
73 | for (int x = ML_Start; x < ML_Ende; x++) |
74 | {
|
75 | digitalWrite(LEDrot[x], HIGH); |
76 | digitalWrite(LEDgruen[x], HIGH); |
77 | delay(LEDpause); |
78 | }
|
79 | for (int x = ML_Start; x < ML_Ende; x++) |
80 | {
|
81 | digitalWrite(LEDrot[x], LOW); |
82 | digitalWrite(LEDgruen[x], LOW); |
83 | delay(LEDpause); |
84 | }
|
85 | }
|
86 | void Widerstandmessen(int MG_pin) |
87 | {
|
88 | // 5 Messungen machen und den Mittelwert errechnen
|
89 | Messwert = 0; |
90 | SpannungR2 = 0; |
91 | Widerstand = 0; |
92 | for (int i = 0; i < 5; i++) |
93 | {
|
94 | Messwert += analogRead(MG[MG_pin]); |
95 | }
|
96 | Messwert = trunc(Messwert / 5); |
97 | |
98 | // Spannung berechnen
|
99 | SpannungR2 = (5.0 / 1023.0) * Messwert; |
100 | |
101 | // Widerstand berechnen
|
102 | Widerstand = R1 * (SpannungR2 / (5.0 - SpannungR2)); |
103 | //delay(1000);
|
104 | }
|
105 | |
106 | void StatusMeldegruppe(int MG_SM) |
107 | {
|
108 | if (Widerstand >= (R2 / 1.52) && Widerstand <= (R2 * 1.52)) |
109 | {
|
110 | if (Alarm[MG_SM] == 0) { |
111 | digitalWrite(LEDrot[MG_SM], LOW); // Wenn kein Alarm ansteht, wird die rote Meldegruppen LED ausgeschaltet |
112 | }
|
113 | digitalWrite(LEDgruen[MG_SM], HIGH); |
114 | }
|
115 | if (Widerstand <= 50) |
116 | {
|
117 | digitalWrite(LEDgruen[MG_SM], LOW); |
118 | for (int i = 0; i < 3; i++) |
119 | {
|
120 | digitalWrite(LEDrot[MG_SM], HIGH); |
121 | delay(100); |
122 | digitalWrite(LEDrot[MG_SM], LOW); |
123 | delay(100); |
124 | }
|
125 | if (Alarm[MG_SM] >= 0) |
126 | {
|
127 | digitalWrite(LEDrot[MG_SM], HIGH); // Wenn ein Alarm ansteht, wird die rote Meldegruppen LED wieder konstant eingeschaltet |
128 | }
|
129 | }
|
130 | if (Widerstand >= 45000) |
131 | {
|
132 | Alarm[MG_SM] += Alarm[MG_SM]++; |
133 | digitalWrite(LEDgruen[MG_SM], LOW); |
134 | digitalWrite(LEDrot[MG_SM], HIGH); |
135 | }
|
136 | }
|
137 | |
138 | void loop() |
139 | {
|
140 | for (int i = ML_Start; i < ML_Ende; i++) |
141 | {
|
142 | //LEDgn = 2 + i;
|
143 | //LEDrt = 3 + i;
|
144 | Widerstandmessen(i); |
145 | StatusMeldegruppe(i); |
146 | delay(25); |
147 | }
|
148 | RstStat = digitalRead(Reset); |
149 | if (RstStat == LOW) |
150 | {
|
151 | for (int i = ML_Start; i < ML_Ende; i++) |
152 | {
|
153 | Alarm[i] = 0; |
154 | }
|
155 | }
|
156 | ModStat=digitalRead(Modi); |
157 | if(ModStat==LOW&&RstStat==LOW) |
158 | {
|
159 | LED_Test(); |
160 | }
|
161 | }
|
Ignoriert bitte den Piepser im Schaltplan (ist noch nicht angeschlossen)
:
Bearbeitet durch User
Welchen Sinn hat den das, der Datentyp int ?
1 | int LEDrot[5]; |
2 | int LEDgruen[5]; |
Karl M. schrieb: > Welchen Sinn hat den das, der Datentyp int ? > int LEDrot[5]; > int LEDgruen[5]; Eine Variable für die for-Schleife, z.B. wird jeweils bei LEDrot und LEDgruen mithilfe der Schleife, der jeweilige Ausgang genutzt Bin auch gerne für Verbesserungsvorschläge offen, stehe noch recht weit am Anfang der Materie. ;-)
Sascha, ich bin der Meinung man sollte alle Datentypen kennen und damit auch den Zahlenbereich. Wie viele Bit hat dein AVR µC ? Und was gilt für integer?
Karl M. schrieb: > Sascha, > > ich bin der Meinung man sollte alle Datentypen kennen und damit auch den > Zahlenbereich. > > Wie viele Bit hat dein AVR µC ? Und was gilt für integer? Ist mir schon klar, das man alle Datentypen kennen sollte. Frage: Was hat der Elefant mit einem Stück Kuchen zu tun?
Sascha W. schrieb: > // LEDs den Pins zuordnen und einschalten > for (int x = ML_Start; x < ML_Ende; x++) Also von 1 bis 4. 0 und 5 schauen dumm aus der Wäsche :-) Sascha W. schrieb: > void LED_Test() > { > for (int x = ML_Start; x < ML_Ende; x++) dto. Sascha W. schrieb: > void loop() > { > for (int i = ML_Start; i < ML_Ende; i++) > { Konsequent :-)
Dieter F. schrieb: > 0 und 5 schauen dumm aus der Wäsche :-) Ich habe bewusst 0 und 5 ausser acht gelassen, um nur quasi Eingang 2 - 5 erstmal zu nutzen, bis ich (auch mithilfe externer) das Problem in den Grid bekommen habe. Ursprünglich ist es folgende Definition:
1 | int ML_Start=0; |
2 | int ML_Ende=6; |
:
Bearbeitet durch User
Hallo Sacha, ich hatte es - das Problem - etwas suspekter hingeschrieben. Und Dieter F. stößt dich direkt drauf. Ich bin gespannt, ob Du das Problem finden kannst. Es mit mit [] und deren Bedeutung zu tun.
Karl M. schrieb: > Was ist den dein "Grid" ? > Kenne ich nicht. Sorry Karl, ich meinte griff nicht Grid
Ist schon ein wenig spät für mich (versuche trotzdem geistig auf der höhe zu bleiben) Das was ich bisher an meiner dargestellten Programmierung sehe ist, das durch die Definition von ML_Start=1 und ML_Ende=5, Eingang 1 und 6 gar nicht erst dargestellt werden. Ist auch vollkommen richtig, da ich bewusst Meldelinie 2 bis 5 auswerten wollte, bis ich Programmiertechnisch das Problem in den Griff bekommen habe. Wie weiter oben bereits beschrieben, heißt es eigentlich:
1 | ML_Start=0; |
2 | ML_Ende=6; |
Oder habe ich da einen gedanklichen Fehler?
Das 3te mal: Es hat mit [] und deren Bedeutung zu tun.
Brillinat....ich blindfisch XD (Danke Dieter und Karl) Korrektur:
1 | // LED definieren
|
2 | int LEDrot[6]; |
3 | int LEDgruen[6]; |
4 | int LEDpause = 50; |
5 | // ------------------
|
6 | |
7 | // Meldegruppen dimensionieren
|
8 | int MG[6]; |
Meldelinie 1 und 6 funktionieren, wie sie sollen.
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.