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.
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 :-)