Ausgabe an UART bringt Müll

OP #2329556
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
Angehängte Dateien:
OP #2329946
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
Gast #2329947
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.
Gast #2329955
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.
Gast #2330017
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
}
OP #2330105
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
Gast #2330115
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.
Gast #2330118
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.
OP #2330142
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
#2330208
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.
OP #2330261
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
#2330266
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren