mikrocontroller.net

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


Autor: Marcel K. (viewer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marcel K. (viewer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcel K. (viewer)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.