Forum: Mikrocontroller und Digitale Elektronik Absolut unerklärliches Programmverhalten


von Andreas (Gast)


Angehängte Dateien:

Lesenswert?

Guten Morgen zusammen!

Ich sitze jetzt seit Freitag an einem Problem mit meinem µC-Programmcode 
und weiß mir absolut keinen Rat mehr.
Mein µC soll zur Auswertung von Sensoreinheiten eingesetzt werden. Jeder 
der angeschlossenen Sensoreinheiten (Sensoreinheit 1 bis 4) hat drei 
Hall-Sensoren integriert die das Magnetfeld eines Relais überwachen. 
Sprechen schalten die Sensoren, dann ist ein Magnetfeld vorhanden und 
das Relais ist eingeschaltet. Die Drei Hall-Sensoren pro Sensoreinheit 
dienen der Redundanz. Sind nicht alle Sensoren Ein oder Aus, so 
entscheidet zum einen die Mehrheit über den jeweiligen Schaltzustand des 
Relais und zusätzlich wird ein Störungsbit gesetzt.

Hier der Programcode der die Sensoreinheit 2 abfragt:
1
/************************************************************
2
************************ Sensor 2 ***************************
3
*************************************************************/
4
      
5
Sensor2=Hall_2_1+Hall_2_2+Hall_2_3;
6
      
7
/*********************** Relais EIN *************************/
8
if (Sensor2 > 1){
9
  PORTA &= ~(1 << LED_Sensor2);
10
  if (sens2 == 0){
11
    buffer="Relais 2 -> EIN";    
12
    uart_puts(buffer);
13
    uart_putc('\n');
14
    sens2=1;
15
  }
16
  if (Sensor2 < 3){
17
           PORTA &= ~(1 << LED_Warnung);
18
    if (stoer2 == 0){
19
             buffer="Sensor 2 -> Stoerung";
20
      uart_puts(buffer);
21
      uart_putc('\n');
22
      stoer2=1;
23
    }
24
  }
25
}
26
      
27
              
28
/*********************** Relais AUS *************************/
29
if (Sensor2 < 2){
30
         PORTA |= (1 << LED_Sensor2);
31
  if (sens2 == 1){
32
    buffer="Relais 2 -> AUS";  //Problemstelle
33
    uart_puts(buffer);
34
    uart_putc('1');
35
    sens2=0;
36
  }
37
  if (Sensor2 > 0){
38
    PORTA &= ~(1 << LED_Warnung);
39
    if (stoer2 == 0){
40
             buffer="Sensor 2 -> Stoerung";
41
             uart_puts(buffer);
42
      uart_putc('\n');
43
      stoer2=1;
44
    }
45
  }
46
}

Zu meinem Problem:
Zuerst will ich noch anmerken, dass die anderen Senoreinheiten absolut 
identisch im Programmcode abgefragt werden.
Ich gebe die Schaltzustände über die UART-Schnittstelle mit Hilfe der 
UART-Libary von Peter Fleury von meinem Atmega32 an meine serielle 
Schnittstelle des Laptops und plotte hier die Zusatndmeldung mit dem 
Terminalprogramm hterm mit. Da ich festgestellt habe, das mein 
Programmcode in der Hauptschleife nicht über die Sensoreinheit 2 heraus 
kommt habe ich testweise den folgenden Programmteil einmal oberhalb und 
einmal unterhalb des oben stehenden Codes eingefügt:
1
buffer="Endline";
2
uart_puts(buffer);
3
uart_putc('\n');

Hierbei habe ich festgestellt, dass mein Terminalprogramm "Endline" in 
der Schleife plottet, wenn der Code oberhalb der Sensoreinheit 2 
plaziert ist. Unterhalb findet keine Ausgabe statt. Wenn ich jedoch an 
der mit "Problemstelle" im Programmcode markierten Zeile in der Variable 
buffer das "->" entferne, dann wird auch unterhalb der Sensoreinheit 2 
die Variable "Endline" ausgegeben. Bei der Sensoreinheit 1 funktioniert 
selsamerweise der identische Programmcode.

Kann mir jemand sagen woran das leigen kann?

Die Variable buffer ist wie folgt deklariert:
1
char buffer;

Die Werte der Variablen Sensor1, Sensor2, Sensor3 und Sensor4 ist 3. 
Damit kommt der Programmcode aufgrund der if-Anweisung vor der 
Problemstelle eigentlich auch gar nicht an dieser Stelle vorbei.

Ich bedanke mich schon einmal im Voraus für Eure Hilfe und hoffe, dass 
mir hier jemand den Fehler aufzeigen kann.


Gruß
Andreas

PS: Den kompletten Programmcode habe ich angefügt.

von Hauspapa (Gast)


Lesenswert?

Nach meinem Verständnis reserviert Dein
> char buffer;
nur eine Speicherstelle, also einen Buchstaben.

ich hätte etwas in der Art erwartet:

char buffer[20];

kann mich aber täuschen, bin mehr der Hardware verhaftet.

viel Erfolg
Hauspapa

von Uwe (Gast)


Lesenswert?

Hallo Andreas Gast,

dein Problem ist, Du weisst nicht was String in "C" sind und wie man mit 
ihnen umgeht.
1
const char str_hallo [6] = "Hallo";
2
char * str1 = str_hallo;

Dadurch hat Dein Programm Fehler und läuft nicht.

von Hauspapa (Gast)


Lesenswert?

Entschuldige, wenn schon dann
char buffer[21];
Ich hatte mich verzählt, und Platz fürs String-Ende-Zeichen muss ja auch 
noch bleiben.

viel Erfolg
Hauspapa

von Andreas (Gast)


Lesenswert?

Super! Vielen Dank!

Genau das war's! Manchmal ist die Lösung so einfach auch wenn das 
Problem noch so komplziert ist! ;-)

von Karl H. (kbuchegg)


Lesenswert?

Andreas schrieb:
> Super! Vielen Dank!
>
> Genau das war's! Manchmal ist die Lösung so einfach auch wenn das
> Problem noch so komplziert ist! ;-)

Warum schreibst du eigentlich nicht anstelle von
1
    buffer="Relais 2 -> EIN";    
2
    uart_puts(buffer);
3
    uart_putc('\n');

ganz einfach
1
    uart_puts( "Relais 2 -> EIN\n" );

Wenn wir schon von 'eine einfache Lösung' reden.

von Andreas S. (schunki)


Lesenswert?

Genau so hab ich's jetzt auch gemacht!
Bevor ich mich mit der von mir gehassten Zeigerarithmetik rum ärgere, 
hatte ich mir das dann so auch schon zu recht gelegt! ;-)

Allerdings ist bei mir gerade noch eine andere Frage aufgetaucht:

Irgendwie ließt mir mein Programm die Sensoreinheit 4 und den 3. Hall 
Sensor der Sensoreinheit 3 (Also alles was über Port C rein kommt) nicht 
ein.
Jemand ne Ahnung warum?
Ich hab das Register C genauso defeniert wie das Register B 
(DDRC=0b00000000) und lese den PORT C auch genauso ein wie den PORT B
1
int Hall_Eingang=PINB;
2
int Hall_Eingang2=PINC;



Gruß
Andreas

von fz (Gast)


Lesenswert?

An Port C hast du JTAG den musst du erst über Fusebits deaktivieren.

von Andreas S. (schunki)


Lesenswert?

Ich hab mir schon sowas in der Richtung gedacht. Wusste nur nicht so 
ganz, was mir da am Port C im Weg steht!

Danke!

von Peter D. (peda)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wenn wir schon von 'eine einfache Lösung' reden.

Man kann noch ne Menge vereinfachen.

Interessant wäre ein Programmablaufplan.

Es gibt da nämlich auch ungeplante Zustände.
Die Sensoren werden ja nicht alle in der gleichen µs umschalten. Dadurch 
ist es möglich, daß auch im regulären Betrieb eine Störung gemeldet 
wird. Man müßte also die Sensoren mehrfach einlesen mit einer 
Entprellzeit dazwischen und auf Gleichheit des Zustandes testen.

Es wird oft nicht daran gedacht, daß eine CPU sauschnell ist und externe 
Ereignisse immmer asynchron sind.


Peter

von Andreas S. (schunki)


Lesenswert?

Hallo Peter!

Da ist was dran!
Ich hatte auch schon ein bisschen darüber nachgedacht, wie ich das Ganze 
während dem Schaltvorgang am Besten realisiere! Ich werde mir mal ein 
Kopf drüber machen, wie ich das am Sichersten hin bekomme!
Danke für Deine Anregung!

Gruß
Andreas

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.