Forum: Mikrocontroller und Digitale Elektronik ASCII und Fleury Uart


von newbie (Gast)


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;
        }


}
}

von Karl H. (kbuchegg)


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.

von newbie (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Karl H. (kbuchegg)


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)

von newbie (Gast)


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!

von Karl H. (kbuchegg)


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"

von newbie (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Wo ist die write_led?

von newbie (Gast)


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]

von Karl H. (kbuchegg)


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?

von newbie (Gast)


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!

von Volker Z. (vza)


Lesenswert?

Dan hast du einen OVERRUN und OVERFLOW error.

von newbie (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von newbie (Gast)


Lesenswert?

ja aber die fleury kennt ja leider den At90can128 nicht

von Karl H. (kbuchegg)


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?

von newbie (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

newbie schrieb:


Mooooooment

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

Wieso UCSZ1?

von newbie (Gast)


Lesenswert?

ICH HAB MEIN MSB!!!

:-)

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

1000 DANK!!!!

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.