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; }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.