Forum: Compiler & IDEs PIC18F252, CCS-IDE 3.9


von Uli N. (uln)


Lesenswert?

PIC18F252, CCS-IDE 3.9

Um überhaupt ein Debug-Mittel bei der Erweiterung eines Uralt-Systems 
zur
Hand zu haben, wollte ich in einem Fifo zwischengespeicherte Debug-Werte
alternierende zur Temperatur üner die serielle Schnittstelle ausgeben.

In einem ersten Schritt habe ich mal zwei Nibble meines ms-Timers 
ausgegeben
und schon damit Problem:

- gebe ich die beiden unteren Nibble des 16bit Return-Wertes aus, 
klappern
  auch die beiden Nibble auf der RS232-Leitung
- gebe ich aber die mittleren beiden Nibble aus (time = ((uint16_t) 
msTime()) >> 4;),
  klappert auf der RS232-Leitung nur noch der untere Nibble
- und gebe ich schließlich die oberen beiden Nibble aus ( >> 8 ),
  klappert gar nichts mehr, ich habe permanent die Ausgabe "@00".

Das Gleiche dann wiederholt mit einer lokalen statischen Variablen 
(tick), mit dem gleichen Ergebnis - wenn ich das ober Byte der 16bit 
Variable ausgebe ( >> 8), sehe ich auf der RS232-Leitung nur "@00" - 
überschreibe ich die berechneten Werte mit den Werten, die ich beim 
ersten Durchlauf erwarte, erhalte ich als Ausgabe auch "@12", das 
Problem muss also bei shift/and/or liegen! Sieht jemand meinen Fehler?
1
              static signed int tick = 0x1234;
2
3
              static uint8_t toggle = 0;
4
5
              tick += 7;
6
7
              toggle ^= 1;
8
9
              if (toggle)
10
11
              {
12
13
                  uint16_t time;
14
15
                  char h, l;
16
                  
17
                  //time = ((uint16_t) msTime()) >> 8;
18
19
                  time = ((uint16_t) tick);
20
21
                  time >>= 8;
22
23
                  h = (char) (((time >> 4) & 0xF) | 0x30);
24
25
                  l = (char) (((time >> 0) & 0xF) | 0x30);
26
27
                  //h = '1';
28
29
                  //l = '2';
30
31
                  tx_state_a[1] = '@';
32
33
                  tx_state_a[2] = h;
34
35
                  tx_state_a[3] = l;
36
37
                  //tx_state_a[2] = Conv4bitsToAscii(((char) ((time >> 4) & 0xF)));
38
39
                  //tx_state_a[3] = Conv4bitsToAscii(((char) ((time >> 0) & 0xF)));
40
41
              }

: Bearbeitet durch User
von Uli N. (uln)


Lesenswert?

Scheibenkleister - mein Compiler mag mich nicht!

Unter TDM-GCC kommt das raus, was ich erwarte!

Jemand eine Idee, was dem CCS-PIC18-Compiler an meiner Formulierung 
nicht gefällt?
1
i=00000 => @12
2
i=00026 => @12
3
i=00052 => @13
4
i=00078 => @14
5
i=00104 => @15
6
i=00130 => @15
7
i=00156 => @16
8
i=00182 => @17
9
i=00208 => @17
10
i=00234 => @18
11
i=00260 => @19
12
i=00286 => @1:
13
i=00312 => @1:
14
i=00338 => @1;
15
i=00364 => @1<
16
i=00390 => @1<
17
i=00416 => @1=
18
i=00442 => @1>
19
i=00468 => @1?
20
i=00494 => @1?
21
i=00520 => @20
22
i=00546 => @21
23
i=00572 => @21
24
i=00598 => @22
25
i=00624 => @23
26
i=00650 => @24
27
i=00676 => @24
28
i=00702 => @25

von Michael D. (Firma: indEAS) (indeas)


Lesenswert?

Wenn ich es noch richtig im Kopf habe, dann ist der Maximalwert bei 
einem "char" im CCS Compiler 127 (dec).
Poste dein Problem doch einfach im CCS -Forum. Dort bekommst Du schnell 
eine Antwort.

von Uli N. (uln)


Lesenswert?

Danke für den Hinweis - dort gab's schnell einen vielversprechenden 
Hinweis (konnte das noch nicht testen) - bei dem Compiler ist wohl "int" 
nur 8bit breit!

von Michael D. (Firma: indEAS) (indeas)


Angehängte Dateien:

Lesenswert?

Am sichersten du hängst an die int immer die passende Breite:
1
int8 x = 0; 
2
int16 y = 0;
3
....
Steht aber auch so in der Hilfe...

: Bearbeitet durch User
von Uli N. (uln)


Lesenswert?

Ich verwende eigentlich immer die Typen aus "stdint.h", also int8_t, 
int16_t uint8_t, uint16_t, ..  -  nur liefert(e?) der CCS-Compiler keine 
stdin.h mit. weshalb ich sie selbst geschrieben habe und das ging halt 
in die Hosen! Mit einem 8bit int hatte ich nicht gerechnet.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Uli N. schrieb:
> Mit einem 8bit int hatte ich nicht gerechnet.

Vor allem, weil der C-Standard mindestens 16bit verlangt. Wäre also 
nicht konform...

von Uli N. (uln)


Lesenswert?

> Vor allem, weil der C-Standard mindestens 16bit verlangt.

So hatte ich es auch angenommen, war mir da jetzt aber nicht mehr sicher 
- lt. wikipedia ist es aber so:

https://en.wikipedia.org/wiki/C_data_types#Basic_types
bzw.
https://de.wikipedia.org/wiki/Datentypen_in_C#Integer

: Bearbeitet durch User
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
Noch kein Account? Hier anmelden.