-         

Ergebnis 1 bis 5 von 5

Thema: EA DOGS 102-6 tut was es will und nicht was es soll;)

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2012
    Beiträge
    132

    EA DOGS 102-6 tut was es will und nicht was es soll;)

    Anzeige

    Hallo zusammen

    Ich habe ein LCD EA DOGS 102-6 an einem ATmgea8 angeschlossen.
    Die Programmierung des AVR klappt soweit, angeschlossene LEDs usw. funktionieren tadellos.

    Hier mal mein Code (fairerweise muss ich sagen, dass ich den Grundcode von hier habe: Link: Ich habe ihn lediglich an meine Schaltung angepasst (also PINs und so).

    Code:
    #include<avr/io.h>
    #define F_CPU 1000000
    #include <util/delay.h>
    
    #define CHIPSELECT     PORTB &= ~(1<<1);
    #define CHIPUNSELECT  PORTB |=  (1<<1);
    
    #define DATA       PORTB |= (1<<0);
    #define COMMAND      PORTB &= ~(1<<0);
    
    #define RESETHIGH    PORTB |= (1<<2);
    #define RESETLOW    PORTB &= ~(1<<2);
    
    
    void SPI_MasterInit(void)
      {    // MOSI, SCK und PB0 als Ausgang
    	  DDRB = 0xFF;
    	  // SPI Konfiguration (Richtiger SPI-mode?)
    	  SPCR |= (1<<6) | (1<<4) | (1<<3)|(1<<2); // SPI-Enabled, Mastermode, SPI-mode
    	  SPSR = (1<<0);
      }
    
    unsigned char spi_out(char b)
    {
        //Byte senden
          SPDR = b;
        //Warten bis Sendevorgang komplett
          while(!(SPSR &(1<<SPIF)));
        //SPIF löschen durch lesen von SPDR
          return SPDR;
    
    }
    
    void sendCommand(char command)
      {    CHIPSELECT;      
           COMMAND;
        //Byte senden
          spi_out(command);
          CHIPUNSELECT;    
      }
    
    void sendData(char data)
      {     
    	  CHIPSELECT;
          DATA;
        //Byte senden
          spi_out(data);
          CHIPUNSELECT;
      }
    
    void DisplayInit(void)
      {   //Display reset
        RESETLOW;
        _delay_ms(1);
        RESETHIGH;
        _delay_ms(5);  
        
        //Display init
    
        sendCommand(0x40);
        sendCommand(0xA1);
        sendCommand(0xC0);
        //sendCommand(0xA4);
        sendCommand(0xA6);
    
        sendCommand(0xA2);
        sendCommand(0x2F);
        sendCommand(0x27);
        sendCommand(0x81);
        sendCommand(0x10);
    
        sendCommand(0xFA);
        sendCommand(0x90);
        sendCommand(0xAF);   
      }
    
    int main(void){
    	   
    	SPI_MasterInit();
    
    	DisplayInit();
    	
        sendCommand(0b00000000);
        sendCommand(0b00010000);
        sendData(0xFF);
        sendCommand(0b00000001);
        sendCommand(0b00010000);
        sendData(0xFF);
        sendCommand(0b00000010);
        sendCommand(0b00010000);
        sendData(0xFF);
        sendCommand(0b00000011);
        sendCommand(0b00010000);
        sendData(0xFF);
        sendCommand(0b00000100);
        sendCommand(0b00010000);
        sendData(0xFF);
    
        
      }
    So. Das LCD blinkt nun beim Einschalten zwei mal auf und gibt Pixelsalat von sich. Oben links kann man ungefähr ein kleines schwarzes Vierreck erahnen, kann aber auch Zufall sein.
    Danach blinkt es in unregelmässigen Abständen wieder auf
    Die Aufblink-Zeiten sind ca. 0.5 Sekunden oder so.

    Was ich versucht habe:

    -LCD gewechselt
    -ATmega gewechselt
    -Anschlüsse überprüft und neu gesteckt
    -Takt überprüft (stimmt, 1MHz)


    Was mache ich falsch? Hoffe es kann mir jemand weiter helfen=)

    Liebe Grüsse
    Thor_


    ---edit----

    Das LCD blinkt (nach dem initialen doppelten Aufblinken) periodisch und zwar mit einem zeitlichen Abstand von ca. 13Sekunden.

    -

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2011
    Ort
    Dresden
    Beiträge
    170
    hi,
    ich verwende eine andere ini, die funktioniert:

    DOGS102_tx_byte(0x40,0); // Start line 0
    DOGS102_tx_byte(0xA0,0); // 12:00 darst.
    DOGS102_tx_byte(0xC8,0); // COM dir normal
    DOGS102_tx_byte(0xA4,0); // All pix on
    DOGS102_tx_byte(0xA6,0); // Invers off
    DOGS102_tx_byte(0xA2,0); // duty 1/65
    DOGS102_tx_byte(0x2F,0); // power control
    delay_ms(120);
    DOGS102_set_contrast();
    DOGS102_tx_byte(0xFA,0); // T-Comp
    DOGS102_tx_byte(0x90,0); // "
    DOGS102_tx_byte(0xAF,0); // ON
    delay_us(100);
    DOGS102_clear();

    (die 0 im tx_byte bedeutet Kommando)
    mfg
    Achim

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2012
    Beiträge
    132
    Hi Achim

    Vielen Dank für deine Antwort.
    Ich habe inzwischen einen anderen Code gefunden, der eine schwarze Seite anzeigt, funktioniert tadellos.
    Es ist soweit also alles in Ordnung und es liegt an mir.

    Hier komme ich auch gerade zum wesentlichen:
    Mir fehlen wohl noch gewisse Infos/Wissen um das Display effizient zu nutzen.
    Mir ist vor allem unklar, wie ich eine gweisse Stelle xy ansprechen kann.
    Das Datenblatt erwähnt Pages, Columns und so weiter, aber ich kann mir das nicht zusammen reimen.

    Hat jemand einen Link der das alles gut erklärt? z.B. ein howTo?
    Das Datenblatt vom LCD sowie vom Controller habe ich mir ausführlich durchgelesen.

    Liebe Grüsse
    Thor_

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von Crazy Harry
    Registriert seit
    15.01.2006
    Ort
    Raum Augsburg - Ulm
    Beiträge
    1.192
    Von C hab ich keine Ahnung, aber ...... das Display kann nur geschrieben also nicht gelesen werden und du mußt immer mindestens ein Byte also 8 Pixel schreiben. Daraus folgt, daß du das Display-RAM im Controller-RAM abbilden mußt, darin deine Zeichenoperationen machst und das Bild mit einem Display-Refresh komplett übertragen mußt. Das heißt aber auch, daß du 102x64/8=864 Byte deines Controller-RAMs schon dafür reservieren mußt. Ich würde sagen, daß dein Controller zu klein ist.
    Ich programmiere mit AVRCo

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2011
    Ort
    Dresden
    Beiträge
    170
    Hi,
    ein paar codeschnipsel aus meiner ansteuerung, ich steuere das ding nicht via spi an, einfach nur durch takt und daten.

    DOGS102_tx_byte(byte b, byte typ)
    {
    byte i;
    LCD_CLR_CS;
    if(typ) LCD_SEND_DATA;
    else LCD_SEND_CMD;
    for(i=0;i<8;i++)
    {
    LCD_CLR_CLK;
    if(b>0x7F) LCD_SET_DATA;
    else LCD_CLR_DATA;
    b<<=1;
    LCD_SET_CLK;
    }
    LCD_SET_CS;
    }

    DOGS102_set_col_addr(byte adr)
    {
    DOGS102_tx_byte(adr & 0x0F, 0);
    DOGS102_tx_byte((adr >> 4) | 0x10, 0);
    }

    DOGS102_set_page_addr(byte adr)
    {
    DOGS102_tx_byte((adr & 7) | 0xB0, 0);
    }

    DOGS102_clear()
    {
    byte c, p;
    for(p=0;p<8;p++)
    {
    for(c=30;c<132;c++)
    {
    DOGS102_set_page_addr(p);
    DOGS102_set_col_addr(c);
    DOGS102_tx_byte(0,1);
    }
    }
    }


    DOGS102_clear_line(byte line)
    {
    byte col;
    for(col=30; col<132; col++)
    {
    DOGS102_set_page_addr(2*line);
    DOGS102_set_col_addr(col);
    DOGS102_tx_byte(0,1);
    DOGS102_set_page_addr(2*line+1);
    DOGS102_set_col_addr(col);
    DOGS102_tx_byte(0, 1);
    }
    }

    byte DOGS102_write_char_at(char c, char line, char col) // line 0..3, col 30..131
    {
    byte i;
    flash char* chpt=char_table[c-ch_offset];
    for(i=0; i<char_width[c-ch_offset]; i++)
    {
    DOGS102_set_page_addr(2*line);
    DOGS102_set_col_addr(col+30);
    DOGS102_tx_byte(*chpt++,1);
    DOGS102_set_page_addr(2*line+1);
    DOGS102_set_col_addr(col+30);
    DOGS102_tx_byte(*chpt++, 1);
    col++;
    }
    return (col);
    }

    vielleicht hiflts weiter.
    mfg
    Achim

Ähnliche Themen

  1. Pin Abrfrage tut nicht so wie sie soll (happert bei der Maskierung)
    Von Thor_ im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 22.09.2013, 10:09
  2. Gyro tut nicht so wie er soll
    Von Keksstar im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 15.08.2009, 16:22
  3. Timer soll zählen, tut er aber nicht. Hilfe!! :)
    Von robo-man im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 19.07.2009, 21:08
  4. Antworten: 13
    Letzter Beitrag: 24.10.2005, 14:52
  5. servo tut nicht, was er soll
    Von Goblin im Forum Motoren
    Antworten: 12
    Letzter Beitrag: 08.05.2005, 22:35

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •