www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik eDIP240-7 und SPI


Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche seit einiger Zeit das eDIP240-7 über das SPI anzusprechen.
Leider ohne Erfolg...
Wenn ich dagegen die Daten über die serielle Schnittstelle übertrage 
funktioniert es.

Angeschlossen ist es wie folgt: (ATMEGA32)
Pin 5  CLK -> PB7 (SCK)
Pin 7  MISO-> PB6 (MISO)
Pin 9  MOSI-> PB5  (MOSI)
Pin 10 SS  -> PB4 (SCK)

CPOL,DORD,CPHA sind jeweils offen dh.(Log 1)
-> richtig??

void SPI_MasterInit(void)
{
  // Set MOSI and SCK output, all others input
  DDRB = (1<<PB5)|(1<<PB7)|(1<<PB4);
  // disable \ss
  PORTB |= (1 << PB4);
  // Enable SPI, Master, set clock rate fck/16
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}



void linieZeichnen(void)
{


  SPI_MasterTransmit(0x11);
  SPI_MasterTransmit(0x0A);
  SPI_MasterTransmit(0x1B);
  SPI_MasterTransmit(0x44);
  SPI_MasterTransmit(0x4C);
  SPI_MasterTransmit(0x1B);
  SPI_MasterTransmit(0x47);
  SPI_MasterTransmit(0x44);
  SPI_MasterTransmit(0x00);
  SPI_MasterTransmit(0x00);
  SPI_MasterTransmit(0xEF);
  SPI_MasterTransmit(0x7F);
  SPI_MasterTransmit(0xDA);


}


int main( void )

{
uart_init( MYUBRR);
SPI_MasterInit();





  while(1)
  {
  _delay_ms(10);
  linieZeichnen();



  }
return 0;

}
Währe nett wenn mir jemand helfen könnte....komme echt nicht weiter.
Vielleicht hat jemand auch mal ein funktionierendes Beispiel für mich.

Mfg

Sascha

Autor: Wolfgang Grimm (wgrimm55)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Sascha,

habe auch lange gebraucht um den eDIP über SPI zu laufen zu bekommen.
Mir hat viel ein LA geholfen mit dem ich das Protokoll beobachtet habe.
Ich sende dir mal mein Beispiel ohne Kommentar, arbeite mit SPI und INT0
Interrupt.
Mal sehen ob du mit meinem Programmierstil was anfangen kannst.
Ich will damit eine Steuerung für die Eisnenbahn, Drehscheibe,
lokschuppen ... aufbauen

Gruss W.G.

Autor: Wolfgang Grimm (wgrimm55)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Sascha,

noch ein Nachtrag, arbeitest du auch richtig mit dem SS Signal des SPI,
ich hatte es ein bischen vernachläsigt. Nachdem ich es so wie im 
Datenblatt
des eDIP abgebildet realisiert hatte funktionierte es bei mir.

Gruss W.G.

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo und erstmal danke für den Versuch mir zu helfen ;-)
Ich werde mich morgen mal durch deinen Code beissen...
Was für einen Controller benutzt du?
Das mit dem SS kann ich leider nicht genau sagen.
Wäre schön gewesen wenn mir jemand sagen könnte wo der Fehler in meinem 
Code liegt.

Frohe Ostern
Sascha

Autor: Jupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Angeschlossen ist es wie folgt: (ATMEGA32)
>Pin 5  CLK -> PB7 (SCK)
>Pin 7  MISO-> PB6 (MISO)
>Pin 9  MOSI-> PB5  (MOSI)
>Pin 10 SS  -> PB4 (SCK)

Welches Display benutzt du denn genau? Im Datenblatt (Reichelt) steht:


Pin 9  CLK
Pin 8  MISO
Pin 7  MOSI
Pin 6 SS

Unterscheiden sich die Pinbelegungen der Displays?

Autor: Bernd Bömer (behbeh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
hatte das gleiche Problem mit dem e320DIP. Über die serielle ging es, 
aber über SPI nicht.
Der Fehler war, man muss das ACK( 6) mit einem Dummybefehl, oder Du 
kannst es auswerten, aus dem Displaycontroller auslesen. Über die 
serielle schnittstelle geht das automatisch. Wenn man es nicht ausliest, 
dann verschluckt der Controller praktisch jeden 2 Befehl...
Hoffe es hilft Dir
Gruss und frohe Ostern
Bernd

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, klar...war die Belegung meiner Stiftleiste ;-)
Ist Natürlich laut Datenblatt angeschlossen:
>Pin 9 CLK -> PB7 (SCK)
>Pin 8  MISO-> PB6 (MISO)
>Pin 7  MOSI-> PB5  (MOSI)
>Pin 6 SS  -> PB4 (SCK)

Display ist das eDIP240-7..

@Bernd
hättest du mal einen Beispielcode? Kann mir jetzt nicht viel darunter 
vorstellen.



Ist zum verzweifeln das Ding...

Gruß
Sascha

Autor: Metaller (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
evtl. hilft dir meine asm-Lib, die ich für das Display geschrieben habe. 
Das Display lief sofort mit ASM und I2C :) Falls Du noch die I2C-Lib 
brauchst, dann melde Dich einfach noch mal.
Über den PC und RS232 progge ich nur die Menues.

Autor: Metaller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry... wer lesen kann ist klar im Vorteil :) Habe es jetzt erst 
begriffen, dass es um SPI geht ... vergebt einem alten Metaller noch 
mal.

Autor: Bernd Bömer (behbeh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
zur zeit nicht, weil das ein Projekt auf der Arbeit war.

Aber ganz einfach.

spitransfer( befehle und daten mit crc lt Datenblatt);
spitransfer(0); Wenn du das ACK(=6) nicht benötigst
dummy = spitransfer(0); wenn du es auswerten willst, es kom´men ja 
verschiedene Erorrs zurück!
durch diesen zusaetzlichen befehl wird automatisch ja ueber MISO das ACK 
ausgelesen, das Byte steht praktisch schon drin im Controller, man muss 
es nur lesen! Zum Lesen muss doch ein CLK Signal erzeugt werden, und 
genau das passiert dann.
Verstanden..?
Gruss Bernd

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So zumindest bekommen ich nun mit folgendem Code schon mal eine Linie 
gezeichnet....

void spi_init(void) {
    // Aktivieren der Pins f?r das SPI Interface
  DDR_SPI |= (1<<P_SCK)|(1<<P_MOSI); //DDRB = 
(1<<PB5)|(1<<PB7)|(1<<PB4);
  PORT_SPI &= ~((1<<P_SCK)|(1<<P_MOSI)|(1<<P_MISO));  //PORTB |= (1 
<<PB4);

    DDR_CS |= (1<<P_CS);
    PORT_CS  |= (1<<P_CS);

    // Aktivieren des SPI Master Interfaces, fosc = fclk / 4
    SPCR = (1<<SPE)|(1<<DORD)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA);

}

uint8_t spi_putc( uint8_t data ) {
    // Sendet ein Byte
    SPDR = data;

    // Wartet bis Byte gesendet wurde
    while( !( SPSR & (1<<SPIF) ) )
        ;
    delay_us(500);
    return SPDR;
}
void linie_zeichnen(unsigned char x1,unsigned char y1,unsigned char 
x2,unsigned char y2)
  {
  char dummy=0;
  char bcc=0;
  bcc=(DC1+0x0A+ESC+0x44+0x4c+0x1B+0x47+0x44+x1+y1+x2+y2)%256;

  PORT_CS &= ~(1<<P_CS);
  spi_putc(DC1);
  spi_putc(0x0A);//len
  spi_putc(ESC);
  spi_putc(0x44);
  spi_putc(0x4c);
  spi_putc(0x1B);
  spi_putc(0x47);
  spi_putc(0x44);
  spi_putc(x1);
  spi_putc(y1);
  spi_putc(x2);
  spi_putc(y2);
  spi_putc(bcc);
  PORT_CS |= (1<<P_CS);
//uart_Send(bcc);
  dummy = spi_putc(0x00);
  uart_Send(dummy);
}

Allerding scheint er wirklich jeden zweiten Befehl zu verschlucken...
müsste mir die obige Funktion linie_zeichnen(); nicht so das ACK bzw. 
NAK
ausgeben? Irgendwie ist mir die Sache mit dem SPI empfang noch unklar.
Oder muss ich hierfür diese Funktion benutzen:

char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)))
;
/* Return data register */
return SPDR;
}
Sorry wegen der vielen Fragen
Mfg
Sascha

Autor: Wolfgang Grimm (wgrimm55)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Sascha

war jetzt 2 Tage nicht online.
Zur info, ich benutze den mega8315.
Noch mal zu dem SS Signal, meine Erfahrung damit war, das der
Prozessor keines erzeugt, es war bei mir immer low.
Ich hatte auch immer Aussetzer. Das edip lief nicht stabil.
Ich habe mir dann das Datenblatt des edip angeshen und meine
Signale auf dem LA, um festgestellt das da beim SS Signal unterschiede
waren.
Danach habe ich nach jedem gesendeten Byte des SS wieder deaktiviert 
(High),
und vor jedem Senden wieder akitviert
und sofort wurde das edip stabil.
Man sollte sicher sein das das Verhalten aus dem Datenblatt auch durch
das SPI exakt nachgebide wird.
Bist du auch sicher das deiner Checksumme richtig berechnet wird,
im Zweifek mit Calculator kontrollieren.
Nach dem Senden des bcc warte ich ein paar us und sende dann FF (dummy 
Byte)
und sofort antwortet der edip mit dem ACK.
Ich habe z.Z nur ein Problem das nach einer bestimmten Anzahl
von Taste oder Schalter funktionen das edip aus dem Tritt kommt, und 
spinnt.


gruss W.G.

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.