Forum: Mikrocontroller und Digitale Elektronik DOG-M Lcd im SPI-Mode


von Andreas Lang (Gast)


Lesenswert?

Hallo,
ich habe hier ein dog-m162 und will ebendieses im SPI-Mode betreiben.
Das Ding tut natürlich gar nichts. Nachdem ich jetzt sowohl die 
Initialisierung aus dem Datenblatt des Displays sowie die aus dem 
Datenblatt des Controllers versucht habe zweifle ich jetzt so langsam 
daran, dass mein SPI-Code überhaupt stimmt. Leider habe ich kein 
Logikanalyzer, um das ganze zu überprüfen.
Ansich sollte der Code Daten zur fallenden Taktflanke ausgeben, damit 
sie is zu steigenden Flanke stabil sind, wo das Display sie dann 
übernimmt.
Vielleicht erkennt ja jemand noch irgendwelche systematischen Fehler, 
Denkfehler oder was auch immer.

#define RST_L PORTD&=~(1<<2)
#define RST_H PORTD|=(1<<2)
#define CSB_L PORTD&=~(1<<1)
#define CSB_H PORTD|=(1<<1)
#define RS_L PORTD&=~(1<<0)
#define RS_H PORTD|=(1<<0)
#define CLK_L PORTD&=~(1<<3)
#define CLK_H PORTD|=(1<<3)
#define SDO_L PORTD&=~(1<<4)
#define SDO_H PORTD|=(1<<4)

#define BEEP_T PORTD^=(1<<5)
#define BEEP_L PORTD&=~(1<<5)
//SPI Status-Codes
#define SPI_READY 1
#define SPI_START 2

volatile uint8_t fsm_spi_status=0;
volatile uint8_t spi_dr=0; //SPI Data Register
volatile uint8_t beep=0;
void init(void)
  {
  DDRD|=0x3f;
  TCCR0=0x02; //->7,8125kHz SPI FSM Base Clock
  TIMSK|=(1<<TOIE0);
  TCCR2=0x04;
  TIMSK|=(1<<TOIE2);
  sei();
}

SIGNAL(SIG_OVERFLOW0)
  {
  static uint8_t temp=0, cbit=0, status=0;
  //SPI FSM for DOG-M LCD
  switch(fsm_spi_status)
    {
    case 0: //Init
      CLK_H;
      SDO_H;
      CSB_H;
      status=1;
      break;
    case 1:
      break; //NOP
    case 2: //Start Transfer
      CLK_H;
      SDO_H;
      CSB_L;
      status=3;
      temp=spi_dr;
      cbit=7;
      //beep=220;
      break;
    case 3: //Output bit and set CLK low
      if(temp&0x80)
        SDO_H;
      else
        SDO_L;
      CLK_L;
      if (cbit==0)
        status=5;
      else
        status=4;
      break;
    case 4: //Shift left data register, decrease bitcounter and set CLK 
high
      cbit--;
      temp<<1;
      CLK_H;
      status=3;
      break;
    case 5: //Set CLK high
      CLK_H;
      status=6;
      break;
    case 6: //Set CSB high and go to idle
      CSB_H;
      status=1;
      //beep=100;
      break;
  }
  fsm_spi_status=status;
}
SIGNAL(SIG_OVERFLOW2)
  {
  if (beep==0)
    BEEP_L;
  else
    {
    BEEP_T;
    TCNT2=beep;
  }
}
void delay(uint8_t time)
  {
  for(uint8_t t=0;t<time;t++)
    _delay_ms(1);
}
void _lcd_data(uint8_t data)
  {
  while(fsm_spi_status!=SPI_READY);
  RS_H;
  spi_dr=data;
  fsm_spi_status=SPI_START;
}
void _lcd_cmd(uint8_t data)
  {
  while(fsm_spi_status!=SPI_READY);
  RS_L;
  spi_dr=data;
  fsm_spi_status=SPI_START;
}

von Tobias F. (tobias-frintz)


Angehängte Dateien:

Lesenswert?

Hy
hab ich von nem anderen Forumuser vielleicht hilft des.
Tobi

von Obelix (Gast)


Lesenswert?

@Tobias

Hast du mal aufs Datum geschaut?

von Tobias F. (tobias-frintz)


Lesenswert?

Hy Obelix

Vielleicht guckt er trotzdem...

Tobi

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.