Forum: Mikrocontroller und Digitale Elektronik UART will nicht


von jochen (Gast)


Lesenswert?

Hallo Zusammen,

ich hab eben versucht meinen AVR (mega8) davon zu überzeugen das er dem
PC doch was über die seriele Schnittstelle erzählen soll.
Hab das ASM Programm aus dem Tutorial genommen. Leider mach mein PC
aber keinerlei Anstalten Test! anzuzeigen.

Hat einer vielleicht eine Idee woran das liegen könnte.
Hab leider kein Oszi hier um was auszumessen. aber mit Multimeter und
Logigstift bin ich mal soweit gekommen:
Am uC werden Daten gesendet die auch über den Wandler gehen (hab am
Ausgang ca 10V Wechselspannung) die Recive-Leitung vom PC ist allerings
immer -10V.
Wenn ich das mit der seriellen Schnittstelle richtig kapiert habe
müsste die eigentlich kurz was senden wenn sie ein byte empfangen hat.
Tut sie aber nicht. Zumindest sagt mir mein Logigstift das.

Am Pc hab ich das HyperTerminal wie beschrieben eingestellt.
OS ist WIN2K.

Bin für jede Hilfe dankbar, der Jochen

P.S. hab auch schon andere Baudrate getestet. leider ohne Erfolg.

von jochen (Gast)


Lesenswert?

Hallo nochmal,

hab eben mal den MAX232 durchgemessen:
Ausgang:
liegen 5V an kommt hinten -12V raus, bei GND kommt hinten 12V
Eingang:
-12V kommt +5V raus bei +12V kommt kommt GND

Ich denke das sieht soweit ganz gut aus

Jochen

von Johannes Raschke (Gast)


Lesenswert?

Hi!

Also, von allein wird die Schnittstelle nicht antworten, wenn etwas
reinkommt... Dieses "echo" müßte man schon in der Software am PC
einstellen!

Der MAX scheint tatsächlich in Ordnung zu sein.

Bei meinem Programm war es so, daß ich nach jedem vom AVR gesendeten
Zeichen eine kurze Pause machen mußte, weil die Abfrage des
"schon-fertig" - Bits nicht geklappt hat...

Bist Du Dir sicher, daß die Taktfrequenz stimmt? Interner Oszi ist aus?

von jochen (Gast)


Lesenswert?

Wie kann ich überprüfen ob der interne Oszi aus ist?

Hab jetzt mal das C-Programm von gcctest4 genommen. Hab das noch auf
meinen mega8 angepasst UCR -> UCSRB und UBR -> UBRRL.

Hab mit mal ein anderes Terminalprog namens Tera Term Pro
heruntergeladen. Da kommen auch irgendwie Zeichen an, hat aber mit dem
was ankommen sollte nichts zu tun. Sind aber soweit ich das beurteilen
kann immer 32 Zeichen so wie Sie von meinem Prg gesendet werden.

Danke schon mal für Eure Hilfe, der Jochen

von Johannes Raschke (Gast)


Lesenswert?

Hi!

Soweit ich weiß, wird der interne Oszillator über Fusebits eingestellt
- also mit einem parallelen Programmer. Du kannst ja mal testen, ob es
besser funktioniert, wenn Du davon ausgehst, daß der MC mit nur 1 MHz
läuft und dementsprechend den Wert zur Baudratenberechnung anpasst...
Wieviele Zeichen sollten sollten denn gesendet werden? 5? Wäre ja
komisch, wen es plötzlich mehr werden...

Tja, viel mehr fällt mir nicht ein...


Johannes

von jochen (Gast)


Lesenswert?

Hallo noch mal,

hab den Takt mal auf 1MHz eingestellt. Nun bekomme ich im HyperTerminal
auch permanent Daten gesendet. Jedoch haben die Daten nichts mit dem zu
tun was der AVR sendet(bzw. senden soll).

Das müsste ja mal fürs erste heißen das das UART mit dem internen Oszi
arbeitet, oder? Wenn ja wie kann ich das abstellen?

Komisch ist auch noch das, wenn ich dem uC den Saft klaue und in dan
wieder anklemme, immer mal ein paar Zeichen richtig ankommen s.U.

òiaì Data fⓥ²©¡¬ „¡´¡¡´¡ ¦²¯­ ¶’ ²¥£¥©¶¥¤££ƒ¬ ¤¡´¡ æ²ï­ ¡–’ receiv
     ^^^^^^                                                  ^^^^^^

Woran kann das liegen.
Es werden immer die gleichen 32 Zeichen gesendet, nur nicht die, die
kommen sollten.

Bin für jeden Hinweis Dankbar, der Jochen

Hier mal noch mein C-Code den ich verwende.

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>


#define F_CPU            1000000      /* 4Mhz */
#define UART_BAUD_RATE      9600      /* 9600 baud */


#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1)


typedef unsigned char  u08;
typedef          char  s08;
typedef unsigned short u16;
typedef          short s16;


/* uart globals */
static volatile u08 *uart_data_ptr;
static volatile u08 uart_counter;



SIGNAL(SIG_UART_TRANS)
/* signal handler for uart txd ready interrupt */
{
    uart_data_ptr++;

    if (--uart_counter)
        outp(*uart_data_ptr, UDR);       /* write byte to data buffer
*/
}


SIGNAL(SIG_UART_RECV)
/* signal handler for receive complete interrupt */
{
    register char led;

    led = inp(UDR);        /* read byte for UART data buffer */
    outp(~led, PORTB);     /* output received byte to PortB (LEDs) */
}


void uart_send(u08 *buf, u08 size)
/* send buffer <buf> to uart */
{
    if (!uart_counter) {
        /* write first byte to data buffer */
        uart_data_ptr  = buf;
        uart_counter   = size;
        outp(*buf, UDR);
    }
}


void uart_init(void)
/* initialize uart */
{
    /* enable RxD/TxD and ints */
    outp((1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN),UCSRB);
    /* set baud rate */
    outp((u08)UART_BAUD_SELECT, UBRRL);
    outp(0, UBRRH);

}


int main(void)
{
    outp(0xff ,DDRB);      /* PortB output */
    outp(0x00, PORTB);     /* switch LEDs on */

    uart_init();
    sei();                 /* enable interrupts */

    for (;;) {             /* loop forever */
        uart_send("Serial Data from AVR received###", 32);
    }
}

von Oli (Gast)


Lesenswert?

>#define F_CPU            1000000      /* 4Mhz */
>#define UART_BAUD_RATE      9600      /* 9600 baud */

>#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1)

OK, für 1Mhz sind es 1000000. Aber steht dort
UART_BAUD_RATE*hunderteinundsechzig ? müsste 16 sein...

von Jochen (Gast)


Lesenswert?

Da hab ich mich auch gewunder, das heist aber nicht 161 sondern 16L
wollt ich mich mal noch drum kümmern wofür das L steht.
Das Problem selbst hat sich gelöst nach dem ich meinem uC klar gemacht
habe das er nur den externen 4MHz Takt nehmen soll. Seit dem sendet er
brav was er soll.

Danke an alle Die mir weiter geholfen haben, der Jochen

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.