mach doch das senden via interrupts das spart rechenzeit.
Code:SIG(SIG_UART_DATA) { //udr ist leer, lade neues zeichen in UDR //wenn zeichen, zb gleich null disable UDRE interrupt } SIG(SIG_UART_TRANS) { //senden ist fertig }
Hallo,
arbeite mich nun schritt für schritt in dem Tutorial von www.microcontroller.net durch wie empfohlen. Allerdings häng ich jetzt schon seit einiger Zeit an einem Problem um steig nicht dahinter an was es scheitert.
"#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 4000000
#endif
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)
#define UART_BAUD_RATE 9600
int main (void) {
UCSRB |= (1<<TXEN);
UCSRC |= (1<<URSEL)|(3<<UCSZ0);
UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );
UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );
while (!(UCSRA & (1<<UDRE))) {
}
UDR = 'c';
return 0;
}"
Dies ist mein letztes "funktionierendes" Programm um im HyperTerminal ein "c" darzustellen.
Dies ist der Code nach dem Punkt "Schreiben einer Zeichenkette (String)":
"#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 4000000
#endif
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)
#define UART_BAUD_RATE 9600
int main (void) {
UCSRB |= (1<<TXEN);
UCSRC |= (1<<URSEL)|(3<<UCSZ0);
UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );
UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );
int uart_putc(unsigned char c)
{
while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
{
}
UDR = c; /* sende Zeichen */
return 0;
}
}"
Beim kompilieren scheint alles zu klappen, nur wird nichts ausgegeben??? Warum???
Auch beim nächsten Versuch mit einer Variable bringt gleich der Compilere ne Meldung: for loop initial declaration used outside c99 mode
hier der code:
"#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 4000000
#endif
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)
#define UART_BAUD_RATE 9600
int main (void) {
UCSRB |= (1<<TXEN);
UCSRC |= (1<<URSEL)|(3<<UCSZ0);
UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );
UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );
char c;
for (uint8_t i=0; i<=9; ++i) {
c = i + '0';
uart_putc( c );
// verkuerzt: uart_putc( i + '0' );
}
}"
Auch das versteh ich nicht. Währe mir über eine korrekte Lösung und kleine erklärung warum und weshalb dankbar. Ansonsten denk ich komm ich zufriedenstellend voran. Input Output war kein Problem.
MfG
Blue
mach doch das senden via interrupts das spart rechenzeit.
Code:SIG(SIG_UART_DATA) { //udr ist leer, lade neues zeichen in UDR //wenn zeichen, zb gleich null disable UDRE interrupt } SIG(SIG_UART_TRANS) { //senden ist fertig }
hm soweit bin ich noch ned...
Zitat von GCCIst kein ISO C99.Code:for (uint8_t i=0; ...
Korrekt:
Code:uint8_t i; for (i=0; ...
Disclaimer: none. Sue me.
und wo??? im makefile???
des weiteren bringt er dass uart_putc( c ); ungültig ist (im 2. Teil des Codes)
und warum funktioniert der 1. teil so nicht? gibt wie gesagt absolut nix aus...
Lesezeichen