Forum: Mikrocontroller und Digitale Elektronik port-expander-matrix Bug ATmega8 hängt sich in der letzten Zeile auf


von Slawa S. (slawa_s)


Angehängte Dateien:

Lesenswert?

Folgendes Poroblem, was mich seit einiger Zeit beschäftig.

Ich Steuere mit Portexpandern eine Matrix mit Tastern und LEDs an.
(siehe p-e-m.gif Schaltplan)

Aktiviere eine Spalte, frage dort die Taster ab oder setzte die LEDs auf 
ein oder aus.

es tut sich alles in der main while(1) schleife


main(){

int LEDs[8] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 
0xFFFF};



while(1){

//------------ SPALTE 0 -------------//
_delay_ms(LED_delay);
pcf8574_set_outputs (PCF_row,0xFF);//alle LEDs aus!
pcf8574_set_outputs (PCF_col,0b00000001);//Spaltenauswahl -> Spalte 0 
Aktiv
pcf8574_set_outputs (PCF_row,LEDs[0]);//Zeilen in Spalte 0 schreiben

pins = pcf8574_get_inputs (PCF_row);//Auslesen der Zeilen
pins &= 0x07;//Maskieren mit 00000111(brauche nur P0,P1,P2)

//mit entprellung
if (pins == 0b00000110){
 if (!(TFLAG[0] & (1<<0))){//wenn Tasterflag nicht gesetzt
  LEDs[0] ^= 0b00001000;//LED toggeln
  TFLAG[0] |= (1<<0);//setze Tasterflag
 }
} else { TFLAG[0] &= 0xFE; }//lösche Tasterflag

if(pins == 0b00000101){  //Taster Zeile 1 gedrückt
 if (!(TFLAG[0] & (1<<1))){
 LEDs[0] ^= 0b00010000;//LED toggeln
 TFLAG[0] |= (1<<1);//setze Tasterflag
 }
} else { TFLAG[0] &= 0xFD; }//lösche Tasterflag

//------------ SPALTE 1 -------------//

genauso nur mit LEDs[1]

//------------ SPALTE 2 -------------//

usw nur mit LEDs[2]

//------------ SPALTE 3 -------------//

usw nur mit LEDs[3]

//------------ SPALTE 4 -------------//

usw nur mit LEDs[4]

//------------ SPALTE 5 -------------//

usw nur mit LEDs[5]

//------------ SPALTE 6 -------------//

usw nur mit LEDs[6]

//------------ SPALTE 7 -------------//

usw nur mit LEDs[7]

//-----------------------------------//




.... dann setze hier nach je nach Auswertung
zb
LEDs[5] |= 0b00100000; //unset
oder
LEDs[6] |= 0b01000000; //unset
oder
LEDs[7] &= 0b10111111; //set

Das Problem ist jetzt, sobald ich in eins von den Feldern 
LEDs[0]...LEDs[7] eine 0 an erster stelle reinschreibe.

also so LEDs[6] &= 0b01111111; //set
oder so LEDs[1] &= 0b01111111; //set
(damit will ich die LEDs in der letzten Zeile zum Leuchten bringen)

und es später beim erneutem Durchlauf weiter an die Funktion gegeben 
wird die meine pcf expander ansteuert

... bleibt der ATmega8 hängen.

}
}

Den Array habe ich oben in der main so deklariert
int LEDs[8] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 
0xFFFF};

und ich benutze die pcf8574.c (siehe oben)

Kommischerweise stürzt das Programm nicht ab wenn ich in die
pcf8574_set_outputs (PCF_row,0b01111111);
reinschreibe.

Die Funktion ist ja so deklariert
void pcf8574_set_outputs (unsigned char address, unsigned char byte)
ich habe auch schon die die LEDs[8] als unsigned char LEDs[8] 
deklariert, bringt aber nichts.

Hätte jemand eine Idee woran es liegen könnte?
Riecht sehr stark nach Typenunverträglichkeit nur habe ich schon alles 
ausprobiert. Es bringt einfach nichts. Es bleibt immer Hängen sobald ich 
in die LEDs[n] &= 0b01111111 eine 0 an erster Stelle reinschreibe.
(erste Stelle ist bei mir letzte Zeile)

In all den anderen Zeilen funktioniert es ja!!!

von Slawa S. (slawa_s)


Lesenswert?

Hätte den niemand eine Idee?

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.