mikrocontroller.net

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


Autor: Kai Markus Tegtmeier (Gast)
Datum:

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

Autor: eugen D (Gast)
Datum:

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

Autor: Sven Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kannst du nicht sowas machen:

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

Autor: Marc (Gast)
Datum:

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

Autor: Kai Markus Tegtmeier (Gast)
Datum:

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

Autor: Marc (Gast)
Datum:

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

Autor: Kai Markus Tegtmeier (Gast)
Datum:

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

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.