Forum: Mikrocontroller und Digitale Elektronik Hilfe bei Zeichen über UART einlesen


von Jakob (Gast)


Lesenswert?

Hallo ich habe da ein kleines Problem, ich habe eine Platine die ein 
Zeichen über RS232 schickt momentan ein "O". Am PC erkennt er das 
Zeichen und gibt es auf dem Terminal aus.
Ich habe aber ein 2te Platine mit meinen AVR drauf und ein Display, dort 
möchte ich das Zeichen empfangen und wieder geben. Display und Atmega 
und funktionieren einwandfrei. Baudrate ist auch richtig eingestellt.

Soweit ich das übers Debuggen raus gefunden habe hängt er in der get 
Routine fest, also erkennt er nicht das ein Zeichen ankommt.

Die Atmega Platine habe ich erfolgreich mit dem PC getestet, sie liest 
Zeichen ein und gibt auch Zeichen aus.


1
int main(void)
2
{
3
  DDRA = 0xFF; //Deklaration 11110000 1=Ausgang 0=Eingang
4
  DDRB = 0xFF; 
5
  DDRC = 0xFF;
6
  DDRD = 0xFF;
7
  
8
  
9
10
  init_uart(207);            //RS232 Initialisierung       
11
  
12
    
13
  
14
  InitialisierungDisplay();  
15
  
16
  while(1){  
17
        
18
  char Zeichen;
19
  Zeichen=uart_getchar();  
20
  printf("%c",Zeichen);  
21
  _delay_ms(1000);
22
  DisplayLoeschen();
23
  
24
  
25
  
26
    
27
  }//while(1)
28
}//Main
29
30
31
32
void init_uart (int UBRR_VAL)
33
{
34
  UCSRB |= (1<<TXEN) | (1<<RXEN);    // UART TX/RX einschalten
35
  UCSRC |= (1<<URSEL)|(3<<UCSZ0);    // Asynchron, 8Bit Framesize, Paritymode disabled, 1 Stopbit (8N1) 
36
37
  UBRRH = UBRR_VAL >> 8;
38
  UBRRL = UBRR_VAL & 0xFF; 
39
}
40
41
42
43
44
45
/*---------------------------------------------------------------------------
46
uart_getchar(): Empfangen einzelner Zeichen                       
47
---------------------------------------------------------------------------*/
48
unsigned char uart_getchar (void)
49
{
50
    while (!(UCSRA & (1<<RXC)))  // warten bis Zeichen verfuegbar
51
        {
52
    }
53
    return UDR;            // Zeichen aus UDR an Aufrufer zurueckgeben
54
}

von Karl H. (kbuchegg)


Lesenswert?

Jakob schrieb:

> Soweit ich das übers Debuggen raus gefunden habe hängt er in der get
> Routine fest, also erkennt er nicht das ein Zeichen ankommt.

Könnte zb ein falsch ausgekreuztes Kabel sein.

von Purzel H. (hacky)


Lesenswert?

Da ist nun nahezu alles falsch, waas man falsch machen kann. Also
- delay : gibt es nicht, ersatzlos gestrichen. Es wird
          generell nirgendwo gewartet. Falls es dennoch
          zu warten gibt, nimm einen Timer und mach was
          anderes.
- getchar : gibt es nicht, es wird nicht gewartet.
- printf() : gibt es nicht, viel zu intransparent,
             zu klotzig. Mach daraus ein writechar
             oder ein writehex, was bedeutet ein
             Durchreichen an den Display, ohne formatierung
- cleardisplay : gibt es nicht, dauert viel zu lange.
                 Mach ein zeilenumbruch, unten an der
                 Seite einen scroll.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:
> Jakob schrieb:
>
>> Soweit ich das übers Debuggen raus gefunden habe hängt er in der get
>> Routine fest, also erkennt er nicht das ein Zeichen ankommt.
>
> Könnte zb ein falsch ausgekreuztes Kabel sein.

Nimm dir halt mal eine LED (samt Vorwiderstand nach GND) und berühre 
damit den Tx Leitung deines Gerätes. Die LED müsste dort blinken, 
bzw.flackern (so kannst du auch die Tx Leitung identifizeren).

Und dann verfolgst du das Signal, bis du am AVR beim Tx Pin angelangt 
bist. Irgendwo wirst du das Blinken verlieren. Dort sitzt dann dein 
Problem. Kann eine schlechte Lötstelle sein, ein falsch raum 
ausgekreuztes Kabel, Kabelbruch, was auch immer.

von Jakob (Gast)


Lesenswert?

Ja, danke es war die falsch ausgekreuztes Kabel. Hätte wohl noch was 
länger gesucht.

Das delay steht/stand drinnen um das ganze anschaulicher zu testen.

Das mit dem Display habe ich anders nicht gelernt und hat bisher gut 
funktioniert, werde aber jetzt wegen deinem Hinweis mal dran arbeiten.

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.