Hallo! Ich würde gerne in ein programm eine Routine implementieren, die einen string über die UART schickt, dabei habe ich mich am tutorial "orientiert", allerdings bläht sich der hex code auf 8,81kb auf...ich vermute, die "art und weise" der programmierung ist nicht sehr gut, evtl kann mir mal jemand ein paar tips geben? und: ich programmiere in C, auch wenn das natürlich mehr als suboptimal ist, aber für die anfänge bequem und eine nachträgliche optimierung anhand des assembly dump bring immer viel...also evtl eine kurze C Routine um zB "hello world" über die uart zu senden? Initialisierung ist soweit klar. Danke, Klaus. (Hierher verwiesen von spotlight.de)
#include <avr/io.h>
#include <stdio.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#define SIG_INTERRUPT0 _VECTOR(1)
#ifndef F_CPU
#define F_CPU 4000000;
#endif
#define UART_BAUD_RATE 9600 // 9600 Baud
//int phone_alarm();
//int uart_init();
/*int uart_putc(unsigned char c) //Experimentalteil UART
ANFANG
{
while(!(USR & (1 << UDRE))); //UART Bereit? Prüfen von
UDRE
UDR = c; //Zeichen in Sendepuffer UDR
return 0;
}
void uart_puts (char *s) //Ruft uart_putc auf, bis
*s=NULL
{
while (*s)
{
uart_putc(*s);
s++;
}
}
int uart_init (){
UBRR = 25; //Initialisiert UART mit 9600baud
bei 2313 mit
4MHz
UCR |= (1<<TXEN); //Transmit enable
}
int phone_alarm (){
uart_init();
fdevopen(uart_putc, NULL, 0);
printf("%s: Hier AT Befehle einfügen!\n", _FUNCTION_);//Zu
sendender string
} //Experimentalteil UART ENDE*/
phone_alarm wird dabei im main aufgerufen und soll den string auf der
uart ausgeben. zeitkritisch ist das ganze nicht. die c funktionen
verstehe ich soweit, kein problem, aber ich vermute das problem in den
includes o.ä....ich würde ja fast mal versuchen, die ganze routine "zu
deuniversalisieren" aber damit auch einfacher zu machen...
in der code sammlung finde ich nur ellenlange asm beispiele...
Klaus.
Hi!
habe mal weiter getestet, erstmal nur ein zeichen zu verschicken:
int uart_init (void){
UCR |= (1<<TXEN); //Transmit enable Bit setzen ->
UART aktiv
UBRR = 25; //Initialisiert UART mit 9600baud
bei 2313 mit
4MHz
}
int phone_alarm (void){
uart_init();
while (!(USR & (1<<UDRE))); /* warten bis Senden
moeglich
*/
UDR = 'x'; /* schreibt das Zeichen x
auf
die Schnittstelle */
if(TXC) cbi(PORTB, 0);
cbi(USR, TXC);
}
das klappt auch einwandfrei, TXC wird auch gesetzt, was ja bedeuten
SOLLTE (soweit ich das datenblatt verstehe), dass auf TXD am µC was
passiert...und jetzt ratet mal? genau: nichts...hmmm?!
Gruß, Klaus.
Der Grund für das Aufblähen des erzeugten Binärcodes ist die Verwendung der Funktion printf(). Wenn das nicht unumgänglich ist, sollte man was anderes verwenden.
ich werds nur mit einem pointer und ner zeichenkette erledigen! oder so :) Klaus.
die Grösse der Hex-Datei ist nicht entscheidend, in etwa kann man 1:3 rechnen. Bei vielen unvollständigen Zeilen kann das Verhältnis aber noch grösser werden - prinzipiell ist es nicht verboten, für jedes Datenbyte eine eigene Zeile zu verwenden - das macht dann 1:11 :-) Der Grund liegt für dein Problem liegt, wie schon gesagt, an printf(). Schöne bequeme Sache, hat aber seinen Preis (Codegrösse). Ich kenne den Compiler nicht, vielleicht lassen sich ein paar Optionen von printf abschalten, das kann allerhand bringen. Aber es gibt keine Notwendigkeit, printf zu benutzen, passt es in den Speicher - warum nicht. Reicht der Platz nicht abspecken. Man kann es auch ganz zu Fuss mit putchar() lösen oder ewas komfortabler mit itoa() o.ä.
ich wollte auf putchar ausweichen, printf() wird hier im tutorial für die uart benutzt, sollte man evtl mal drauf hinweisen! so, ich versuchs erstmal und melde mich dann evtl nochmnals...mit einem zeichen tuts ja schon, da ist der weg nicht mehr weit. Gruß & N8, Klaus.
Hier mal der aktuelle Code, das senden eines strings scheinbt zu
klappen, muss es noch mit einem terminalprogramm testen...
int uart_init (void){
UCR |= (1<<TXEN); //Transmit enable Bit setzen ->
UART aktiv
UBRR = 25; //Initialisiert UART mit 9600baud
bei 2313 mit
4MHz
return 0;
}
int phone_alarm (char *string){ //phone_alarm übernimmt
string[10]
uart_init();
while(*string){ //Prüft, ob Zeichenkette komplett
gesendet
while (!(USR & (1<<UDRE))); //warten bis Senden moeglich
UDR = (char)*string; //schreibt das Zeichen
von
*string auf die Schnittstelle
string++; //Pointer + 1 (nächstes Zeichen)
}
if(TXC) PORTB ^= 1<<PB0; //Zu Testzwecken
cbi(USR, TXC);
phone=0; //Verriegelung damit phone_alarm nur
einmal aktiv
wird
return 0;
}
woher weiß ich, ob der controller nun 8N1 sendet? das wäre wichtig zu
wissen, aber von einer "initialisierung des formats" wird nirgends
gesprochen? oder ist das "standardmäßig gesetzt"?
kann ich davon ausgehen, dass wenn TXC gesetzt ist, das senden
funktioniert hat?
Gruß, Klaus.
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.