Hallo,
ich habe ein Problem mit meinem C167 Microcontroller.
Ich möchte die Signale eines Inkrementalgebers auswerten und die
aktuelle Geschwindigkeit bzw. Position 1 mal pro Sek. über die serielle
Schnittstelle an meinen PC senden. Zur Übertragung möchte ich die printf
funktion nutzen doch mit genau dieser habe ich Probleme. Noch bevor die
Messung und auswertung gestartet wird, also auch vor der while Schleife
in der main Funktion, soll eine Information an das Hyper terminal
gesendet "Inkrementalmessung wird gestartet".
Diese Info wird nie an das terminal gesendet. Es werden fast nur
Leerzeichen versendet und diese Übertragung der Leerzeichen wird nicht
beendet. Also die printf Funktion wird erst gar nicht abgearbeitet bzw
nicht beendet.
Kann mir da vielleicht jemand weiter helfen? Liegt es an den
Einstellungen die ich bei dem Controller machen muss? Die Beispiel
Programme von Phytec kann ich nämlich alle ausführen auch die mit einer
printf funktion.
Gruß
Richard
am besten erlaubst Du uns einen Blick in Deinen Code.
Stimmt die Baudrate?
Kommen wirkleich Spaces (0x20) an oder sind es andere nicht
darstellbare Zeichen?
Nein für C167 gib es nicht freies,
Eval. Version von Keil (www.Keil.com) (limit 8KByte)
oder Compiler von Tasking, vermutlich ähnliche begrenzung.
Gruß
Zverjatko
Hallo,
printf ist eine Funktion, die auf (eine) Grundfunktion(en)
zurückgreift. Je nach Compiler muss eine Funktion z.B. iowrite() erst
definiert werden. Hier wird dann der Output Stream festgelegt.
Woher soll printf denn wissen, wohin die Daten ausgegeben werden sollen
(z.B. RS232, LCD-Display1, LCD-Display2, CAN,...)?
Hallo,
leider haben Eure Tipps noch nicht geholfen.
@zverjatko
habe S0TIR = 1; eingefügt, leider keine veränderung.
@Take it Easy
Ich kann deinen Hinweis wohl nachvollziehen, aber in den beispielen von
Phytec ist die printf() funktion auch nicht anders konfiguriert worden.
Hat vielleicht noch jemand eine idee ?
Greetz Richard
Programmierst du mit Keil ?
Wenn ja, hast du schon mit dem µVision das Programm simuliert ?
Du schreibst: // set baudrate to 9600 baud at 40Mhz
Der alte C167 so weit ich weiß läuft maximal bis 24Mhz.
Gruß
Also ich arbeite mit Keil µVision3 (eval. Vers.).
Wie schon erwähnt kann ich die Beispiel Programme von Phytec auch
compilieren und auf meinem C167 laufen lassen.
hat vielleicht noch jemand eine idee woran es liegen kann ?
Hier habe ich mal das Programm das läuft:
Mein c167HSE hat einen Takt von 40MHz.
#include <REG167.H> /* Register Set of 80C167 controller */
#include <stdio.h> /* Standard I/O functions */
/* main program */
void main (void) /* execution starts here */
{
/* init serial0 port: */
P3 |= 0x0400; /* set port 3.10 output latch (TXD)*/
DP3 |= 0x0400; /* configure port 3.10 for output */
/* operation. ( TXD output) */
DP3 &= 0xF7FF; /* configure port 3.11 for input */
/* operation. ( RXD input) */
S0TIC = 0x80; /* set transmit interrupt flag */
S0RIC = 0x00; /* delete receive interrupt flag */
/* PLEASE CHECK YOUR phyCORE-167-HS/E Quarz frequency and choose the
right */
/* reload value to set the baudrate to 9600 Baud */
//S0BG = 0x40; /* set baudrate to 9600 baud at 20Mhz */
//S0BG = 0x50; /* set baudrate to 9600 baud at 25Mhz */
//S0BG = 0x6A; /* set baudrate to 9600 baud at 33Mhz */
S0BG = 0x80; /* set baudrate to 9600 baud at 40Mhz */
S0CON = 0x8011; /* set serial mode */
putchar(' '); /* send dummy-Byte for compatibility */
printf ("\aHello World\n"); /*print 'Hello World' to the
serial port.*/
while (1) /* An embedded program without any */
{ /* operating system usually does not */
/* stop and never returns. */
/* We've used an endless loop in
this example. */
printf (" char = %02bX\n",getchar()); /* print the two digit hex
code of */ /* any received
character */
}
}
Also ich habe dein Programm jetzt im µVision3 Simuliert und
es fehlte S0TIR=1.
Das Programm funktioniert.
void main (void) /* execution starts here */
{
/* init serial0 port: */
P3 |= 0x0400; /* set port 3.10 output latch (TXD)*/
DP3 |= 0x0400; /* configure port 3.10 for output */
/* operation. ( TXD output) */
DP3 &= 0xF7FF; /* configure port 3.11 for input */
/* operation. ( RXD input) */
S0TIC = 0x80; /* set transmit interrupt flag */
S0RIC = 0x00; /* delete receive interrupt flag */
S0TIR=1;
S0BG = 0x81; /* set baudrate to 9600 baud at 40Mhz */
S0CON = 0x8011; /* set serial mode
....
die reale Baudrate beträgt 9615 (+0,15%) d.h jetzt muss es
funktionieren, falls es doch nicht geht,dann hast du ein Hardware
Problemm.
Beim Phytec gibt es aber nur phyCORE-ST10F168/269/276 HS/E und kein
C167HSE, die schnellsten alten C167 sind mit 25MHz.
Dieses Programm habe ich auch anschliesend mit einem ST10F269
simuliert.Es funktioniert ebenfalls.
Gruß
zverjatko
Vielen dank allen denen die mir hier geholfen haben.
Ich habe gestern noch einmal versucht das beispiel programm von Phytec
zu starten und es hatte genau den selbigen Fehler wie das von mir
erstellte Programm !! Daraufhin habe ich alle Programme von Phytec und
Keil gelöscht, neu aufgespielt und anschließend mein Programm wieder
neu und sauber programmiert (incl. S0TIR=1;) !!! und siehe da alles
funzt.
Ich denke das einfach im laufe der Zeit und der unzähligen Versuche von
mir einige Einstellungen so verändert wurden das es einfach nicht mehr
funktionieren konnte. Also nochmal vielen dank für die unterstützung.
Gruß
Richard
Hallo,
ich beschäftige mich zur Zeit auch mit dem printf Befehl und dem C167
Controller.
Ich möchte ein Gyroskop steuern und habe auch soweit mit dem Keil
Compiler einen Quellcode erstellt.
Das Gyroskop gibt einen binären Datenstrom aus, den ich via einem
Hyperterminal anzeigen möchte. Mit dem Oszilloskop sieht man, dass das
Gyroskop vom Prinzip her funktioniert und Daten ausgibt.
Wenn ich mit integer Werten Berechnungen mache, werden diese Variablen
wunderbar angezeigt. Am Programmcode habe ich mich am Beispiel "Hello
World" orientiert und möchte eigentlich nur einen Zustand eines Pins mit
printf anzeigen lassen.
Den Datenstrom des Gyroskop kann man sehr schön sehen, aber leider kann
ich mit dem printf Befehl nur Nullen ausgeben.
Stefan
Hallo!
Ich habe das selbe Problem, allerdings, nach vielen Versuchen und mit
Hilfe dieses Threads -> noch immer!!!!
Meine Programm laufen zwar im Monitor (Programmiere mit Keil)
einwandfrei, allerdings im Flash wird nur noch das erste Zeichen normal
geschickt, dann kommen nur noch Leerzeichen (0x20).
Kann jemand irgend ein kleines funktionierendes Testprojekt zur
Verfügung stellen? Ich komme z.Zt. echt nicht weiter!
Danke.
Hallo!
Mein Problem ist derzeit noch das einlesen. Ich möchte den Hex-Wert
einer gedrückten Taste auf der Tastatur über das Hyperterminal einlesen
und diesen dann im c167 verwerten.
Wie lese ich ich den Wert in S0TIR ein bzw. greife wieder darauf zu um
ihn auszugeben?
Sorry meine banale Frage aber bin erst Anfänger mit im µC-programmieren.
gtx, Robert
Naja passt zwar nicht unbedingt zum Thema aber egal.
Also erstens geht es nicht um das S0TIR-Register, weil es 1. kein
InterruptRequest sein soll sondern der Wert aus dem Buffer und zweitens
geht es hierbei nicht um den Transmitter sondern um den Receiver.
Das Register, welches du auslesen musst ist das S0RBUF. Dies machst du
am Besten in einer Methode die vom interrupt 43 (0x2B in hex, der
ReceiverInterrupt) verwendet wird.
Zum Beispiel:
1
voidisr_serial_receive()interrupt43
2
{
3
unsignedcharc=S0RBUF;// Empfangspuffer lesen
4
....
5
}
Diesen Interrupt musst du nur noch enablen. Dies schaut bei mir so aus:
1
S0RIC=0x56;
und dann dürft eigentlich gar nichts mehr schief gehen (wenn du die
Serielle schon initialisiert hast).
Was allerdings meist ein Problem ist:
Wenn du einen Monitor verwendest, dann verwendet meist der Monitor
(zumindest bei mir war es so, ich habe einen Keil-Monitor) diese
Interrupt-Routine und überschreibt dir quasi deinen Interruptvektor.
Läuft das Programm von Rom oder Flash läuft es auch so einwandfrei, für
den Monitor musste ich noch einiges hinzufügen:
1
unsignedshort*p=0xAC;// Pointer auf 16 bit Wort
2
*p=0x00FA;// JMPS bits 16 - 23 der Sprungadresse werden hier 0 gesetzt !!!
3
p++;// nächstes Wort
4
*p=(unsignedshort)&isr_serial_receive;//Vector der ISR auf Adresse schreiben
Hallo - ich hatte gestern abend das gleiche problem mit meinem c167:
jedes printf sendet den ersten buchstaben und daraufhin nur noch 0x20 an
das terminal über die serielle schnittstelle. ich habe neu installiert,
unterschiedlichste beispielprogramme der evaluation software probiert -
überall das gleiche problem. Andere Dinge schienen zu funktionieren
(Blinky etc...) lediglich printf() bereitete die erwähnten probleme.
ich konnte es jedoch wie folgt lösen (mache das alles hier erst seit ein
paar tagen - den grund konnte ich nicht wirklich ermitteln, aber eine
lösung - zumindest für mich):
demo software unter http://www.phytec.com/zip/ runterladen - bei mir war
es http://www.phytec.com/zip/Demos_PCM-009_K.zip (s. Anhang des
Beitrags). dieses Paket enthält ebenfalls ein Hello World - und zwar
eins das mit dem C167 CR-LM funktioniert. ich nehme diese demo als
ausgangsprojekt und füge meinen code hinzu. ich denke es liegt entweder
an der start167.a66 oder an der projektkonfiguration selbst. wobei ich
bei letzteren unterschiede finden konnte (Options -> L166 Locate im Feld
Target Classes und im Feld Linker Control String) jedoch, weiß ich nicht
wo man diese Werte selbst anpassen kann... Wäre aber interessant, wenn
mir das jemand sagen könnte, dann brauche ich nicht immer ein kopiertes
ausgangsprojekt, sondern könnte die einstellungen selbst vornehmen. ich
bin da wirklich ganz unerfahren und kein c profi, aber ich vermute mal,
dass da irgendwas falsch gelinkt wird, wenn diese einstellungen nicht
angepasst werden. ich war hartnäckig, hier ist meine lösung - ich hoffe
sie hilft einigen.
grüße,
mocca