Forum: Mikrocontroller und Digitale Elektronik Problem mit HiTOP5 und Keil µVision 3


von Christian F. (funke)


Lesenswert?

Guten Tag,

ich hab ein Problem mit HiTOP5. Ein C-Code, für den XC888, läuft in 
µVision3 ohne Probleme. Er arbeitet den Code bis zur while(1)-Schleife 
locker durch.
Lade ich den gleichen C-Code, eingebettet in ein MiniIDE-Projekt, auf 
mein Zielsystem, ein StarterKit von HITEX mit nem XC888, so funktioniert 
es nur noch bis zu einem gewissen Punkt bzw. gar nicht.
Hier mal das Programm, ich hoffe es ist nicht zu lang für die 
Darstellung hier im Forum:
1
#include <xc888.h>
2
xdata char Text1[] ="\nHallo du Da!";
3
void SendChar(char z);
4
void S1Ini(void);
5
void SendTxt(char* text);
6
char tt;
7
int a=0;
8
void main(void)
9
{
10
  S1Ini();
11
  tt = P1_DATA;
12
  if(tt==0x08)
13
  {
14
  SendTxt(Text1);
15
  }
16
  P0_DATA = 0x1;
17
  P0_DATA=0x0;
18
  while(1);    
19
}
20
void SendChar(char z)
21
{
22
  SBUF = z;
23
  while((SCON&0x02) == 0);
24
  SCON &= 0xFD;
25
}
26
void SendTxt(char* text)
27
{
28
int i = 0;
29
while(text[i] != 0x00)
30
  {
31
  SendChar(text[i]);
32
  i++;
33
  }
34
}
35
void S1Ini(void)
36
{
37
SCON = 0x40;
38
BCON = 0x01;
39
BG = 0x9C;
40
P1_DIR=0xFF;
41
}
In HiTOP bleibt er direkt hinter
1
void SendChar(char z)
2
{
 stehen, und ich muss abbrechen. Sowieso ist der Programmablauf komplett 
anders. So lässt er mein Subprogramm S1Ini komplett aus. Er springt auch 
irgendwie gar nicht nach main, sondern gleich zu dieser Stelle hinter
1
SendChar(char z)
2
{
.
Kann das daran liegen das das in MiniIDE erzeugte, die Header-Datei 
MAIN.h mit dazu bezieht? Dort stehen dann die gleiche Deklarationen wie 
in xc888.h. Das müsste aber doch eigentlich egal sein oder?
Ich würde mich sehr über ein paar konstruktive Vorschläge bezüglich 
dessen freuen, denn ich steh da irgendwie auf'm Schlauch.
Was mir persönlich auch weiter helfen würde, wäre wenn ich wüsste wie 
ich die C-Datei in µVision3 auf das StarterKit bekomme, ohne HiTOP. Ist 
das überhaupt möglich?

Freue mich über alle Antworten

Gruß Funke

PS: Ich würde mich auch darüber freuen wenn nicht ganz so wild mit 
Fachbegriffen umgegangen wird, da ich mich in erster Linie nur mit IC's 
befasse die keine Programmierung benötigen, bin also Neuling. Und meine 
Programmierkenntnisse beziehen sich eher auf VBASIC, da ich viele 
Anwederorientierte Programme bisher geschrieben habe, bin also zudem 
auch noch ein C/C++-Neuling.

von Christian F. (funke)


Lesenswert?

Keiner?
Wenn nein, woran liegt es?
Warscheinlich am XC888, mit dem scheint sich keiner so richtig zu 
beschäftigen zu wollen, verständlich wenn man sich das Angebot von 
anderen µC's anguckt.
Ein kopfnicken reicht übrigens!

von Bernd (Gast)


Lesenswert?

Ich würde mal davon ausgehen das deine SendChar Routine einfach nicht 
richtig ist.
1
void putchar_uart (char c)    {
2
  while (!TI);                         // Transmitter ready/busy ?
3
  TI = 0;                              // TI Flag löschen
4
  SBUF = c;                            // Ausgabe an UART
5
}
Seh es mal als Beispiel für nen 8x51 Derivat... ich mag jetzt nicht ins 
Datenblatt schauen aber woher weißt Du, das schon wieder gesendet werden 
kann ?

von Ferkes-Willem (Gast)


Lesenswert?

>ich hab ein Problem mit HiTOP5. Ein C-Code, für den XC888,
>läuft in µVision3 ohne Probleme. Er arbeitet den Code bis
>zur while(1)-Schleife locker durch.

Wo, auf dem Simulator, oder dem Zielsystem mit XC888?

>Lade ich den gleichen C-Code, eingebettet in ein MiniIDE-Projekt,
>auf mein Zielsystem, ein StarterKit von HITEX mit nem XC888, so
>funktioniert es nur noch bis zu einem gewissen Punkt bzw. gar
>nicht.

"den gleichen C-Code" meint Ouellcode oder Object-Code?

Was darf man zwischen Keil und Hitex mischen?

Zum besseren Verständnis:
Aus welchen Komponenten exakt bestehen deine Keil- bzw. Hitex-Tools, und 
was wird gegenwärtig wie (gemischt???) verwendet?

Mit Keil µVision3 hab ich ne Weile gearbeitet, bestand aus IDE mit 
Simulator, Compiler, Debugger, einem ULINK (Debug- und Flash-Tool über 
USB). Ich nehme mal an, die Hitex-Tools sind ähnlich, heißen nur etwas 
anders? Z.B. Tantino statt ULINK?

Immerhin, die Software ist schon mal gelaufen, das ist ein guter 
Ausgangspunkt. Im nächsten Schritt, könntest du die Debug-Option "Nach 
Reset: Sprung zu main" abschalten, falls in Hitex vorhanden. Dann das 
Programm vom Resetpunkt bis zu der Stelle vor main(), wo es hakt, 
durchsteppen. Oder alternativ, so weit es geht, vor main() einen 
Breakpoint setzen. Denn, wenn das Programm nicht bis main() kommt, 
scheint der Knackpunkt davor zu liegen.

Das Programm wird doch nicht etwa den Funktionsprototypen
1
void SendChar(char z);
als Funktionsaufruf verwerten? Nun ja, nichts ist unmöglich!

von Christian F. (funke)


Lesenswert?

Hm, irgendwie versteh ich es noch nicht, aber nun funktioniert es allen 
anschein nach. Ich meld mich wenn ich mehr weiss nochmal, denn momentan 
funktioniert es.

von Christian F. (funke)


Lesenswert?

Also, folgender Code funktioniert in µVision. Er lässt sich simulieren 
und am UART1 erhalte ich dann auch mein gewünschtes Wort.
1
#include "xc888.h"
2
#include <stdio.h>
3
#include <MAIN.h>
4
void MAIN_vInit(void)
5
{
6
  SFR_PAGE(_su1, noSST);         // switch to page1
7
  CMCON         =  0x10;         // load Clock Control Register
8
  SFR_PAGE(_su0, noSST);         // switch to page0
9
  IP            =  0x00;         // load Interrupt Priority Register
10
  IPH           =  0x00;         // load Interrupt Priority High Register
11
  IP1           =  0x00;         // load Interrupt Priority 1 Register
12
  IPH1          =  0x00;         // load Interrupt Priority 1 High Register
13
 }
14
void UART1_vInit(void)
15
{
16
  SFR_PAGE(_pp2, noSST);         // switch to page 2 without saving
17
  P3_ALTSEL0   |=  (ubyte)0x02;  // configure alternate function register 0
18
  P3_ALTSEL1   |=  (ubyte)0x02;  // configure alternate function register 1
19
  SFR_PAGE(_pp0, noSST);         // switch to page 0 without saving
20
  P3_DIR       |=  (ubyte)0x02;  // set output direction
21
  SFR_PAGE(_su3, noSST);         // switch to page 3 without saving
22
  MODPISEL1    |=  (ubyte)0x08;  // configure peripheral input select register
23
  SFR_PAGE(_su0, noSST);         // switch to page 0 without saving
24
  SET_RMAP();                   
25
  UART1_BCON    =  0x00;         // reset baudrate timer/reload register
26
  UART1_SCON    =  0x40;         // load serial channel control register
27
  UART1_BG      =  0x9B;         // load baudrate timer/reload register
28
  UART1_BCON   |=  0x01;         // load baud rate control register
29
  RESET_RMAP();                 
30
}
31
void SendChar(char z);
32
void SendTxt(char* text);
33
int i;
34
int l=0;
35
char Buffer[3]="Hi!";
36
int z =5;
37
void main(void)
38
{
39
  MAIN_vInit();
40
  SendTxt(Buffer);
41
  while(1);
42
  
43
}
44
void SendChar(char k)
45
{
46
SBUF = k;
47
while(!TI);
48
TI=0;
49
}
50
void SendTxt(char* text)
51
{
52
  int l=0;
53
  while(text[l] != 0x00)
54
  {
55
          SendChar(text[l]);
56
    l++;
57
  
58
    if (text[l] == '\n')
59
    {
60
        SendChar(0x0A);
61
        SendChar(0x0D);
62
    }
63
  }
64
}
Selber Code, nur in HiTOP, besser gesagt auf dem XC888, läuft zwar, aber 
ich kann auf'm Oszilloskop nix erkennen. Und ja ich kann ein Oszi 
bedienen, ist ein CombiScop und triggert bei steigenden und fallenden 
Flanken. Es steht im Digitalbetrieb auf Einzelflanke. Also muss er, 
sobald ein Signal kommt, triggern. Tut er aber nicht. Und bei 9,6kBaud 
müsste ich ein paar ASCII-Zeichen auch im Normalbetrieb sehen können.
Problem seh ich also eher im Code, da er im Unterprogramm "void SendChar 
(char k)" die beiden Zeilen "SBUF=k; while(!TI);"auslässt und gleich zu 
"T1=0;" springt. Ist ja, wenn den Code richtig interpretiere, ja nicht 
Sinn und Zweck der Sache. Setze ich "SBUF=k;" nach "T1=0;" dann 
funktioniert es übrigens auch in µVision nicht, da er in der 
"while(!TI)"-Schleife hängen bleibt. Auf dem XC888 geht es dafür wenn 
ich das so schreibe wie Bernd es vorgeschlagen hat, allerdings sendet er 
dann immer noch nicht.
Hat da irgendjemand eine plausible Erklärung für? Bin irgendwie am 
verzweifeln.

von Christian F. (funke)


Lesenswert?

Kann das evtl. auch was mit UART1_vInit zu tuen haben? Der Code ist von 
Dave generiert, also eine potentielle Fehlerquelle. Allerdings werde ich 
aus dem Alternate Select Register nicht wirklich schlau im Datenblatt.

von Bernd (Gast)


Lesenswert?

Keine Ahnung wer Dave ist :-) aber fällt dir was auf ?
1
void SendChar(char k)
2
{
3
SBUF = k;
4
while(!TI);
5
TI=0;
6
}
7
8
void putchar_uart (char c)    {
9
  while (!TI);                         // Transmitter ready/busy ?
10
  TI = 0;                              // TI Flag löschen
11
  SBUF = c;                            // Ausgabe an UART
12
}

Ich hab schon länger nichts mehr mit 8x51 Typen gemacht aber irgendwo 
wirds doch ne vernünftige Doku zu deinem MC geben ? Eigentlich waren 
neuere Typen immer Abwärtskompatibel... die "Basics" sollten sich da 
nicht verändert haben.

von Christian F. (funke)


Lesenswert?

@Bernd

Ich hab SBUF=k; auch schon am Ende der Funtkion gesetzt, blos das mag 
µVision anscheinend nicht, da er bei while(!TI); hängen bleibt. Mit 
Hitop gehts, oder besser gesagt er arbeitet den Code durch. Am Ausgang 
(P3.1) kommt immer noch nix an. Frustierend! Das Datenblatt, auch wenn 
es über 600Seiten hat, ist nicht sehr hilfreich.
Ich führ mir es aber dennoch gerne nochmal zu Gemüte und weck mal die 
Leute bei Infineon auf.
PS: Vielen Dank das du dich überhaupt damit auseinandersetzt *Daumen 
hoch*

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.