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
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?
Oliver J. schrieb: > Seit wann hat eine void Funktion ein return? wie willst du sonst eine funktion mal in der mitte abbrechen?
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.
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
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.
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.
Ich hatte sowas von unrecht. Hier ist eine Referenz zum return-statement. http://home.htw-berlin.de/~junghans/cref/SYNTAX/return.html
Oliver J. schrieb: > http://home.htw-berlin.de/~junghans/cref/SYNTAX/return.html sorry, der Link funktioniert nicht.
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 | }
|
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
Edi R. schrieb: > Justus schrieb: > >> sorry, der Link funktioniert nicht. > > > > Bei mir schon. Bei mir nicht, vielleicht stimmt was mit Eurem Internet nicht?
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.
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
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.
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.
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
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.
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.