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.
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"
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...
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!
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...