Hä??? Die Zeile steht doch schon in rc5.h... Die Doppelte Deklaration sollte also nix zur Sache tun.
Die Zeile sagt dem Compiler, daß rc5 vom Typ rc5_t ist, ohne jedoch so ein Objekt anzulegen, d.h. Platz dafür zu reservieren.
Die Compiler kann also auf das Objekt (bzw) seine Komponenten, Adresse, ...) zugreifen, ohne zu wissen, wo das Ding genau liegt. Das Anlegen (=Instanziieren, Definieren) geschieht in rc5.c mittels
rc5_t rc5;
In beiden Fällen muss der Typ rc5_t schon bekannt sein, sonst gibt's nen Compilerfehler.
Ohne das extern... in main.c scheint der Compiler (bzw. Linker) auf zwei unterschiedliche Objekte rc5 zuzugreifen, so daß das, was in rc5.c nach rc5 geschrieben wird, was anderes ist als in main aus rc5 gelesen wird (weil zweites ein anderes Objekt ist).
Genaue Aussagen kann man eigentlich nur mir dem Code zusammen mit Map-File und Assemblerausgabe des Compilers machen, d.h. ob's sich evtl um einen Compiler-, Linker- oder Makefile-Fehler handelt.
https://www.roboternetz.de/wissen/in...en_mit_avr-gcc
https://www.roboternetz.de/wissen/in...file_erstellen