PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupts schuld an GLCD/Variablen Fehler



sBronco
28.07.2011, 13:30
Hi,
das ganze ist jetzt etwas komplizierter.


Ich habe einen Mega128 im Einsatz, das ganze ist eine Lüftersteuerung für meinen PC.
Der Prototyp ist seit einem guten halben Jahr im Einsatz und funktioniert tadellos.

Die 2. Version steht hier vor mir auf dem Schreibtisch und funktioniert ebenfalls perfekt,
solange ich die Lüftergeschwindigkeit nicht abfrage.

Die Int0 - Int3, Int6 und Int7 sind neu dazugekommen um die Flanken vom Fan festzustellen.

Es wird immer nur ein Lüfter abgefragt und das auch nicht ständig,
sondern alle 30sec ein kompletter Durchlauf.



' SETFAN Speedcheck
Macro SETFAN
tFan = 5 : flag.1 = 1 : FANSIG = 0
Select Case fanchannel
'Config GREEN = Output
Case 1:
GIFR.IntF3 = 1
Enable Int3
Case 2:
GIFR.IntF2 = 1
Enable Int2
Case 3:
GIFR.IntF1 = 1
Enable Int1
Case 4:
GIFR.IntF0 = 1
Enable Int0
Case 5:
GIFR.IntF7 = 1
Enable Int7
Case 6:
GIFR.IntF6 = 1
Enable Int6
End Select
cFan = 0
End Macro

Macro GETFAN

flag.1 = 0
Disable Int3
Disable Int2
Disable Int1
Disable Int0
Disable Int7
Disable Int6
glcd.0 = 1
'Shift FANSIG , left , 5
FANSPEED(fanchannel) = FANSIG * 50
'Shift FANSPEED(fanchannel) , right , 1 , SIGNED
Incr fanchannel
If fanchannel > 6 then
fanchannel = 1
tFan = 150
End If
End Macro

'################################################# #
' FANSIGNAL INTERRUPT
'################################################# #
FANISR:
incr FANSIG
Return

Die ganze Sache funktioniert eine ganze Weile gut,
bis die Anzeigeroutine durchdreht.


'################################################# #
SUB MENUMAIN ' Haupt Anzeige
If rebuild = 1 then
CLS : rebuild = 0 : TempA = PWM0
End If

For ch = 1 to 6

If glcd.2 = 1 then
LEISTUNGSANZEIGE ' MACRO Leistung
TEMPERATURANZEIGE ' MACRO Temperatur
If ch = 6 then glcd.2 = 0
End If
DREHZAHLANZEIGE ' MACRO Drehzahl
Next ch
'################################################# #

In diesem ProgTeil wird nacheinander jeder der 6 Kanäle auf seiner Position angezeigt, wenns dann passiert, zählt die For ch = 1 to 6 aber nicht hoch, sondern bleibt 0 obwohl da 1 als Startwert steht.
Während der gesamten Anzeigeroutine sind Interrupts global DISABLED.

Wenn die Drehzahlerfassung auskommentiert ist, kommt es NICHT zu Fehlern.

Ich habe den FAN Teil jetzt schon zig mal umgeschrieben, andere Zeiten benutzt, nur 2 Flanken ausgewertet (1 Umdrehung) und aus der Dauer gerechnet, alle Stacks erhöht (verdoppelt).
Das Programm ist im wesentlichen das selbe das in meinem PC fehlerfrei arbeitet.

Ich komm nicht drauf woran das liegen könnte


EDIT: Niemand eine Idee?