Hallo! Ich habe mir die UART library von Peter Fleury genommen udn auf meinen AT90can128 angepasst. Jetzt habe ich ein Problem: Wenn der Controller ASCII Zeichen per UART empfängt liegt der erweiterte ASCII zeichensatz im negativen. Es soll aber von 0-255 gehen!!!! Im Code von Fleury wird doch nur unsigned char/int verwendet... Kann mir da einer weiterhelfen? Hier der code: unsigned char uart_readbyte (void){ for(;;){ unsigned int c; c = uart1_getc(); if ( c & UART_NO_DATA ) {} else { return (unsigned char)c; break; } } }
newbie schrieb: > Wenn der Controller ASCII Zeichen per UART empfängt liegt der erweiterte > ASCII zeichensatz im negativen. Es soll aber von 0-255 gehen!!!! Der Fehler liegt nicht im Fleury Code, sondern daran, was du mit dem Byte weiter machst. Im einfachsten Fall ist einfach nur deine Ausgaberoutine, mit der du festgestellt hast, dass da 'negative Zahlen' vorkommen, fehlerhaft. Ein Byte ist erst mal nur ein Byte. 8 Bits. Dem sieht man nicht an, ob es jetzt ein Vorzeichen hat oder nicht. Erst die Ausgabefunktion entscheidet, wie dieses Byte aufzufassen ist.
hmm.. oder kann es sein daß mein hyperterminal ersatz (docklight) die zeichen verändert beim reinkopieren?
Nein. Definitiv nicht. Wie sollte das auch gehen? Wie Karl Heinz schon angemerkt hat, liegt der Fehler bei Dir, genauer, bei der Methode, mit der Du den Zeichencode in eine Dezimalzahl umwandelst. Die geht von einer vorzeichenbehafteten Zahl aus und stellt die vorzeichenlose Zahl entsprechend mit Vorzeichen dar.
Nein Im Regelfall ist es ein Fehler in deinem Code. Es ist müssig über Fehler * im Compiler * in Terminalprogrammen * Zulieferlibraries * sonstwo zu suchen Zu 99.5% sind es immer Fehler im eigenen Code. Ehe man einen Fehler in einem der Punkte der Tabelle in Betracht zieht, ist man besser beraten, erst einmal vor seiner eigenen Tür zu kehren und die Stelle zu suchen, an der zb ein itoa anstelle eines utoa unzulässigerweise benutzt wurde (nur um jetzt mal eine Möglichkeit anzuführen, die dein Problem erklären könnte)
also ich geb in Docklight mein Sonderzeichen ein: á In Hex sagter mir das wäre E0, was in dez. 224 wäre. Mein Zeichen liegt aber bei Dez 160 in der ASCII tabelle, oder -96. Jetzt empfange ich das Zeichen auf dem Controller mit der Fleury UART library und lasse mir die unsigned char variable mit write_led ausgeben. Und er zeigt an: 96! das minus fehlt!
Wenn du Hilfe willst, dann zeig endlich deinen kompletten Code. Deine Fehleranalyse ist erstens sinnlos und zweitens grundfalsch. Wenn man bei 160 das Vorzeichenbit streicht, kommt 32 raus. Ein Amerikaner würde sagen: "You are barking up the wrong tree" und meint damit "Du suchst an einer völlig falschen Stelle"
1 | unsigned char uart_readbyte (void){ |
2 | for(;;){ |
3 | unsigned int c; |
4 | c = uart1_getc(); |
5 | |
6 | if ( c & UART_NO_DATA ) |
7 | {}
|
8 | else
|
9 | {
|
10 | |
11 | if ( c & UART_FRAME_ERROR ) |
12 | {
|
13 | /* Framing Error detected, i.e no stop bit detected */
|
14 | write_led(0x80); |
15 | }
|
16 | if ( c & UART_OVERRUN_ERROR ) |
17 | {
|
18 | /*
|
19 | * Overrun, a character already present in the UART UDR register was
|
20 | * not read by the interrupt handler before the next character arrived,
|
21 | * one or more received characters have been dropped
|
22 | */
|
23 | write_led(0x40); |
24 | }
|
25 | if ( c & UART_BUFFER_OVERFLOW ) |
26 | {
|
27 | /*
|
28 | * We are not reading the receive buffer fast enough,
|
29 | * one or more received character have been dropped
|
30 | */
|
31 | write_led(0x20); |
32 | }
|
33 | write_led(c); |
34 | return (unsigned char)c; |
35 | break; |
36 | }
|
37 | |
38 | |
39 | }
|
40 | }
|
41 | |
42 | |
43 | void usart_initalisierung(void){ |
44 | /*
|
45 | * Initialize UART library, pass baudrate and AVR cpu clock
|
46 | * with the macro
|
47 | * UART_BAUD_SELECT() (normal speed mode )
|
48 | * or
|
49 | * UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode)
|
50 | */
|
51 | |
52 | |
53 | uart1_init( UART_BAUD_SELECT_DOUBLE_SPEED(UART_BAUD_RATE,F_CPU) ); |
54 | |
55 | |
56 | |
57 | UCSR1A = (1<<U2X1); //Enable 2x speed |
58 | |
59 | |
60 | UBRR1= 1; |
61 | |
62 | /* Enable USART receiver and transmitter and receive complete interrupt */
|
63 | UCSR1B = _BV(RXCIE1)|(1<<RXEN1)|(1<<TXEN1); |
64 | |
65 | /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
|
66 | |
67 | |
68 | UCSR1C = (0<<UMSEL1) | (0<<UPM1) | (1<<USBS1) | (3<<UCSZ1); |
69 | UCSR1B = (1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1); |
70 | }
|
71 | |
72 | |
73 | |
74 | |
75 | |
76 | int main(void) |
77 | {
|
78 | |
79 | |
80 | |
81 | |
82 | usart_initalisierung(); |
83 | led_init(); |
84 | |
85 | |
86 | sei(); |
87 | |
88 | |
89 | |
90 | int i; |
91 | int m; |
92 | int d; |
93 | |
94 | |
95 | while(1){ |
96 | |
97 | |
98 | |
99 | unsigned char test; |
100 | test=uart_readbyte(); |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | }
|
112 | |
113 | }
|
Also auch wenn das jetzt noch eine weitere bescheuerte Vermutung ist aber ich kanns mir nicht verkneifen: Kann es sein dass das erste Bit irgendwie nicht erkannt wird weil ich die UART falsch initalisiert habe? 8N1 is mein Plan gewesen...
[c]void led_init(void) { //-- Set direction LED_PORT_DIR = 0xFF; //-- Clear LEDs. LED_PORT_OUT = 0x00; } //---------------------------------------------------------------------- -------- // @fn write_led //! //! On-board LEDs writing byte. Write hexa value on LEDs display. //! //! @warning none //! //! @param led_display = Hexa display value //! //! @return (none) //! //---------------------------------------------------------------------- -------- void write_led(U8 led_display) { LED_PORT_OUT = led_display; }[\c]
U8 ist sicher ein unsigned char? #include-Files sind alle eingebunden? Jetzt würde mich nur noch interessieren > Mein Zeichen liegt aber bei Dez 160 > in der ASCII tabelle, oder -96. Jetzt empfange ich das > Zeichen auf dem Controller mit der Fleury UART library > und lasse mir die unsigned char variable mit write_led > ausgeben. Und er zeigt an: 96! das minus fehlt! wie du zu der Aussage kommst, das das minus fehlt? Wenn du auf deiner Tastatur á drückst, welche LED leuchten dann?
so siehts aus: 0 0 0 0 0 x x 0 (x leuchtet) 64 + 32 = 96 ! Die 128 muss aber auch leuchten! Tut sie aber nicht! Wenn ich die UART normal polle dann leuchtet sie!
das ist es leider auch nicht! hab die LEDS für den Status rausgeworfen und immernoch das selbe...
newbie schrieb: > Also auch wenn das jetzt noch eine weitere bescheuerte Vermutung ist > aber ich kanns mir nicht verkneifen: Kann es sein dass das erste Bit > irgendwie nicht erkannt wird weil ich die UART falsch initalisiert habe? > 8N1 is mein Plan gewesen... Die Fleury UART LIbrary hat eine wunderbare Initialisierungsfunktion. Lass die ihre Sachen machen und pfusche ihr nicht ins Handwerk indem du da selber noch mal an den Kontrollregistern Hand anlegst.
newbie schrieb: > ja aber die fleury kennt ja leider den At90can128 nicht OK. Ist natürlich ein Argument :-) Aber ich kann ehrlich nichts sehen, was da falsch laufen könnte. Dein LED-Muster ist ... ungewöhnlich, weil es so gar nichts mit dem gesendeten Zeichen zu tun hat. Es sollte so aussehen 0 0 0 0 0 x 0 x LSB MSB selbst wenn da irgendwo das MSB Bit verloren geht, sollte das Muster anders aussehen. Einen signed/unsigned Mismatch kann ich auch nirgends ausmachen. Welchen Compiler verwendest du eigentlich?
ich benutze AVR Studio 4.14! Aber das mit dem Bitmuster is eigentlich richtig bis auf das MSB halt! Denn in Docklight kann ich mir auch das übertragene Bitmuster anzeigen lassen und das is 0 0 0 0 0 1 1 1 . Ergibt dann halt 224. Das übertrag ich dann und plötzlich fehlt die 1 im MSB. Ich habs auch in Hyperterminal probiert und wild irgendwelche Sonderzeichen reingetippt und das MSB will einfach nicht anspringen. Aber wie gesagt, die LED ist nicht kaputt, denn im Polling mode klappt alles! Es muss doch irgendwie so sein, daß durch die Komination Fleury Lib und dem At90can128 das MSB verloren geht... Merkwürdig...
newbie schrieb: Mooooooment > > UCSR1C = (0<<UMSEL1) | (0<<UPM1) | (1<<USBS1) | (3<<UCSZ1); Wieso UCSZ1?
ICH HAB MEIN MSB!!! :-) (0<<UCSZ12)| (1<<UCSZ11)| (1<<UCSZ10); so muss es sein! 1000 DANK!!!!
Diese unsägliche 3<<UCSZ0 Schreibweise für 1<<UCSZ1 | 1<<UCSZ0 hätte es nie ins Tutorial schaffen sollen.
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.