AT90USB USART

Gast #1375144
Hi hab bereits hier im Forum gesucht. Leider fand ich kein passendes 
Thema zu meinem Problem.

Ich versuche auf einem AT90USB1287 beim betätigen eines Tasters ein 
Zeichen zu senden.

Quellcode:

#include <avr/io.h>
#include <inttypes.h>


#define F_CPU       8000000UL

#define BAUD        19200UL
#define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)



// USART initialisieren
void uart_init(void)
{
    // Baudrate einstellen (Normaler Modus)
    UBRR1H = (uint8_t) (UBRR_BAUD>>8);
    UBRR1L = (uint8_t) (UBRR_BAUD & 0x0ff);

    // Aktivieren von receiver und transmitter
    UCSR1B = (1<<RXEN1)|(1<<TXEN1);

    // Einstellen des Datenformats: 2 Stoppbit, 8 Datenbits
    UCSR1C = (1<<USBS1)|(3<<UCSZ10);
}

void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSR1A & (1<<UDRE1)) )
;
/* Put data into buffer, sends the data */
UDR1 = data;
}

int main(void)
{

  // Hardwareinitialisierung

     DDRE    = 0xff;
     DDRD    &=~ ((1 << DDD0) | (1 << DDD1) | (1 << DDD4) | (1 << DDD5) 
| (1 << DDD6));


    uint8_t data;

    // USART initialisieren
    uart_init();

    while (1)
    {



    if (!( PIND & (1<<PIND4) )) { //wenn Taster S4 betätigt (low)
    USART_Transmit('z');    //Sende z

    }





    }
}

Wenn ich den  Taster halte und dabei den Reset Taster drücke, sendet er 
was. Allerdings nur Müll! Lauter Nullen. Ohne Reset passiert beim 
Betätigen gernichts.

An dieser Stelle soll erwähnt werden das ich Anfänger bin!
Hoffe jemand weiß einen Rat.

Danke im vorraus
Gast #1375599
>Autor:  Gast (Gast)

Eigentlich antworte ich auf namenlose Beiträge nicht, und ich habe 
obiges Posting auch nur überflogen: Wenn Du sonst alles richtig gemacht 
hast könnte es mal wieder das Problem mit dem Prescaler sein. Der 
AT90USB1287 teilt den Takt intern (zunächst) durch 8, wenn er nicht 
anders programmiert wurde. Wenn Du das nicht berücksichtigst stimmt dein 
UART Timing natürlich nicht. Es gab schon einige Leute mit diesem 
Problem, auch hier im Forum.
Gast #1375894
Hi,
erstmal danke für die Antwort! Was hat das mit dem Prescaler auf sich?
An dem habe ich nichts eingestellt!

Hab mal das init()von Ihrer Uart_dev übernommen
die Einstellungen passen soweit mit dem was ich will überein.

#include <avr/io.h>
#include "lcd-routines.h"
#ifndef F_CPU
#define F_CPU 8000000UL
#define KB_HIT() (UCSR1A & (1 << RXC1))

#endif

#define Wait_USART_Ready() while (!(UCSR1A & (1<<UDRE1)))
#define BAUDRATE 19200UL //Definition als unsigned long, sonst gibt es 
Fehler in der Berechnung

void uart_init()
{
    uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);

    UBRR1H = (uint8_t) (ubrr>>8);
    UBRR1L = (uint8_t) (ubrr);

    // UART Receiver und Transmitter anschalten
    // Data mode 8N1, asynchron
    UCSR1B = (1 << RXEN1) | (1 << TXEN1);
    UCSR1C = (1<<UCSZ10) | (1<<UCSZ11);

    // Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger 
Werte)
    do
    {
        UDR1;
    }
    while (UCSR1A & (1 << RXC1));
}


Trotzdem kommen nur Kryptische Zeichen an!!!

Gesendet wird das ganze über:


    if (!( PIND & (1<<PIND4) )) { //wenn Taster S4 betätigt
    USART_WriteChar('z');    //Sende z

    }

Hoffe jemand weiß Rat!!!

Gruß
Alex
Gast #1376256
>Hi,
>erstmal danke für die Antwort! Was hat das mit dem Prescaler auf sich?
>An dem habe ich nichts eingestellt!

Na du könntest schon mal ins Datenblatt gucken!

>Hab mal das init()von Ihrer Uart_dev übernommen
>die Einstellungen passen soweit mit dem was ich will überein.

Ich schätze mal so geht es nicht -- entweder deaktivierst Du den 
Prescaler, etwa wie ich es in

http://www.ssalewski.de/USB-Sources/SUDD.c

getan habe

int
main(void)
{
  cli();
  CLKPR = (1<<7);
  CLKPR = 0; // clock prescaler == 0, so we have 16 MHz mpu frequency 
with our 16 MHz crystal

oder Du akzeptierst den durch 8 geteilten Takt, etwa mit

#define F_CPU       1000000UL

Und dann würde ich nicht gleich mit

#define BAUD        19200UL

sondern langsamer, etwa wie bei mir

#define USART_BAUD  9600UL    // baud(rate) for serial port


Und dann kommt es natürlich auf deine Hardware-Verdrahtung und die 
Einstellungen Deines Terminal-Programms an, wenn die nicht korrekt sind 
wird es nicht funktionieren.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.