PIC18F252, CCS-IDE 3.9

OP #5835562
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
              }
OP #5835752
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
OP #5837572
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren