Forum: Mikrocontroller und Digitale Elektronik Einlesen von 10-Stelliger Zahl über UART


von Marvin Hartmann (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Habe mir den RFID-Reader Bausatz von Pollin gekauft. Dieser läuft 
einwandfrei mit einem ATmega8 und der Software von proektsammlung.de. 
Habe den Code so modifiziert das beim Start der String "0000000000" (als 
Init) über die UART ausgegeben wird und bei jedem gelesenen Tag die 
Daten Dezimal gesendet werden.

Auf der Empfänger Seite sitzt ein ATmega32. Hier habe ich die UART-Lib 
von Peter Fleury am laufen 
(http://homepage.hispeed.ch/peterfleury/group__pfleury__uart.html).

Diese funktioniert auch soweit perfekt. Mein Ziel ist es nun die 
ankommenden Daten vom gelesenen Tag zu speichern und darauf zu 
reagieren. Außerdem werden die Daten wieder weiter an den PC gesendet.

Meine Lösung ist leider weder Schön noch Platz sparend noch fehler 
frei... (s. Anhang)

Meine Probleme:
- Manche Tags werden nicht vollständig wieder weiter gesendet.
- Ich hätte das ganze gern in EINER Variable stehen stehen, dies wäre 
einfacher zum späteren Vergleichen und übersichtlicher.

Hatt hierfür jemand ein Tipp für mich, oder vllt. einen komplett anderen 
Lösungsansatz?

Danke und Gruß!

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

TIP: Bitschiebebefehle

von Marvin Hartmann (Gast)


Lesenswert?

Hallo,

Danke für den Tipp! Habe es hinbekommen das der gelesene Tag in einem 
Array gespeichert wird. Allerdings habe ich immer noch Probleme beim 
einlesen der Daten. Beim ersten einlesen klappt noch alles Perfekt... 
die darauf folgenden werden dann unvollständig oder als Hieroglyphen 
gesendet.

Bin für jeden Tipp dankbar!

Gruß

von Marvin Hartmann (Gast)


Lesenswert?

Hat keiner einen Tipp für mich?

Habe auch heute wieder weiter experimentiert, aber es ändert sich 
einfach nichts an dem, was im Terminal aufm PC raus kommt...

von hauspapa (Gast)


Lesenswert?

Dauern so Sachen wie:
>uart_puts_P("Buffer overflow error: ");
evtl. zu lang um neue Daten zu verarbeiten?

viel Erfolg
Hauspapa

von Marvin Hartmann (Gast)


Lesenswert?

Danke für die Antwort!

Auch wenn ich das alles weg lasse:
1
            if ( data & UART_FRAME_ERROR )
2
            {
3
                uart_puts_P("UART Frame Error: ");
4
            }
5
6
            if ( data & UART_OVERRUN_ERROR )
7
            {
8
                uart_puts_P("UART Overrun Error: ");
9
            }
10
11
            if ( data & UART_BUFFER_OVERFLOW )
12
            {
13
                uart_puts_P("Buffer overflow error: ");
14
            }

Ändert sich nichts. Auch ausschalten der Globalen Interrupts während dem 
auslesen hilft nicht. Wie könnte ich die UART schöner/schneller 
auslesen?

Lg Marvin

von Karl H. (kbuchegg)


Lesenswert?

Marvin Hartmann schrieb:

> Ändert sich nichts. Auch ausschalten der Globalen Interrupts während dem
> auslesen hilft nicht. Wie könnte ich die UART schöner/schneller
> auslesen?

Gar nicht. DIe Fleury Lib ist schon ziemlich gut. Besser kriegst du das 
auch nicht hin.
Und lass die Interrupts eingeschaltet. Die auszuschalten ist komplett 
kontraproduktiv.

von Karl H. (kbuchegg)


Lesenswert?

hauspapa schrieb:
> Dauern so Sachen wie:
>>uart_puts_P("Buffer overflow error: ");
> evtl. zu lang um neue Daten zu verarbeiten?

solange dieser Fehlerfall nicht eintritt, ist das völlig wurscht.

von S. K. (hauspapa)


Lesenswert?

>Auch wenn ich das alles weg lasse:

Das hier wirst Du wohl nicht weglassen können:

>if(comp == 1)
>        {
>        uart_putc(bit1);
>        uart_putc(bit2);
>        uart_putc(bit3);
>        uart_putc(bit4);
>        uart_putc(bit5);
>        uart_putc(bit6);
>        uart_putc(bit7);
>        uart_putc(bit8);
>        uart_putc(bit9);
>        uart_putc(bit10);
>        }

und braucht auch seine Zeit.

Wenn Du am Gesamtkonzept nicht zu viel ändern möchtest, hilft evtl. 
gelegentlich
>  data = uart_getc();
auszuführen und in einen Puffer zu schreiben.
z.B. nach jedem
>uart_putc(...);

keine Garatie auf Sinnhaftigkeit, bin mehr der Hardware zugewandt.
Hauspapa

von Karl H. (kbuchegg)


Lesenswert?

Probier mal folgendes.
Mit deinen ganzen Hilfsvariablen und Flags wird man ja ganz schwummerig, 
wenn man im Code verfolgen soll, wann welches Flag auf 1 oder 0 geht und 
damit welche andere Aktion auslöst. Muss jan nicht sein, dass das alles 
so kompliziert ist :-)
1
int main(void)
2
{
3
  unsigned int data;
4
  unsigned char tag[10];
5
  uint8_t tagCnt;
6
  uint8_t i;
7
8
  lcd_graphics_init(); // Display initialisieren
9
  lcd_graphics_clear(); // Display löschen
10
  g_draw_main_menu(); // Hauptmenü zeichnen  
11
12
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); // UART starten (baud)
13
  
14
15
  tagCnt = 0;
16
17
  sei(); //Globale Interrupts akt.
18
19
  for(;;)
20
  {
21
    data = uart_getc();
22
    if ( !(data & UART_NO_DATA) )
23
    {
24
      tag[tagCnt] = data;
25
      tagCnt++;
26
27
      if( tagCnt == 10 )
28
      {
29
        for( i = 0; i < 10; i++ )
30
          uart_putc( tag[i] );
31
        uart_putc( ' ' );
32
33
        tagCnt = 0;
34
      }
35
    }
36
  }
37
}

von Marvin Hartmann (Gast)


Angehängte Dateien:

Lesenswert?

Karl Heinz schrieb:
> Und lass die Interrupts eingeschaltet. Die auszuschalten ist komplett
> kontraproduktiv.

Das hab ich mir fast gedacht...

Mit:
> Wie könnte ich die UART schöner/schneller
> auslesen?

meinte ich die Art wie ich die Daten mit
1
uart_getc();
 hole zu verbessern, nicht die Funktion der Lib. ;)

Karl Heinz schrieb:
> hauspapa schrieb:
>> Dauern so Sachen wie:
>>>uart_puts_P("Buffer overflow error: ");
>> evtl. zu lang um neue Daten zu verarbeiten?
>
> solange dieser Fehlerfall nicht eintritt, ist das völlig wurscht.

Ok, dann werd ich das lassen wie es ist.

@hauspapa Ich ändere gerne das Gesamtkonzept damits am Ende dann auch 
läuft :)


Karl Heinz schrieb:
> Mit deinen ganzen Hilfsvariablen und Flags wird man ja ganz schwummerig,
> wenn man im Code verfolgen soll, wann welches Flag auf 1 oder 0 geht und
> damit welche andere Aktion auslöst. Muss jan nicht sein, dass das alles
> so kompliziert ist :-)

Bin in C noch nicht so lange unterwegs :/ Danke für den Code, er macht 
das ganze schon ziemlich übersichtlich. Allerdings mit dem gleichen 
Ergebniss :( (s. Bild)

Lg

von Karl H. (kbuchegg)


Lesenswert?

Marvin Hartmann schrieb:

> das ganze schon ziemlich übersichtlich. Allerdings mit dem gleichen
> Ergebniss :( (s. Bild)

Na ja. Das kann aber ein Blinder greifen, dass die RFID Leser eben nicht 
10 Character schickt, sondern ein paar mehr und nach dem eigentlichen 
Tag noch irgendwelche Zusatzinformation geliefert wird. Aus der Position 
des Leerzeichens und wie es wandert, kann ich ablesen, dass da 2 Bytes 
noch hinten drann kommen. Ich schätze mal der Reader wird da wohl ein CR 
und LF noch hinten nach schieben, was auch vernünftig wäre um 
anzuzeigen: jetzt ist der Tag zu ende. Aber sieh mal zu, dass du die 
Bytes in Hex-Form siehst. Ich würde fast wetten, dass du hier ein 0x0D 
und ein 0x0A sieht.

: Bearbeitet durch User
von Marvin Hartmann (Gast)


Angehängte Dateien:

Lesenswert?

Hier ein Bild der Daten im Hex-Format. Werde morgen mal versuchen den 
Reader umzuprogrammieren das nur noch der Tag gesendet wird.

Danke schonmal jetzt,

lg Marvin

von Karl H. (kbuchegg)


Lesenswert?

Marvin Hartmann schrieb:
> Hier ein Bild der Daten im Hex-Format. Werde morgen mal versuchen den
> Reader umzuprogrammieren das nur noch der Tag gesendet wird.

Nein. Falsch.

Wenn du den Tag sowieso weiter sendest, dann willst du diesen 
Zeilenvorschub eigentlich haben. Denn er trennt dir einen Tag vom 
nächsten.

Willst du die Tags auf dem AVR bearbeiten: so schwer ist das jetzt auch 
wieder nicht, die 0x0D bzw. 0x0A auszufilter. Das ist eine Standardübung 
für jeden, der eine Eingabezeile von irgendwoher einliest: solange 
Zeichen sammeln, bis ein Trennzeichen daher kommt oder das Array voll 
ist.

Ein bischen was muss man schon im VOrfeld auch können, ehe man sich an 
ein Projekt wagt. Sorry, aber das musste jetzt sein, denn ich kann 
dieses "ich kann C nicht" ehrlich gesagt nicht mehr hören (zumal das 
alles mit C eigentlich recht wenig zu tun hat. Das ist stink normale 
Programmlogik)

: Bearbeitet durch User
von Marvin Hartmann (Gast)


Lesenswert?

Problem erkannt - Problem gebannt!

Vielen Dank für eure Hilfe, habs hin bekommen! :-)

Gruß Marvin

-CLOSED-

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.