Hallo,
mein Problem ist, das mein kleiner ATtiny2313 nur bei 8Mhz (intern) funktioniert. Bei 4Mhz kommt nur undefiniertes gedöns.
Ich möchte mein code verwenden, habe aus verzweifelung schon die Library von Peter Fleury probiert.
Hier mal mein TinyCode ^^:
Kennt jemand die lösung? Der Code ist korrekt, läuft problemlos bei einem ATmega. Bei ATtiny halt nur bei 8Mhz F_CPU.
mfg & thx
gfcwfzkm
mein Problem ist, das mein kleiner ATtiny2313 nur bei 8Mhz (intern) funktioniert. Bei 4Mhz kommt nur undefiniertes gedöns.
Ich möchte mein code verwenden, habe aus verzweifelung schon die Library von Peter Fleury probiert.
Hier mal mein TinyCode ^^:
C-Quellcode
- #define F_CPU 8000000UL //Systemtakt in Hz
- #include <avr/io.h>
- #include <util/delay.h>
- #include <avr/interrupt.h>
- #define BAUD 9800UL //Baudrate
- //Berechnungen
- #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) //clever runden
- #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) //Reale Baudrate
- #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) //Fehler in Promille, 1000 = kein Fehler.
- #define USE_2X 1
- #if ((BAUD_ERROR < 990) | (BAUD_ERROR > 1010)) //Wenn die Baudrate zu unregelmässig ist, einen Fehler auslösen!
- #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
- #endif
- #include <util/setbaud.h> //Muss nach den UART-Definitionen eingeschlossen werden!
- void uart_init(void);
- int uart_putc(unsigned char c);
- void uart_puts(char *s);
- uint8_t uart_getc(void);
- char *uart_gets(void);
- int main(void)
- {
- char c;
- uart_init();
- sei();
- _delay_ms(10);
- uart_puts("\n\rUART - Demoprogramm\n\r");
- while(1)
- {
- c = uart_getc();
- if (c==13)
- {
- uart_puts("\n\r");
- }
- else if (c=='s')
- {
- while(1)
- {
- uart_putc('W');
- }
- }
- else
- {
- uart_putc(c);
- }
- }
- }
- void uart_init(void)
- {
- UBRRH = UBRR_VAL >> 8; // Wichtig! UBRRH vor UBRRL setzten!
- UBRRL = UBRR_VAL & 0xFF;
- #if USE_2X
- /* U2X-Modus erforderlich */
- UCSRA |= (1 << U2X);
- #else
- /* U2X-Modus nicht erforderlich */
- UCSRA &= ~(1 << U2X);
- #endif
- UCSRB |= (1<<TXEN) | (1<<RXEN); // UART TX einschalten - UART RX einschalten
- UCSRC |= (1<<UCSZ1) | (1<<UCSZ0); // Asynchron 8N1
- }
- /* Zeichen senden */
- int uart_putc(unsigned char c)
- {
- while (!(UCSRA & (1<<UDRE))) { } // warten bis Senden möglich ist
- UDR = c; // sende Zeichen
- return 0;
- }
- /* Zeichenkette senden */
- void uart_puts(char *s)
- {
- while (*s)
- { // so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)"
- uart_putc(*s);
- s++;
- }
- }
- /* Zeichen empfangen */
- uint8_t uart_getc(void)
- {
- while (!(UCSRA & (1<<RXC))) {}
- return UDR;
- }
Kennt jemand die lösung? Der Code ist korrekt, läuft problemlos bei einem ATmega. Bei ATtiny halt nur bei 8Mhz F_CPU.
mfg & thx
gfcwfzkm