Forum: Compiler & IDEs AVR Uart Display anzeige


von Philipp P. (Gast)


Lesenswert?

Guten Abend,

ich habe in VB 2005 ein Programm geschrieben was mir Zahlenwerte von 
0-250 in den ASCII Unicode wandelt und über den UART an den MC schickt. 
Um zu testen ob einzelne Zeichen ankommen, wollte ich mir die Zahlen auf 
dem Display ausgeben lassen, was nicht so wirklich funktioniert. Das 
Display hängt immer ein 0100 hinter die Zahl. Schick ich eine 50 kommt 
500100 raus, bei 60 eine 600100 usw. Warum?! Ich benutze die Uart und 
Lcd lib von Peter Fleury. Würde mich über antworten sehr freuen.

MfG Philipp
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <avr/pgmspace.h>
5
#include <string.h>
6
#include <stdio.h>
7
#include "uart.h"
8
#include "lcd.h"
9
 
10
11
/* define CPU frequency in Mhz here if not defined in Makefile */
12
#ifndef F_CPU
13
#define F_CPU 4000000UL
14
#endif
15
16
/* 9600 baud */
17
#define UART_BAUD_RATE      9600      
18
19
20
21
22
23
int main(void)
24
{
25
    unsigned int c;
26
  int arsch;
27
  
28
  
29
  
30
  unsigned char command[21];
31
    int ci = 0;
32
  int intwert;
33
34
    int digit_to_int(unsigned char d)
35
    {
36
     char str[2];
37
38
     str[0] = d;
39
     str[1] = '\0';
40
     return (int) strtol(str, NULL, 10);
41
    }
42
43
    void lcd_puti( int number )
44
    {
45
      char buffer[10];
46
47
       itoa( number, buffer, 10 );
48
        lcd_puts( buffer );
49
    }
50
  
51
    void lcd_putu( unsigned int number )
52
    {
53
         char buffer[10];
54
55
      utoa( number, buffer, 10 );
56
      lcd_puts( buffer );
57
    }
58
59
    lcd_init(LCD_DISP_ON);
60
61
   
62
      uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
63
    
64
   
65
      sei();
66
    
67
   
68
 
69
    uart_putc('\r');
70
    lcd_clrscr();
71
  
72
    for(;;)
73
74
  
75
  
76
{
77
    // Per UART Zeichen einlesen
78
    c = uart_getc();
79
      if (!( c & UART_NO_DATA ))
80
    {
81
      // In Char-Array "command" speichern & testweise ausgeben
82
      command[ci] = c;
83
      ci = ci<20 ? ci+1 : 0;
84
      uart_putc(c);
85
86
  /*intwert = digit_to_int(c);*/
87
  
88
  lcd_putu(c);
89
90
91
    /*unsigned char buffer [255];
92
    snprintf (buffer, (size_t)255, "%d", arsch);
93
    lcd_puts(buffer);*/
94
95
      
96
      // Wenn FB empfangen wurde
97
      if (c == 0xFB) 
98
      {
99
        // String mit 0-Byte terminieren
100
        command[ci+1] = '\0';
101
        ci = 0;
102
103
    
104
  
105
    
106
      }
107
    }
108
    }
109
   
110
}

von Karl H. (kbuchegg)


Lesenswert?

Wenn man aus deinem Programm mal alles rauswirft, was nichts zur Sache 
beiträgt, dann bleibt das hier übrig
1
void lcd_putu( unsigned int number )
2
{
3
  char buffer[10];
4
5
  utoa( number, buffer, 10 );
6
  lcd_puts( buffer );
7
}
8
9
int main(void)
10
{
11
  unsigned int c;
12
  
13
  lcd_init(LCD_DISP_ON);
14
15
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
16
    
17
  sei();
18
19
  uart_putc('\r');
20
  lcd_clrscr();
21
  
22
  for(;;)
23
  {
24
    c = uart_getc();
25
    if (!( c & UART_NO_DATA ))
26
    {
27
      uart_putc(c);
28
      lcd_putu(c);
29
30
      lcd_putc( ' ' );  // Vorschlag
31
    }
32
  }
33
}

Man sieht:
Kommt ein Zeichen über die UART rein, dann wird es zurückgeschickt, und 
sein Code auf dem LCD ausgegeben. (Ich würde mal vorschlagen, nach dem 
Code noch ein Leerzeichen auszugeben, damit man erkennen kann, wo ein 
Code anfängt und wo er endet).

Das LCD schreibt von sich aus sicher nichts zusätzliches hin. Wenn also 
das, was du am LCD siehst, nicht das ist was du erwartest, dann musst du 
dich fragen, was eigentlich von deinem VB-Programm weggeschickt wird.

Ich würde mal testen, wie sich das ganze verhält, wenn du nicht von 
deinem VB Programm etwas an die UART schickst, sondern von einem ganz 
normalen Terminal-Programm. Denn von dem ist bekannt, dass es nach dem 
Drücken der Taste 'A' auch tatsächlich den ASCII Code des Zeichens 'A' 
und nur den ASCII COde des Zeichens 'A' über die Schnittstelle jagt. 
Dein VB Programm kann nattürlich korrekt sein und das auch richtig 
machen. Aber 'kann' ist nicht 'ich weiß, das' - sprich: Im Moment 
besteht die Möglichkeit eines Fehlers im AVR Teil und/oder im VB-Teil. 
Die vernünftigste Vorgehensweise besteht darin, erst mal eine mögliche 
Fehlerquelle zu eliminieren und einen Teil durch etwas zu ersetzen, von 
dem recht sicher angenommen werden kann, dass er korrekt ist. Den 
VB-Teil durch ein Terminalprogramm zu ersetzen ist genau so ein Schritt, 
der auch noch andere Vorteile hat.


Ist eigentlich die UART schon insofern getestet, dass du dir sicher 
bist, dass die Baudrate korrekt ist? Sprich: Hast du schon mit einem 
Terminal verifiziert, dass das was der AVR wegschickt, im Terminal auch 
genau so ankommt?
Genau aus diesem Grund ist ebenfalls der Ersatz des VB-Teiles mit einem 
Terminalprogramm eine gute Idee: Er erlaubt dir, den AVR-Teil deiner 
Anwendung komplett (inkl. Hardware) zu testen.

: Bearbeitet durch User
von Philipp P. (Gast)


Lesenswert?

Hallo,

vielen Dank Karl Heinz für die schnelle und ausführliche antwort. Ich 
habe es mit einem fertigen Terminal programm getestet und es kommt das 
an was ich haben möchte ;) Jetzt weiß ich wo ich anfangen muss den 
Fehler zu suchen.

Vielen Dank nochmal

MfG Philipp

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.