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


von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


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:
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 
:-)))

von Chris (Gast)


Lesenswert?

Definitionsbereich falsch ? Oder ist das alles in einer Funktion ?
Mal volatile benutzen:

volatile x_null = 6;
volatile y_null = 8;

von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


Lesenswert?

Ich habe zur Zeit das hier stehen:
1
unsigned int        x_coord128_orig, y_coord64_orig, x_coord128_null, y_coord64_null, x_coord128_max , y_coord64_max;
2
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...

von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


Lesenswert?

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

von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


Lesenswert?

Ich bins noch einmal, hab jetzt ganz anderes Problem. Und zwar habe ich 
eine Funktion:
1
void Touchscreen_kalibrieren()
2
     {
3
     //code Touchscreen 
4
     }

diese Funktion funktioniert leider irgendwie nicht, warum?
Es kommt kein menü "Touchscreen Kalibrierung" aufm GLCD.
1
void Touchscreen_kalibrieren(void);
2
3
void main ()
4
  {
5
  Touchscreen_kalibrieren()
6
7
  ///...
8
  }


Und wenn ich denn //code direkt in "main einfüge", dann funktioniert das 
Display, so meine ich:
1
void main ()
2
  {
3
  //code Touchscreen
4
5
  ///...
6
  }


Kann mir mal einer das erklären?
Bitte!

Gruß

von Karl H. (kbuchegg)


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.

von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


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?!
1
void Touchscreen_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
24
        Glcd_Write_Text(msg,15,6,1);
25
26
        Glcd_H_Line(0, 6, 3, 1);
27
        Glcd_V_Line(0, 6, 3, 1);
28
29
30
while (1) {
31
            // read X-Y and convert it to 128x64 space
32
       x_coord = GetX();
33
       y_coord = GetY();
34
35
       x_coord128_orig = ((x_coord * 128) / 1024);
36
       y_coord64_orig = 64 - ((y_coord *64) / 1024);
37
38
       if ((gedruckt_calib == 0) && (x_coord128_orig >= 0) && (x_coord128_orig <= 20) && (y_coord64_orig >= 0) && (y_coord64_orig <= 20))
39
          {
40
        gedruckt_calib ++;
41
        x_null = x_coord128_orig ;
42
        y_null = y_coord64_orig ;
43
44
        CopyConst2Ram(msg,rechts_unten);                     // Copy "RECHTS UNTEN" string to RAM
45
        Glcd_Write_Text(msg,15,6,1);
46
47
        Glcd_Box(0,0,15,15,0);
48
49
        Glcd_H_Line(121, 127, 60, 1);
50
        Glcd_V_Line(57, 63, 124, 1);
51
        }
52
53
        if ((gedruckt_calib == 1) && (x_coord128_orig >= 100) && (x_coord128_orig <= 128) && (y_coord64_orig >= 50) && (y_coord64_orig <= 64))
54
          {
55
        gedruckt_calib ++;
56
        x_coord128_max = x_coord128_orig ;
57
        y_coord64_max = y_coord64_orig ;
58
59
        CopyConst2Ram(msg,fertig);                       // Copy "FERTIG" string to RAM
60
        Glcd_Write_Text(msg,15,6,1);
61
62
        Glcd_Box(120,57,127,63,0);
63
64
        x_factor =  (128 * 100) / x_coord128_max;
65
        y_factor =  (64 * 100) / y_coord64_max;
66
        }
67
68
        if (gedruckt_calib == 2)
69
          {
70
          INTCON.GIE = 0;
71
          EEPROM_Write(0x10, x_null);
72
          Delay_ms(20);
73
          EEPROM_Write(0x12, y_null);
74
          Delay_ms(20);
75
          EEPROM_Write(0x14, x_factor);
76
          Delay_ms(20);
77
          EEPROM_Write(0x16, y_factor);
78
          Delay_ms(20);
79
          EEPROM_Write(0x18, gedruckt_calib);
80
          INTCON.GIE = 1;
81
          Delay_ms(3000);
82
          Glcd_Fill(0);
83
          return;
84
          }
85
     }
86
87
  }

von Karl H. (kbuchegg)


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!

von Karl H. (kbuchegg)


Lesenswert?

Überprüf mal, ob du beim Aufuf in main die () angegeben hast
1
int main()
2
{
3
  ...
4
  Touchscreen_kalibrieren;    // das ist kein Funktionsaufruf!
5
6
  Touchscreen_kalibrieren();  // das ist ein Funktionsaufruf
7
}

von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


Lesenswert?

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

1
void Befehl_senden (void);      // Unterprogramm Definieren (Bekanntmachen fur andere Unterprogramme)
2
void TxD (void);
3
void TxDNull (void);
4
void TxDEins (void);
5
void Watchdog_loschen  (void);
6
void Touchscreen_kalibrieren (void);
7
8
9
10
void main() {
11
     PORTA = 0;
12
     PORTC = 0;
13
     TRISA =  0b00000011;                                // RA0 i RA1 are analog inputs
14
     ADCON0 = 0b00001011;
15
     ADCON1 = 0b00001100;                                  // Configure other AN pins as digital I/O
16
     ADCON2 = 0b10000000;
17
     TRISC = 0 ;                                  // PORTC is output
18
     TRISB      = 0b11111111;                     // PortB als Input eistellen
19
     TRISD = 0;                             // PORTD - выход     Lcd_Init();
20
     TRISJ = 0;
21
22
23
     T0CON.TMR0ON = 1;                       // 1 = Enables Timer0  TMR0ON: Timer0 On/Off Control bit
24
     T0CON.T08BIT = 0;                       // 0 = Timer0 is configured as a 16-bit timer/counter /// 1 = Timer0 is configured as an 8-bit timer/counter
25
     T0CON.T0CS   = 0;                       // 0 = Internal instruction cycle clock (CLKO)
26
     T0CON.T0SE   = 1;                       // 1 = Increment on high-to-low transition on T0CKI pin
27
     T0CON.PSA    = 0;                       // 0 = Timer0 prescaler is assigned. Timer0 clock input comes from prescaler output.
28
29
     T0CON.T0PS2  = 1;                       // T0PS2:T0PS0: Timer0 Prescaler Select bits
30
     T0CON.T0PS1  = 0;                       //  111 = 1:256 prescale value
31
     T0CON.T0PS0  = 0;                       //  110 = 1:128 prescale value
32
                                             //  101 = 1:64 prescale value
33
                                             //  100 = 1:32 prescale value
34
                                             //  011 = 1:16 prescale value
35
                                             //  010 = 1:8 prescale value
36
                                             //  001 = 1:4 prescale value
37
                                             //  000 = 1:2 prescale value
38
     INTCON.TMR0IE = 1;                       // 1 = Enables the TMR0 overflow interrupt
39
40
     INTCON.INT0IE = 1;                     // Enables the INT0 external interrupt
41
     INTCON.PEIE = 1;                       // enable peripheral interrupts
42
     INTCON.GIE = 1;                        // enable global interrupt
43
44
      WatchDog = 0;
45
      gedruckt_BUTTON1 = 0;
46
      gedruckt_BUTTON2 = 0;
47
      
48
      Touchscreen_kalibrieren();      // HIER Problemm beim callen?!
49
50
51
  Glcd_Init();                                 // Glcd_Init_EP5
52
  Glcd_Set_Font(font5x7, 5, 7, 32);   // Choose font size 5x7
53
  Glcd_Fill(0);                                // Clear GLCD
54
  CopyConst2Ram(msg,msg1);                     // Copy "TOUCHPANEL EXAMPLE" string to RAM
55
  Glcd_Write_Text(msg,6,0,1);
56
  CopyConst2Ram(msg,msg9);                     // Copy "TOUCHPANEL EXAMPLE" string to RAM
57
  Glcd_Write_Text(msg,6,1,1);
58
59
  CopyConst2Ram(msg,msg10);                     // Copy "ADC AN0 Y-Koor:" string to RAM
60
  Glcd_Write_Text(msg,1,6,1);
61
  CopyConst2Ram(msg,msg2);                    // Copy "ADC AN0 Y-Koor:" string to RAM
62
  Glcd_Write_Text(msg,1,7,1);
63
64
65
  //Display Buttons on GLCD:
66
  Glcd_Rectangle(8,19,60,43,1);
67
  Glcd_Rectangle(68,19,120,43,1);
68
69
  CopyConst2Ram(msg,msg3);                     // Copy "BUTTON1" string to RAM
70
  Glcd_Write_Text(msg,14,3,1);
71
  CopyConst2Ram(msg,msg5);                     // Copy "RC6 OFF" string to RAM
72
  Glcd_Write_Text(msg,14,4,1);
73
  CopyConst2Ram(msg,msg4);                     // Copy "BUTTON2" string to RAM
74
  Glcd_Write_Text(msg,74,3,1);
75
  CopyConst2Ram(msg,msg6);                     // Copy "RC7 OFF" string to RAM
76
  Glcd_Write_Text(msg,74,4,1);
77
  while (1) {
78
    // read X-Y and convert it to 128x64 space
79
    x_coord = GetX();
80
    y_coord = GetY();
81
82
    x_coord128_orig = ((x_coord * 128) / 1024);
83
    y_coord64_orig = 64 - ((y_coord *64) / 1024);
84
85
    x_coord128_temp = ((x_coord * 128) / 1024) - 6;
86
    y_coord64_temp = ((y_coord *64) / 1024) - 8;
87
88
    x_coord128 =  (x_coord128_temp  * 117) / 100;
89
    y_coord64 =  64 - ((y_coord64_temp   * 140) / 100);
90
91
        ADC_AN2 = ADC_Read(2);
92
        temp2 = (49 * ADC_AN2) / 10;
93
94
    IntToStr(x_coord128, txt);
95
    Glcd_Write_Text(txt, 50, 7, 1);
96
    IntToStr(y_coord64, txt);
97
    Glcd_Write_Text(txt, 50, 6, 1);
98
99
    IntToStr(x_coord128_orig, txt);
100
    Glcd_Write_Text(txt, 90, 7, 1);
101
    IntToStr(y_coord64_orig, txt);
102
    Glcd_Write_Text(txt, 90, 6, 1);
103
104
/*IntToStr(temp2, txt);
105
    Glcd_Write_Text(txt, 70, 1, 1);
106
107
108
109
    IntToStr(WatchDog, txt);
110
    //CopyConst2Ram(msg,Watchdog);               // Function used for text movin
111
    Glcd_Write_Text(txt, 70, 0, 1);*/
112
113
114
    //if BUTTON1 is selected
115
116
    if ((x_coord128 >= 10) && (x_coord128 <= 58) && (y_coord64 >= 21) && (y_coord64 <= 41)) {
117
         Glcd_Rectangle(8,19,60,43,0);
118
        if (gedruckt_BUTTON1 == 0) {
119
      if(PORTC.F6 == 0) {
120
        PORTC.F6 = 1;
121
        Glcd_Box(10,21,58,41,2);
122
        CopyConst2Ram(msg,msg7);               // Copy "RC6 ON " string to RAM
123
        Glcd_Write_Text(msg,14,4,0);
124
        CopyConst2Ram(msg,msg3);                     // Copy "BUTTON1" string to RAM
125
        Glcd_Write_Text(msg,14,3,0);
126
        gedruckt_BUTTON1 = 1;
127
128
      }
129
       else  {
130
        PORTC.F6 = 0;
131
        Glcd_Box(10,21,58,41,2);
132
        CopyConst2Ram(msg,msg5);               // Copy "RC6 OFF" string to RAM
133
        Glcd_Write_Text(msg,14,4,1);
134
        CopyConst2Ram(msg,msg3);                     // Copy "BUTTON1" string to RAM
135
        Glcd_Write_Text(msg,14,3,1);
136
        gedruckt_BUTTON1 = 1;
137
138
      }
139
      }
140
    }
141
    else {
142
        gedruckt_BUTTON1 = 0;
143
        Glcd_Rectangle(8,19,60,43,1);
144
        }
145
146
147
    //if BUTTON2 is selected
148
    if ((x_coord128 >= 70) && (x_coord128 <= 118) && (y_coord64 >= 21) && (y_coord64 <= 41)) {
149
      Glcd_Rectangle(68,19,120,43,0);
150
      if (gedruckt_BUTTON2 == 0) {
151
      if (PORTC.F7 == 0) {
152
        PORTC.F7 = 1;
153
        Glcd_Box(70,21,118,41,2);
154
        CopyConst2Ram(msg,msg4);                     // Copy "BUTTON2" string to RAM
155
        Glcd_Write_Text(msg,74,3,0);
156
        CopyConst2Ram(msg,msg8);               // Copy "RC7 ON " string to RAM
157
        Glcd_Write_Text(msg,74,4,0);
158
        gedruckt_BUTTON2 = 1;
159
      }
160
      else {
161
        PORTC.F7 = 0;
162
        Glcd_Box(70,21,118,41,2);
163
        CopyConst2Ram(msg,msg4);                     // Copy "BUTTON2" string to RAM
164
        Glcd_Write_Text(msg,74,3,1);
165
        CopyConst2Ram(msg,msg6);               // Copy "RC7 OFF" string to RAM
166
        Glcd_Write_Text(msg,74,4,1);
167
        gedruckt_BUTTON2 = 1;
168
      }
169
      }
170
      }
171
          else {
172
        gedruckt_BUTTON2 = 0;
173
        Glcd_Rectangle(68,19,120,43,1);
174
        }
175
176
    Delay_ms(50);
177
178
   }
179
}

von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


Lesenswert?

Karl heinz Buchegger schrieb:
> Überprüf mal, ob du beim Aufuf in main die () angegeben hast
>
>
1
> 
2
> int main()
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 :-)))

von Karl H. (kbuchegg)


Lesenswert?

Hermann U. schrieb:
> Karl heinz Buchegger schrieb:
>> Überprüf mal, ob du beim Aufuf in main die () angegeben hast
>>
>>
1
>>
2
>> int main()
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?

von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


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

nee geht immer noch nicht :(

von Karl H. (kbuchegg)


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:
>
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.

von Mandrake (Gast)


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

von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


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 :(
1
void Touchscreen_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
24
        Glcd_Write_Text("[  LINKS OBEN  ]",15,6,1);
25
26
27
        Glcd_H_Line(0, 6, 3, 1);
28
        Glcd_V_Line(0, 6, 3, 1);
29
30
31
32
 while (1) {
33
            // read X-Y and convert it to 128x64 space
34
       x_coord = GetX();
35
       y_coord = GetY();
36
        }
37
        }
38
39
       /*x_coord128_orig = ((x_coord * 128) / 1024);
40
       y_coord64_orig = 64 - ((y_coord *64) / 1024);
41
42
43
       if ((gedruckt_calib == 0) && (x_coord128_orig >= 0) && (x_coord128_orig <= 20) && (y_coord64_orig >= 0) && (y_coord64_orig <= 20))
44
          {
45
        gedruckt_calib ++;
46
        x_null = x_coord128_orig ;
47
        y_null = y_coord64_orig ;
48
49
        //CopyConst2Ram(msg,rechts_unten);                     // Copy "RECHTS UNTEN" string to RAM
50
        Glcd_Write_Text("RECHTS UNTEN",15,6,1);
51
52
        Glcd_Box(0,0,15,15,0);
53
54
        Glcd_H_Line(121, 127, 60, 1);
55
        Glcd_V_Line(57, 63, 124, 1);
56
        }
57
58
        if ((gedruckt_calib == 1) && (x_coord128_orig >= 100) && (x_coord128_orig <= 128) && (y_coord64_orig >= 50) && (y_coord64_orig <= 64))
59
          {
60
        gedruckt_calib ++;
61
        x_coord128_max = x_coord128_orig ;
62
        y_coord64_max = y_coord64_orig ;
63
64
        //CopyConst2Ram(msg,fertig);                       // Copy "FERTIG" string to RAM
65
        Glcd_Write_Text("FERTIG",15,6,1);
66
67
        Glcd_Box(120,57,127,63,0);
68
69
        x_factor =  (128 * 100) / x_coord128_max;
70
        y_factor =  (64 * 100) / y_coord64_max;
71
        }
72
73
        if (gedruckt_calib == 2)
74
          {
75
          INTCON.GIE = 0;
76
          EEPROM_Write(0x10, x_null);
77
          Delay_ms(20);
78
          EEPROM_Write(0x12, y_null);
79
          Delay_ms(20);
80
          EEPROM_Write(0x14, x_factor);
81
          Delay_ms(20);
82
          EEPROM_Write(0x16, y_factor);
83
          Delay_ms(20);
84
          EEPROM_Write(0x18, gedruckt_calib);
85
          INTCON.GIE = 1;
86
          Delay_ms(3000);
87
          Glcd_Fill(0);
88
          return;
89
          }
90
     }
91
92
 }*/



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

von Karl H. (kbuchegg)


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.

von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


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.

von STK500-Besitzer (Gast)


Lesenswert?

Aus der Schleife willst du gar nicht raus...

von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


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.

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.
1
void GetOrigCoord( int *x, int *y )
2
{
3
  x_coord = GetX();
4
  y_coord = GetY();
5
  *x = ((x_coord * 128) / 1024);
6
  *y = 64 - ((y_coord *64) / 1024);
7
}
8
9
void CalibrateLinksOben( void )
10
{
11
  Glcd_Write_Text("[  LINKS OBEN  ]",15,6,1);
12
13
  Glcd_H_Line(0, 6, 3, 1);
14
  Glcd_V_Line(0, 6, 3, 1);
15
16
  do {
17
    GetOrigCoord( &x_coord128_orig, &y_coord64_orig );
18
  } while( !( ( x_coord128_orig >= 0 ) && ( x_coord128_orig <= 20 ) &&
19
              ( y_coord64_orig  >= 0 ) && ( y_coord64_orig  <= 20 ) ) );
20
21
  x_null = x_coord128_orig ;
22
  y_null = y_coord64_orig ;
23
}
24
25
void CalibrateRechtsUnten( void )
26
{
27
  Glcd_Write_Text("RECHTS UNTEN",15,6,1);
28
29
  Glcd_Box(0,0,15,15,0);
30
  Glcd_H_Line(121, 127, 60, 1);
31
  Glcd_V_Line(57, 63, 124, 1);
32
33
  do {
34
    GetOrigCoord( &x_coord128_orig, &y_coord64_orig );
35
  } while( !( ( x_coord128_orig >= 100 ) && ( x_coord128_orig <= 128 ) &&
36
              ( y_coord64_orig  >=  50 ) && ( y_coord64_orig  <=  64 ) ) );
37
38
  x_coord128_max = x_coord128_orig ;
39
  y_coord64_max = y_coord64_orig ;
40
}
41
42
void Touchscreen_kalibrieren ()
43
{
44
  Glcd_Write_Text("Touchscreen",30,0,1);
45
  Glcd_Write_Text("KALIBRIERUNG",28,1,1);
46
  Glcd_Write_Text("Tippen Sie auf",22,3,1);
47
  Glcd_Write_Text("das Kreuz",35,4,1);
48
49
  CalibrateLinksOben();
50
51
  CalibrateRechtsUnten();
52
53
  Glcd_Write_Text("FERTIG",15,6,1);
54
  Glcd_Box(120,57,127,63,0);
55
56
  x_factor =  (128 * 100) / x_coord128_max;
57
  y_factor =  (64 * 100) / y_coord64_max;
58
59
  INTCON.GIE = 0;
60
  EEPROM_Write(0x10, x_null);
61
  Delay_ms(20);
62
  EEPROM_Write(0x12, y_null);
63
  Delay_ms(20);
64
  EEPROM_Write(0x14, x_factor);
65
  Delay_ms(20);
66
  EEPROM_Write(0x16, y_factor);
67
  Delay_ms(20);
68
  EEPROM_Write(0x18, gedruckt_calib);
69
  INTCON.GIE = 1;
70
  Delay_ms(3000);
71
  Glcd_Fill(0);
72
}

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.

von manateemoo (Gast)


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 ?

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.