Forum: Mikrocontroller und Digitale Elektronik Hilfe bei sprintf,...


von Maria (Gast)


Lesenswert?

Hallo zusammen,

Habe einen Atmega16 und programmiere mit WINAVR

Habe in einer Variablen unsigned int ergebnis eine Zahl zwischen 0 und
360 dez stehen (0 ... 101101000bin). Möchte diese Zahl jetzt über
Register UDR an meinen Terminal senden, der kann ja nur ASCII
empfangen. Habe schon einmal gefragt und mir wurde immer nur gesagt,
nimm die Funktion sprintf oder printf. Habe gerade kein c-Buch und
verstehe die Library zu diesen Funktionen nicht, bei Code den ich im
Internet gefunden habe gibt es nur Fehlermeldungen. Hoffe mir kann
jemand die genaue Lösung für mein Problem geben, sind doch nur 2 oder 3
Zeilen, oder?
Dachte mir, dass vieleicht noch eine String Variable deklariert werden
muss, in die dann ein von der Funktion zurückgekommener String
geschrieben wird????

Bitte helfen, lg Maria

von crazy horse (Gast)


Lesenswert?

#include <stdio.h>

printf ("%3u",alarm_minute);

Die Formatsteuerung beginnt mit dem %Zeichen
es werden 3 Zeichen ausgegeben (3)
u Argument ist unsigned

von Maria (Gast)


Lesenswert?

Wenn ich jetzt

printf ("%3u", ergebnis);

einfüge, steht direkt auf meinem Termianl ein d, wo ist der Fehhler?
ergebnis war unsigned int ergebnis und der Wert wäre 360 in diesem Fall
gewesen.

von Maria (Gast)


Lesenswert?

schreibt der jetzt direkt automatisch auf das Terminal, oder bekomme ich
einen Rückgabewert von printf, verstehe das immer noch nicht richtig?

von crazy horse (Gast)


Lesenswert?

du kannst einen Rückgabewert erhalten (liefert die Anzahl der
tatsächlich ausgegebenen Zeichen, wird selten benutzt).
Voraussetzung für das korrekte Funktionieren  von printf () ist
allerdings die korrekte Einstellung der UART (Baudrate, Freigabe etc),
hast du das gemacht?
Ansonsten schreibt printf() normalerweise direkt auf die serielle
Schnittstelle.

von Maria (Gast)


Lesenswert?

UART habe ich so initialisiert, müsste richtig sein, UART funktioniert
auch, kann den zu messenden Wert schon als Hex zahl, in dem Fall kann
ich "168" (Programm hierfür selber geschrieben) (die 360) auf dem
Terminal schon ablesen, aber eben nicht als "360".


void UART_init(void)
{

  //Initialisierung der UART

  UCSRB |= ( 1 << TXEN ); // UART TX einschalten; Hiermit nur
Sendebetrieb möglich
  UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 ); // Asynchron 8N

  UBRRH = 0;
  UBRRL = 103; /* Asynchronous Normal Mode, U2X=0,
UBRRL=((16MHz/16/baudrate)-1)=103,1666dez=1100111bin
              Error=0,2% */

}

von Maria (Gast)


Lesenswert?

Möchte zusätzlich aber noch den Wert an ein ASCII LCD senden. Macht das
die funktion dann auch gleichzeitig, gibt es noch irgend etwas anderes
ausser selber schreiben? Für LCD und ASCII wäre der ASCII Code in
Registern vieleicht ganz gut, also ein Code für die 3, einer für 6 und
einer für 0.

von Hagen (Gast)


Lesenswert?

Hast du auch der stdlib mitgeteilt das deine Daten über UART/LCD
ausgegeben werden sollen ?

int put(char value) {

  UART_put(value);
  LCD_put(value);
  return(1);
}


void main(void) {

  UART_init();
  LCD_init();

  fdevopen(&put, 0, 0);

}

fdevopen() ist das was ich meine. Die eigene put() Callback kann dann
gleichzeitig das Zeichen an den UART und LCD ausgeben.

Gruß Hagen

von Maria (Gast)


Lesenswert?

Nein, verstehe schon wieder nur Bahnhof, hatte mit fdevopen schon ein
bischen rumexperimentiert, dachte auch, dass ich das noch dazu benutzen
müsste, mein compiler meckert jedoch bei einer Zeile wie:

fdevopen(&put, 0, 0);

Er sagt, dass ich zu viele Argumente übergeben habe, das stimmt aich
nach Libc manuel, da kann ich nur fdevopen(&put, 0); z.B. übergeben.
Hat sich da etwas verändert, habe neuste Version?

Weiss gar nicht, was das alles da oben bedeuten soll

Maria

Bitte weitere Hilfe

von Maria (Gast)


Angehängte Dateien:

Lesenswert?

Habe jetzt mein Programm mitgesendet. Vieleicht kann man damit mehr
erklären.

in main.c habe ich schon mal die Zeile

printf ("%3u",alarm_minute);

eingetragen. Dahinter steht ein kleines Kommentar. Wäre super nett,
wenn ihr mir dort noch etwas reinschreiben könntet, wie ich es brauche.


Wäre super nett, geht ja nur um die Ausgabe mit printf.

lg, Maria
nicht wundern, ist mein erstes Programm :-)

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.