DOG-M Lcd im SPI-Mode

Gast #424358
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;
}

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.