|
 |
XPlain - Empfange Müll am USART |
TecDroiD
Moderator
  

Dabei seit: 12.08.2003
Beiträge: 2.409
Herkunft: Berlin
 |
|
| XPlain - Empfange Müll am USART |
 |
Aaalso ich nutze in einem Testprogramm den USART der am USB-Port hängt und habe testweise ein einfaches Echo programmiert...
Leider kommt nur Müll an. Einige Buchstaben stimmen, andere Zeichen sind außerhalb dessen, was Putty darstellen kann..
meine usart-funktionen sehen so aus:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
|
/*
* usart.h
*
* Created on: 08.03.2010
* Author: tecdroid
*/
#ifndef USART_H_
#define USART_H_
#include <avr/io.h>
#include <avr/iox128a1.h>
void usart_init () {
/* This PORT setting is only valid to USARTC0 if other USARTs is used a
* different PORT and/or pins is used. */
/* PIN3 (TXD0) as output. */
PORTC.DIRSET = PIN3_bm;
/* PC2 (RXD0) as input. */
PORTC.DIRCLR = PIN2_bm;
// enable tx rx double clock
USARTC0.CTRLB = USART_RXEN_bm | USART_TXEN_bm | USART_CLK2X_bm;
// asynchronous, char size is 8 bit, no parity, one stop bit
USARTC0.CTRLC = USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc;
}
void usart_setRecvInt (uint8_t enable) {
if (enable) {
USARTC0.CTRLA |= USART_RXCINTLVL_HI_gc;
} else {
USARTC0.CTRLA &= ~(USART_RXCINTLVL_HI_gc);
}
}
void usart_setSpeed (uint32_t speed) {
uint8_t bsel = (F_CPU / (8 * speed)-1);
USARTC0.BAUDCTRLA = bsel & 0xff;
USARTC0.BAUDCTRLB = (USARTC0.BAUDCTRLB & 0xf0) + ((bsel >> 8) & 0x0f);
}
uint8_t usart_canSend () {
return USARTC0.STATUS & USART_TXCIF_bm;
}
void usart_sendByte(uint8_t byte) {
USARTC0.DATA = byte;
}
void usart_sendData (uint8_t *data, uint16_t count) {
uint16_t i;
for (i = 0; i < count; i++) {
while (!usart_canSend()) ;
usart_sendByte(data[i]);
}
}
uint8_t usart_hasByte () {
return USARTC0.STATUS & USART_RXCIF_bm;
}
uint8_t usart_getByte () {
return USARTC0.DATA;
}
void usart_getData (uint8_t *data, uint16_t count) {
uint16_t i;
for (i = 0; i < count; i++) {
while (!usart_hasByte()) ;
data[i] = usart_getByte();
}
}
#endif /* USART_H_ */
|
|
und mein hauptprogramm:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
|
/*
* main.c
*
* Created on: 17.03.2010
* Author: tecdroid
*/
#include <avr/io.h>
#include <avr/iox128a1.h>
#include "usart.h"
void sync_osc() {
/*Oscillator auf 32Mhz einstellen*/
OSC.CTRL |= OSC_RC32MEN_bm;
/*Wenn Oscillator stabil wird das Flag RC32MRDY
* gesetzt und 32Mhz können benutzt werden*/
while (!(OSC.STATUS & OSC_RC32MRDY_bm)) {
}
/*I/O Protection*/
CCP = CCP_IOREG_gc;
/*Clock auf 32Mhz einstellen*/
CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
/* auto kalibierung ein */
DFLLRC32M.CTRL = DFLL_ENABLE_bm;
}
int main(int argc, char **argv) {
/*
* initializations
*/
sync_osc();
usart_init();
usart_setSpeed(9600);
uint8_t byte;
/*
* endles loop for running cpu
*/
while (1) {
if (usart_hasByte()) {
byte = usart_getByte();
usart_sendByte(byte);
}
}
return 0;
}
|
|
kann mir jemand erklären, was da schief läuft?
korrekt werden /auch zuverlässig!) die buchstaben tuvwdefg (und deren Großbuchstaben) gesendet. alles Andere ergibt Müll..
__________________ ^[:wq
Sorry, eigentlich wollte ich mich kurz fassen.
Wer meine Ideen kommerziell nutzen möchte, möge mich bitte beteiligen- ich spare auf ein Haus
|
|
23.03.2010 12:37 |
|
|
a957m
Mitglied
 
Dabei seit: 20.06.2007
Beiträge: 48
 |
|
Hallo,
in Deinem Programm ist mir so auf die schnelle nichts verdächtiges aufgefallen.
Was mir schon bei UART Problemen geholfen hat, ist das Sendesignal mit dem Oszi zu messen. So kann man feststellen, ob die Sendefrequenz, sprich die Baudrate, dem entspricht, was man glaub eingestellt zu haben.
Senden des Zeichens 'U' (hex 55) ergibt bei einem Stop-Bit ein Rechtecksignal, dessen Freuenz der halben Baudrate entspricht.
|
|
24.03.2010 12:46 |
|
|
Malibann
Foren Gott
 

Dabei seit: 18.09.2004
Beiträge: 4.533
 |
|
Jep und ein ganz bößer Fehler ( meist bei selbstgebauten Kabeln ):
Fehlende Masse
oder
Masse mit signalleitung vertauscht.
__________________ Mit freundlichen Grüßen Malibann
(falls ich es mal wieder vergessen habe)
|
|
24.03.2010 12:57 |
|
|
TecDroiD
Moderator
  

Dabei seit: 12.08.2003
Beiträge: 2.409
Herkunft: Berlin
Themenstarter
 |
|
Gott, ich hoffe, die haben diesen Fehler nicht auf dem XPlain gemacht
Ja, ich komm nur gerade schlecht zum Messen.
Irgendwann stell ich mir mal nen Koffer zusammen mit Netbook, Programmer, Steckbrett USB-Oszi Multimeter und variabler Spannungsversorgung..
Das wär doch mal was..
btt: wie oder wo kann ich das dann am xplain messen?
__________________ ^[:wq
Sorry, eigentlich wollte ich mich kurz fassen.
Wer meine Ideen kommerziell nutzen möchte, möge mich bitte beteiligen- ich spare auf ein Haus
|
|
25.03.2010 08:14 |
|
|
Horst_h
Haudegen
  
Dabei seit: 16.03.2008
Beiträge: 500
Herkunft: Nds
 |
|
Hallo,
aus der ASCII Tabelle>:
Hex Werte $ => ASCII
$44..$47 =>E..G
$54..$57 =>T..W
$64..$67 =>e..g
$74..$77 =>t..w
Sollte das nicht irgendwie stutzig machen?
Es werden nur $4..$7 erkannt oder anders nur die 4-Bit Folge 0b01XX
Grusz Horst
|
|
25.03.2010 10:37 |
|
|
TecDroiD
Moderator
  

Dabei seit: 12.08.2003
Beiträge: 2.409
Herkunft: Berlin
Themenstarter
 |
|
ja, das hab ich so noch gar nicht betrachtet.
ich muss mir mal einen anderen client suchen, auf dem ich auch hex-werte sehen kann.. ich vielleicht sende/empfange ich einfach die falsche Anzahl bits?
__________________ ^[:wq
Sorry, eigentlich wollte ich mich kurz fassen.
Wer meine Ideen kommerziell nutzen möchte, möge mich bitte beteiligen- ich spare auf ein Haus
|
|
25.03.2010 16:14 |
|
|
TecDroiD
Moderator
  

Dabei seit: 12.08.2003
Beiträge: 2.409
Herkunft: Berlin
Themenstarter
 |
|
jetzt wirds noch mal spannend.
ich habe mal das kleine alphabet eingetippt und mir die hex vals angeschaut:
7D 7E 7F 64 65 66 67 EC ED EE EF EC ED ED EE EF 7C 7D 7E 7F 74 75 76 77 7C 7D 7E FF
Das große Alphabet sieht so aus
7D 7E 7F 44 45 46 47 CC CD CE CF CC CD CE CF 5C 5D 5E 5F 54 55 56 57 5C 5D 5E
lustig ist, wenn ich das empfangene Byte auf port e ausgebe, leuchten die meiste Zeit LED 0 und 1, der Rest flackert nur gelegentlich
__________________ ^[:wq
Sorry, eigentlich wollte ich mich kurz fassen.
Wer meine Ideen kommerziell nutzen möchte, möge mich bitte beteiligen- ich spare auf ein Haus
|
|
25.03.2010 22:08 |
|
|
Horst_h
Haudegen
  
Dabei seit: 16.03.2008
Beiträge: 500
Herkunft: Nds
 |
|
Hallo,
probiere doch einmal nur die Zeichen von char(32) bis char(96) auszugeben und zu empfangen.
Wer weiß. wie die Steuerzeichen von 0(Break) ..27(ESCape)..31 vom Empfänger interpretiert werden.
Oder war das gerade Dein Versuch?
Gruß Horst
|
|
25.03.2010 22:25 |
|
|
Malibann
Foren Gott
 

Dabei seit: 18.09.2004
Beiträge: 4.533
 |
|
Nochwas, laut deiner Beschreib ung testest du nur mit Echo.
Das heißt du weiß nicht ob die zeichen falsch Empfangen oder falsch gesendet wurden ...
Nun ich denke du solltest statt eines Echos eine Art "Hello World" auf dem XPlain schreiben.
Also wirklich so was wie
printf("hello Worl");
Und dann als Test nicht irgendwelche ASCII Zeichen sondern Zeichen der Bits du genau kennst:
printf(0x55,0x55,0x55,0x55);
printf(0xAA,0xAA,0xAA,0xAA);
printf(0x11,0x11,0x11,0x11);
Sehr gut sind auch druckbare Zeichen mit nur einem gesetzten Bit:
printf("@@@@"); // 4 x 0100 0000
Man kann dann ganz gut sehen ob nur die Empfangs oder Senderichtung vom Fehler betroffen isgt oder ob die Zeichen wenigstens immer gleich falsch ausgewertet werden.
__________________ Mit freundlichen Grüßen Malibann
(falls ich es mal wieder vergessen habe)
|
|
25.03.2010 23:36 |
|
|
TecDroiD
Moderator
  

Dabei seit: 12.08.2003
Beiträge: 2.409
Herkunft: Berlin
Themenstarter
 |
|
aalso warum auch immer, wenn ich den clk2 raus nehm, hab ich schon mal bessere werte- möglicherweise hab ich die falsche takt-rechnung..
__________________ ^[:wq
Sorry, eigentlich wollte ich mich kurz fassen.
Wer meine Ideen kommerziell nutzen möchte, möge mich bitte beteiligen- ich spare auf ein Haus
|
|
28.03.2010 12:28 |
|
|
|
|
|
 |
Impressum
|