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
xdatacharText1[]="\nHallo du Da!";
3
voidSendChar(charz);
4
voidS1Ini(void);
5
voidSendTxt(char*text);
6
chartt;
7
inta=0;
8
voidmain(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
voidSendChar(charz)
21
{
22
SBUF=z;
23
while((SCON&0x02)==0);
24
SCON&=0xFD;
25
}
26
voidSendTxt(char*text)
27
{
28
inti=0;
29
while(text[i]!=0x00)
30
{
31
SendChar(text[i]);
32
i++;
33
}
34
}
35
voidS1Ini(void)
36
{
37
SCON=0x40;
38
BCON=0x01;
39
BG=0x9C;
40
P1_DIR=0xFF;
41
}
In HiTOP bleibt er direkt hinter
1
voidSendChar(charz)
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(charz)
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.
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!
Ich würde mal davon ausgehen das deine SendChar Routine einfach nicht
richtig ist.
1
voidputchar_uart(charc){
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 ?
>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
voidSendChar(charz);
als Funktionsaufruf verwerten? Nun ja, nichts ist unmöglich!
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.
UART1_BCON|=0x01;// load baud rate control register
29
RESET_RMAP();
30
}
31
voidSendChar(charz);
32
voidSendTxt(char*text);
33
inti;
34
intl=0;
35
charBuffer[3]="Hi!";
36
intz=5;
37
voidmain(void)
38
{
39
MAIN_vInit();
40
SendTxt(Buffer);
41
while(1);
42
43
}
44
voidSendChar(chark)
45
{
46
SBUF=k;
47
while(!TI);
48
TI=0;
49
}
50
voidSendTxt(char*text)
51
{
52
intl=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.
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.
Keine Ahnung wer Dave ist :-) aber fällt dir was auf ?
1
voidSendChar(chark)
2
{
3
SBUF=k;
4
while(!TI);
5
TI=0;
6
}
7
8
voidputchar_uart(charc){
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.
@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*