Hallo,
Kann mir mal einer helfen, ich mache grad eine Tocuhscreen-Routine mit
automatischer Kalibrierung. x_null, y_null, x_factor und y_factor sind
automatisch ermittelte Werte, im code unten ist es manuell eingetragen.
Wie kann ich diese Formel hier auswerten, mir geht es um:
y_null und x_null
So funktioniert leider nicht:
1
2
x_null=6;
3
y_null=8;
4
x_factor=117;
5
y_factor=140;
6
7
8
x_coord=GetX();
9
y_coord=GetY();
10
11
x_coord128_orig=((x_coord*128)/1024);
12
y_coord64_orig=64-((y_coord*64)/1024);
13
14
x_coord128_temp=((x_coord*128)/1024)-x_null;
15
y_coord64_temp=((y_coord*64)/1024)-y_null;
16
17
x_coord128=(x_coord128_temp*x_factor)/100;
18
y_coord64=64-((y_coord64_temp*y_factor)/100);
Und so geht es, ohne y_null, x_null....:
1
x_coord=GetX();
2
y_coord=GetY();
3
4
x_coord128_orig=((x_coord*128)/1024);
5
y_coord64_orig=64-((y_coord*64)/1024);
6
7
x_coord128_temp=((x_coord*128)/1024)-6;
8
y_coord64_temp=((y_coord*64)/1024)-8;
9
10
x_coord128=(x_coord128_temp*117)/100;
11
y_coord64=64-((y_coord64_temp*140)/100);
Leider bin ich noch ein Anfänger in C, wor kurzem von ASM umgestiegen
:-)))
Hermann U. schrieb:
> Kann mir mal einer das erklären?
Und wie soll dir mit dem bischen Vorgabe irgendwer irgendetwas erklären?
"funktioniert leider irgendwie nicht" ist keine Fehlerbeschreibung mit
der irgendjemand irgendetwas anfangen kann.
Okay, das ist der Code für die Kalibrierung von Touchscreen, ich kann
diese Funktion "Touchscreen_kalibrieren();" nicht aus "main" Routine
abfragen. Wenn ich aber diesen Code direkt in "main" einfüge
funktioniert alles ohne Probleme?!
1
voidTouchscreen_kalibrieren(){
2
Glcd_Init();// Glcd_Init_EP5
3
Glcd_Set_Font(font5x7,5,7,32);// Choose font size 5x7
4
Glcd_Fill(0);
5
6
7
gedruckt_calib=0;
8
9
Glcd_Fill(0);
10
11
CopyConst2Ram(msg,touchscreen);// Copy "Touchscreen" string to RAM
12
Glcd_Write_Text(msg,30,0,1);
13
14
CopyConst2Ram(msg,kalibrierung);// Copy "Kalibrierung" string to RAM
15
Glcd_Write_Text(msg,28,1,1);
16
17
CopyConst2Ram(msg,tippen);// Copy "Tippen Sie auf" string to RAM
18
Glcd_Write_Text(msg,22,3,1);
19
20
CopyConst2Ram(msg,kreuz);// Copy "das Kreuz" string to RAM
21
Glcd_Write_Text(msg,35,4,1);
22
23
CopyConst2Ram(msg,links_oben);// Copy "LINKS OBEN" string to RAM
und wo ist main()?
gibt es einen Protoypen dafür, etc. etc. etc.
Dass deine Funktion funktioniert, davon gehe ich mal aus.
Was soll "ich kann nicht aufrufen" bedeuten.
Hilf uns ein wenig!
Hermann U. schrieb:
> Karl heinz Buchegger schrieb:>> Überprüf mal, ob du beim Aufuf in main die () angegeben hast>>>>
1
>>
2
>>intmain()
3
>>{
4
>>...
5
>>Touchscreen_kalibrieren;// das ist kein Funktionsaufruf!
6
>>
7
>>Touchscreen_kalibrieren();// das ist ein Funktionsaufruf
8
>>}
9
>>
>> Das weiß ich, ich hab mich verschrieben, sorry :-)))
Kein Problem. Die Sache ist nur die, dass beide Statements absolut
gültige C-Statements sind und das einer der häufigeren Gründe ist, warum
eine Funktion nicht aufgerufen wird.
Klappts jetzt oder wie soll ich "ich hab mich verschrieben" verstehen?
Karl heinz Buchegger schrieb:
>> Klappts jetzt oder wie soll ich "ich hab mich verschrieben" verstehen?
ich hab mich hier im Forum verschrieben, aber wie man in dem
Hauptprogramm "main" sieht ist es richtig geschrieben:
1
Touchscreen_kalibrieren();// HIER Problemm beim callen?!
Hermann U. schrieb:
> Karl heinz Buchegger schrieb:>>>> Klappts jetzt oder wie soll ich "ich hab mich verschrieben" verstehen?>>> ich hab mich hier im Forum verschrieben, aber wie man in dem> Hauptprogramm "main" sieht ist es richtig geschrieben:>
1
Touchscreen_kalibrieren();// HIER Problemm beim callen?!
>> nee geht immer noch nicht :(
Schon mal versucht im Debugger im Einzelschrittmodus durchzugehen?
(Jetzt ist der Punkt erreicht an dem man keine generelle
Lösungsstrategie mehr anwenden kann. Zumindest fällt mir nichts mehr
ein. Du könntest noch dein komplettes Projekt posten, dann kann ich das
hier versuchen nachzustellen)
Edit:
Blödsinn: Das ist ja gar kein AVR. Da fehlen mir ja die
Entwicklungstools dazu.
Hast du zu deinem Funktionsprototypen auch irgendwo die Implementierung?
Wenn nicht, schreib die mal unter die main-Methode, dann sollte er es
eigentlich richtig aufrufen.
Gruß
Mandrake
Karl heinz Buchegger schrieb:
> Blödsinn: Das ist ja gar kein AVR. Da fehlen mir ja die> Entwicklungstools dazu.
Ja das ist ein BIGPIC5 mit mikroC Pro Compiler...
Ich hab jetzt aber folgendes festgestellt, das Unterprogramm wird
irgendwie
nicht fertig, zu viele Funktionen innen drinn :-/
So weit habe ich zum Laufen gebracht, Rest ist ausgeklammert und geht
nicht :(
1
voidTouchscreen_kalibrieren(){
2
3
gedruckt_calib=0;
4
5
//CopyConst2Ram(msg,touchscreen); // Copy "Touchscreen" string to RAM
6
Glcd_Write_Text("Touchscreen",30,0,1);
7
8
9
//CopyConst2Ram(msg,kalibrierung); // Copy "Kalibrierung" string to RAM
10
Glcd_Write_Text("KALIBRIERUNG",28,1,1);
11
12
13
14
//CopyConst2Ram(msg,tippen); // Copy "Tippen Sie auf" string to RAM
15
Glcd_Write_Text("Tippen Sie auf",22,3,1);
16
17
18
19
//CopyConst2Ram(msg,kreuz); // Copy "das Kreuz" string to RAM
20
Glcd_Write_Text("das Kreuz",35,4,1);
21
22
23
//CopyConst2Ram(msg,links_oben); // Copy "LINKS OBEN" string to RAM
Hermann U. schrieb:
> Karl heinz Buchegger schrieb:>>> Blödsinn: Das ist ja gar kein AVR. Da fehlen mir ja die>> Entwicklungstools dazu.>> Ja das ist ein BIGPIC5 mit mikroC Pro Compiler...>>> Ich hab jetzt aber folgendes festgestellt, das Unterprogramm wird> irgendwie> nicht fertig, zu viele Funktionen innen drinn :-/
Drösle die Funktion in einzelne Teilfunktionen auf und sieh zu, dass du
die Endlosschleife mir dem return mitten drinn los wirst. Ds ist alles
viel zu unübersichtlich.
Karl heinz Buchegger schrieb:
> Hermann U. schrieb:>> Karl heinz Buchegger schrieb:>> dass du die Endlosschleife mir dem return mitten drinn los wirst.
Wie meinst du das, wie komm ich sonst aus ener schleife/funktion raus,
wie wird es sonst gemacht? In ASM habe ich mit "return" gemacht, es hat
immer funktioniert.
STK500-Besitzer schrieb:
> Aus der Schleife willst du gar nicht raus...
Ja schon, ich will aber solange drine in der Schleife bleiben bis:
if (gedruckt_calib == 2)
und dann mit "return" raus. So hab ich mir es vorgestellt.
Hermann U. schrieb:
> STK500-Besitzer schrieb:>> Aus der Schleife willst du gar nicht raus...>> Ja schon, ich will aber solange drine in der Schleife bleiben bis:>> if (gedruckt_calib == 2)
dann wird wohl gedruckt_calib nie 2 werden.
Lass dir doch einfach mal x_coord und y_coord bzw. die Werte die du
daraus errechnest ausgeben.
Hermann U. schrieb:
> Wie meinst du das, wie komm ich sonst aus ener schleife/funktion raus,> wie wird es sonst gemacht?
Natürlich musst du irgendwie uirück.
Aber diese ganze Schleiferei mit der komplizierten pressed Steuerung
muss ja nicht sein. Mach dir kurze Funktionen, die du auch überblicken
kannst anstatt über 3 Bildschirmseiten mit seltsamen Flag-Steuerungen
laufen.
Jetzt hast du auch ein schönes Plätzchen (die Funktion GetOrigCoord) an
der du die gelesenen und umgerechneten Koordinaten zu Debugzwecken schön
ausgeben und kontrollieren kannst.
Nur so eine Idee....
x_null = 6;
y_null = 8;
x_factor = 117;
y_factor = 140;
geht nicht, aber mit Konstanten gehts.
Code im main() geht aber mit Funktionsaufruf nicht.
--> Ist der stack pointer richtig initialisiert ?