Forum: Mikrocontroller und Digitale Elektronik ili-tft startsequenz


von grundschüler (Gast)


Lesenswert?

bin am code-aufräumen. Meine ili-init läuft, aber nur wenn der reset-pin 
aktiviert wird. Wenn ich nur Spannung anlege, bleibt der tft hell:
1
void lcd_init(void)
2
{
3
sbi(DDR(ll_cs_port),ll_cs_pin);
4
ll_cs_high;
5
6
lcd_spi_init();
7
8
//  DeviceCode = LCD_ReadReg(0x0000);    /* Read ID  */  
9
  /* Different driver IC initialization*/
10
//  if( DeviceCode == 0x9320 || DeviceCode == 0x9300 )
11
//  {
12
    lcd_write_reg(0x00,0x0000);
13
    lcd_write_reg(0x01,0x0100); /* Driver Output Contral */
14
    lcd_write_reg(0x02,0x0700); /* LCD Driver Waveform Contral */
15
16
#if ( DISP_ORIENTATION == 0 )//0° grad
17
    lcd_write_reg(0x0003,(1<<12) );   /* importance */
18
#endif
19
#if ( DISP_ORIENTATION == 1 )//90°
20
    lcd_write_reg(0x0003,(1<<12)|(1<<5)|(1<<3) );   /* importance */
21
#endif
22
#if ( DISP_ORIENTATION == 2 )//180°
23
    lcd_write_reg(0x0003,(1<<12)|(1<<4)|(1<<5) );   /* importance */
24
#endif
25
#if ( DISP_ORIENTATION == 3 )//270°
26
    lcd_write_reg(0x0003,(1<<12)|(1<<4)|(1<<3) );   /* importance */
27
#endif
28
    lcd_write_reg(0x04,0x0000); /* Scalling Contral */
29
    lcd_write_reg(0x08,0x0202); /* Display Contral 2 */
30
    lcd_write_reg(0x09,0x0000); /* Display Contral 3 */
31
    lcd_write_reg(0x0a,0x0000); /* Frame Cycle Contal */
32
    lcd_write_reg(0x0c,(1<<0)); /* Extern Display Interface Contral 1 */
33
    lcd_write_reg(0x0d,0x0000); /* Frame Maker Position */
34
    lcd_write_reg(0x0f,0x0000); /* Extern Display Interface Contral 2 */     
35
    _delay_ms(50); 
36
    lcd_write_reg(0x07,0x0101); /* Display Contral */
37
    _delay_ms(50);    
38
    lcd_write_reg(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4)); /* Power Control 1 */
39
    lcd_write_reg(0x11,0x0007);                              /* Power Control 2 */
40
    lcd_write_reg(0x12,(1<<8)|(1<<4)|(0<<0));                /* Power Control 3 */
41
    lcd_write_reg(0x13,0x0b00);                              /* Power Control 4 */
42
    lcd_write_reg(0x29,0x0000);                              /* Power Control 7 */
43
    lcd_write_reg(0x2b,(1<<14)|(1<<4)); 
44
  
45
    lcd_write_reg(0x50,0);       /* Set X Start */
46
    lcd_write_reg(0x51,239);      /* Set X End */
47
    lcd_write_reg(0x52,0);      /* Set Y Start */
48
    lcd_write_reg(0x53,319);      /* Set Y End */
49
  _delay_ms(50);
50
    lcd_write_reg(0x60,0x2700); /* Driver Output Control */
51
    lcd_write_reg(0x61,0x0001); /* Driver Output Control */
52
    lcd_write_reg(0x6a,0x0000); /* Vertical Srcoll Control */
53
    
54
    lcd_write_reg(0x80,0x0000); /* Display Position? Partial Display 1 */
55
    lcd_write_reg(0x81,0x0000); /* RAM Address Start? Partial Display 1 */
56
    lcd_write_reg(0x82,0x0000); /* RAM Address End-Partial Display 1 */
57
    lcd_write_reg(0x83,0x0000); /* Displsy Position? Partial Display 2 */
58
    lcd_write_reg(0x84,0x0000); /* RAM Address Start? Partial Display 2 */
59
    lcd_write_reg(0x85,0x0000); /* RAM Address End? Partial Display 2 */
60
    
61
    lcd_write_reg(0x90,(0<<7)|(16<<0)); /* Frame Cycle Contral */
62
    lcd_write_reg(0x92,0x0000);         /* Panel Interface Contral 2 */
63
    lcd_write_reg(0x93,0x0001);         /* Panel Interface Contral 3 */
64
    lcd_write_reg(0x95,0x0110);         /* Frame Cycle Contral */
65
    lcd_write_reg(0x97,(0<<8)); 
66
    lcd_write_reg(0x98,0x0000);         /* Frame Cycle Contral */    
67
    lcd_write_reg(0x07,0x0133); 
68
//  }    
69
    _delay_ms(100);   /* delay 50 ms */    
70
}


wenn ich einen zusätzlichen sw_rst versuche, klappt es manchmal, aber 
auch nicht zuverlässig:
1
    lcd_write_reg(0x00,0x0000);//software reset
2
    lcd_write_reg(0x01,0x0100); /* Driver Output Contral */
3
    lcd_write_reg(0x02,0x0700); /* LCD Driver Waveform Contral */
4
_delay_ms(100);
5
    lcd_write_reg(0x00,0x0000);
6
    lcd_write_reg(0x01,0x0100); /* Driver Output Contral */
7
    lcd_write_reg(0x02,0x0700); /* LCD Driver Waveform Contral 
8
*/
9
....

jemand eine Idee?

von G. H. (schufti)


Lesenswert?

warum sollte das auch funktionieren?
Wesshalb, denkst du, haben die Chiphersteller einen reset-Pin 
vorgesehen?
Entweder verbindest du den RST mit RST vom System oder du improvisierst 
mit Pull-up/down und kleinem C ein power-on Reset.

von Johannes S. (Gast)


Lesenswert?

Bist du alle Register durchgegangen ob die auf default gesetzt werden? 
Die Hersteller Muster verlassen sich evtl. darauf das ein Register durch 
den HW Reset auf default gesetzt wird und setzen das in der Init Sequenz 
nicht.

von grundschüler (Gast)


Lesenswert?

G. H. schrieb:
> power-on Reset

Das ist wahrscheinlich das richtige Stichwort



Johannes S. schrieb:
> Register durchgegangen ob die auf default

das war irgendwannmal copy-paste-code. Dass da register fehlen könnten 
-mgl.

Deine Frage hat mich jedenfalls auf den Gedanken gebracht, den init-code 
2x durchlaufen zu lassen:
1
void main(void){
2
u8 i,ret;
3
led1_init;
4
i2c_init(); 
5
lcd_init();
6
lcd_init();

damit startet der tft sicher. D.h. es gibt eine Initialisierung, bei der 
ein externer reset nicht erforderlich ist. Wäre schön, wenn man den 
doppelt ausgeführten code noch auf das Notwendige reduzieren könnte.

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.