Hallo, Ich verwende den CC5X Compiler free version für den PIC16F676. Das Problem ist, dass 16 bit Variablen vom Compiler als 8 bit Variablen gehandhabt werden.zB. 16 bit Zählvariable kommt nur bis 255. Ich habe den Compiler in die MPLAB6.50 eingebunden. Kennt jemand dies Problem und die Lösung dazu? Mit dem HI-Tech Compiler habe ich keine Probleme jedoch unterstützt die freie Version nicht den 16F676. Vielen Dank
Hallo das Problem liegt darin, daß die PIC's 8 Bit-Prozessoren sind. Wird der Variablentyp int verwendet, hat die Variable automatisch 8 Bit. Für 16-Bit ist long zu verwenden. Gerhard
Hallo nochmal es gibt da noch ein PIC-Forum: www.fernando-heitor.de Vielleicht weiß da jemand Rat Gerhard
"das Problem liegt darin, daß die PIC's 8 Bit-Prozessoren sind" Das hat absolut nichts mit der Bitbreite der CPU zu tun. Auch alle mir bekannten 8051 und AVR Compiler halten sich an den ANSI-Standard. Und da gilt eben: char = 8 Bit int = 16 oder 32 Bit long = 32 oder 64 Bit D.h. der CC5X hält nicht den ANSI-Standard ein. Peter
Hallo Peter das ist nicht richtig Der Ursprung des INT ist die Breite des Datenbuses. Gerhard
@Gerhard, kannst Du mir bitte einen Link zu einer ANSI-C Referenz nennen, wo das steht ? Ich habe bisher nur ausschließlich C Compiler gesehen, wo int mindestens 16 Bit ist, egal ob für 4-, 8- oder 16-Bitter. Es würde ja auch die Portabilität von C Code drastisch einschränken, wenn das nicht so wäre. Peter
Hallo Peter ich weiß nicht was in der ANSI-C ref steht, aber ich bin schon einige male über den Blödsinn mit INT gestolpert. Und deshalb hab ich mir das INT abgewöhnt und schreib immer short oder long, bzw int8 oder int16. Solche "Inkompatibilitäten" treten verschiedentlich auf besonders natürlich beim PC mit int als 16Bit bzw 32 Bit. Auch beim AVR ist das nicht so ganz klar - wenn man sich die Doku anschaut - was der Compiler macht wenn man nur int schreibt stat int8 oder int16. Bei 8-Bit Mikrocontrollern (z.B. CCS) ist int = int8, damit entpsricht int der Prozessor-Datenbus - Breite. Gerhard
short oder long bringt nichts, es gilt: short int <= int <= long int. Allein, wenn Du int8, int16 oder long32 nimmst bist Du auf der sicheren Seite, da das keine Standard-Symbole sind. D.h. die sind in irgendeinem *.h-File definiert und daher dem Compiler anpaßbar. Ich habe mal einen C-Kurs mitgemacht, das war noch auf VMS-Maschinen und da galt: int ist immer mindestens 16 Bit, kann aber auch mehr sein. Deshalb sollte man, wenn man einen 16 Bit Überlauf absichtlich auswerten will immer (wert & 0xFFFF) schreiben, damits bei 32 bit auch noch klappt. Peter
Unterschiedliche Int-Grössen siehe: http://www.lysator.liu.se/c/bwk-tutor.html unter 3. Hier ein kurzer Auszug: C has four fundamental types of variables: int integer (PDP-11: 16 bits; H6070: 36 bits; IBM360: 32 bits) char one byte character (PDP-11, IBM360: 8 bits; H6070: 9 bits) float single-precision floating point double double-precision floating point Volker
Hallo Peter mit short und long hast Du recht. Fazit: man kommt in keinem Fall darum herum, sich im Programmers manual des C-Compilers schlau zu machen, was Sache ist. Meines Erachtens ist int als int8 zwar Realität aber doch eher unlogisch. es ist bedauerlich, daß es hier keinen einheitlichen Standard gibt. Selbst beim PC gibts meines Wissens Unterschiede zwischen Microsoft C und Borland C. "Früher" gabs neben int nur noch short und long. da wars dann klar short = 16 Bit und long = 32 Bit. Diese Verwendung ist bzw war anwendbar so lange die Microprozessoren mit 16 bzw 32 Bit datenbus ausgestattet waren. Aber das ändert sich jetzt wieder. Was ist int beim Athlon 64 ? Gerhard
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.