Forum: Compiler & IDEs ET-TFT320240 Rev.3.2 Code in Modul und Header aufteilen


von Vorn N. (lufthackn)


Lesenswert?

Hallo zusammen,

ich möchte meinen Spaghetticode aufteilen und ein C&H-File für das
ET-TFT320240 Rev3.2 Touchdisplay erstellen um es später in Projekte zu 
includieren. Ich benutze AVR-GCC fürs Coden, das Display wird von einem 
Atmega2561 im 8Bit Modus gesteuert.

Verkauf:
http://www.steitec.net/Displays/TFT-240x320-Touch-3-2.html
Forum Threads:
Beitrag "LCD 240x320 color + touch screen module"

Der Code war auf der mitgelieferten CD drauf ...

Bisher hatte ich alles in einer grossen C-Datei aber so langsam wirds 
unüberschaubar. Die Reihenfolge des laufenden Codes ist genauso wie 
gepostet.
Die Datei inkl. WatchDog Erweiterungen sieht etwas gekürzt 
folgendermassen aus:
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <math.h>
4
#include <stdint.h>
5
#include <avr/io.h>
6
#include <compat/deprecated.h>
7
#include <avr/pgmspace.h>
8
#define F_CPU  8000000UL
9
#include <util/delay.h>
10
11
// für das Display nicht nötige Header-Files
12
#include <avr/wdt.h>
13
#include <avr/eeprom.h>
14
#include <avr/interrupt.h>
15
16
////////////////////////////////////////////////////////////////////////
17
// Watch Dog ausschalten und das Register MCUSR in mcusr_mirror sichern!
18
////////////////////////////////////////////////////////////////////////
19
uint8_t mcusr_mirror __attribute__ ((section(".noinit")));
20
void get_mcusr(void)__attribute__((naked))__attribute__((section(".init3")));
21
void get_mcusr(void)
22
    {
23
      mcusr_mirror = MCUSR;
24
      MCUSR = 0;
25
      wdt_disable();
26
    }
27
////////////////////////////////////////////////////////////////////////
28
29
30
31
/////////////////////////////////////////////////////////////////////////
32
// Ascii Font
33
/////////////////////////////////////////////////////////////////////////
34
prog_char ascii_6x8[95][6]=
35
  {
36
   {0x00,0x00,0x00,0x00,0x00,0x00}, // 0x20 space
37
   {0x00,0x00,0x00,0x5f,0x00,0x00}, // 0x21 !
38
//  ...
39
   {0x00,0x02,0x01,0x02,0x04,0x02}  // 0x7e ~
40
  };
41
42
43
44
//////////////////////////////////////////////////////////////////////////
45
// Farben
46
//////////////////////////////////////////////////////////////////////////
47
#define no_bg      0x0001 // No Color Back Ground
48
#define BGnd_Farbe 0x0000 // Screen Hintergrund
49
#define Weiss      0xFFFF // Weiss
50
#define Schwarz    0x0000 //Schwarz
51
52
53
////////////////////////////////////////////////////////////
54
// Display Funktionen für das "ET-TFT240320TP-3.2Rev.B" GLCD
55
////////////////////////////////////////////////////////////
56
57
// Valiable for Touch Screen Function GLCD
58
long dif_adc_X,dif_adc_Y          ;
59
long buf_adc_X[100],buf_adc_Y[100];
60
long ave_adc_X,ave_adc_Y          ;
61
long tcs_ave_X[3]                 ;
62
long tcs_ave_Y[3]                 ;
63
long dis_XD[3] = {24,215,120}     ;
64
long dis_YD[3] = {32,160,287}     ;
65
long divider,An,Bn,Cn,Dn,En,Fn,X,Y;
66
67
// Touch Screen SPI Treiber (ADS7846)
68
void tcs_sck_hi(void)           ;
69
void tcs_sck_lo(void)           ;
70
void tcs_cs_hi(void)            ;
71
void tcs_cs_lo(void)            ;
72
void tcs_sdo_hi(void)           ;
73
void tcs_sdo_lo(void)           ;
74
void tcs_busy(void)             ;
75
uint8_t status_touch(void)      ;
76
uint8_t tcs_wr(uint8_t DataByte);
77
void tcs_read(void)             ;
78
void ave_x_y(uint8_t num)       ;
79
80
void touch_calibrate(void)      ;
81
void set_matrix(void)           ;
82
void get_point(uint8_t num)     ;
83
84
// Function Control Graphic LCD ET-TFT240320TP-3.2 REV.B (Driver SPFD5408A)
85
void gp_cs_hi(void)          ;
86
void gp_cs_lo(void)          ;
87
void gp_rs_hi(void)          ;
88
void gp_rs_lo(void)          ;
89
void gp_wr_hi(void)          ;
90
void gp_wr_lo(void)          ;
91
void gp_rd_hi(void)          ;
92
void gp_rd_lo(void)          ;
93
void gp_res_hi(void)         ;
94
void gp_res_lo(void)         ;
95
void gp_bl_on(void)          ;
96
void gp_bl_off(void)         ;
97
void gp_wr_cmm(uint8_t cmm)  ;
98
void gp_wr_data(uint16_t dw) ;
99
void init_glcd(void)         ;
100
101
// Function Application of GLCD
102
void bg_color(unsigned int bg_color);
103
void plot_mark(uint8_t x1,uint16_t y1,uint8_t x2,uint16_t y2,uint16_color);
104
void lcd_Ascii(uint8_t row,uint8_t font,uint8_t x,uint16_t y,uint16_t fg_clr,uint16_t bg_clr);
105
void print_Str(char *str,uint8_t font,uint8_t sx,uint16_t sy,uint16_t fg_color,uint16_t bg_color);
106
void print_Zahl(uint16_t zahl,uint8_t ziffern,uint8_t font,uint8_t x,uint16_t y,uint16_t farbe, uint16_t bgfarbe);
107
void print_Arr(char *array,uint8_t font,uint8_t x,uint16_t y,uint16_t fg_color,uint16_t bg_color);
108
109
void plot_dot(uint8_t dx,uint16_t dy,uint16_t color);
110
void Line(uint8_t lx1,uint16_t ly1,uint8_t lx2,uint16_t ly2,uint8_t line_type,uint16_t color);
111
void Circle(uint8_t cx,uint16_t cy,uint8_t Radius,uint8_t tick,uint16_t color,uint8_t fill);
112
void Ellipse(uint16_t h,uint16_t k,long rx,long ry,uint8_t tick,uint16_t color,uint8_t fill);
113
void Rectan(uint8_t x1,uint16_t y1,uint8_t x2,uint16_t y2,uint8_t tick,uint16_t color,uint8_t fill);

die Funktionen delay_ms weiss ich nicht wo/wie ich es auslagern soll:
macht irgendwie nur probleme;
../TFT.c:56: warning: implicit declaration of function '_delay_ms'


1
// Ports für das GLCD einstellen
2
3
// Function Initial Port
4
void init_port(void)
5
  { DDRF  = 0xFF ;
6
    DDRE |= 0xFC ;
7
    DDRD  = 0x98 ;
8
// Set Value Default Port
9
    PORTF = 0    ;
10
    PORTE = 0x7C ;
11
    PORTD = 0x80 ;
12
  }
13
14
// Delay Funktion ms
15
void delay_ms(uint16_t cnt){for(;cnt>0;cnt--)_delay_ms(1);}

Jetzt kommen ein paar angefügte Strukturen und dann die Main;
1
////////////////////////////////////////////////////////////////
2
// EEPROM Struktur;
3
////////////////////////////////////////////////////////////////
4
typedef struct
5
{ // GLCD Touch Kalibrierungs Daten (28 Byte)
6
  struct
7
  { int32_t Divider    ;
8
    int32_t An         ;
9
    int32_t Bn         ;
10
    int32_t Cn         ;
11
    int32_t Dn         ;
12
    int32_t En         ;
13
    int32_t Fn         ;
14
  } TouKal             ;
15
} Speicherdaten        ;
16
Speicherdaten RAM_Data;       // RAM_Daten ist eine Struktur im RAM
17
Speicherdaten EEP_Data EEMEM; // EEP_Daten ist eine Struktur im EEPROM
18
19
20
21
////////////////////////////////////////////////////////////////////
22
//  Globale Variablen für das Menü in einer Struktur
23
////////////////////////////////////////////////////////////////////
24
typedef struct
25
{ // Menü Struktur
26
  uint16_t Wert    ;
27
  uint16_t TextF   ;
28
  uint16_t TextR   ;
29
  uint16_t TextG   ;
30
  uint16_t BackF   ;
31
  uint16_t HellF   ;
32
  uint16_t DunkF   ;
33
  uint16_t Sub_F   ;
34
  uint16_t Btn_H1  ;
35
  uint16_t Btn_H2  ;
36
  uint16_t Btn_H3  ;
37
  uint8_t  Btn_B1  ;
38
  uint8_t  Btn_B2  ;
39
  uint8_t  Fenster ;
40
  uint8_t  Feld    ;
41
42
  struct
43
    {
44
   uint16_t Y;
45
   uint16_t H;
46
  struct
47
    { char Menu  :4;
48
    }       ;
49
    }Leiste     ;
50
} Menu_struct ; Menu_struct Menu;
51
52
53
54
55
//#######################################################################
56
// MAIN PROGRAM 
57
#########################################################################
58
int main(void)
59
  {
60
  }
61
#########################################################################


jetzt kommen die ganzen Display Funktionen die ich nicht extra alle 
posten möchte:

1
/////////////////////////////////////////////////////////////////////////
2
// Unterprogramme - 
3
/////////////////////////////////////////////////////////////////////////
4
// Function Control of Graphic LCD EL-TFT240320TP-3.2 REV.B(Driver SPFD5408S)
5
6
// ******* ControlPin cs (PE2=CS) ********
7
void gp_cs_hi(void) {sbi(PORTE,2) ;} // PE2 = Hi
8
void gp_cs_lo(void) {cbi(PORTE,2) ;} // PE2 = Lo
9
10
// ******* ControlPin rs (PE3=RS) ********
11
void gp_rs_hi(void) {sbi(PORTE,3) ;} // PE3 = Hi
12
void gp_rs_lo(void) {cbi(PORTE,3) ;} // PE3 = Lo
13
14
// ******* ControlPin wr (PE4=WR) ********
15
void gp_wr_hi(void) {sbi(PORTE,4) ;} // PE4 = Hi
16
void gp_wr_lo(void) {cbi(PORTE,4) ;} // PE4 = Lo
17
18
// ******* ControlPin rd (PE5=RD) ********
19
void gp_rd_hi(void) {sbi(PORTE,5) ;} // PE5 = Hi
20
void gp_rd_lo(void) {cbi(PORTE,5) ;} // PE5 = Lo
21
22
// ******* ControlPin res(PE6=RES) *******
23
void gp_res_hi(void) {sbi(PORTE,6);} // PE6 = Hi
24
void gp_res_lo(void) {cbi(PORTE,6);} // PE6 = Lo
25
26
// ******* Control BackLight(PE7=Back Light) *******
27
void gp_bl_on (void){sbi(PORTE,7) ;} // PE7 = Hi(ON)
28
void gp_bl_off(void){cbi(PORTE,7) ;} // PE7 = Lo(OFF)

Ich habe jetzt mal angefangen auszulagern:
- Die ganzen Display Funktionen (Unterprogramme) in eine TFT.c Datei
- Die Funktionsprototypen, Farb Defines in eine TFT.h Datei
- Den Font in eine Font.c Datei inkl #include <avr/pgmspace.h> Header
der Font wird dann vermutlich in die TFT.c oder TFT.h Datei includiert.


Leider meckert mir der Compiler bei der EEPROM Struktur die sich jetzt 
in der Main.h befindet.-für so einen lufthackn wie mich völlig 
unverständlich:
../Main.h:164: error: expected '=', ',', ';', 'asm' or '__attribute__' 
before 'EEMEM'

dazu noch die Warnungen:
../TFT.c:56: warning: implicit declaration of function '_delay_ms'
../Main.c:152: warning: implicit declaration of function 'delay_ms'
../Main.c:206: warning: implicit declaration of function 'init_port'

Vlt kann mir jemand ein Tip geben wie die Delay_ms & Init_port Funktion 
ausgelagert werden muss. Ich wollt sie in das TFT.c oder TFT.h file 
kopieren. -beides geht irgendwie nich so auf Anhieb.
Grundsätzlich steh ich grad wie der Ochs vorm Berg und wäre wirklich 
dankbar für einen Schubser in die richtige Richtung.
Axxo: C-Skill =NOOB, hab auch grad kein Geld fürn C-Buch^^



Vielen Dank im Vorraus
lufthackn

von Klaus W. (mfgkw)


Lesenswert?

Vorn Nachn schrieb:
> Axxo: C-Skill =NOOB, hab auch grad kein Geld fürn C-Buch^^

Faule Ausrede für nicht lernen wollen; das gibt es auch alles im 
Internet.

Vorn Nachn schrieb:
> Leider meckert mir der Compiler bei der EEPROM Struktur die sich jetzt
> in der Main.h befindet.-für so einen lufthackn wie mich völlig
> unverständlich:
> ../Main.h:164: error: expected '=', ',', ';', 'asm' or '__attribute__'
> before 'EEMEM'
>
> dazu noch die Warnungen:
> ../TFT.c:56: warning: implicit declaration of function '_delay_ms'
> ../Main.c:152: warning: implicit declaration of function 'delay_ms'
> ../Main.c:206: warning: implicit declaration of function 'init_port'

Da fehlen dir halt in Main.h noch die #include für EEMEM und _delay...



Und sonst: http://www.wachtler.de/ck/16_Aufteilung_mehrere_Quell.html

von Vorn N. (lufthackn)


Lesenswert?

hallo,

vielen dank für die lehrreiche seite herr wachtler.
es läuft endlich und die lösung war so einfach...
da hätt ich mir auch das posten des codes echt sparen können. - lol

lufthackn

von Karl H. (kbuchegg)


Lesenswert?

Vorn Nachn schrieb:
> hallo,
>
> vielen dank für die lehrreiche seite herr wachtler.
> es läuft endlich und die lösung war so einfach...
> da hätt ich mir auch das posten des codes echt sparen können. - lol

Häng mal deine c und h Files als Attachment an.
Da sind sicher noch einige Unsauberkeiten übrig geblieben.

Ehe du das postest, geh noch mal dein h-File durch und überleg bei jedem 
einzelnen Teil: Muss jemand, der dieses Modul benutzt, diese Information 
wirklich wissen? Speziell bei Variablen ist es der falsche Weg, einfach 
alle Variablen ins Header File zu packen. Ganz im Gegenteil, die meisten 
werden als static Variablen im C File landen. Genauso wie einige 
Hilfsfunktionen nicht im Header File auftauchen werden, sondern als 
static Funktionen im C-File residieren werden.

von Vorn N. (lufthackn)



Lesenswert?

Hallo,

CPU Frequenz Header Datei;
kann man eigentlich auch den Chip in einer Header einstellen?
-dann müsst ich nicht in den Projekt-Optionen den Chip manuell 
einstellen.
"f_cpu.h" Datei;
1
#ifndef F_CPU_H
2
#define F_CPU_H
3
4
#define F_CPU 8000000UL // ATMEGA2561 @ 8Mhz intern
5
6
#endif


Die Header Datei für das main modul,
"main.h" Datei;
1
#ifndef MAIN_H
2
#define MAIN_H
3
4
#define extern
5
#include "f_cpu.h"
6
#undef extern
7
8
#endif


In der Main wird die 3 Stufige Kalibrierung aufgerufen.
Anschliesend gibts ne Font Demo und ein Zeichenfeld zum Checken der 
Kalibrierungsdaten. Ich nutze das Display über einen 8Bit Port 
Interface, auf der mitgelieferten CD gibts auch Anschlussdiagramme für 
SPI oder 16Bit.
"main.c" Datei:
1
/**************************************************************************
2
 Datei Name           : main.c
3
 Editor               : AVR Studio 4.18 Build 700
4
 Compiler             : WinAVR-20100110
5
 **************************************************************************
6
 MCU                  : ATMEL AVR-MEGA2561
7
 - Ex.Quarz           : -
8
   intern             : 8Mhz
9
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10
 Touch Display        : "ET-TFT240320TP3.2Rev.b": Port Interface 8Bit: Display Format Hochkant
11
 - Data GLCD          : PF[0..7]         Connect: DB8..DB15
12
 - Control GLCD       : PE2              Connect: CS-H
13
 -                    : PE3              Connect: RS-H(0=cmm,1=data)
14
 -                    : PE4              Connect: WR-H(Write)
15
 -                    : PE5              Connect: RD-H(Read)
16
 -                    : PE6              Connect: RES-H(Reset)
17
 - Back Light GLCD    : PE7              Connect: BL-H(LCD-Back Light(Active=1))
18
 - Touch Screen       : PD2 (MISO-in)    Connect: MISO
19
 -                    : PD3 (MOSI-out)   Connect: MOSI
20
 -                    : PD4 (SCLK-out)   Connect: SCLK
21
 -                    : PD5 (BUSY-in)    Connect: BUSY(No_USE)
22
 -                    : PD6 (PEN-in)     Connect: PEN
23
 -                    : PD7 (TC_CS-out)  Connect: TC_CS
24
 - UART0:BaudRate=9600: PE0 = RXD0
25
 -                    : PE1 = TXD0
26
 *************************************************************************/
27
28
#define extern
29
#include "f_cpu.h"
30
#include "main.h"
31
#include "ettft240320tp3_2_rev_b.h" // Touch Display
32
#undef extern
33
34
// interne Header
35
#include <stdint.h>
36
#include <util/delay.h>
37
38
39
/**************************************************************************
40
           MAIN PROGRAM
41
 *************************************************************************/
42
int main(void)
43
  {
44
   init_port();       // GLCD Ports ini
45
   init_glcd();        // GLCD ini
46
47
   touch_calibrate();
48
   bg_color(Black);
49
   print_Str("  <Touch Screen Calibration>  ",2,0, 20,Green, Black);
50
   print_Str("           Succeeded!         ",2,0,50, Green, Black);
51
   print_Str("     -Tap Screen for exit-    ",2,0,100,White, Black);
52
   while(!status_touch()){;}  
53
   bg_color(Black);
54
55
   // Font Beispiele
56
   print_Str("          Font1 mit 6x8 Pixeln          ",1,0, 20, Green, Black);
57
   print_Str("Im Hochkantbetrieb max.40 Zeichen/ Zeile",1,0, 35, Green, Black);
58
   print_Str("     Font2 mit 7x11 Pixeln    ",2,0, 60, Green, Black);
59
   print_Str("Hochkantbetrieb30Zeichen/Zeile",2,0, 80, Green, Black);
60
61
   // Zeichenfeld für den Kalibrierungs Test
62
   Rectan(8,145,233,311,1, White,0);
63
   
64
   // Kalibrierungs Test
65
   while(1)
66
   {
67
     if(status_touch()){get_point(20);} // TouchAbfrage Rückgabewert X,Y
68
     if((Y<=310)&&(Y>=146)&&(X<=232)&&(X>=9)) // Zeichenfeld berührt?
69
               {
70
              plot_dot(X,  Y,  White); // Fadenkreuz
71
                plot_dot(X-1,Y,  White);
72
                plot_dot(X+1,Y,  White);
73
               plot_dot(X,  Y+1,White);
74
               plot_dot(X,  Y-1,White);
75
                }
76
     }
77
  }
78
/****************************************************************************/

Das Display Modul "ettft240320tp3_2_rev_b.c"
und die 2 Header Dateien dafür lade ich als Anhang hoch.

thx & grüsse

von Vorn N. (lufthackn)


Lesenswert?

Hab die f_cpu.h ausversehen nochmal mit hochgeladen;
Also die Projekt Dateien sind:

Source Files;
main.c
ettft240320tp3_2_rev_b.c

Header Files;
main.h
f_cpu.h
ettft240320tp3_2_rev_b.h
ettft240320tp3_2_rev_b_font.h

Bei gleicher Beschaltung muss nur noch die f_cpu an den Chip Takt 
angepasst werden. Deshalb auch die Frage ob ich in dieser Header gleich 
den Chip einstellen kann. Das wär saupraktisch., dann würd ich die in 
cpu.h umbenennen.

grüße

von Klaus W. (mfgkw)


Lesenswert?

Vorn Nachn schrieb:
> Deshalb auch die Frage ob ich in dieser Header gleich
> den Chip einstellen kann.

nein, weil der gcc per -m...-Aufruf den Controller wissen muß,
um den richtigen Code zu erzeugen.

Meines Wissen gibt es keine Möglichkeit, das im Quelltext zu
verdrahten.

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.