Forum: Mikrocontroller und Digitale Elektronik SPI und EA DIP 204-4


von Marcel K. (viewer)


Lesenswert?

Hallo Forum- Gemeinde,

ich möchte gerne mein EA DIP 204-4 über SPI ansteuern. Allerdings klappt 
das nicht so recht :o(
Könnt ihr mir vielleicht sagen was ich falsch mache?

Zur Hardware:
Lötbrücke auf der Rückseite ist gesetzt.
AT Mega 16, 4MHz.


Zur Software:

Spi-init sieht in etwa so aus:

-transmit msb first
-Init in master mode
-set clockrate (fosc / 16)
-data Mode 3 (Idle = high, Datenübernahme bei fallenden Flanke von SCLK)
-spi interrupt enabled
-spi on


Für die Initialisierung des Displays sende ich:

spi_send_data(0xF8); // Starbyte
spi_send_data(0x00); spi_send_data(0x10); // higher; lower Byte
pause()
spi_send_data(0x20); spi_send_data(0x40);
pause()
spi_send_data(0x00);spi_send_data(0xC0);
pause()
spi_send_data(0x20);spi_send_data(0x00);
pause()
spi_send_data(0x00);spi_send_data(0x60);
pause()
spi_send_data(0x20);spi_send_data(0x40);
pause()
spi_send_data(0x00);spi_send_data(0x90);
pause()
spi_send_data(0x02);spi_send_data(0x00);
pause()
spi_send_data(0x00);spi_send_data(0x10);

Die Reihenfolge der Initialisierung habe ich schon mehrere male geändert 
da ich nicht so genau weiß wie man das Display richtig initialisiert. 
Ich habe auch die Initialisierung laut Datenblatt probiert. Es gibt hier 
im Forum zwar ein paar Beispiele aber die konnten mir auch nicht weiter 
helfen. Ich habe ein billiges, PC Oszilloskop, die Daten werden schon 
richtig raus gesendet.
Ich würde gerne wissen in welcher Art das Display seriell angesteuert 
werden muss. Im 8 Bit, 4Bit oder ist es egal?? (im Bezug auf das DL Bit 
in „Function Set“)

Mir geht es in erster Linie darum, ob ich das Display so richtig 
initialisiert habe.

Sieht von Euch jemand auf Anhieb einen Fehler?

Vielen Dank für Eure Mühe.

Grüße, Marcel

von holger (Gast)


Lesenswert?

>Spi-init sieht in etwa so aus:

Und wie sieht die präzise aus ?

>-spi interrupt enabled

Na hoffentlich hast du auch eine Interrupt Routine
dafür programmiert.

>Ich habe auch die Initialisierung laut Datenblatt probiert.

Das ist in der Regel der richtige Weg.

von Marcel K. (viewer)


Lesenswert?

Hallo Holger,

Die Init sieht so aus:

folgendes steht im Header.....

/////////////Definitionen /////////////////
// Bit 5 Übertragungsrichtung
#define DATA_ORDER 0x20
#define transmit_lsb_first() { SPCR |=  DATA_ORDER;}
#define transmit_msb_first() { SPCR &= ~DATA_ORDER;}
#define SPI_MODE 0x10
#define set_spi_master_mode() {SPCR |=  SPI_MODE;}

// Bit 3 Polarität von SCK
#define CLOCK_POLARITY 0x08
#define set_sck_idle_high() {SPCR |=  CLOCK_POLARITY;}
#define set_sck_idle_low()  {SPCR &= ~CLOCK_POLARITY;}

// Bit 2 Sende- Flanke
#define CLOCK_PHASE 0x04
#define set_send_from_idle_to_no_idle() {SPCR |=  CLOCK_PHASE;}
#define set_send_from_no_idle_to_idle() {SPCR &= ~CLOCK_PHASE;}



im .c Modul
////////////////// Funktionen //////////////////
void init_spi_master_mode(void)
{
  DDR_SPI |= (1<<SCK) | (1<<MOSI) | (1<<SS);// SCK, MOSI  und SS als 
output
  PORT_SPI |= (1<<SCK)|(1<<SS);// SCK und SS "driven high"
  set_spi_master_mode();

}

void set_data_mode(U8 mode)
{
  switch (mode)
  {
    case DATA_MODE_0:
      set_sck_idle_low();
      set_send_from_no_idle_to_idle();
    break;

    case DATA_MODE_1:
      set_sck_idle_low();
      set_send_from_idle_to_no_idle();
    break;

    case DATA_MODE_2:
      set_sck_idle_high();
      set_send_from_no_idle_to_idle();
    break;

    case DATA_MODE_3:
      set_sck_idle_high();
      set_send_from_idle_to_no_idle();
    break;
  }
}


void init_spi(void)
{
  transmit_msb_first();
  init_spi_master_mode();
  SPCR |= (1<<SPR0);
  set_data_mode(DATA_MODE_3);
   //spi_interrupt_enable();
  spi_enable();
}


Hmmm, aber mir fällt auf das ich ja gar keine ISR bräuchte…. Ich möchte 
ja nur Daten senden.

Viele Grüße,
Marcel

von Marcel K. (viewer)


Lesenswert?

Hallo, ich habe da noch eine Frage zum MISO!! Wie muss der Pegel vom 
MISO aussehen?? Wenn ich mit dem Oszi schaue dann haben SCLK und MOSI 
Flanken von etwa 0 bis 4,5 Volt, MISO allerdings von 4 bis 5 Volt. Als 
nur einen Spannungshub von 1 Volt. Ich habe diese Spannung sowohl wenn 
der Controller mit dem Display verbunden ist also auch wenn die Leitung 
frei in der Luft hängt. Das ist doch viel zu wenig, oder?? Ich habe 
wegen der ISP- Programmierschnittstelle 10k Widerstände in den drei 
Leitungen MOSI,MISO, SCLK. Benötigt der Mega 16 überhaupt das MISO- 
Signal??
Ich würde mich über einen Hinweis sehr freuen!!

Viele Grüße,
Marcel

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.