www.mikrocontroller.net

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


Autor: Christian Funke (funke)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <xc888.h>
xdata char Text1[] ="\nHallo du Da!";
void SendChar(char z);
void S1Ini(void);
void SendTxt(char* text);
char tt;
int a=0;
void main(void)
{
  S1Ini();
  tt = P1_DATA;
  if(tt==0x08)
  {
  SendTxt(Text1);
  }
  P0_DATA = 0x1;
  P0_DATA=0x0;
  while(1);    
}
void SendChar(char z)
{
  SBUF = z;
  while((SCON&0x02) == 0);
  SCON &= 0xFD;
}
void SendTxt(char* text)
{
int i = 0;
while(text[i] != 0x00)
  {
  SendChar(text[i]);
  i++;
  }
}
void S1Ini(void)
{
SCON = 0x40;
BCON = 0x01;
BG = 0x9C;
P1_DIR=0xFF;
}
In HiTOP bleibt er direkt hinter
void SendChar(char z)
{
 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
SendChar(char z)
{
.
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.

Autor: Christian Funke (funke)
Datum:

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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde mal davon ausgehen das deine SendChar Routine einfach nicht 
richtig ist.
void putchar_uart (char c)    {
  while (!TI);                         // Transmitter ready/busy ?
  TI = 0;                              // TI Flag löschen
  SBUF = c;                            // Ausgabe an UART
}

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 ?

Autor: Ferkes-Willem (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
void SendChar(char z);
als Funktionsaufruf verwerten? Nun ja, nichts ist unmöglich!

Autor: Christian Funke (funke)
Datum:

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

Autor: Christian Funke (funke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, folgender Code funktioniert in µVision. Er lässt sich simulieren 
und am UART1 erhalte ich dann auch mein gewünschtes Wort.
#include "xc888.h"
#include <stdio.h>
#include <MAIN.h>
void MAIN_vInit(void)
{
  SFR_PAGE(_su1, noSST);         // switch to page1
  CMCON         =  0x10;         // load Clock Control Register
  SFR_PAGE(_su0, noSST);         // switch to page0
  IP            =  0x00;         // load Interrupt Priority Register
  IPH           =  0x00;         // load Interrupt Priority High Register
  IP1           =  0x00;         // load Interrupt Priority 1 Register
  IPH1          =  0x00;         // load Interrupt Priority 1 High Register
 }
void UART1_vInit(void)
{
  SFR_PAGE(_pp2, noSST);         // switch to page 2 without saving
  P3_ALTSEL0   |=  (ubyte)0x02;  // configure alternate function register 0
  P3_ALTSEL1   |=  (ubyte)0x02;  // configure alternate function register 1
  SFR_PAGE(_pp0, noSST);         // switch to page 0 without saving
  P3_DIR       |=  (ubyte)0x02;  // set output direction
  SFR_PAGE(_su3, noSST);         // switch to page 3 without saving
  MODPISEL1    |=  (ubyte)0x08;  // configure peripheral input select register
  SFR_PAGE(_su0, noSST);         // switch to page 0 without saving
  SET_RMAP();                   
  UART1_BCON    =  0x00;         // reset baudrate timer/reload register
  UART1_SCON    =  0x40;         // load serial channel control register
  UART1_BG      =  0x9B;         // load baudrate timer/reload register
  UART1_BCON   |=  0x01;         // load baud rate control register
  RESET_RMAP();                 
}
void SendChar(char z);
void SendTxt(char* text);
int i;
int l=0;
char Buffer[3]="Hi!";
int z =5;
void main(void)
{
  MAIN_vInit();
  SendTxt(Buffer);
  while(1);
  
}
void SendChar(char k)
{
SBUF = k;
while(!TI);
TI=0;
}
void SendTxt(char* text)
{
  int l=0;
  while(text[l] != 0x00)
  {
          SendChar(text[l]);
    l++;
  
    if (text[l] == '\n')
    {
        SendChar(0x0A);
        SendChar(0x0D);
    }
  }
}
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.

Autor: Christian Funke (funke)
Datum:

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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine Ahnung wer Dave ist :-) aber fällt dir was auf ?
void SendChar(char k)
{
SBUF = k;
while(!TI);
TI=0;
}

void putchar_uart (char c)    {
  while (!TI);                         // Transmitter ready/busy ?
  TI = 0;                              // TI Flag löschen
  SBUF = c;                            // Ausgabe an UART
}


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.

Autor: Christian Funke (funke)
Datum:

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

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.