www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ASCII und Fleury Uart


Autor: newbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;
        }


}
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: newbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm.. oder kann es sein daß mein hyperterminal ersatz (docklight) die 
zeichen verändert beim reinkopieren?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Autor: newbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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"

Autor: newbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned char uart_readbyte (void){
for(;;){
      unsigned int c;
        c = uart1_getc();
    
        if ( c & UART_NO_DATA )
        {}
        else
        {
            
       if ( c & UART_FRAME_ERROR )
            {
                /* Framing Error detected, i.e no stop bit detected */
                write_led(0x80);
            }
            if ( c & UART_OVERRUN_ERROR )
            {
                /* 
                 * Overrun, a character already present in the UART UDR register was 
                 * not read by the interrupt handler before the next character arrived,
                 * one or more received characters have been dropped
                 */
                write_led(0x40);
            }
            if ( c & UART_BUFFER_OVERFLOW )
            {
                /* 
                 * We are not reading the receive buffer fast enough,
                 * one or more received character have been dropped 
                 */
                write_led(0x20);
            }
      write_led(c);
      return (unsigned char)c;
      break;
        }


}
}


void usart_initalisierung(void){
    /*
     *  Initialize UART library, pass baudrate and AVR cpu clock
     *  with the macro 
     *  UART_BAUD_SELECT() (normal speed mode )
     *  or 
     *  UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode)
     */

        
    uart1_init( UART_BAUD_SELECT_DOUBLE_SPEED(UART_BAUD_RATE,F_CPU) ); 
  


     UCSR1A = (1<<U2X1);  //Enable 2x speed 
       
     
    UBRR1= 1;

    /* Enable USART receiver and transmitter and receive complete interrupt */
    UCSR1B = _BV(RXCIE1)|(1<<RXEN1)|(1<<TXEN1);
    
    /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
    
   
   UCSR1C = (0<<UMSEL1) | (0<<UPM1) | (1<<USBS1) | (3<<UCSZ1);
   UCSR1B = (1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1);
  }





int main(void)
{

  
  
    
  usart_initalisierung();
  led_init();

    
    sei();


   
  int i;         
    int m;
  int d;


   while(1){


    
   unsigned char test;
   test=uart_readbyte();  
   
    
  







}

}

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist die write_led?

Autor: newbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
[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]

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: newbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dan hast du einen OVERRUN und OVERFLOW error.

Autor: newbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist es leider auch nicht! hab die LEDS für den Status rausgeworfen 
und immernoch das selbe...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: newbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja aber die fleury kennt ja leider den At90can128 nicht

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: newbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
newbie schrieb:


Mooooooment

>
>    UCSR1C = (0<<UMSEL1) | (0<<UPM1) | (1<<USBS1) | (3<<UCSZ1);

Wieso UCSZ1?

Autor: newbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ICH HAB MEIN MSB!!!

:-)

(0<<UCSZ12)| (1<<UCSZ11)| (1<<UCSZ10);
so muss es sein!

1000 DANK!!!!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diese unsägliche  3<<UCSZ0  Schreibweise für  1<<UCSZ1 | 1<<UCSZ0 hätte 
es nie ins Tutorial schaffen sollen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.