PIC-Programmierung in C (mit CC5X)
(Elektronik)


zurück zu Elektronik, Homepage


5. Besonderheiten beim Programmieren mit mehreren Modulen

5.1. Externe Register

Wird eine Variable (= Register) in mehreren Unterprogrammen verwendet, so muss diese Variable als externes Register definiert werden.

Dabei gilt:

  1. Dieses Register darf nur in einer C-Datei (wo dieses Register verwendet wird) definiert werden. Zum Beispiel:
               uns16        sollwert;
               char         zahl1;
            
  2. Zusätzlich muss diese externe Variable auch noch in PROJEKT.H als externe Variable definiert werden. Zum Beispiel:
               /* 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.
nach oben

5.2. Unterprogramme

Befindet sich aufgerufene Unterprogramm nicht in derselben Datei wie das aufrufende Unterprogramm oder aufrufende Hauptprogramm so gelten folgende Einschränkungen:

  1. Es ist nur ein Übergabeparameter möglich
  2. Dieser eine Übergabeparameter kann nur 8bit breit sein
  3. Strukturen können nicht übergeben werden
  4. Für einen eventuellen Rückgabeparameter gelten die selben 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!

nach oben

5.3. Interrupt

Für Interrupts gilt:

  1. Datei int16CXX.h einbinden (z.B. am Beginn der Datei, wo sich die ISR befindet)
               /****************** Include-Dateien *****************************************************/
               #include "PROJEKT.H"
               #include <int16CXX.H>           // Ist fuer die Interrupts notwendig
            
  2. Die Interrupt-Routine (z.B.)
               /****************** 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!
  3. .LKR-File des verwendeten PIC anpassen und im Projektordner speichern (Hier: für den PIC16F877, diese befindet sich z.B. unter C:\\Programme\Michrochip\MPASM Suite\LKR\):

    Die rot markierte Stelle muss entfernt werden, und die blau markierten müssen hinzugefügt werden.
nach oben


zurück zu Elektronik, Homepage

Autor: Buchgeher Stefan
Erstellt: 23. Juli 2006
Letzte Änderung: