mikrocontroller.net

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


Autor: Maria (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <stdio.h>

printf ("%3u",alarm_minute);

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

Autor: Maria (Gast)
Datum:

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

Autor: Maria (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Maria (Gast)
Datum:

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

}

Autor: Maria (Gast)
Datum:

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

Autor: Hagen (Gast)
Datum:

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

Autor: Maria (Gast)
Datum:

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

Autor: Maria (Gast)
Datum:
Angehängte Dateien:

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

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.