Hallo Leute,
vielleicht hat einer von euch eine Idee.
Ich nutze ein XMEGA384C3 für unsere aktuelle Steuerung.
Hier laufen verschiedene Tasks/Process-Systeme ab.
Wir haben von der Steuerung schon sehr viele im Einsatz, diese laufen ohne Probleme und haben
alle EMV-Tests ohne Beanstandungen bestanden.
Nun haben mir 2 unserer Kunden ein Problem mitgeteilt, bei je einer Steuerung.
Das Display (Soft-SPI) scheint wie eingefroren zu sein, die Steuerung arbeitet aber ohne Probleme ihr Main-Programm ab.
Task/Process-System:
Im Main läuft das Hauptprogramm, die PAE (Prozessabbild der Eingänge) / PAA (Prozessabbild der Ausgänge). Hier wird auch immer der Hardware-Watchdog angetriggert. Sollte sich die Steuerung da irgendwo aufhängen wird ein Reset angestoßen. Somit ist sichergestellt, dass die eigentliche Steuerungs-/Überwachungsfunktion immer läuft.
Da ich dieses Fehlerbild noch NIE hatte, kann ich es nicht richtig einkreisen. Entweder hängt sich das Display auf, die SPI Kommunikation (AVRcoTreiber) oder der Process vom Display/Display-Statuszeile.
Um sicherzustellen, dass der SPI Treiber nicht in 2 verschiedenen Processen auf das Display zugreift, sperre ich immer das Tasksystem während die Daten an das Display gesendet werden:
Da ich den Fehler nicht greifen kann, würde ich gerne überprüfen ob sich der AVRco-SPI-Treiber oder das LCD-Display aufgehängt hat. Und wenn ja würde ich hier gerne den Treiber oder das LCD neu initialisieren.
Hat Jemand von euch eine Idee wie man den Treiber oder das Display Checken könnte?
Angenommen ich versuche vom LCD-Treiberbaustein etwas zu lesen und dieser antwortet, dann sollte ja der SPI-Treiber und das Display funktionieren oder? Klar, wenn ich zwischen dem Display und dem Treiberbaustein im Display irgendwas aufgehängt hat, bekomme ich das so wahrscheinlich nicht mit.
Was macht ihr bei sowas? Resetet ihr euere Displays regelmäßig mal?
Gruß
Thorsten
vielleicht hat einer von euch eine Idee.
Ich nutze ein XMEGA384C3 für unsere aktuelle Steuerung.
Hier laufen verschiedene Tasks/Process-Systeme ab.
Wir haben von der Steuerung schon sehr viele im Einsatz, diese laufen ohne Probleme und haben
alle EMV-Tests ohne Beanstandungen bestanden.
Nun haben mir 2 unserer Kunden ein Problem mitgeteilt, bei je einer Steuerung.
Das Display (Soft-SPI) scheint wie eingefroren zu sein, die Steuerung arbeitet aber ohne Probleme ihr Main-Programm ab.
Task/Process-System:
Code
MainProcess (das eigentliche Mainprogramm))
process ControlJobZKS(128, 180 : iData; 1, suspended); // Ausweislesersystem RS485
Task ControlJob(iData, resumed); // USB
Process USB_RxTx (256, 512 : iData ); // USB
process LCD_Displ(256, 384 : iData; 5); // LCD Hauptbildschirm wird oft schlafen gelegt wenn auf Eingabe gewartet wird
process LCD_DisplBott(180, 384 : iData; 5); // LCD Statuszeile unterer Bildschirmbereich
process ControlJobZKS(128, 180 : iData; 1, suspended); // Ausweislesersystem RS485
Task ControlJob(iData, resumed); // USB
Process USB_RxTx (256, 512 : iData ); // USB
process LCD_Displ(256, 384 : iData; 5); // LCD Hauptbildschirm wird oft schlafen gelegt wenn auf Eingabe gewartet wird
process LCD_DisplBott(180, 384 : iData; 5); // LCD Statuszeile unterer Bildschirmbereich
Im Main läuft das Hauptprogramm, die PAE (Prozessabbild der Eingänge) / PAA (Prozessabbild der Ausgänge). Hier wird auch immer der Hardware-Watchdog angetriggert. Sollte sich die Steuerung da irgendwo aufhängen wird ein Reset angestoßen. Somit ist sichergestellt, dass die eigentliche Steuerungs-/Überwachungsfunktion immer läuft.
Da ich dieses Fehlerbild noch NIE hatte, kann ich es nicht richtig einkreisen. Entweder hängt sich das Display auf, die SPI Kommunikation (AVRcoTreiber) oder der Process vom Display/Display-Statuszeile.
Um sicherzustellen, dass der SPI Treiber nicht in 2 verschiedenen Processen auf das Display zugreift, sperre ich immer das Tasksystem während die Daten an das Display gesendet werden:
Code
//-------------------------------------------------------------
// nur die Fußzeile Refresh
procedure DispBottomRefresh;
var
xDispFor : byte; // Zeile
xiDispFor : byte;// Spalte
xiii : word; // Adresse GraphColArr
begin
xiii:= 54 * 32; // Speicher Adresse für Start setzen
for xDispFor:= 54 to 63 do// Zeile
LOCK(LCD_DisplBott); // Lock für Adresse und Zeile
display_address(0, xDispFor); // hier Zeile setzen
for xiDispFor:= 0 to 31 do // Spalte
DispBW2RGB(GraphColArr[xiii]); // Daten via SPI an LCD schreiben
Inc(xiii);
endfor;
UNLOCK(LCD_DisplBott); // Nach der kompletten Zeile kann der Process unterbrochen werden
endfor;
end DispBottomRefresh;
// nur die Fußzeile Refresh
procedure DispBottomRefresh;
var
xDispFor : byte; // Zeile
xiDispFor : byte;// Spalte
xiii : word; // Adresse GraphColArr
begin
xiii:= 54 * 32; // Speicher Adresse für Start setzen
for xDispFor:= 54 to 63 do// Zeile
LOCK(LCD_DisplBott); // Lock für Adresse und Zeile
display_address(0, xDispFor); // hier Zeile setzen
for xiDispFor:= 0 to 31 do // Spalte
DispBW2RGB(GraphColArr[xiii]); // Daten via SPI an LCD schreiben
Inc(xiii);
endfor;
UNLOCK(LCD_DisplBott); // Nach der kompletten Zeile kann der Process unterbrochen werden
endfor;
end DispBottomRefresh;
Da ich den Fehler nicht greifen kann, würde ich gerne überprüfen ob sich der AVRco-SPI-Treiber oder das LCD-Display aufgehängt hat. Und wenn ja würde ich hier gerne den Treiber oder das LCD neu initialisieren.
Hat Jemand von euch eine Idee wie man den Treiber oder das Display Checken könnte?
Angenommen ich versuche vom LCD-Treiberbaustein etwas zu lesen und dieser antwortet, dann sollte ja der SPI-Treiber und das Display funktionieren oder? Klar, wenn ich zwischen dem Display und dem Treiberbaustein im Display irgendwas aufgehängt hat, bekomme ich das so wahrscheinlich nicht mit.
Was macht ihr bei sowas? Resetet ihr euere Displays regelmäßig mal?
Gruß
Thorsten