UART -> PC

Gast #216240
Lesenswert?

hallo,
um debugg Infos zu bekommen will ich die serielle Schnittstelle des uC
an den PC anschließen.
hier mein Code

#include <avr/io.h>
    2
    3
    4 void usart_init()
    5 {
    6    UBRR0L=103;               // 9600 bps
    7    UBRR0H=0;
    8    UCSR0B = (1<<TXEN);       // Receiver enable
    9                             // Set frame format
   10 }
   11
   12
   13
   14 int main ()
   15 {
   16    usart_init();
   17     while (!(UCSR0A & (1<<UDRE))); /* warten bis Senden moeglich
                 */
   18         UDR0 = 'x';                    /* schreibt das Zeichen
x
                                            auf die Schnittstelle
   19
   20 }

ich arbeite mit ATMega128, stk500,501
Linux vielleicht liegts auch daran ?
ich strate die bash
dann in wechsel ich in Ordner /dev
dann mach ich einfach cat ttyS0
dann strate ich meinen uC neu ... nichts passiert ..
liegts an meinem Programm oder wie ich die serielle Schnittstelle unter
Linux abfrage.
 Danke Sehr
   Chris

PS: Ich find das Forum hier echt gut.
    Danke an alle ;-)
Gast #216248
Lesenswert?

> ich weis ehrlcih gesagt net was ich für nen Takt benutze,
> hab in der stk nirgendwo was darüber gefunden :-( ....

Das ist aber doch schon von elementarer Bedeutung. Du solltest
vielleicht wirklich mal herausfinden, wie hoch deine Taktfrequenz ist.
Gast #216249
Lesenswert?

kennst du das stk500 ?
das stk501 ist nur ne erweiterung für den ATMega128, bei dem ATMega128
ist doch PORTE0 ist doch RXD0
     und PORTE1 ist doch TXD0
als hab ich so ein zwei kleine leitungen genommen und PORTE0 mit RXD
und PORTE1 mit TXD ( RS232 Spare , gleich neben Port E verbunden, alles
auf stk500 )
jetzt nehme ich an die RS232 Spare Serielle Buchse vorne neben der
anderen seriellen Schnittstelle ( zum Programmieren ) zu den beiden
Pins neben PortE gehört ? da habe ich dann meine Leitung zum PC
angeschlossen ..... chris
Gast #216251
Lesenswert?

Wie wäre es, wenn du UBRR0L und UBRR0H in der Reihenfolge anordnest, wie
sie im Datenblatt beschrieben ist?
Zumindest bei den beiden Megas (32 und 162), die ich bisher per UART
angesprochen habe, war es so, dass UBRRH vor UBRRL beschrieben werden
musste.
Gast #216252
Lesenswert?

installier mal minicom...
dann starten STRG A O und dort bei serial port setup
Baudraten einstellen etc.
Dann in minicom bleiben oder kannst auch rausgehen und per cat ttyS0
gucken.
Wichtig ist nur das die Baudrate einmal richtig gesetzt wird ;)
Gast #216253
Lesenswert?

hi,
die Baudrate ist richtig, bzw die gleiche die ich in meinem uC Prog
benutz haben 9600 bps .......
ich hab das mit dem Befehl stty überprüft ...da war die PC
Schnittstelle auch auf 9600 Baud eingestellt ....
ja, mal ehrlcih .. ich muss mal rausfinden welche Taktfrequenz ich
benutze .....
  chris
Gast #216254
Lesenswert?

guten morgem,
ich schon wieder , also hab rausgefunden wie mein Takt ist 1Mhz (
default)
hier mein aktuelles Progamm

 10 int main ()
   11 {
   12    int i,j;
   13    char x='x';
   14    DDRB=255;
   15    //usart_init();
   16    UBRR0H=0;
   17    UBRR0L=12;                 // 9600 bps
   18
   19    UCSR0B = (1<<TXEN);       // Trans enable
   20
   21     while ((UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich
                 */
   22      {
   23          for(i=0;i<1000;i++)
   24           {
   25            for (j=0;j<100;j++)
   26              {
   27               PORTB=255;
   28              }
   29           }
   30         UDR0 = x;                     /* schreibt das Zeichen
auf die Schnittstelle */
   31         for(i=0;i<1000;i++)
   32           {
   33            for (j=0;j<100;j++)
   34              {
   35                PORTB=0;
   36              }
   37           }
   38      }
   39}


es geht immer nich net :-( ...
  chris
#216256
Lesenswert?

Hallo,

ich sehe auf Anhieb zwei Problemas :
1. in UCSR0C ist nicht die richtige Menge an Datenbits eingestellt ! Du
verwendest momentan 5N1, also 5bits Daten keine Parität und 1 Stopbit -
Du solltest aber besser 8N1 verwenden. Also noch mal kurz zurück ans
Reißbrett und im Datenblatt Seite 192 konsultieren.
2. Deine Programmstruktur ist nicht gut. Der GCC meckert doch bestimmt
jedesmal rum, dass Deine non-void function irgendwie ohne return
aufhört .... Die Funktion main() sollte mit einer Endlosschleife enden.
Ungefähr so:

...
// Initialisierung
...

// Hauptschleife
while (1)
{
 // warten, bis ein Zeichen gesendet werden kann
 while (!(UCSR0A & (1 << UDRE))) ; // Es ist Quatsch, dass hier {}
stehen muss ';' reich völlig aus.

 // Ein Zeichen auf den Weg schicken.
 UDR0 = 'x';
}

// Ende von main()

Wenn Du Dein Programm so aufbaust, dann sendet der MC immer ein 'x'
nach dem anderen an den PC. Pass dabei auf, dass Du zuerst auf dem PC
Dein Terminalprogramm oder was auch immer für eine Empfangsmöglichkeit
startest und dann noch mal den Microcontroller anhaust - wir wollen ja
immer schön in sync bleiben ;-).

MfG, Daniel.

P.S.: PC-Programme sollten nach endlicher Zeit enden (es sei denn es
sind Betriebssysteme. Microcontrollerprogramme sollten eigentlich nicht
enden, es sei denn sie laufen auf Betriebssystemen.
Gast #216257
Lesenswert?

Also ein Tipp von mir.
Verwende unter Linux minicom (eventuell als root).
Dann verbinde dein RX und TX am seriellen Port und schreibe wie ein
wilder im Minicom. Jetzt sollten alle Buchstaben als Echos kommen so
kannst du testen ob dein Terminal geht.

cu
chege

--: http://cybertux.org :--
Gast #216258
Lesenswert?

hi,
also danke erst mal ....
ich hab erst mal minicom benutzt :-) .... irgendwie kommt nur das an

&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; 
&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; 
&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; 
&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; 
&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; 
&#65533;&#65533;&#65533;

&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H&# 
65533;[9;96H&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H&#65 
533;[9;96H&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H&#6553 
3;[9;96H&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H&#65533; 
[9;96H&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H&#65533;[9 
;96H&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H&#65533;[9;9 
6H&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H 
&#65533;[9;96H&#65533;[9;96H&#65533;[9;96H



mein Programm sieht so aus (1Stopbit , 8Datenbits)
 #include <avr/io.h>
    2
    3 int main ()
    4 {
    5    int i,j;
    6    DDRB=255;
    7    UBRR0H=0;
    8    UBRR0L=6;                                             // 9600
bps
    9    UCSR0B = (1<<TXEN)|(0<<UCSZ02);                       //
Transmiter enable
   10    // Set Frame Format QUCSR0C=
(0<<USBS0)|(1<<UCSZ00)|(1<<UCSZ01);          // 1 Stopbit
   11
   12
   13    PORTB=255;
   14    while(1)
   15    {
   16      while (!(UCSR0A & (1<<UDRE0)));  /* warten bis Senden
moeglich dh UDRE0=1                  */
   17      {
   18        UDR0 = 'x';                     /* schreibt das Zeichen
auf die Schnittstelle */
   19      }
   20    for (i=0;i<1000;i++)
   21     {
   22     for(j=0;j<100;j++)
   23      {
   24       PORTB=~1;
   25      }
   26     }
   27    }
   28  return 0;
   29 }
   30
   31

ja mein Compiler emkert
"no new line at end of file" ..
kann mir jemadn saen warum ich kein x sehe ?
  chris
#216262
Lesenswert?

Hallo ?

N -> odd parity ?!

Wo auch immer das so gehandhabt wird, ist es ein großer Unfug !
Normalerweise steht 8N1 für 8 bits Daten - parity _N_one - 1 stop-bit.

Mir persönlich ist die Bezeichnung (N) für eine odd-parity noch nie
untergekommen. Bitte überprüfen.

MfG, Daniel
Gast #216264
Lesenswert?

Sorry mein Fehler ;-)

Im minicom ist die Taste L für none und O für ODD ;-)

N => None Parity stimmt natürlich. Bin Heute etwas verpeilt :-)


Tasten Einstellung Minicom
L: None  : =>  8N1
M: Even  : =>  8E1
N: Odd   : =>  8O1
O: Mark  : =>  8M1
P: Space : =>  8S1

Bin dann lieber still ;-)

cu
chege
Gast #216265
Lesenswert?

also, es is immer das gleiche se geht net :-( ....
hab inzwischen meine Parity eingestllt, dann uit mirg aufgefallen das
ich nicht angeb ob synchron oder asynchron ...
bei meinem Takt bin ich mir net sicher ob 1Mhz oder 3.68 Mhz
mein derzeitges Prog

   1 #include <avr/io.h>
    2
    3 int main ()
    4 {
    5
    6    int i,j;
    7    DDRB=255;
    8
    9    UBRR0H=0;
   10    UBRR0L=23;                 //9600 bps
   11    UCSR0B = (1<<TXEN)|(0<<UCSZ02);  // Transmiter enable
   12    // Set Frame Format
   13    UCSR0C=
(0<<UMSEL0)|(0<<USBS0)|(1<<UCSZ00)|(1<<UCSZ01)|(0<<UPM01)|(0<<UPM00);
       // 1 Stopbit, 8 Daten , No Parity
   14
   15
   16    PORTB=255;
   17    while(1)
   18    {
   19      while (!(UCSR0A & (1<<UDRE0)));  /* warten bis Senden
moeglich dh UDRE0=1                  */
   20      {
   21        UDR0 = 65;                     /* schreibt das Zeichen
auf die Schnittstelle */
   22      }
   23    for (i=0;i<1000;i++)
   24     {
   25     for(j=0;j<100;j++)
   26      {
   27       PORTB=~1;
   28      }
   29     }
   30    }
   31  return 0;
   32 }
   33
   34
....und es kommt nur Müll bei minicom an ...
hab die HardwareFlußkontrolle ain bzw ausgeshclatet .. also beides
probiert ..... es kommen nur punkte ..... obwohl 65 = a ...
muss ich in minicom angeben das in ascii zeichen augegebne werden soll
? ......
noch was .. ich hab mal die äußere while - schleife weggelassen
als bei jedem Reset wurde ein zeichen gesendet ....
minicom hat aber erst nach 2 maligm drücken der Reset taste was
ausgegeben ..... wie kann das sein ? ...
  chris
PS bei meinem minocom steht unten immer offline aber wenn ich resette
kommt schon was an ... ??
Gast #216267
Lesenswert?

ein bischen Erfolg ....
als ich sende jetzt '6' .. aber im minicom kommt
666v6v6vvvvv6vvv6v66v6v6v dh 6 und v in ungeregelter reihenfolge
ich hab schon Umsel =1 oder =0 probiert ...
muss ich  noch was umstellen bei synchron ??
  chris
Gast #216268
Lesenswert?

> Könnte es sein, daß das Benutzerinterface von "Minicom" kaputt ist?

Du meinst damit sicher das Betriebssystem, natürlich ist das kaputt :)
Er sollte einfach mal Windows benutzen, da kann nichts kaputt gehen.
Gast #216270
Lesenswert?

hallo,
wenn ich das Programm starte :
    1 #include <avr/io.h>
    2
    3 void sende(char x)
    4 {
    5     while (!(UCSR0A & (1<<UDRE0)));  /* warten bis Senden
moeglich dh UDRE0=1                  */
    6     UDR0 = x;                     /* schreibt das Zeichen  auf
die Schnittstelle */
    7     return;
    8 }
    9
   10
   11 int main ()
   12 {
   13
   14    int i,j;
   15    DDRB=255;
   16
   17    UBRR0H=0;
   18    UBRR0L=6;                                            // 9600
bps
   19    UCSR0B = (1<<TXEN)|(0<<UCSZ02);                       //
Transmiter enable
   20    // Set Frame Format
   21    UCSR0C=
(0<<UCPOL0)|(0<<UMSEL0)|(0<<USBS0)|(1<<UCSZ00)|(1<<UCSZ01)|(0<<UPM01)|(0 
<<UPM00);
         // 1 Stopbit, 8 Daten bist
   22    UCSR0A= (0<<U2X0);    // normal  mode
   23    PORTB=255;
   24    while(1)
   25    {
   26   /* sende('a');
   27    sende('b');
   28    sende('1');
   29    sende('5');
   30    sende('6');
   31    sende('7');*/
   32    sende('8');
   33    sende('9');
   34   /*
   35    for (i=0;i<1000;i++)
   36     {
   37     for(j=0;j<100;j++)
   38      {
   39       PORTB=~1;
   40      }
   41     }*/
   42    }
   43  return 0;
   44 }

wird immer nur 8 bzw x ausgegebn ..... warum wird die funktion senden
nie mit '9' aufgerufen ??
  chris
#216271
Lesenswert?

Hallo chris.
Ich habe hier leider kein ATMega128 also kann ich diesen Code nicht
testen, aber laut dem Datenblatt müsste folgender Code Funktionieren,
sofern mit deiner Hardware alles in Ordnung ist:
1
void USART_Init( unsigned int baud )
2
{
3
    /* Set baud rate */
4
    UBRR0H = (unsigned char)(baud>>8);
5
    UBRR0L = (unsigned char)baud;
6
    /* Enable receiver and transmitter */
7
    UCSR0B = (1<<RXEN)|(1<<TXEN);
8
    /* Set frame format: 8data, 1stop bit */
9
    UCSR0C = (0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
10
}
11

12
void USART_Transmit( unsigned char data )
13
{
14
    /* Wait for empty transmit buffer */
15
    while ( !( UCSR0A & (1<<UDRE)) ) ;
16
    /* Put data into buffer, sends the data */
17
    UDR0 = data;
18
}
19
  
20
 
21

22
int main ()
23
{
24
  USART_Init(0x000C);//fuer 19200 Baud
25
  while(1)
26
  {
27
    USART_Transmit('x');
28
    USART_Transmit('#');
29
    USART_Transmit('q');  
30
  }
31
  return 0;
32
}

Ein ähnlicher Code für ATMega8 funktioniert bei mir einwandfrei.
Trotzdem was hier ein Troll behauptet, funktioniert Zugriff auf
serielle Schnittstelle unter Linux recht zuverlässig.
Die Schnittstell soll aber noch konfigurieren werden:
stty -F /dev/ttyS0 ispeed 19200 cs8
und dann mit:
cat /dev/ttyS0 zeichen empfangen.
Gast #216272
Lesenswert?

hi,
geht leider auhc net :-( ...... wenn ich stty -F /dev/ttyS0 eingebe
kommt das

speed 9600 baud; line = 0;
min = 1; time = 5;
ignbrk -brkint -icrnl ixoff -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke

kann das sein das ich min , oder time umstellen muss ??
  chris
#216273
Lesenswert?

>kann das sein das ich min , oder time umstellen muss ??
nein, es ist ok so.
>wenn ich stty -F /dev/ttyS0 eingebe
Ja das sind alle aktuellen einstellungen, gib einfach mal stty --help
um zu sehen was sie bedeuten.Es ist auch alles in Ordnung so.Aber es
ist auch alles eher unwichtig.

Wozo gibst du eigentlich stty -F /dev/ttyS0 alleine, damit werden doch
keine Einstellungen geändert ?

Wichtig ist Baudrate und Framenformat. Hat du es eingestelllt ? Auf
beiden Seiten muss es richtig eingestellt sein.
Bei dir seht aber dannach nicht aus(speed 9600 baud), der Code was ich
gepostet habe ist für 4MHz Quarz und 19200Baud.

Also:
stty -F /dev/ttyS0 ispeed baudrate cs8

und im Code entsprechenden Wert bei USART_Init(Wert) übergeben. Sonst
kannst du entweder nichts empfangen oder nur sinnlose Zeichen.
Gast #216275
Lesenswert?

Am besten fängst Du mit einem Echo an; d. h. die empfangenen Bytes
werden ungeändert zurück geschickt, so wie von einer Drahtbrücke.
In einem Programm wie minicom sieht man dann, ob die Daten ankommen
oder nicht und ob sie auch unverändert ankommen.
Mit Drahtbrücken am seriellen Port und direkt vor dem MC bekommt man
heraus, ob die Hardware funktioniert. Erst nach diesen Test macht es
Sinn die Software auf dem MC zu betrachten.

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