Forum: Mikrocontroller und Digitale Elektronik ATmega328P Pin0 funktioniert nicht wie gewollt


von Sascha W. (botimbo)


Lesenswert?

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.

von Dieter F. (Gast)


Lesenswert?

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.

von Sascha W. (botimbo)


Lesenswert?

> Da Du uns beides vorenthältst kann Dir nicht geholfen werden.

Keine Angst Schaltung und Programmierung kommen jetzt ;-)

von Sascha W. (botimbo)


Angehängte Dateien:

Lesenswert?

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
von Karl M. (Gast)


Lesenswert?

Welchen Sinn hat den das, der Datentyp int ?
1
int LEDrot[5];
2
int LEDgruen[5];

von Karl M. (Gast)


Lesenswert?

Wo entprellst Du denn eine Eingänge ?

von Sascha W. (botimbo)


Lesenswert?

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. ;-)

von Karl M. (Gast)


Lesenswert?

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?

von Sascha W. (botimbo)


Lesenswert?

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?

von Dieter F. (Gast)


Lesenswert?

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 :-)

von Sascha W. (botimbo)


Lesenswert?

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
von Karl M. (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

LEDs funktionieren in Durchlassrichtung besser.

von Karl M. (Gast)


Lesenswert?

Was ist den dein "Grid" ?
Kenne ich nicht.

von Sascha W. (botimbo)


Lesenswert?

Karl M. schrieb:
> Was ist den dein "Grid" ?
> Kenne ich nicht.

Sorry Karl, ich meinte griff nicht Grid

von Sascha W. (botimbo)


Lesenswert?

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?

von Karl M. (Gast)


Lesenswert?

Das 3te mal:

Es hat mit [] und deren Bedeutung zu tun.

von Sascha W. (botimbo)


Lesenswert?

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
Noch kein Account? Hier anmelden.