www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CC5X Compiler 16 bit


Autor: Helfried Passath (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Gerhard Gunzelmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Gerhard Gunzelmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal

es gibt da noch ein PIC-Forum:

www.fernando-heitor.de

Vielleicht weiß da jemand Rat

Gerhard

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"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

Autor: Gerhard Gunzelmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter

das ist nicht richtig

Der Ursprung des INT ist die Breite des Datenbuses.

Gerhard

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Gerhard Gunzelmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Volker Kattoll (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Gerhard Gunzelmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.