Hallöle!
Ich möchte Zahlen über meinen UART senden. Wie mache ich das am besten?
Bisher ist es mir nur gelungen, char's zu senden.:
UDR = 'x';
Ich möchte also das TCCR0-Register und diverse Überlauf-Variablen
dezimal an mein VisualBasic-Programm schicken.
Vielen Dank
Hmm, habe es durchgelesen...
ich möchte wiegesagt eine Variable über den UART schicken, damit der
wert der variablen als "dezimale" Zahl in meinem Programm erscheint.
Ich würde mich mal für diese sprintf() variante interessieren:
______________________________________________
char Buffer[20]; //Ist das die Anzahl der Zeichen, die
gewandelt werden müssen? also 20?
sprintf( Buffer, "%d", i ); //steht i für die Array-Position?
Das heißt doch, dass ich eine Array mit 20 "Buchstaben" habe, und diese
Buchstaben in dezimal wandle?!
danke
Nein.
Das heist das du eine Zahl hast und sprintf wandelt dir
eine Zahl in einen String, einen Text um.
Aus 5436 wird der String "5436"
Und den kannst du dann als ganz normalen Text verschicken.
Der Vorteil einer Textform ist es, dass diese von jedem
Programm leicht aufgefangen werden kann (und dann eventuell
wieder in eine Zahl verwandelt wird). Aber auch jedes
Terminal, bzw. jedes Terminalprogramm kann so einen Text
unmittelbar anzeigen.
> char Buffer[20]; //Ist das die Anzahl der Zeichen, die> gewandelt werden müssen? also 20?
Die 20 bedeuten, dass dieses Array maximal einen String
der Länge 20 aufnehmen kann. Für eine int Zahl brauchst du
wesentlich weniger. Ein 16-Bit Integer kann ja minimal
-32768 gros sein. Dafür brauchst du daher maximal
eins, zwei, drei, ..... sechs Zeichen (inklusive Vorzeichen).
Dazu noch das obligatorische abschliessende '\0' Zeichen
für Strings und mit einem Array der Länge 7 bist du dabei.
Mehr schadet nicht: Ein String der Länge 7 kann ohne Probleme
in einem Array der Länge 10 oder 20 gespeichert werden.
(Siehe auch im gleichen Artikel etwas weiter unten den
Abschnitt über String-Verarbeitung).
> sprintf( Buffer, "%d", i ); //steht i für die Array-Position?
Nein.
i ist die Zahl die gewandelt werden soll.
char Buffer[20];
int i = 5436;
sprintf( Buffer, "%d", i );
// Buffer enthält jetzt den String "5436"
Du solltest dir Literatur zum Thema 'C' besorgen.
Ohne sie wirst du nicht weit kommen.
hmm könntet ihr mir dann mal so nen kleinen Codeschnipsel zukommen
lassen?
Etwa wie diesen FALSCHEN von mir?
char Buffer[3] = {1,2,3};
for (i=0;i<3;i++)
{
char Buffer[i];
sprintf( Buffer, "%d", i );
}
danke
habe jetzt folgenden Code:
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
void enableTx(void)
{
while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich
*/
{
}
}
/////////////////// Im Terminalprogramm wird eine Baudrate von 9600
eingestellt
int main (void)
{
char s[7];
int y=4;
char string1[10] = {'J'};
UCSRB |= (1<<TXEN); //Senden aktivieren
UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); //
UBRRH = 00; //Baudrate einstellen 9600 bei 8 MHz
UBRRL = 51;
char Buffer[20];
int i = 5436;
sprintf( Buffer, "%d", i );
UDR = Buffer;
// Buffer enthält jetzt den String "5436"
}
Am VB-Programm kommt jedoch ein "L" an.
EinSteigÄr wrote:
> char Buffer[20];> int i = 5436;>> sprintf( Buffer, "%d", i );>> UDR = Buffer;
Wie soll das gehen.
Buffer ist ein String, also eine Abfolge von einzelnen Zeichen.
UDR hingegen kann nur ein einzelnes Zeichen fassen.
Du musst dir schon eine Funktion schreiben, die einen
String entgegen nimmt und den Zeichen für Zeichen
über die UART verschickt.
Dazu schreibst du dir als erstes mal eine Funktion die
ein einzelnes Zeichen korrekt verschickt!
Denn einfach so mit Zuweisen an UDR ist es ja nicht getan.
An UDR zuweisen kannst du sinnvollerweise erst dann,
wenn die UART auch bereit ist ein Zeichen entgegen zu nehmen
(Das steht aber eigentlich auch alles im AVR-gcc Tutorial
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Senden_mit_dem_UART
)
1
intuart_putc(unsignedcharc)
2
{
3
while(!(UCSRA&(1<<UDRE)))/* warten bis Senden moeglich */
4
{
5
}
6
7
UDR=c;/* sende Zeichen */
8
return0;
9
}
10
11
voiduart_puts(char*s)
12
{
13
while(*s)
14
{/* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
Hilfee es klappt nicht mehr. Was habe ich gemacht dass er nichts mehr
sendet?? Ich dreh gleich am Rad^^
danke:
#include <inttypes.h>
#include <avr/io.h>
int uart_putc(unsigned char c)
{
while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
{
}
UDR = c; /* sende Zeichen */
return 0;
}
void uart_puts (char *s)
{
while (*s)
{ /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
uart_putc(*s);
s++;
}
}
int wandle(int y)
{
char Buffer[20];
int i = y;
sprintf( Buffer, "%d", i );
uart_puts( Buffer );
}
/////////////////// Im Terminalprogramm wird eine Baudrate von 9600
eingestellt
int main (void)
{
int testvar=0xFF;
int y=4;
char string1[10] = {'J'};
UCSRB |= (1<<TXEN); //Senden aktivieren
UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); //
UBRRH = 00; //Baudrate einstellen 9600 bei 8 MHz
UBRRL = 51;
wandle(testvar); //soll "0xFF" über UART schicken
}
Es kommt nichts mehr in meinem Terminal an
Habe in die UART-Registernamen ein paar 1 eingefügt und das Ganze auf
einem ATmega1281 laufen lassen. Es kommen fotlaufend 255255255255
auf dem Terminal an.
#include <stdio.h> fehlte noch.
Wie schreibt doch Cliff Lawson so schön in seiner signature auf
avrfreaks.net:
FAQ#3: 99.9% of UART errors are AVRs not being clocked right
Bist du dir sicher, dass deine 8 MHz auch stimmen? (Und du nicht
z. B. noch den Taktteiler auf 1 MHz drin hast oder sowas.)
p.s.: Bitte benutze [ c ] ... [ /c ] Markierungen, damit deine
Programme ordentlich formatiert bleiben und nicht wild umgebrochen
werden.
Vielen Dank, habe es aber wieder hingekriegt. Ganz komisch....Habe das
<stdio.h> weiterhin NICHT eingefügt, und es funktioniert so wie vorher,
wo es auch nicht dabeistand.
danke:)