Forum: Compiler & IDEs UART


von saschisch (Gast)


Lesenswert?

Hallo Leute!

Ich hab das Problem, das meine serielle Schnittstelle nicht senden
kann. Das Programm sollte "test" auf dem Display ausgeben uwenn UDRE
gesetzt ist. Das tut es aber nicht.WARUM?  Bitte um Hilfe.(ist
dringend)

main.c:

#include <stdlib.h>
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/pgmspace.h>
#include "lcd.h"
#include <lcd.c>
void sendeneinzeichen(unsigned char daten)
{
while (!(UCSRA & (1<<UDRE))); //Warten bis UDR leer ist
lcd_puts("test");
UDR=daten;
}

/*
** constant definitions
*/






int main(void)
{
    char buffer[7];
    int  num=13564;




    /* initialize display, cursor off */
    lcd_init(LCD_DISP_ON);


        /* convert interger into string */
        itoa( num , buffer, 10);


        /* put converted string to display */
        lcd_puts(buffer);

    //UART INIT

    //UBRR = 23
    UBRRH=0x00;
    UBRRL=23;
        //TXD einschalten
    UCSRB|=(1<<TXEN);
    //Frame Format 1SB 8DB 1STP 0PB
    UCSRC=(1<<UMSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    itoa( num , buffer, 10);
    for(;;)
    {

    sendeneinzeichen('x');

    lcd_clrscr();

    }





}

von Hubert.G (Gast)


Lesenswert?

Das lcd_clrscr(); in der for-Schleife löscht dir das Disp schneller als
es anzeigen kann.
Es können aber noch andere Fehler drinnen sein.

von saschisch (Gast)


Lesenswert?

Hallo!

Vielleicht haben wir einfach nur Glück, denn auf unserem Display steht,
was wir sehen wollen. Das eigentliche Problem besteht einfach darin,
dass auf der anderen Seite der seriellen SChnittstelle einfach kein
Signal ankommt. Kannst du dir das vielleicht auch erklären?

MfG

saschisch

von Hubert.G (Gast)


Lesenswert?

Ich verwende ein fertige UART-Routine und hatte das Glück das sie immer
so funktioniert hat wie ich es wollte und habe mir so eine Menge leere
Kilometer erspart.
Vom PC her einfach mal RxD und TxD verbinden und schauen ob das
Terminal das Echo anzeigt, im Terminal natürlich Echo ausschalten.

von Tom (Gast)


Lesenswert?

Bist du sicher, dass deine Baudrate richtig eingestellt ist? Die 23
kommen mir etwas komisch vor (ausser du hast nen Quarz mit so ner
krummen Frequenz).
Hat denn die serielle schon mal funktioniert? Ansonsten: verdrahtung
checken...

Gruss

von saschisch (Gast)


Lesenswert?

Hallo!

Die 23 kommen bei einer Frequenz von 3,6864 Mhz exakt heraus ;)
Wir haben uns heute die komplette Verdrahtung angeschaut und wir sind
zu dem Entschluss gekommen, dass wir fehlerfrei gearbeitet haben :)
Wir haben bis heute außerdem mit einem USB - Serial Adapter gearbeitet
und vertrauen dem aber nicht. Also haben wir heute das ganze direkt zu
einer seriellen Schnittstelle geführt und schätzt mal..... es
funktioniert trotzdem nicht!!

Binamverzweifeln

MfG

Saschisch

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Was tut es denn eigentlich?

Bist du dir auch sicher, dass du wirklich mit den 3,6864 Mhz
arbeitest (und nicht etwa mit den internen 1 MHz)?

von saschisch (Gast)


Lesenswert?

Das ist ein guter Hinweis!

Aber ich weiß ehrlich gesagt nicht wie ich das nachprüfen kann. Bitte
erklär es mir und sobald ich wieder zu meinem µC komme mache ich das !

MfG

Saschisch

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Fusebits angucken.

Ich nehme dafür immer den Terminalmodus von avrdude.  Meine
Kollegen nehmen zuweilen dafür auch AVR Studio, aber die suchen
da doch meist länger 'rum als ich.

Anyway, falls du die Fuses noch nicht geändert hast, kannst du
erstmal davon ausgehen, dass du mit 1 MHz fährst.  Das geht mit
der UART sogar ganz brauchbar (zumindest bei Vcc = 5 V, für das
der RC-Oszillator bei den meisten AVRs kalibriert ist), sofern
man das U2X-Bit einschaltet (Oversampling von 16fach auf 8fach
reduziert).  Da ist der nominelle Baudratenfehler bei 9600 Bd
nur noch 0,2 %, damit kann jede RS-232-Verbindung eigentlich
leben.

von Karl H. (kbuchegg)


Lesenswert?

> Aber ich weiß ehrlich gesagt nicht wie ich das nachprüfen kann.

Schreib Dir ein Programm, dass eine LED im Sekundentakt (theoretisch)
blinken lassen soll. Ob die LED einmal oder dreimal in der
Sekunde´blinkt, siehst Du mit freiem Auge.

von saschisch (Gast)


Lesenswert?

OK danke!

Ich habe mir schon mal so eine Art LED Lciht gebaut und das mit einer
Frequenz von theoretischen 1 kHz blinken lassen. Am Oszi waren das dann
aber 3, ... ms. Ich habe mir damals gedacht, dass das daher rührt, dass
die Befehle ein bisschen länger dauern beim Abarbeiten und habe dann
einfach die AVR Lib delay.h verwendet. Ist das schon ein Beweis dafür?

MfG

Saschisch

von Karl H. (kbuchegg)


Lesenswert?

Das whrscheinlichste ist, dass der AVR mit einer
anderen Taktfrequenz arbeitet als Du glaubst.
Oder Du hast Dich bei der Berechnung der 1 kHz
vertan.

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.