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
#include <stdio.h> printf ("%3u",alarm_minute); Die Formatsteuerung beginnt mit dem %Zeichen es werden 3 Zeichen ausgegeben (3) u Argument ist unsigned
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.
schreibt der jetzt direkt automatisch auf das Terminal, oder bekomme ich einen Rückgabewert von printf, verstehe das immer noch nicht richtig?
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.
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% */ }
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.