Hi Da_Vinci13

mal in Kurzform:

Schreib eine Headerdatei etwa mit dem Inhalt (dies nur als Beispiel, auszugsweise, aus einer *.h-Datei die ich grad parat habe) Variablendeklarationen, Funktionsprototypen:

Code:
/* Sicherung 15sep08 1120   ...C1..\m168D_10\m168D_com_10x80.c 
 ===================================================================================
 ===================================================================================
  Target MCU        : M168
  Target Hardware   : div, z.B. flex168, m168D
  Target cpu-frequ. : In der Quelle wählbar
 ===================================================================================
  Enthaltene Routinen:
    KEINE - nur Variablendefinitionen
 ===================================================================================
  *** Versionsgeschichte:
 ====================
 x82 29Jan09 Iz_diff0 wird im Test als Null angezeigt: unsigned-Problem?
             ie_mot12 (-34?) wird als 63... angezeigt: unsigned-Problem?
....
 x00 27jan08 00:ff Erster Aufbau von \2-drehz-mess\r2d_common_x00.h

  Original: ...C1..\2_drehz-mess\ -
 ===================================================================================
  *** Aufgabenstellung : Initialisierung und Abarbeitung von Interuptroutinen für
  die Programmsammlung zum R2D2cd
 ================================================================================ */



/*==================================================================================
 ===================================================================================
 ================================================================================ */
/*##### Variablenliste, global #####*/
/*==================================================================================
 ===================================================================================
 ================================================================================ */


/*==================================================================================
  Motordaten: Steuerung, Motortests
 ================================================================================ */
uint8_t imot = 1, kre = 1, kli = 1;
uint8_t min = 15, max = 122;
uint16_t mosore = 20, mosoli = 20;      // Sollfahrt rechts und links
uint8_t moffre = 0, moffli = 0;         // Geschwindigkeitsoffset Motor re/li
volatile uint8_t most12 = 0, most34 = 0;        // Motoransteuerwert / Absolutwert
                                // vgl. zu most oben mosore/~li, moffre/~li etc.
volatile uint16_t stupsi12=0, stupsi34 = 0;     // Sollwert Motoransteuerung
                                                // = Führungsgröße w
volatile uint16_t tupsi12=0, tupsi34 = 0;       // Istwert Motor
                                                // = Regelgroesse x (= Iz_diff0)
// volatile float e_mot12, esum12, y12;         // für Regelalgorithmus
volatile int16_t ie_mot12, iesum12, iy12;       // für Regelalgorithmus
volatile int16_t idrz12, ndrz12;                // Ist-/Solldrehzahl
                                                  
volatile int16_t ie_mot34, iesum34, iy34;       // für Regelalgorithmus
volatile int16_t idrz34, ndrz34;                // Ist-/Solldrehzahl
                
uint16_t Iservo;                                // Counter für Regelfrequenz
                           
                           
/*==================================================================================
  Encoderbedienung und Zeitdaten
 ================================================================================ */
/*Ab rev x42: Indizes f EXT-INT0 + EXT-INT1 angepasst: 0 und 1 statt 1 und 2      */
/* beachte: volatile!  und   Vorzeichenlos reicht für alle                        */

volatile uint16_t Iencdr0, Iencdr1;	/* Counter für Encoder-ticks
  Werden in der ISR hochgezählt und im main bei Gelegenheit
    (welcher? - nach 5 sec?) - spätestens aber beim Fahrtrichtungswechsel
    auf Null gesetzt. DAnn aber die Werte musv+musi entsprechend anpassen    */


volatile uint16_t Ienc0alt, Ienc1alt;   // Encoder-Altwerte


volatile uint16_t Iz_ysecv0, Iz_ysecv1;	/* Zeitmarke "µsec"
  des vorletzten Interrupts in der Einheit 100 Mikrosekunden. Ist der Wert des
  hochlaufenden Timers zum Interruptzeitpunkt i-1                            */

volatile uint16_t Iz_yseci0, Iz_yseci1;	/* Zeitmarke "µsec"
    des letzten Interrupts in der Einheit 100 Mikrosekunden. Ist der Wert des
    hochlaufenden Timers zum Interruptzeitpunkt i (letzter Interrupt)        */

//volatile uint16_t Iz_diff0, Iz_diff1;	  
volatile int16_t Iz_diff0, Iz_diff1;	
                                       /* Zeitdifferenz
  Beim Abarbeiten des Interrupts wird yseci mit time1 belegt und diff aus der
    Differenz yseci-ysecv errechnet. Danach wird yseci nach ysecv kopiert.
    Im main bzw. regelung wird aus Iz_diffx die Drehzahl berechnet.               */

volatile uint16_t Izeit_1;			/* Timer läuft hoch
  Die Interruptroutine läuft mit 20 kHz (Möglicherweise sind 100 kHz besser)
    Beim Start des Timers läuft der Zähler time1 hoch und wird nach 3 sec -
    also beim Wert 60 000 - wieder auf Null gesetzt. Dabei werden die Werte
    ysecv und yseci angepasst                                                  */
volatile uint16_t Izthrznt;     // Der zeitliche Horizont, z.B. 20000 für 2 sec

volatile uint16_t icntdwn;      // Countdownzähler (max 43200 = 12 Std)
volatile uint16_t icdwvor;      //   x Sekunden Vorwarnung mit blLED
volatile uint16_t icdwmax;      //   x Sekunden aktueller Maximalwert für Countdown

volatile uint16_t Iztmp_0;			/* Timer läuft hoch
  Zeitdifferenz zwischen zwei extINT0 wenn die Differenz kleiner als 10 ist, 
  break - dann ist der Interrupt  viel zu kurz um korrekt zu sein.               */

volatile uint16_t Iztmp_1;			/* Timer läuft hoch
  Zeitdifferenz zwischen zwei extINT1 wenn die Differenz kleiner als 10 ist, 
  break - dann ist der Interrupt  viel zu kurz um korrekt zu sein.               */

volatile int16_t Ikre, Ikli, Iregel1, Iregel2;	/* Zeitvorgaben und Regelwerte
  Ikre und Ikli sind die Entsprechungen von kre und kli, sie werden
    in der Regelungsroutine verarbeitet                                          */
                 
volatile uint8_t Idelta1=100, Idelta2=100;      /*                               */

...............................


/*==================================================================================
 ===================================================================================
 ================================================================================ */
/*##### Modulliste           #####*/
/*==================================================================================
 ===================================================================================
 ================================================================================ */
                 
                 
/*==================================================================================
  Routinen in Datei m168D_dme_10x80.c        Routinen:     irDME-Routinen
 ================================================================================ */
  void TC0IRP_CMA_init(void);
  ISR(TIMER0_COMPA_vect);
  void TC1PWM_init(void);               //Init Timer/Counter 1, PWM-Signal 
  void setSRV1(uint16_t speed1);        //Relative Pulslänge auf OC1A/PB1
/*==================================================================================
 ================================================================================ */
                 
                 
/*==================================================================================
  Routinen in Datei m168D_inf_10x81.c           Routinen:     INFO´s
 ================================================================================ */
  void init_USART0( unsigned int ubrr ); 
  void sendchar(unsigned char c);
  void sendUSART(char *s);
  char getchar(void);
  void getsUSART(char* Buffer, uint8_t MaxLen);
  static inline void setportbon(const uint8_t n);   // für Ports B, C und D
  void info01(void);            // Startinfo     #####>>>>> steht IMMER im main
  void info_Motst(void);        // Ausgabe Daten zu ~tst~/void Motst_aufab(void)
  void info_Motupm(void);       // Ausgabe Upm zu ~tst~613~/void Motst_aufab(void)
  void inf_irDME(uint8_t m1, uint8_t m2, uint8_t m3);
/*==================================================================================
 ================================================================================ */
....................
Aufpassen bei der Syntax für die Funktionsprototypen. Die werden so dargestellt wie oben geschrieben, praktisch wie die Funktion selbst, aber mit Semikolon danach ! ! !

Im main wird so darauf Bezug genommen:

Code:
#include "m168D_com_10x82signed.h"    // commonvariable
...bzw. in etwas mehr "Umgebung" des Hauptprogramms
Code:
/* Sicherung 28Jan09 1230   ...C1..\m168D_10\m168D_10x83.c
 ===================================================================================
  Target MCU        : ATmega168
  Target Hardware   : m168D für R2D03
  Target cpu-frequ. : 20 MHz, externer Quarzoszillator
 ===================================================================================
  Enthaltene Routinen :
        #includes siehe unten
                
  void info01(void)   // Startinfo   #####>>>>> steht IMMER im main-modul
  int main(void)
 ===================================================================================
  *** Versionsgeschichte:
 ==================== 
 x83 28Jan09 1230 tupsitest Testweise Ausgabe stupsi, tupsi etc zur Kontrolle der 
     Fahrgeschwindigkeit: ==> Iz_diff0 wird falsch ausgegeben UND
     ie_mot12/34 darf nicht usigned sein (kann ja negativ werden).
..............................
 x00 17mai08 1556 Übernahme von *x342.c v. 26jun08 1336
 ===================================================================================
  *** Aufgabenstellung : Software für R2_D03
              in einer ersten Ausbaustufe angelehnt an: siehe Original              
  Original: ...C1..\m168D_10\m168D_10x342.c   26juni08 13ff
 ===================================================================================
Alle möglichen Portanschlüsse am ATMega168:
               ==============          ===
       PCINT14,/RESET,PC6   1   28   PC5,ADC5,SCL,PCINT13
          PCINT16,RxD,PD0   2   27   PC4,ADC4,SDA,PCINT12
          PCINT17,TxD,PD1   3   26   PC3,ADC3,PCINT11
         PCINT18,INT0,PD2   4   25   PC2,ADC2,PCINT10
    PCINT19,OC2B,INT1,PD3   5   24   PC1,ADC1,PCINT9
       PCINT20,XCK,T0,PD4   6   23   PC0,ADC0,PCINT8
                      VCC   7   22   GND
                      GND   8   21   AREF
  PCINT6,;XTAL1,TOSC1,PB6   9   20   VCC
   PCINT7,XTAL2,TOSC2,PB7  10   19   PB5,SCK,PCINT5
      PCINT21,OC0B,T1,PD5  11   18   PB4,MISO,PCINT4
    PCINT22,OC0A,AIN0,PD6  12   17   PB3,MOSI,OC2,OC2A,PCINT3
         PCINT23,AIN1,PD7  13   16   PB2,/SS,OC1B,PCINT2
     PCINT0,CLKO,ICP1,PB0  14   15   PB1,OC1A,PCINT1
--------------------==========-----------------------
Vorgesehene/belegte Anschlüsse am (ATMega168)-R2D2cc:
            ==================                        (für ´168 d = Drive/Director)
                   /RESET   1   28   PC5,(SCL) aktuell LED
                RxD,(PD0)   2   27   PC4,(SDA) aktuell LED
                TxD,(PD1)___3   26___PC3, ADC0 / Sharp GP2D120
  (SigMot1) ExtINT0,(PD2)   4   25   PC2, SFH 5110, IN irDME 4   } vorgesehen
  (SigMot2) ExtINT1,(PD3)   5   24   PC1, SFH 5110, IN irDME 3   } evtl. auch in
  (E7)  _|-- 3,4 Guz, PD4___6   23___PC0, SFH 5110, IN irDME 1-2 } ´168 n
                      VCC   7   22   GND
                      GND   8   21   AREF
               XTAL1  PB6___9   20___VCC
               XTAL2  PB7  10   19   PB5, (Startblink/LED0, 3sec v Tmr0, Mehrzweck)
  (E6) PWM 1,2 uz+Guz,PD5  11   18   PB4  _|-- 3,4  uz  (E4) (hier oder PB3)
  (E5) PWM 3,4 uz+Guz,PD6__12   17___PB3, Reserve 2
  (E8)   _|-- 1,2  uz,PD7  13   16   PB2, Servo
  (E9)   _|-- 1,2 Guz,PB0  14   15   PB1, OC1A = SFH 415, OUT (irDME)             */
/* ============================================================================== */
                   
#include <stdlib.h> 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>       // Dies für die UART-Library "Fleury"
/* Beachte C:\Programme\WinAVR-20070525\avr\include\avr\iomx8.h */
          
#include "m168D_com_10x82signed.h"    // commonvariable
#include "m168D_dme_10x80.c"    // irDME Routinen
#include "m168D_inf_10x81.c"    // Info-Ausgaben     - - - Usart zuerst init.
//#include "m168D_kal_10x81.c"    // Kalibrierungen, speziell irDME´s
//#include "m168D_kal_10x81x.c"    // Kalibrierungen, speziell irDME´s
//#include "m168D_kal_10x81y.c"    // Kalibrierungen, speziell irDME´s
#include "m168D_kal_10x81zz.c"    // Kalibrierungen, speziell irDME´s
#include "m168D_mot_10x80.c"    // Motorroutinen incl. PWM, Regelung Motor
#include "m168D_tmr_10x81.c"    // Timer, PWM
#include "m168D_gpd_10x80.c"    // ADC-Routinen für GP2D120 und Aufruf Regelung
//#include "m168D_tst_10x82x.c"    // Testroutinen
//#include "m168D_tst_10x82y.c"    // Testroutinen
#include "m168D_tst_10x83_tupsitest.c"    // Testroutinen

#define MCU = AVR_ATmega168

#define F_CPU  20000000         // Quarz 20 Mhz-CPU
// #define BAUD   57600
#define UART_BAUD_RATE     57600        // Änderung am 19sep08 2220 für lib Fleury
#define MYUBRR ((unsigned int)((unsigned long) F_CPU/16/BAUD-1)) //vgl doc2545,S179
//            und https://www.roboternetz.de/phpBB2/ze...=375337#375337
/* ============================================================================== */
/*   Interrupt-Handler und -Adressen
Address Labels Code Comments
siehe C:\Programme\WinAVR-20070525\avr\include\avr\iomx8.h sowie
Interruptvektoren/-vektortabelle in *doc2545, S 63 von AVR                    */

/* ============================================================================== */
// =====  Subroutinen  =============================================================
/* ============================================================================== */

.................................

/* ============================================================================== */
/* ===  HAUPTProgramm =========================================================== */
/* Initialisierungen, LED1 kurzblinken als Signal für Programmstart,
    Ausgabe des Indentifizierungsstrings per USART                                */

  int main(void)
{        
  uint8_t i;
               
//Pins/Ports als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
  DDRB  = 0b00110111;   // siehe aktuell oben oder fortschritt/R2D2
  PORTB = 0b11001000;   //    und Port/Pull Ups (1)  aktivieren
              
  DDRC  = 0b01110000;   // PC3 ist ADC3, PC0 .. 6 , kein PC7-Pin bei m168
  PORTC = 0b00000111;   // Änderung für ADC: PC3 ist Eingang ##>> OHNE Pullup !!
                        //   Encoder_1 = ExtINT0 = PortD2, Encoder_2 = PortD3
  DDRD  = 0b11110000;   // -> siehe unter DDRB,  sowie PD2,3 extInt
  PORTD = 0b00001111;   //    Pull Ups aktivieren
               
  for(i=0; i<20; i++)   // LED auf PC5 5 sek blinken lassen 
                        //   ###>>> bevor Interrupts erlaubt sind, um ungewollte
			//   Resets u.ä. besser erkennen zu können
  {
    setportcon(5);      //   Hellphase
    waitms(3);          //    ... damit man kurze resets besser erkennt
    setportcoff(5);     //   Dunkelphase
    waitms(97);
  }        
                   
  TC0PWM_init();        //Init Timer/Counter0 für PWM/Motoren               
  TC0IRP_CMA_init();    //Init Tmr/Cnt0 CmprMtchA Interrupt enable - zu dme
                              
  TC1PWM_init();        //Init Timer/Counter1 36kHz/27,8µs am 19 Mai 2008, 2258Uhr
  setSRV1(128);         //  und gleich irLED einschalten auf Maximalwert-
                        
  Isvs1    = 27;        //Vorgabewert "Servoansteuerung" auf Mittelstellung
  TC2TMR_init();	//Init Timer/Cntr2-Interrupt Zeitnahme 20 kHz/50 µsec
                        
  ADC3_10_init_irupt(); // Initialisiere ADC3, 10 Bit, MIT Interrupt
//  init_USART0(MYUBRR);  //USART0 initialisieren mit wählbarer Baudrate (s.o.)
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );  // Init "Fleury"

  XTI_0_1_init();       //Initialisiere den externen Interrupt 0 und 1
                        
  sei();		//Globalen Interrupt freigeben
                                                
  waitms(1000);         
  init_KO_lst();        //Initialisierung KOnstanten-Liste = Werte + div. Vorgaben
                        //  Aufruf NACH sei(), weil irDME´s abgefragt werden.
  waitms(1000);         
  info01();             //Startinfo über USART ausgeben
                         .................
}
// =====  Ende des Testabschnittes, er kann aus mehreren Abschnitten bestehen =====
// ================================================================================
              
/*  Es folgt der aktuelle Übersetzungskommentar:
Build started 30.9.2008 at 18:13:37
avr-gcc.exe 
 -I"D:\pro-fils_D\compu+MC\C1 mC Projekte\m168D_10\alter_code\aug_08_allgem"
 -I"D:\pro-fils_D\compu+MC\C1 mC Projekte\m168D_10\alter_code\jul_08_allgem" 
 -mmcu=atmega168 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char
 -funsigned-bitfields -fpack-
struct -fshort-enums -MD -MP -MT m168D_10.o -MF dep/m168D_10.o.d  -c  ../m168D_10.c

avr-gcc.exe -mmcu=atmega168 -Wl,-Map=m168D_10.map m168D_10.o     -o m168D_10.elf
avr-objcopy -O ihex -R .eeprom  m168D_10.elf m168D_10.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" 
 --change-section-lma .eeprom=0 --no-change-warnings 
 -O ihex m168D_10.elf m168D_10.eep || exit 0
c:\Programme\WinAVR-20070525\bin\avr-objcopy.exe: there are no sections to be copied!
avr-objdump -h -S m168D_10.elf > m168D_10.lss

AVR Memory Usage
----------------
Device: atmega168

Program:    6772 bytes (41.3% Full)
(.text + .data + .bootloader)

Data:        494 bytes (48.2% Full)
(.data + .bss + .noinit)


Build succeeded with 0 Warnings...
 ============================================================ */
WENN nun die *.h im gleichen (Projekt-) Verzeichnis ist wie Deine haupt*.c mit dem "main"-Modul, dann reicht dieses #include xy.h . . . mehr musst Du nicht machen - den Compiler musst Du nicht mehr sagen - der sucht im aktuellen Verzeichnis ganz von selbst. Und dorthin gehört die *.h ja auch . . . .

Ich selbst mache für jedes "Programm" eine eigene Projektdatei - in der auch eine Subdirectory "alter code" existiert *ggggg*.

Ist das so genug verständlich? Oder zuviel Codebeispiel? Zu undurchsichtig?