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 ;-)
also ich habe von PORTE0 auf RXD und PORTE1 auf TXD gesteckt (RXD und TXD von RS232 Spare , dann vorne die Serielle Schnittstelle RS232 Spare mit meinem PC verbuunden (alles bei stk500) chris
teste mal andere baudraten... ich nehme an du benutzt den internen oszi das ist immer so ne sache für sich hab putty für linux/unix noch nicht getestet aber die windows version ist gut http://the.earth.li/~sgtatham/putty/latest/putty-0.58.tar.gz
hallo, ich weis ehrlcih gesagt net was ich für nen Takt benutze, hab in der stk nirgendwo was darüber gefunden :-( .... max.p deins hab ich probiert ohen Erfolg chris
Hallo Es muss aber uaf jeden fall UDRE0 heisen, steht im Datenblatt des Mega128 drin. Kenne leider das 501 nicht,aber bist du sicher das es der UART0 ist? könnte es vieleicht 1 sein?
> 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.
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
Hast du ein Oszilloskop, mit dem du überprüfen kannst, ob aus dem ATmega überhaupt was rauskommt?
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.
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 ;)
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
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
vergesst Zeile 17
17 UBRR0L=12; // 9600 bps
war num zum Probieren
hab natürlich
UBRR0L=6; drinn
chris
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.
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 :--
hi,
also danke erst mal ....
ich hab erst mal minicom benutzt :-) .... irgendwie kommt nur das an
���������
���������
���������
���������
���������
���
�[9;96H�[9;96H�[9;96H�[9;96H�[9;96H&#
65533;[9;96H�[9;96H�[9;96H�[9;96H�[9;96HA
533;[9;96H�[9;96H�[9;96H�[9;96H�[9;96Hᦙ
3;[9;96H�[9;96H�[9;96H�[9;96H�[9;96H�
[9;96H�[9;96H�[9;96H�[9;96H�[9;96H�[9
;96H�[9;96H�[9;96H�[9;96H�[9;96H�[9;9
6H�[9;96H�[9;96H�[9;96H�[9;96H�[9;96H
�[9;96H�[9;96H�[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
Hast du mal den Test mit RX TX gemacht? Ansonsten könnte der Müll an einer falschen Baudrate bzw Konfiguration der Schnittstelle liegen wie ist minicom konfiguriert? cu chege --: http://www.cybertux.org :--
minicom setup habe ich so gemacht : serial Port setup : dann hab ich A : serial device in : /dev/ttyS0 und E : bps : 9600 8N1 gemacht ich nehem an 8N1 sthet für 8 datenbits, 1 stopbit ? chris
Hm es könnte sein das du den initstring noch raushauen musst aber ich denke das dürfte den avr nicht stören. Hab jetzt das Datenblatt nicht da aber stimmt deine odd Parity? N=> Odd parity L => None. Versuch mal die hardwareflusskontrolle auszuschalten. cu chege --: http://www.cybertux.org :--
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
Hallo nochmal hier eine Referenz zur Bezeichnungslogik und anderen Daten zu RS232 : http://de.wikipedia.org/wiki/RS232 MfG, Daniel
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
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 ... ??
. Tasten Einstellung Minicom L: None : => 8N1 M: Even : => 8E1 N: Odd : => 8O1 O: Mark : => 8M1 P: Space : => 8S1 Könnte es sein, daß das Benutzerinterface von "Minicom" kaputt ist?
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
> 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.
;-) ..... tja wie man's nimmt ..... naja komische beobachtung ... sende ich 6 kommt dazwischen nen v sende ich 7 kommt dazwischen nen w ....
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
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.
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
>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.
Ich kenn mich beim Board nicht aus, aber ist da kein Quarz drauf? Ohne Quarz wirst keine saubere Baudrate zusammenbringen. Wenn einer drauf ist, musst ihn mit den Fusebits erst enablen. Und dann natürlich die USART Baudrate anpassen.
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.
Mir ist noch ein kleiner Fehler unterlaufen: Die Komandozeile muss lauten:#
1 | stty -F /dev/ttyS0 ispeed 19200 cs8 raw -cstopb |
Damit alles auf einen Schlag richtig konfiguriert ist, für den Empfang von dem MCU.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.