Forum: Mikrocontroller und Digitale Elektronik AT90USB USART


von Gast (Gast)


Lesenswert?

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

von Stefan Salewski (Gast)


Lesenswert?

>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.

von Stefan Salewski (Gast)


Lesenswert?

>gab schon einige Leute mit diesem Problem,

Finde ich jetzt nicht, aber eigentlich kannst Du Dir von hier alles 
zusammen suchen:

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

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

von Alex (Gast)


Lesenswert?

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

von Stefan Salewski (Gast)


Lesenswert?

>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.

von Stefan Salewski (Gast)


Lesenswert?


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
Noch kein Account? Hier anmelden.