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!!!