- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 21

Thema: EA DOMG-163 an SPI - Ich krieg die Krise

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473

    EA DOMG-163 an SPI - Ich krieg die Krise

    Hallo

    Ich will oben genanntes LCD mit einem STM32 über SPI ansteuern, allerdings will das Ganze nicht wie ich.
    Datenblatt:
    http://cdn-reichelt.de/documents/dat...500/dog-me.pdf

    Das LCD wird mit 3,3V versorgt, die Beschaltung erfolgte nach Datenblatt. Die Initialisierung ebenso. Die SPI wird mit 2MHz getaktet, das macht mit dem verwendeten Taktteiler irgendwas knapp unter 8kHz.

    Init:
    void SPI2_IntHandler(DMA_HandleTypeDef *hdma_spi2_tx){
    HAL_Delay(1);
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);
    }

    void testLCD(){
    unsigned short pl; //pl - Pufferlänge
    unsigned long to; //to - Time Out
    char t=0;

    //Chip-Select-Pin
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_RESET);

    //RS_Pin
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET);
    //Init-Befehle für LCD
    char lcdpuffer[] = {0b00111001, 0b00010101, 0b01010101, 0b01101110, 0b01110010, 0b00001111, 0b00000001, 0b00000110};
    pl = 8;
    to = 50;
    char s[]= "Test OK";

    //Init senden
    HAL_SPI_Transmit(&hspi2, lcdpuffer, pl, to);
    HAL_Delay(100);
    printf("LCD initialisiert\n");

    //RS_Pin
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET);
    //String in s an LCD senden
    pl = 6;
    HAL_SPI_Transmit(&hspi2, s, pl, to);
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);
    SPI-Init:
    /* SPI2 init function */
    static void MX_SPI2_Init(void)
    {

    hspi2.Instance = SPI2;
    hspi2.Init.Mode = SPI_MODE_MASTER;
    hspi2.Init.Direction = SPI_DIRECTION_2LINES;
    hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;
    hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
    hspi2.Init.NSS = SPI_NSS_SOFT;
    hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
    hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
    hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    hspi2.Init.CRCPolynomial = 10;
    if (HAL_SPI_Init(&hspi2) != HAL_OK)
    {
    Error_Handler();
    }

    }
    Hat irgendjemand eine Ahnung, warum das Scheißteil nicht kooperieren will? Die SPI jedenfalls scheint auszugeben was sie soll...sagt zumindest das Oszilloskop von einem Freund.

    PS: Langsam glaube ich an Voodoo...
    Während ich das hier schreibe und zwischendurch mal rumprobiere, habe ich die Spannung versehentlich kurz kurzgeschlossen. Ist Mist (das Netzteil liefert kontinuierlich 40A, wenn es muß), aber das LCD hat endlich mal das angezeigt was es anzeigen soll.
    Auch heute Nachmittag waren einmal kurz etwas Blödsinn drauf...

    Hat irgendjemand ne Ahnung was da los sein könnte?

    Ach...und nach Neustart funktioniert es wieder nicht.
    Geändert von White_Fox (24.10.2016 um 16:49 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    33
    Beiträge
    1.192
    Hallo White_Fox,
    habe schon mal ein ähnliches Display vom gleichen Hersteller verwendet (DOGM132), erfahrungsgemäß sind die Datenblätter eher knapp.

    Was z.B. nicht genannt wird, ob/wie lange eine Startup-Zeit eingehalten werden muss. Am einfachsten könnte man vor der Initialisierung eine Pause programmieren.
    Auch nicht spezifiziert wird, wie beim SPI die CPOL / CPHA einzustellen ist, eventuell muss man hier probieren.
    Ich kenne die HAL-Funktionen jetzt nicht näher, aber vermutlich wird zwischen dem Senden der einzelnen Intiilisierungs-Bytes keine Pause eingelegt?
    Eventuell bringt eine Pause zwischen den Befehlen etwas. Zumindest der Clear Display Befehl braucht ~1ms.
    Die Initialisierungs-Sequenz habe ich jetzt nicht überprüft. Das Datenblatt zeigt nur 8bit Initialisierungen an. Das könnte man sicherheitshalber auch nochmal mit dem Datenblatt vergleichen.

    Habe selber auch schon an einigen Displays rumprobiert, die Pausen zu programmieren hilft meist.
    Sind alle Pins richtig angeschlossen und an jedem Ausgang auch mal nachgemessen oder eine LED blinken lassen?
    Liegt der PSB-Anschluss auf GND?
    Sind Reset, VIN, VDD an 3,3V?
    Ist die Chip-Select-Leitung in Ordnung? Hat das Display einen Abblockkondensator bekommen? Ist die Betriebsspannung im Rahmen?

    Viele Grüße,
    Bernhard
    Geändert von BMS (24.10.2016 um 17:49 Uhr)
    "Im Leben geht es nicht darum, gute Karten zu haben, sondern auch mit einem schlechten Blatt gut zu spielen." R.L. Stevenson

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Hallo BMS

    Nun, das LCD hat 2s bevor die SPI Daten rausschiebt. 10ms zwischen den Befehlen hab ich schon ausprobiert. Initialisiert wird auch mit acht Bit. Taktpolarität und -phase sind im Datenblatt vom Controller...die passen soweit.

    Das LCD hat auch seinen eigenen Abblockkondensator...das sollte hinhauen. Die Betriebsspannung liegt bei stabilen 3,3V.

    und wie gesagt...aus irgendeinem mir unerfindlichen Grund hat es einmal kurz funktioniert.

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Jetzt gehts rund...

    Mit folgendem Code hab ich meinen STM32 gefüttert:

    void testLCD(){
    unsigned short pl; //pl - Pufferlänge
    unsigned long to; //to - Time Out
    char t=0;

    //Chip-Select-Pin
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_RESET);

    //RS_Pin
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET);
    //Init-Befehle für LCD
    char lcdpuffer[] = {0b00001111, 0b00111001, 0b00010101, 0b01010101, 0b01101110, 0b01110010, 0b00111000, 0b00001111, 0b00000001, 0b00000110};
    pl = 9;
    to = 50;
    char s[]= "Test OK";

    //Init senden
    HAL_SPI_Transmit(&hspi2, lcdpuffer, pl, to);
    HAL_Delay(100);
    //printf("LCD initialisiert\n");

    HAL_Delay(10);
    //RS_Pin
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET);

    //Text senden
    HAL_SPI_Transmit(&hspi2, s, 7, 10);
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);
    Am Ende der Text-Übertragung habe ich mal den RS-Pin getoggelt. Und es hat funktioniert!

    Einmal Ein- und Ausschalten, und es funktioniert nicht mehr. Und ich krieg es auch nicht mehr hin daß es wieder funktioniert. Was ist das bloß für ein Mist...

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    33
    Beiträge
    1.192
    Wenn ich das richtig sehe, wird hier der RS-Pin getoggelt.
    Code:
    void SPI2_IntHandler(DMA_HandleTypeDef *hdma_spi2_tx){
      HAL_Delay(1);
      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);
      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);
    }
    Frage: Wozu?

    Ist diese Interrupt-Routine während der Initialisierung aktiv? Besser nicht...

    Grüße, Bernhard
    "Im Leben geht es nicht darum, gute Karten zu haben, sondern auch mit einem schlechten Blatt gut zu spielen." R.L. Stevenson

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Hallo BMS

    Errstmal: leider ist dieser Interrupt nicht aktiv. ich hab da mal im Debug-Modus einen Haltepunkt reingesetzt, jedoch kam der NIE zum Auslösen. Anscheinend stelle ich mich beim Thema Interrupt noch zu doof an.

    Den RS-Pin zu toggeln war ein Hinweis, den ich auf mikrocontroller.net gefunden habe. Da fragte auch wer, der sein LCD (gleicher Typ9 zwar initialisieren konnte, aber keine Zeichen dargestellt bekam. Wie gesagt, weil die aber nie angesprungen wird hab ich mich darum nicht mehr gekümmert die wieder rauszunehmen. Werd ich trotzdem gleich mal machen...

Ähnliche Themen

  1. noch ne seltsame Rechenfunktion - ich krieg die Krise!
    Von dl1akp im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 17.08.2008, 20:44
  2. wie, krieg ich die hex auf dem board
    Von Sp666dy im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 25.02.2008, 07:34
  3. Menü - ich krieg die Krise!!!
    Von dl1akp im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 18.11.2007, 14:41
  4. Wo krieg ich BASCOM Basic her?
    Von zwerg1 im Forum AVR Hardwarethemen
    Antworten: 23
    Letzter Beitrag: 13.02.2007, 22:34
  5. Wo krieg ich Baupläne her
    Von Aramis im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 05.09.2004, 10:16

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad