www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Touchscreen Routine, in C = Problem!


Autor: Hermann U. (Firma: !www.pcb-devboards.de) (gera82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
    
      x_null = 6;
      y_null = 8;
      x_factor = 117;
      y_factor = 140;


    x_coord = GetX();
    y_coord = GetY();
    
    x_coord128_orig = ((x_coord * 128) / 1024);
    y_coord64_orig = 64 - ((y_coord *64) / 1024);
    
    x_coord128_temp = ((x_coord * 128) / 1024) - x_null;
    y_coord64_temp = ((y_coord *64) / 1024) - y_null;
    
    x_coord128 =  (x_coord128_temp  * x_factor) / 100;
    y_coord64 =  64 - ((y_coord64_temp   * y_factor) / 100);


Und so geht es, ohne y_null, x_null....:

    x_coord = GetX();
    y_coord = GetY();
    
    x_coord128_orig = ((x_coord * 128) / 1024);
    y_coord64_orig = 64 - ((y_coord *64) / 1024);

    x_coord128_temp = ((x_coord * 128) / 1024) - 6;
    y_coord64_temp = ((y_coord *64) / 1024) - 8;

    x_coord128 =  (x_coord128_temp  * 117) / 100;
    y_coord64 =  64 - ((y_coord64_temp   * 140) / 100);

Leider bin ich noch ein Anfänger in C, wor kurzem von ASM umgestiegen 
:-)))

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Definitionsbereich falsch ? Oder ist das alles in einer Funktion ?
Mal volatile benutzen:

volatile x_null = 6;
volatile y_null = 8;

Autor: Hermann U. (Firma: !www.pcb-devboards.de) (gera82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe zur Zeit das hier stehen:
unsigned int        x_coord128_orig, y_coord64_orig, x_coord128_null, y_coord64_null, x_coord128_max , y_coord64_max;
unsigned int        x_null, y_null, x_factor, y_factor;

Ich will die werte, die hier drin stehen:
x_null, y_null, x_factor, y_factor;

multiplizieren, dividieren usw...

Autor: Hermann U. (Firma: !www.pcb-devboards.de) (gera82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sich erledigt, Das Programm hat richtig gerechnet nur falsch am GLCD 
angezeigt. :-))

Autor: Hermann U. (Firma: !www.pcb-devboards.de) (gera82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bins noch einmal, hab jetzt ganz anderes Problem. Und zwar habe ich 
eine Funktion:
void Touchscreen_kalibrieren()
     {
     //code Touchscreen 
     }

diese Funktion funktioniert leider irgendwie nicht, warum?
Es kommt kein menü "Touchscreen Kalibrierung" aufm GLCD.
void Touchscreen_kalibrieren(void);

void main ()
  {
  Touchscreen_kalibrieren()

  ///...
  }


Und wenn ich denn //code direkt in "main einfüge", dann funktioniert das 
Display, so meine ich:
void main ()
  {
  //code Touchscreen

  ///...
  }


Kann mir mal einer das erklären?
Bitte!

Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Hermann U. (Firma: !www.pcb-devboards.de) (gera82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?!
void Touchscreen_kalibrieren() {
        Glcd_Init();                                      // Glcd_Init_EP5
        Glcd_Set_Font(font5x7, 5, 7, 32);   // Choose font size 5x7
        Glcd_Fill(0);


        gedruckt_calib = 0;

        Glcd_Fill(0);

        CopyConst2Ram(msg,touchscreen);                      // Copy "Touchscreen" string to RAM
        Glcd_Write_Text(msg,30,0,1);

        CopyConst2Ram(msg,kalibrierung);                     // Copy "Kalibrierung" string to RAM
        Glcd_Write_Text(msg,28,1,1);

        CopyConst2Ram(msg,tippen);                          // Copy "Tippen Sie auf" string to RAM
        Glcd_Write_Text(msg,22,3,1);

        CopyConst2Ram(msg,kreuz);                           // Copy "das Kreuz" string to RAM
        Glcd_Write_Text(msg,35,4,1);

        CopyConst2Ram(msg,links_oben);                      // Copy "LINKS OBEN" string to RAM
        Glcd_Write_Text(msg,15,6,1);

        Glcd_H_Line(0, 6, 3, 1);
        Glcd_V_Line(0, 6, 3, 1);


while (1) {
            // read X-Y and convert it to 128x64 space
       x_coord = GetX();
       y_coord = GetY();

       x_coord128_orig = ((x_coord * 128) / 1024);
       y_coord64_orig = 64 - ((y_coord *64) / 1024);

       if ((gedruckt_calib == 0) && (x_coord128_orig >= 0) && (x_coord128_orig <= 20) && (y_coord64_orig >= 0) && (y_coord64_orig <= 20))
          {
        gedruckt_calib ++;
        x_null = x_coord128_orig ;
        y_null = y_coord64_orig ;

        CopyConst2Ram(msg,rechts_unten);                     // Copy "RECHTS UNTEN" string to RAM
        Glcd_Write_Text(msg,15,6,1);

        Glcd_Box(0,0,15,15,0);

        Glcd_H_Line(121, 127, 60, 1);
        Glcd_V_Line(57, 63, 124, 1);
        }

        if ((gedruckt_calib == 1) && (x_coord128_orig >= 100) && (x_coord128_orig <= 128) && (y_coord64_orig >= 50) && (y_coord64_orig <= 64))
          {
        gedruckt_calib ++;
        x_coord128_max = x_coord128_orig ;
        y_coord64_max = y_coord64_orig ;

        CopyConst2Ram(msg,fertig);                       // Copy "FERTIG" string to RAM
        Glcd_Write_Text(msg,15,6,1);

        Glcd_Box(120,57,127,63,0);

        x_factor =  (128 * 100) / x_coord128_max;
        y_factor =  (64 * 100) / y_coord64_max;
        }

        if (gedruckt_calib == 2)
          {
          INTCON.GIE = 0;
          EEPROM_Write(0x10, x_null);
          Delay_ms(20);
          EEPROM_Write(0x12, y_null);
          Delay_ms(20);
          EEPROM_Write(0x14, x_factor);
          Delay_ms(20);
          EEPROM_Write(0x16, y_factor);
          Delay_ms(20);
          EEPROM_Write(0x18, gedruckt_calib);
          INTCON.GIE = 1;
          Delay_ms(3000);
          Glcd_Fill(0);
          return;
          }
     }

  }

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Überprüf mal, ob du beim Aufuf in main die () angegeben hast

int main()
{
  ...
  Touchscreen_kalibrieren;    // das ist kein Funktionsaufruf!

  Touchscreen_kalibrieren();  // das ist ein Funktionsaufruf
}

Autor: Hermann U. (Firma: !www.pcb-devboards.de) (gera82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist das Hauptprogramm "main", ich kann nicht das Unterprogramm " 
Touchscreen_kalibrieren();" ansprechen.


void Befehl_senden (void);      // Unterprogramm Definieren (Bekanntmachen fur andere Unterprogramme)
void TxD (void);
void TxDNull (void);
void TxDEins (void);
void Watchdog_loschen  (void);
void Touchscreen_kalibrieren (void);



void main() {
     PORTA = 0;
     PORTC = 0;
     TRISA =  0b00000011;                                // RA0 i RA1 are analog inputs
     ADCON0 = 0b00001011;
     ADCON1 = 0b00001100;                                  // Configure other AN pins as digital I/O
     ADCON2 = 0b10000000;
     TRISC = 0 ;                                  // PORTC is output
     TRISB      = 0b11111111;                     // PortB als Input eistellen
     TRISD = 0;                             // PORTD - выход     Lcd_Init();
     TRISJ = 0;


     T0CON.TMR0ON = 1;                       // 1 = Enables Timer0  TMR0ON: Timer0 On/Off Control bit
     T0CON.T08BIT = 0;                       // 0 = Timer0 is configured as a 16-bit timer/counter /// 1 = Timer0 is configured as an 8-bit timer/counter
     T0CON.T0CS   = 0;                       // 0 = Internal instruction cycle clock (CLKO)
     T0CON.T0SE   = 1;                       // 1 = Increment on high-to-low transition on T0CKI pin
     T0CON.PSA    = 0;                       // 0 = Timer0 prescaler is assigned. Timer0 clock input comes from prescaler output.

     T0CON.T0PS2  = 1;                       // T0PS2:T0PS0: Timer0 Prescaler Select bits
     T0CON.T0PS1  = 0;                       //  111 = 1:256 prescale value
     T0CON.T0PS0  = 0;                       //  110 = 1:128 prescale value
                                             //  101 = 1:64 prescale value
                                             //  100 = 1:32 prescale value
                                             //  011 = 1:16 prescale value
                                             //  010 = 1:8 prescale value
                                             //  001 = 1:4 prescale value
                                             //  000 = 1:2 prescale value
     INTCON.TMR0IE = 1;                       // 1 = Enables the TMR0 overflow interrupt

     INTCON.INT0IE = 1;                     // Enables the INT0 external interrupt
     INTCON.PEIE = 1;                       // enable peripheral interrupts
     INTCON.GIE = 1;                        // enable global interrupt

      WatchDog = 0;
      gedruckt_BUTTON1 = 0;
      gedruckt_BUTTON2 = 0;
      
      Touchscreen_kalibrieren();      // HIER Problemm beim callen?!


  Glcd_Init();                                 // Glcd_Init_EP5
  Glcd_Set_Font(font5x7, 5, 7, 32);   // Choose font size 5x7
  Glcd_Fill(0);                                // Clear GLCD
  CopyConst2Ram(msg,msg1);                     // Copy "TOUCHPANEL EXAMPLE" string to RAM
  Glcd_Write_Text(msg,6,0,1);
  CopyConst2Ram(msg,msg9);                     // Copy "TOUCHPANEL EXAMPLE" string to RAM
  Glcd_Write_Text(msg,6,1,1);

  CopyConst2Ram(msg,msg10);                     // Copy "ADC AN0 Y-Koor:" string to RAM
  Glcd_Write_Text(msg,1,6,1);
  CopyConst2Ram(msg,msg2);                    // Copy "ADC AN0 Y-Koor:" string to RAM
  Glcd_Write_Text(msg,1,7,1);


  //Display Buttons on GLCD:
  Glcd_Rectangle(8,19,60,43,1);
  Glcd_Rectangle(68,19,120,43,1);

  CopyConst2Ram(msg,msg3);                     // Copy "BUTTON1" string to RAM
  Glcd_Write_Text(msg,14,3,1);
  CopyConst2Ram(msg,msg5);                     // Copy "RC6 OFF" string to RAM
  Glcd_Write_Text(msg,14,4,1);
  CopyConst2Ram(msg,msg4);                     // Copy "BUTTON2" string to RAM
  Glcd_Write_Text(msg,74,3,1);
  CopyConst2Ram(msg,msg6);                     // Copy "RC7 OFF" string to RAM
  Glcd_Write_Text(msg,74,4,1);
  while (1) {
    // read X-Y and convert it to 128x64 space
    x_coord = GetX();
    y_coord = GetY();

    x_coord128_orig = ((x_coord * 128) / 1024);
    y_coord64_orig = 64 - ((y_coord *64) / 1024);

    x_coord128_temp = ((x_coord * 128) / 1024) - 6;
    y_coord64_temp = ((y_coord *64) / 1024) - 8;

    x_coord128 =  (x_coord128_temp  * 117) / 100;
    y_coord64 =  64 - ((y_coord64_temp   * 140) / 100);

        ADC_AN2 = ADC_Read(2);
        temp2 = (49 * ADC_AN2) / 10;

    IntToStr(x_coord128, txt);
    Glcd_Write_Text(txt, 50, 7, 1);
    IntToStr(y_coord64, txt);
    Glcd_Write_Text(txt, 50, 6, 1);

    IntToStr(x_coord128_orig, txt);
    Glcd_Write_Text(txt, 90, 7, 1);
    IntToStr(y_coord64_orig, txt);
    Glcd_Write_Text(txt, 90, 6, 1);

/*IntToStr(temp2, txt);
    Glcd_Write_Text(txt, 70, 1, 1);



    IntToStr(WatchDog, txt);
    //CopyConst2Ram(msg,Watchdog);               // Function used for text movin
    Glcd_Write_Text(txt, 70, 0, 1);*/


    //if BUTTON1 is selected

    if ((x_coord128 >= 10) && (x_coord128 <= 58) && (y_coord64 >= 21) && (y_coord64 <= 41)) {
         Glcd_Rectangle(8,19,60,43,0);
        if (gedruckt_BUTTON1 == 0) {
      if(PORTC.F6 == 0) {
        PORTC.F6 = 1;
        Glcd_Box(10,21,58,41,2);
        CopyConst2Ram(msg,msg7);               // Copy "RC6 ON " string to RAM
        Glcd_Write_Text(msg,14,4,0);
        CopyConst2Ram(msg,msg3);                     // Copy "BUTTON1" string to RAM
        Glcd_Write_Text(msg,14,3,0);
        gedruckt_BUTTON1 = 1;

      }
       else  {
        PORTC.F6 = 0;
        Glcd_Box(10,21,58,41,2);
        CopyConst2Ram(msg,msg5);               // Copy "RC6 OFF" string to RAM
        Glcd_Write_Text(msg,14,4,1);
        CopyConst2Ram(msg,msg3);                     // Copy "BUTTON1" string to RAM
        Glcd_Write_Text(msg,14,3,1);
        gedruckt_BUTTON1 = 1;

      }
      }
    }
    else {
        gedruckt_BUTTON1 = 0;
        Glcd_Rectangle(8,19,60,43,1);
        }


    //if BUTTON2 is selected
    if ((x_coord128 >= 70) && (x_coord128 <= 118) && (y_coord64 >= 21) && (y_coord64 <= 41)) {
      Glcd_Rectangle(68,19,120,43,0);
      if (gedruckt_BUTTON2 == 0) {
      if (PORTC.F7 == 0) {
        PORTC.F7 = 1;
        Glcd_Box(70,21,118,41,2);
        CopyConst2Ram(msg,msg4);                     // Copy "BUTTON2" string to RAM
        Glcd_Write_Text(msg,74,3,0);
        CopyConst2Ram(msg,msg8);               // Copy "RC7 ON " string to RAM
        Glcd_Write_Text(msg,74,4,0);
        gedruckt_BUTTON2 = 1;
      }
      else {
        PORTC.F7 = 0;
        Glcd_Box(70,21,118,41,2);
        CopyConst2Ram(msg,msg4);                     // Copy "BUTTON2" string to RAM
        Glcd_Write_Text(msg,74,3,1);
        CopyConst2Ram(msg,msg6);               // Copy "RC7 OFF" string to RAM
        Glcd_Write_Text(msg,74,4,1);
        gedruckt_BUTTON2 = 1;
      }
      }
      }
          else {
        gedruckt_BUTTON2 = 0;
        Glcd_Rectangle(68,19,120,43,1);
        }

    Delay_ms(50);

   }
}

Autor: Hermann U. (Firma: !www.pcb-devboards.de) (gera82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Überprüf mal, ob du beim Aufuf in main die () angegeben hast
>
>
> 
> int main()
> {
>   ...
>   Touchscreen_kalibrieren;    // das ist kein Funktionsaufruf!
> 
>   Touchscreen_kalibrieren();  // das ist ein Funktionsaufruf
> }
> 

Das weiß ich, ich hab mich verschrieben, sorry :-)))

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hermann U. schrieb:
> Karl heinz Buchegger schrieb:
>> Überprüf mal, ob du beim Aufuf in main die () angegeben hast
>>
>>
>>
>> int main()
>> {
>>   ...
>>   Touchscreen_kalibrieren;    // das ist kein Funktionsaufruf!
>>
>>   Touchscreen_kalibrieren();  // das ist ein Funktionsaufruf
>> }
>> 
>
> 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?

Autor: Hermann U. (Firma: !www.pcb-devboards.de) (gera82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
Touchscreen_kalibrieren();      // HIER Problemm beim callen?!

nee geht immer noch nicht :(

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
>
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.

Autor: Mandrake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Hermann U. (Firma: !www.pcb-devboards.de) (gera82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 :(
void Touchscreen_kalibrieren (){

        gedruckt_calib = 0;

        //CopyConst2Ram(msg,touchscreen);                      // Copy "Touchscreen" string to RAM
        Glcd_Write_Text("Touchscreen",30,0,1);


        //CopyConst2Ram(msg,kalibrierung);                     // Copy "Kalibrierung" string to RAM
        Glcd_Write_Text("KALIBRIERUNG",28,1,1);



        //CopyConst2Ram(msg,tippen);                          // Copy "Tippen Sie auf" string to RAM
        Glcd_Write_Text("Tippen Sie auf",22,3,1);



        //CopyConst2Ram(msg,kreuz);                           // Copy "das Kreuz" string to RAM
        Glcd_Write_Text("das Kreuz",35,4,1);


        //CopyConst2Ram(msg,links_oben);                      // Copy "LINKS OBEN" string to RAM
        Glcd_Write_Text("[  LINKS OBEN  ]",15,6,1);


        Glcd_H_Line(0, 6, 3, 1);
        Glcd_V_Line(0, 6, 3, 1);



 while (1) {
            // read X-Y and convert it to 128x64 space
       x_coord = GetX();
       y_coord = GetY();
        }
        }

       /*x_coord128_orig = ((x_coord * 128) / 1024);
       y_coord64_orig = 64 - ((y_coord *64) / 1024);


       if ((gedruckt_calib == 0) && (x_coord128_orig >= 0) && (x_coord128_orig <= 20) && (y_coord64_orig >= 0) && (y_coord64_orig <= 20))
          {
        gedruckt_calib ++;
        x_null = x_coord128_orig ;
        y_null = y_coord64_orig ;

        //CopyConst2Ram(msg,rechts_unten);                     // Copy "RECHTS UNTEN" string to RAM
        Glcd_Write_Text("RECHTS UNTEN",15,6,1);

        Glcd_Box(0,0,15,15,0);

        Glcd_H_Line(121, 127, 60, 1);
        Glcd_V_Line(57, 63, 124, 1);
        }

        if ((gedruckt_calib == 1) && (x_coord128_orig >= 100) && (x_coord128_orig <= 128) && (y_coord64_orig >= 50) && (y_coord64_orig <= 64))
          {
        gedruckt_calib ++;
        x_coord128_max = x_coord128_orig ;
        y_coord64_max = y_coord64_orig ;

        //CopyConst2Ram(msg,fertig);                       // Copy "FERTIG" string to RAM
        Glcd_Write_Text("FERTIG",15,6,1);

        Glcd_Box(120,57,127,63,0);

        x_factor =  (128 * 100) / x_coord128_max;
        y_factor =  (64 * 100) / y_coord64_max;
        }

        if (gedruckt_calib == 2)
          {
          INTCON.GIE = 0;
          EEPROM_Write(0x10, x_null);
          Delay_ms(20);
          EEPROM_Write(0x12, y_null);
          Delay_ms(20);
          EEPROM_Write(0x14, x_factor);
          Delay_ms(20);
          EEPROM_Write(0x16, y_factor);
          Delay_ms(20);
          EEPROM_Write(0x18, gedruckt_calib);
          INTCON.GIE = 1;
          Delay_ms(3000);
          Glcd_Fill(0);
          return;
          }
     }

 }*/



Und das blöde ist, wenn ich es in Hauptprogramm "main" einfüge dann geht 
es... Ich verstehe es nicht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Hermann U. (Firma: !www.pcb-devboards.de) (gera82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aus der Schleife willst du gar nicht raus...

Autor: Hermann U. (Firma: !www.pcb-devboards.de) (gera82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
void GetOrigCoord( int *x, int *y )
{
  x_coord = GetX();
  y_coord = GetY();
  *x = ((x_coord * 128) / 1024);
  *y = 64 - ((y_coord *64) / 1024);
}

void CalibrateLinksOben( void )
{
  Glcd_Write_Text("[  LINKS OBEN  ]",15,6,1);

  Glcd_H_Line(0, 6, 3, 1);
  Glcd_V_Line(0, 6, 3, 1);

  do {
    GetOrigCoord( &x_coord128_orig, &y_coord64_orig );
  } while( !( ( x_coord128_orig >= 0 ) && ( x_coord128_orig <= 20 ) &&
              ( y_coord64_orig  >= 0 ) && ( y_coord64_orig  <= 20 ) ) );

  x_null = x_coord128_orig ;
  y_null = y_coord64_orig ;
}

void CalibrateRechtsUnten( void )
{
  Glcd_Write_Text("RECHTS UNTEN",15,6,1);

  Glcd_Box(0,0,15,15,0);
  Glcd_H_Line(121, 127, 60, 1);
  Glcd_V_Line(57, 63, 124, 1);

  do {
    GetOrigCoord( &x_coord128_orig, &y_coord64_orig );
  } while( !( ( x_coord128_orig >= 100 ) && ( x_coord128_orig <= 128 ) &&
              ( y_coord64_orig  >=  50 ) && ( y_coord64_orig  <=  64 ) ) );

  x_coord128_max = x_coord128_orig ;
  y_coord64_max = y_coord64_orig ;
}

void Touchscreen_kalibrieren ()
{
  Glcd_Write_Text("Touchscreen",30,0,1);
  Glcd_Write_Text("KALIBRIERUNG",28,1,1);
  Glcd_Write_Text("Tippen Sie auf",22,3,1);
  Glcd_Write_Text("das Kreuz",35,4,1);

  CalibrateLinksOben();

  CalibrateRechtsUnten();

  Glcd_Write_Text("FERTIG",15,6,1);
  Glcd_Box(120,57,127,63,0);

  x_factor =  (128 * 100) / x_coord128_max;
  y_factor =  (64 * 100) / y_coord64_max;

  INTCON.GIE = 0;
  EEPROM_Write(0x10, x_null);
  Delay_ms(20);
  EEPROM_Write(0x12, y_null);
  Delay_ms(20);
  EEPROM_Write(0x14, x_factor);
  Delay_ms(20);
  EEPROM_Write(0x16, y_factor);
  Delay_ms(20);
  EEPROM_Write(0x18, gedruckt_calib);
  INTCON.GIE = 1;
  Delay_ms(3000);
  Glcd_Fill(0);
}

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.

Autor: manateemoo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.