Forum: Mikrocontroller und Digitale Elektronik Ausgabe an UART bringt Müll


von Hue \. (hue)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein seltsames Problem: Wenn ich die globale Variable 
"__release" in der Funktion "decode" auskommentiere, kommt Zeichenmüll 
auf dem Terminal an.

Das "main.c" File in der momentan Fassung funktioniert. Die Daten werden 
von einer
PS/2 Tastatur gelesen. Sobald ich aber testen will, ob die Taste 
losgelassen wird, sie sendet dann nämlich "0xF0", dann will ich dies mir 
merken und die nachfolgenden Zeichen ignoriern. Aber das Auskommentieren 
der "__release" Variable bringt mein Programm durcheinander. Wo klemmt 
hier die Säge?

MfG

HUE \a

von Oliver J. (skriptkiddy)


Lesenswert?

1
void decode ( uint8_t sc )
2
{
3
  if ( sc != 0xF0 )
4
  {
5
    uart_putc(sc);
6
//    __release=0;      
7
  } else {
8
//    __release=1;
9
  }
10
  return;
11
}

Seit wann hat eine void Funktion ein return?

von Peter II (Gast)


Lesenswert?

Oliver J. schrieb:
> Seit wann hat eine void Funktion ein return?

wie willst du sonst eine funktion mal in der mitte abbrechen?

von Oliver J. (skriptkiddy)


Lesenswert?

Peter II schrieb:
> Oliver J. schrieb:
>> Seit wann hat eine void Funktion ein return?
>
> wie willst du sonst eine funktion mal in der mitte abbrechen?

Du hast recht.

von Hue \. (hue)


Lesenswert?

Hallo,

das "return" kann durchaus entfernt werden, es ändert aber das 
beschriebene Problem nicht. Sobald ich versuche einen Zwischenstand 
mittels globaler Variable oder localer Variable "static uint8_t release" 
zu speichern, kommt auf dem Terminal nur noch Quatsch an.

Hat noch jemand dazu einen Tipp?

HUE \a

von Justus (Gast)


Lesenswert?

Peter II schrieb:
> Oliver J. schrieb:
>
>> Seit wann hat eine void Funktion ein return?

Meiner Kenntnis nach muss ein Return immer einen Wert zurückliefern, so 
kann der Programmteiln icht funktionieren. Es muss lauten

return (0); oder irgendetwas anderes - aber schlicht return; geht nicht.

von Peter II (Gast)


Lesenswert?

Justus schrieb:
> Es muss lauten
> return (0); oder irgendetwas anderes - aber schlicht return; geht nicht.

nein denn return ist keine funktion damit muss auch keine klammer hin. 
Klar darf man es auch ohne parameter verwenden.

Sollte aber in jeden Buch auch so drin stehen.

von Oliver J. (skriptkiddy)


Lesenswert?

Ich hatte sowas von unrecht.
Hier ist eine Referenz zum return-statement.

http://home.htw-berlin.de/~junghans/cref/SYNTAX/return.html

von Justus (Gast)


Lesenswert?


von Peter II (Gast)


Lesenswert?

Justus schrieb:
> sorry, der Link funktioniert nicht.
klar geht doch

von Edi R. (edi_r)


Lesenswert?

Justus schrieb:
> sorry, der Link funktioniert nicht.

Bei mir schon.

von Matthias (Gast)


Lesenswert?

Die Variablen sollten so definiert werden:
Außerdem sollte die Variable Data auch mal wieder auf 0x00
gesetzt werden, da Du ja "nur" Bits setzt und nicht aktiv löschst!
1
volatile uint8_t __edge, __bitcount;
2
volatile uint8_t __release;
3
4
ISR(INT0_vect)
5
{
6
    static uint8_t data;                      // Holds the received scan code
7
8
    if (!__edge)                                // Routine entered at falling edge
9
    {
10
        if(__bitcount < 11 && __bitcount > 2)    // Bit 3 to 10 is data. Parity bit,
11
        {                                    // start and stop bits are ignored.
12
            data = (data >> 1);
13
            if(PINA & 4)
14
                data = data | 0x80;            // Store a '1'
15
        }
16
17
        MCUCR = 3;                            // Set interrupt on rising edge
18
        __edge = 1;
19
        
20
    } else {                                // Routine entered at rising edge
21
22
        MCUCR = 2;                            // Set interrupt on falling edge
23
        __edge = 0;
24
25
        if(--__bitcount == 0)                    // All bits received
26
        {
27
      decode(data);
28
      data = 0x00; // DAS HIER SOLLTE VIELLEICHT AUCH REIN!
29
            __bitcount = 11;
30
        }
31
    }
32
}

von Hue \. (hue)


Lesenswert?

Hallo,

die Anweisungen "volatile" und das Rücksetzen von "data" haben nicht den 
gewünschten Effekt gebracht. Es kommt immer noch Müll auf dem Terminal 
an.

HUE \a

von Justus (Gast)


Lesenswert?

Edi R. schrieb:
> Justus schrieb:
>
>> sorry, der Link funktioniert nicht.
>
>
>
> Bei mir schon.

Bei mir nicht, vielleicht stimmt was mit Eurem Internet nicht?

von Marc H. (Gast)


Lesenswert?

Justus schrieb:
>> Bei mir schon.
>
>
>
> Bei mir nicht, vielleicht stimmt was mit Eurem Internet nicht?

Vielleicht ist Dein Rechner kaputt? Nimm doch mal etwas Speisefett und 
öle die CPU etwas, damit sie besser läuft und Du was empfangen kannst.

von Hue \. (hue)


Lesenswert?

Also nach weiteren Tests hat es nur mit dem Setzen der Variable 
"_release" zu tun.
Fraglich warum nur das Setzen schon den Müll auf dem Display verursacht. 
Ich habe doch noch nichts verbrochen, was die Ausgabe an das Terminal 
angeht, oder?

HUE \a

von Marc H. (Gast)


Lesenswert?

Hue \a schrieb:
> Also nach weiteren Tests hat es nur mit dem Setzen der Variable
> "_release" zu tun.
>
> Fraglich warum nur das Setzen schon den Müll auf dem Display verursacht.
> Ich habe doch noch nichts verbrochen, was die Ausgabe an das Terminal
> angeht, oder?
>
> HUE \a

Ich denke nicht, dass es mit der Variablen _release zu tun hat, viel 
mehr scheint die Return-Rückgabewertproblematik Ursache für das 
Nichtfunktionieren Deines Programmentwurfes zu sein. Alternativ könntest 
Du die Verwendung einer cerebralen Logik verwenden, die z.B. in 
Wirbeltieren vorkommend aufzufinden sind.

von Justus (Gast)


Lesenswert?

Ode an die Logik

Eines morgens trafen sich eine Logik und ein Gatter. Nachdem die Logik 
klassisch nachdachte, fand sie das Gatter schön und tat sich mit dem 
Gatter zusammen. Vereint kommen sie noch heute als Logikgatter in 
digitalen Schaltkreisen vor - vereint bis zum letzten PC.

von Hue \. (hue)


Lesenswert?

Hier ist die Routine "decode"
1
void decode ( uint8_t sc )
2
{
3
    if ( sc != 0xF0 )
4
    {
5
         uart_putc(sc);
6
//      __release=0;            
7
    } else {
8
//      __release=1;
9
    }
10
}

So gehts!
1
void decode ( uint8_t sc )
2
{
3
    if ( sc != 0xF0 )
4
    {   
5
        uart_putc(sc);
6
      __release=0;            
7
    } else {
8
      __release=1;
9
    }   
10
}

So nicht!

HUE \a

von Stefan E. (sternst)


Lesenswert?

Es könnte auch schlicht ein Timing-Problem sein. Der PS/2-Clock ist mit 
10-16.7 kHz ja auch nicht gerade langsam. Es könnte sein, dass es ohne 
die Zuweisungen an __release noch so gerade eben passt, mit ihnen aber 
nicht mehr.

PS: Was soll der Unsinn mit den beiden führenden Unterstrichen? Solche 
Namen sind für den Compiler reserviert.

von Justus (Gast)


Lesenswert?

Stefan Ernst schrieb:
> Was soll der Unsinn mit den beiden führenden Unterstrichen? Solche
>
> Namen sind für den Compiler reserviert.

Das sehe ich auch ao. Es liegt einfach an dem Return, dass ist 
fehlerhaft und die Unterstriche sind nicht nur für Compiler, sondern 
auch für Eisdielen.

von Hue \. (hue)


Lesenswert?

Wo ist denn in der Funktion "decode" das RETURN"?

Hier mein funktionierender Code mit der lokalen Definition von 
"release".
1
void decode ( uint8_t sc )
2
{
3
    uint8_t release;
4
5
    if ( sc != 0xF0 )
6
    {
7
        uart_putc(sc);
8
        release=0;
9
    } else {
10
        release=1;
11
    }
12
}

Es kann ja nicht ein Timingproblem sein, wenn das schreiben der Variable 
"release" im lokalen Modus funktioniert, und als "static" Variable oder 
als "globale" Variable nicht.

Der Code ist an die AppNote von Atmel zur Abfrage der Tastatur 
angelehnt.

HUE \a

von Stefan E. (sternst)


Lesenswert?

Hue \a schrieb:
> Wo ist denn in der Funktion "decode" das RETURN"?

Ignoriere den Troll doch einfach.

Hue \a schrieb:
> Es kann ja nicht ein Timingproblem sein, wenn das schreiben der Variable
> "release" im lokalen Modus funktioniert, und als "static" Variable oder
> als "globale" Variable nicht.

Doch, kann es, denn als lokale Variable wird sie (und die Zuweisungen an 
sie) komplett wegoptimiert. Packe doch mal ein paar NOPs in die 
funktionierende Version, und schaue was passiert.

von Hue \. (hue)


Lesenswert?

Hallo,

vielen Dank für Eure konstruktiven Hinweise. Ich habe mich nun der 
Meinung angeschlossen, dass ich ein Timing Problem habe. Ich werde mich 
nun bemühen, dies zu beheben.

Ein schönes Wochenende...

HUE \a

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.