port-expander-matrix Bug ATmega8 hängt sich in der letzten Zeile auf

OP #1834868
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!!!
Angehängte Dateien:

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.