Forum: Compiler & IDEs ET-TFT320240 Rev.3.2 Code in Modul und Header aufteilen
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
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
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
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.
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
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
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.
|