Forum: Mikrocontroller und Digitale Elektronik Printf() modifizieren in Codevision


von Kai Markus Tegtmeier (Gast)


Lesenswert?

Hallo, allerseits!

Ich habe eine Frage zu der Routine printf() unter Codevision. Läßt sich
diese Routine so modifizieren, daß sie immer erst einen bestimmten
Portpin nach dem Pegel abfragt, bevor sie ein Zeichen rausschickt? Und
wenn ja, wo? Ich bin aus verschiedenen Gründen auf die Routine printf()
angewiesen und kann leider nicht mit putchar() oder puts() arbeiten.

Hat jemand eine Idee?

MfG
Kai Markus

von eugen D (Gast)


Lesenswert?

na musst du nicht beim mc selbst erstmal ne funktion wie putchar oder
getchar schreiben auf die  du dann mit fopen zugreifst. in diese kannst
du doch dann die abfrage einbauen.
worüber schickst du die daten ? (uart, paralel, spi?)
mfg eugen

von Sven Müller (Gast)


Lesenswert?

kannst du nicht sowas machen:

while (Pin gesetzt) printf("hallo");

von Marc (Gast)


Lesenswert?

In der stdio.h, die u vorher in dein Verzeichniss kopieren solltes und
umbenennen z.b. mystdio.h, sind die Funktionen getchar und putchar als
asm-Code hinterlegt. Alle Funktionen, auch printf rufen im Ende diese
Funktionen auf. Wenn du hier den asm-Code so änderst, dass ein Zeichen
nur ausgegeben wird wenn dein Pin gesetzt ist wird sich putchar auch so
verhalten und damit auch printf. So bekommst du eine syncrone
Kommunikation. Die Funktion wartet bis das Bit gesetzt ist. Wenn du
aber weiter arbeiten willst und die Bytes versendet werden sollen wenn
das Bit gesetzt ist, assyncron im Hintergrund sozusagen, solltest du
mit purchar in einen Puffer schreiben. Der dann via Interrupt oder in
der Warteschleife im Main ausgesendet wird, dass musst du dann wieder
normal im Programm machen.

von Kai Markus Tegtmeier (Gast)


Lesenswert?

Hallo, allerseits. Vielen Dank erstmal für Eure Antworten. Ich bin etwas
erstaunt, diese Anfrage im Forum Allgemein wiederzufinden; irgendwie
war sie auch ein paar Tage verschwunden...

Aber zu dem Problem:

ich betreibe ein Grafikdisplay von Electronic assembly am UART und
möchte mit printf() eine formatierte Ausgabe von einem Zahlenwert
machen. Leider ist das Display mit anderen Ausgaben gut beschäftigt und
der Datenpuffer vom Display nur 24 Byte groß, so daß ich vor dem
Versenden von JEDEM Zeichen erst mit der Leitung CTS prüfen muß, ob ein
weiteres Zeichen angenommen werden kann. Ich möchte deshalb printf
nutzen, weil ich (bequem bin und) auf die formatierte Ausgabe von
Variablen nicht verzichten möchte. Also werde ich mir die stdio.h mal
anschauen. Ich hatte immer vermutet, den Code von printf() irgendwo
auch als C-sourcefile zu finden. Aber Assembler tuts ja auch.

Vielen Dank zunächst mal für die Hilfe!
Greetz
Kai Markus

von Marc (Gast)


Lesenswert?

@Kai
Wie oben bereits beschrieben, verwenden alle output und
input-Funktionen im Ende die getchar bzw. putchar Funktion und die ist
praktischerweise in der stdio hinterlegt. Ich kann nur wenig Assembler,
die Funktion ist aber so simpel, dass es mit wenig Aufwand möglich ist
hier eine Änderung, wie die das du erst das CTS-Signal überprüfst
einbauen kannst. Ich würde dass einfach in C schreiben kompilieren und
mir den Output im .asm-File ansehen und das was ich da gerlernt habe
entsprechend in der mystdio hinterlegen - Probiers mal aus und
berichte, würd mich intersessieren!

von Kai Markus Tegtmeier (Gast)


Lesenswert?

Hallo!

Habs ausprobiert und in die Bibliotheksdatei Stdio.lib in die
Funktion putchar() einfach folgende Zeile vor den Assemblertext
eingefügt:

while(PIND.3==1);

An diesem Portpin hängt die RTS-Leitung vom Display. Die ist auf
logisch High, solange der Displaypuffer voll ist. Kann das Display
neue Zeichen annehmen, wechselt die Leitung auf Low.

Ergebnis: klappt super, alle Ausgaben warten auf ein Handshake vom
Display.

Vielen Dank für Eure Hilfe!

Kai Markus

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.