Frage zu UART

Gast #2841901
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
}
Angehängte Dateien:
Gast #2841941
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.
Gast #2841950
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??
Gast #2841954
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?
#2841965
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
Gast #2841971
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 ?
Gast #2841979
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 :-(.
Gast #2841997
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.
Gast #2842019
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?
#2842068
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren