mikrocontroller.net

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


Autor: Vorn Nachn (lufthackn)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdint.h>
#include <avr/io.h>
#include <compat/deprecated.h>
#include <avr/pgmspace.h>
#define F_CPU  8000000UL
#include <util/delay.h>

// für das Display nicht nötige Header-Files
#include <avr/wdt.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>

////////////////////////////////////////////////////////////////////////
// Watch Dog ausschalten und das Register MCUSR in mcusr_mirror sichern!
////////////////////////////////////////////////////////////////////////
uint8_t mcusr_mirror __attribute__ ((section(".noinit")));
void get_mcusr(void)__attribute__((naked))__attribute__((section(".init3")));
void get_mcusr(void)
    {
      mcusr_mirror = MCUSR;
      MCUSR = 0;
      wdt_disable();
    }
////////////////////////////////////////////////////////////////////////



/////////////////////////////////////////////////////////////////////////
// Ascii Font
/////////////////////////////////////////////////////////////////////////
prog_char ascii_6x8[95][6]=
  {
   {0x00,0x00,0x00,0x00,0x00,0x00}, // 0x20 space
   {0x00,0x00,0x00,0x5f,0x00,0x00}, // 0x21 !
//  ...
   {0x00,0x02,0x01,0x02,0x04,0x02}  // 0x7e ~
  };



//////////////////////////////////////////////////////////////////////////
// Farben
//////////////////////////////////////////////////////////////////////////
#define no_bg      0x0001 // No Color Back Ground
#define BGnd_Farbe 0x0000 // Screen Hintergrund
#define Weiss      0xFFFF // Weiss
#define Schwarz    0x0000 //Schwarz


////////////////////////////////////////////////////////////
// Display Funktionen für das "ET-TFT240320TP-3.2Rev.B" GLCD
////////////////////////////////////////////////////////////

// Valiable for Touch Screen Function GLCD
long dif_adc_X,dif_adc_Y          ;
long buf_adc_X[100],buf_adc_Y[100];
long ave_adc_X,ave_adc_Y          ;
long tcs_ave_X[3]                 ;
long tcs_ave_Y[3]                 ;
long dis_XD[3] = {24,215,120}     ;
long dis_YD[3] = {32,160,287}     ;
long divider,An,Bn,Cn,Dn,En,Fn,X,Y;

// Touch Screen SPI Treiber (ADS7846)
void tcs_sck_hi(void)           ;
void tcs_sck_lo(void)           ;
void tcs_cs_hi(void)            ;
void tcs_cs_lo(void)            ;
void tcs_sdo_hi(void)           ;
void tcs_sdo_lo(void)           ;
void tcs_busy(void)             ;
uint8_t status_touch(void)      ;
uint8_t tcs_wr(uint8_t DataByte);
void tcs_read(void)             ;
void ave_x_y(uint8_t num)       ;

void touch_calibrate(void)      ;
void set_matrix(void)           ;
void get_point(uint8_t num)     ;

// Function Control Graphic LCD ET-TFT240320TP-3.2 REV.B (Driver SPFD5408A)
void gp_cs_hi(void)          ;
void gp_cs_lo(void)          ;
void gp_rs_hi(void)          ;
void gp_rs_lo(void)          ;
void gp_wr_hi(void)          ;
void gp_wr_lo(void)          ;
void gp_rd_hi(void)          ;
void gp_rd_lo(void)          ;
void gp_res_hi(void)         ;
void gp_res_lo(void)         ;
void gp_bl_on(void)          ;
void gp_bl_off(void)         ;
void gp_wr_cmm(uint8_t cmm)  ;
void gp_wr_data(uint16_t dw) ;
void init_glcd(void)         ;

// Function Application of GLCD
void bg_color(unsigned int bg_color);
void plot_mark(uint8_t x1,uint16_t y1,uint8_t x2,uint16_t y2,uint16_color);
void lcd_Ascii(uint8_t row,uint8_t font,uint8_t x,uint16_t y,uint16_t fg_clr,uint16_t bg_clr);
void print_Str(char *str,uint8_t font,uint8_t sx,uint16_t sy,uint16_t fg_color,uint16_t bg_color);
void print_Zahl(uint16_t zahl,uint8_t ziffern,uint8_t font,uint8_t x,uint16_t y,uint16_t farbe, uint16_t bgfarbe);
void print_Arr(char *array,uint8_t font,uint8_t x,uint16_t y,uint16_t fg_color,uint16_t bg_color);

void plot_dot(uint8_t dx,uint16_t dy,uint16_t color);
void Line(uint8_t lx1,uint16_t ly1,uint8_t lx2,uint16_t ly2,uint8_t line_type,uint16_t color);
void Circle(uint8_t cx,uint16_t cy,uint8_t Radius,uint8_t tick,uint16_t color,uint8_t fill);
void Ellipse(uint16_t h,uint16_t k,long rx,long ry,uint8_t tick,uint16_t color,uint8_t fill);
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'


// Ports für das GLCD einstellen

// Function Initial Port
void init_port(void)
  { DDRF  = 0xFF ;
    DDRE |= 0xFC ;
    DDRD  = 0x98 ;
// Set Value Default Port
    PORTF = 0    ;
    PORTE = 0x7C ;
    PORTD = 0x80 ;
  }

// Delay Funktion ms
void delay_ms(uint16_t cnt){for(;cnt>0;cnt--)_delay_ms(1);}

Jetzt kommen ein paar angefügte Strukturen und dann die Main;
////////////////////////////////////////////////////////////////
// EEPROM Struktur;
////////////////////////////////////////////////////////////////
typedef struct
{ // GLCD Touch Kalibrierungs Daten (28 Byte)
  struct
  { int32_t Divider    ;
    int32_t An         ;
    int32_t Bn         ;
    int32_t Cn         ;
    int32_t Dn         ;
    int32_t En         ;
    int32_t Fn         ;
  } TouKal             ;
} Speicherdaten        ;
Speicherdaten RAM_Data;       // RAM_Daten ist eine Struktur im RAM
Speicherdaten EEP_Data EEMEM; // EEP_Daten ist eine Struktur im EEPROM



////////////////////////////////////////////////////////////////////
//  Globale Variablen für das Menü in einer Struktur
////////////////////////////////////////////////////////////////////
typedef struct
{ // Menü Struktur
  uint16_t Wert    ;
  uint16_t TextF   ;
  uint16_t TextR   ;
  uint16_t TextG   ;
  uint16_t BackF   ;
  uint16_t HellF   ;
  uint16_t DunkF   ;
  uint16_t Sub_F   ;
  uint16_t Btn_H1  ;
  uint16_t Btn_H2  ;
  uint16_t Btn_H3  ;
  uint8_t  Btn_B1  ;
  uint8_t  Btn_B2  ;
  uint8_t  Fenster ;
  uint8_t  Feld    ;

  struct
    {
   uint16_t Y;
   uint16_t H;
  struct
    { char Menu  :4;
    }       ;
    }Leiste     ;
} Menu_struct ; Menu_struct Menu;




//#######################################################################
// MAIN PROGRAM 
#########################################################################
int main(void)
  {
  }
#########################################################################


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

/////////////////////////////////////////////////////////////////////////
// Unterprogramme - 
/////////////////////////////////////////////////////////////////////////
// Function Control of Graphic LCD EL-TFT240320TP-3.2 REV.B(Driver SPFD5408S)

// ******* ControlPin cs (PE2=CS) ********
void gp_cs_hi(void) {sbi(PORTE,2) ;} // PE2 = Hi
void gp_cs_lo(void) {cbi(PORTE,2) ;} // PE2 = Lo

// ******* ControlPin rs (PE3=RS) ********
void gp_rs_hi(void) {sbi(PORTE,3) ;} // PE3 = Hi
void gp_rs_lo(void) {cbi(PORTE,3) ;} // PE3 = Lo

// ******* ControlPin wr (PE4=WR) ********
void gp_wr_hi(void) {sbi(PORTE,4) ;} // PE4 = Hi
void gp_wr_lo(void) {cbi(PORTE,4) ;} // PE4 = Lo

// ******* ControlPin rd (PE5=RD) ********
void gp_rd_hi(void) {sbi(PORTE,5) ;} // PE5 = Hi
void gp_rd_lo(void) {cbi(PORTE,5) ;} // PE5 = Lo

// ******* ControlPin res(PE6=RES) *******
void gp_res_hi(void) {sbi(PORTE,6);} // PE6 = Hi
void gp_res_lo(void) {cbi(PORTE,6);} // PE6 = Lo

// ******* Control BackLight(PE7=Back Light) *******
void gp_bl_on (void){sbi(PORTE,7) ;} // PE7 = Hi(ON)
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

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Vorn Nachn (lufthackn)
Datum:

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

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

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

Autor: Vorn Nachn (lufthackn)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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;
#ifndef F_CPU_H
#define F_CPU_H

#define F_CPU 8000000UL // ATMEGA2561 @ 8Mhz intern

#endif


Die Header Datei für das main modul,
"main.h" Datei;
#ifndef MAIN_H
#define MAIN_H

#define extern
#include "f_cpu.h"
#undef extern

#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:
/**************************************************************************
 Datei Name           : main.c
 Editor               : AVR Studio 4.18 Build 700
 Compiler             : WinAVR-20100110
 **************************************************************************
 MCU                  : ATMEL AVR-MEGA2561
 - Ex.Quarz           : -
   intern             : 8Mhz
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Touch Display        : "ET-TFT240320TP3.2Rev.b": Port Interface 8Bit: Display Format Hochkant
 - Data GLCD          : PF[0..7]         Connect: DB8..DB15
 - Control GLCD       : PE2              Connect: CS-H
 -                    : PE3              Connect: RS-H(0=cmm,1=data)
 -                    : PE4              Connect: WR-H(Write)
 -                    : PE5              Connect: RD-H(Read)
 -                    : PE6              Connect: RES-H(Reset)
 - Back Light GLCD    : PE7              Connect: BL-H(LCD-Back Light(Active=1))
 - Touch Screen       : PD2 (MISO-in)    Connect: MISO
 -                    : PD3 (MOSI-out)   Connect: MOSI
 -                    : PD4 (SCLK-out)   Connect: SCLK
 -                    : PD5 (BUSY-in)    Connect: BUSY(No_USE)
 -                    : PD6 (PEN-in)     Connect: PEN
 -                    : PD7 (TC_CS-out)  Connect: TC_CS
 - UART0:BaudRate=9600: PE0 = RXD0
 -                    : PE1 = TXD0
 *************************************************************************/

#define extern
#include "f_cpu.h"
#include "main.h"
#include "ettft240320tp3_2_rev_b.h" // Touch Display
#undef extern

// interne Header
#include <stdint.h>
#include <util/delay.h>


/**************************************************************************
           MAIN PROGRAM
 *************************************************************************/
int main(void)
  {
   init_port();       // GLCD Ports ini
   init_glcd();        // GLCD ini

   touch_calibrate();
   bg_color(Black);
   print_Str("  <Touch Screen Calibration>  ",2,0, 20,Green, Black);
   print_Str("           Succeeded!         ",2,0,50, Green, Black);
   print_Str("     -Tap Screen for exit-    ",2,0,100,White, Black);
   while(!status_touch()){;}  
   bg_color(Black);

   // Font Beispiele
   print_Str("          Font1 mit 6x8 Pixeln          ",1,0, 20, Green, Black);
   print_Str("Im Hochkantbetrieb max.40 Zeichen/ Zeile",1,0, 35, Green, Black);
   print_Str("     Font2 mit 7x11 Pixeln    ",2,0, 60, Green, Black);
   print_Str("Hochkantbetrieb30Zeichen/Zeile",2,0, 80, Green, Black);

   // Zeichenfeld für den Kalibrierungs Test
   Rectan(8,145,233,311,1, White,0);
   
   // Kalibrierungs Test
   while(1)
   {
     if(status_touch()){get_point(20);} // TouchAbfrage Rückgabewert X,Y
     if((Y<=310)&&(Y>=146)&&(X<=232)&&(X>=9)) // Zeichenfeld berührt?
               {
              plot_dot(X,  Y,  White); // Fadenkreuz
                plot_dot(X-1,Y,  White);
                plot_dot(X+1,Y,  White);
               plot_dot(X,  Y+1,White);
               plot_dot(X,  Y-1,White);
                }
     }
  }
/****************************************************************************/

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

thx & grüsse

Autor: Vorn Nachn (lufthackn)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

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

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.