mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT90USB USART


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.