Ich bin im Moment an einem Schulprojekt. Ziel ist es ein einfaches
Oszilloskop zu erstellen. Die Anwendung schlussendlich ist eigentlich
nicht wichtig, es geht nur ums Prinzip. Nun habe ich aber ein komischs
Problem.
Ich benutze einen 80C537-N als Controller, die Ausgabe erfolgt über ein
T6963C-Display.
Das Speichermodell ist small, einige Variabeln sind als data andere als
idata und ein grosses Array ist als xdata definiert. Um Variabeln auch
im Interrupt zu gebrauchen habe ich globale Variabeln verwendet. Habe
ich dies üerhaupt richtig gelöst?
IN MAIN.C:
1 | char xdata ScopeMem[220]; // Speicherung der ADC-Daten in externem Speicher
|
2 | char MemFlag = 0; // Flag für Timer0-Überlauf
|
3 | unsigned char MemPos = 0; // Position in ScopeMem
|
IN INTERRUPT.C:
1 | extern char xdata ScopeMem[220]; // Speicherung der ADC-Daten in externem Speicher
|
2 | extern char MemFlag; // Flag für Timer0-Überlauf
|
3 | extern unsigned char MemPos; // Position in ScopeMem
|
Im main() sollte eigentlich gar nicht viel gemacht werden, dieses wurde
um den Fehler zu suchen stark vereinfacht.
Das Problem ist, dass auf dem Display in Abhängigkeit des Interrupts
eine andere Ausgabe erfolgt. Eigentlich sollte das Display nur
intialisiert werden und auf ihm ein Raster gezeichnet werden. Ist im
Interrupt aber folgende Zeile aktiv, so wird noch eine weitere Funktion
ausgeführt.
Besagte Zeile, welche auskommentiert wird oder nicht (befindet sich in
interrupt.c):
1 | ScopeMem[MemPos] = ADDAT; // AD-Wert zwischenspeichern
|
Funktion, die fälschlicherweise aufgerufen wird, wenn obere Zeile
ausgefürt wird (befindet sich in T6963C.c):
1 | void T6963cPutADCline(int idata delay, int idata zoom)
|
Ich glaube, dass diese Funktion nur einmal am Anfang aufgerufen wird.
Nun, ich sehe nicht ganz wo das Problem liegt, allerdings kenne ich mich
mit Memorybereichen etc. auch nicht sonderlich gut aus. Im Anhang habe
ich noch das MemoryMap des Projektes angehängt.
Dieses sieht zwar je nach Code-Optimierungslevel (welches im Moment auf
Level 0 'constant folding' eingestellt ist) ein bisschen anders aus, der
Fehler wirkt sich aber gleich aus.
Es wird wohl irgendwas in der Speicherzuordnung (Stack, Adressierung der
Funktionen, o.ä.) nicht stimmen.
Wäre sehr dankbar wenn mir jemand helfen könnte. Bin am verzweifeln!
[Anhängend in einer Datei:]
- main.c
- interrupt.c