Wird eine Variable (= Register) in mehreren Unterprogrammen verwendet, so muss diese Variable als externes Register definiert werden.
Dabei gilt:
uns16 sollwert;
char zahl1;
/* Externe Register */
extern bank0 uns16 sollwert;
extern bank0 char zahl1;
Wichtig ist hier das Schlüsselwort extern und die Angabe bank0
gibt an in welcher Registerbank (bank0 bis ... je nach PIC unterschiedlich)
diese Variable gesichert wird.
Befindet sich aufgerufene Unterprogramm nicht in derselben Datei wie das aufrufende Unterprogramm oder aufrufende Hauptprogramm so gelten folgende Einschränkungen:
Es sind daher nur möglich:
wobei, anstelle von char auch unsigned char, int8 oder uns8 verwendet werden kann.
Alle anderen sind so nicht möglich, zum Beispiel:
Ausweg:
Externe Parameter (Variablen) verwenden! Bei mir lauten diese z.B.
Wichtig:
Dabei müssen natürlich die schon gemachten Hinweise für externe Register beachtet werden!
Weiters:
Zu jedem Unterprogramm muss es auch einen Funktionsprototyp geben. Dieser befindet sich bei mir immer in der
Datei PROJEKT.H. Für die Funktionsprototypen gilt:
extern page0 void Unterprogramm1(void);
extern page0 char Unterprogramm2(char parameter);
Wichtig ist hier das Schlüsselwort extern und die Angabe page0 gibt den Programmspeicherbereich (page0 bis ... je nach PIC unterschiedlich) an.
Anmerkung:
Das Hauptprogramm und die Interrupt-Routine benötigen keinen Funktionsprototyp!
Für Interrupts gilt:
/****************** Include-Dateien *****************************************************/
#include "PROJEKT.H"
#include <int16CXX.H> // Ist fuer die Interrupts notwendig
/****************** ISR - Timer0 ********************************************************/
/****************************************************************************************/
/* Interrupt Service Routine (ISR): */
/****************************************************************************************/
#pragma origin 4
interrupt ISR(void) // Interruptroutine
{
int_save_registers // W, STATUS (und PCLATH) retten
// Beginn der eigentlichen ISR-Routine
int_restore_registers // W, STATUS (und PCLATH) Wiederherstellen
}
Anmerkung: ISR ist dabei ein beliebiger Name!