Forum: Mikrocontroller und Digitale Elektronik Frage zu UART


von Anfänger (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

aus dem Datenblatt habe ich ein paar Programmsegmente kopiert und in ein 
C-Programm geschrieben. Compilieren und linken ging ohne Probleme und 
dann habe ich das Programm im Debugger ausgeführt und besonders dabei 
die Variable UDR0 beobachtet. Bei den anderen Variablen sehe ich, wie 
sie sich verändern (zB. nach jedem Schritt in UART_init), aber UDR0 - wo 
eigentlich der Wert reinmüsste, den ich mit der Funktion USART_Transmit 
übergebe, wird nie dort reingeschrieben, die Bits von UDR0 bleiben alle 
ungesetzt. Mach ich da was falsch in dem Programm oder kann ich bei den 
IO-Views nicht sehen, wenn ein Zeichen zur Übertragung in UDR0 
geschrieben wurde?
1
 C-Code
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
/*
5
1. UART initialisieren
6
2. 
7
8
*/
9
10
11
#define FOSC 8000 // Clock Speed
12
#define BAUD 9600
13
#define MYUBRR FOSC/16/BAUD-1
14
15
void USART_Init( unsigned int ubrr)
16
{
17
/*Set baud rate */
18
UBRR0H = (unsigned char)(ubrr>>8);
19
UBRR0L = (unsigned char)ubrr;
20
/* Enable receiver and transmitter */
21
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
22
/* Set frame format: 8data, 2stop bit */
23
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
24
}
25
26
void USART_Transmit( unsigned char data )
27
{
28
/* Wait for empty transmit buffer */
29
while ( !( UCSR0A & (1<<UDRE0)) );
30
/* Put data into buffer, sends the data */
31
UDR0 = data;
32
}
33
34
int main(void)
35
{
36
    int i=0;
37
  USART_Init(9600);
38
  for (i=1; i<14; i++)
39
     { 
40
    USART_Transmit(i);
41
    //UDR0 = i;
42
    //PORTB ++;
43
     }    
44
  
45
}

von Anfänger (Gast)


Lesenswert?

Hi, egal, wie auch immer ich versuche an UDR0 einen Wert zu schicken, es 
klappt nicht. An mehreren Stellen in dem Programm hab ich eingebaut
1
UDR0 = 'x';

und ich habe gehofft, dass mir dann der Binärcode-ASCII im IO-View von 
'x' angezeigt wird, aber nix, nix nix.

von Dr G. Reed (Gast)


Lesenswert?

UDR kann zwar geschrieben werden

Aber wenn man es liest, wird es den Wert eines vorher empfangenen 
Zeichens beinhalten.

von Anfänger (Gast)


Lesenswert?

Dr G. Reed schrieb:
> UDR kann zwar geschrieben werden
>
> Aber wenn man es liest, wird es den Wert eines vorher empfangenen
> Zeichens beinhalten.

Ach so, ich bekomme also im IO-View "nur" bei den Bits etwas angezeigt, 
wenn ich ein Signal empfangen habe, nicht jedoch, ob eins versendet 
wurde??

von Anfänger (Gast)


Lesenswert?

also genaugenommen, um etwas zu sehen, müsste ich es "real" machen, also 
auf den uC flaschen und dann mit einem Oszi das Signal abreifen und dann 
meine Bits von dem gesendeten Zeichen anhand der Flanken erkennen?

von Dr G. Reed (Gast)


Lesenswert?

Wenn ein Zeichen versendet wurde, ist danach das TX-Complete Flag 
gesetzt, das kann man dann abfragen oder einen Interrupt auslösen 
lassen.

von Dr G. Reed (Gast)


Lesenswert?

Wies im Simulator genau aussieht, weiss ich nicht, aber in Echt 
funktioniert das recht zuverlässig!

von Ulli B. (ulli-b)


Lesenswert?

Anfänger schrieb:
> also genaugenommen, um etwas zu sehen, müsste ich es "real" machen, also
> auf den uC flaschen und dann mit einem Oszi das Signal abreifen und dann
> meine Bits von dem gesendeten Zeichen anhand der Flanken erkennen?

Vielleicht bist Du auch in der glücklichen Lage noch einen PC mit 
serieller Schnittstelle zu besitzen (oder einen RS232/USB-Umsetzer).
Dann kannst Du mit einem Terminalprogramm ganz einfach mitlesen was da 
so gesendet wird.

Das ist wesentlich komfortabler als ein Oszi.

mfG
Ulli

von Dr G. Reed (Gast)


Lesenswert?

Ich hab mit dem Simulator noch fast nie was gemacht, vielleicht kann man 
bei dem ja auch virtuell den RX und TX Pin verbinden, dann müsste man ja 
im UDR Register nach einiger Zeit das gesendete Zeichen wieder empfangen 
können.

Kann man das ?

von Anfänger (Gast)


Lesenswert?

Ulli B. schrieb:
> Vielleicht bist Du auch in der glücklichen Lage noch einen PC mit
> serieller Schnittstelle zu besitzen (oder einen RS232/USB-Umsetzer).
> Dann kannst Du mit einem Terminalprogramm ganz einfach mitlesen was da
> so gesendet wird.

hab ich schon, aber ich wollte es erstmal im Simulator ausprobieren, ob 
dann das Programm alles klappt, so hab ich den ganzen "Aufwand" auch mit 
dem Überspielen des Programms auf den AVR und das wollte ich mir erstmal 
vermeiden und alles im Debugger simulieren, aber dass geht nun scheinbar 
nicht :-(.

von Anfänger (Gast)


Lesenswert?

und das Programm stimuli gibts in AVR-Studio 5 nicht, so wie ich es 
bisher gelesen haben :-(

von Dr G. Reed (Gast)


Lesenswert?

Aufwand mit Überspielen etc:

Wenn Du es ein paarmal gemacht hast, ist das wirklich kein Aufwand mehr.

Grad im Zusammenspiel mit UART-Bootloader kann man hier sehr schön 
entwickeln.

Den Simulator vermisse absolut überhaupt nicht.

von Anfänger (Gast)


Lesenswert?

Eine Frage hab ich nochmal, ich hab das AVRISPmkII.
Muss ich eigentlich dazu den uC so wie hier aufbauen:


http://www.mikrocontroller.net/wikifiles/f/f6/Mega8_Tutorial.png

Oder ist es zum Flashen eines Prgraamms ausreichend, wenn ich lediglich 
die entsprechenden Kontakte wie MISO, MOSI ... miteinander verinde und 
den Quarz und den ganzen Rest, den ich da herum habe, weglasse?

Die Frage deshalb, weil ich einen uC in einer Platine drinnen hab, wo 
viele Kontakte vorhanden sind, mit Tastern, LEDS ..., aber diese Platine 
nicht für das dierekte Flashen geeignet, sondern dass müsste ich dierekt 
machen.

Daher - muss die Grundschaltung wie in dem Link so angegeben komplett 
auch für das Flashen so aufgebaut sein?

von Thomas E. (thomase)


Lesenswert?

Anfänger schrieb:
> Daher - muss die Grundschaltung wie in dem Link so angegeben komplett
> auch für das Flashen so aufgebaut sein?
Den 6-poligen ISP-Anschluss brauchst du. Mehr nicht. Die Schaltung 
braucht eine eigene Stromversorgung. Der Avrisp versorgt die nicht!

Und deinen Uart testest du so:
1
void USART_Transmit( unsigned char data )
2
{
3
/* Wait for empty transmit buffer */
4
while ( !( UCSR0A & (1<<UDRE0)) );
5
/* Put data into buffer, sends the data */
6
UDR0 = data;
7
}
8
9
int main(void)
10
{
11
   USART_Init(9600);
12
   while(1)
13
   {
14
   if(UCSR0A & (1 << RXC0))
15
   {
16
     USART_Transmit(UDR0);
17
   }
18
   } 
19
}

Dann hängst du deinen PC mit Hyperterminal ran (RS232-Pegel beachten!) 
und wenn du ein Zeichen sendest, schickt der µC das wieder zurück. Damit 
hast du rundum alles getestet.

mfg.

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.