mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Dogm-132-5 Probleme


Autor: Robert Jähne (hubertchen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mit einem ATmega 16 und einem DOGM132-5 auf einem Steckbrett 
eine Schaltung aufgebaut. Sie funktioniert auch soweit, mein Problem ist 
nur, dass ich das Display nicht richtig Löschen kann. Wenn ich das 
Display vollständig löschen will, muss ich ca 5mal nacheinander 4*132 
mal 0x00 als Daten in das Display schreiben. Damit ist die Anzeige von 
anderem als ganzen Zeilen unmöglich weil das, was ich anzeigen will 
immer an der falschen Stelle steht

Mehr Delays helfen nichts, ebensowenig weniger.
SPI-Takt ändert auch nichts.
Initialisierung 1:1 aus dem Datenblatt.

kann es am Steckbrett liegen?
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
/** INCLUDES *********************************************************************************************************************/
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/eeprom.h>
/** DEFINES **********************************************************************************************************************/
#define F_CPU 8000000UL
#define A0 0x04
#define CS1B 0x08
#define RST 0x10
#define DD_DOGM_PORT DDRB
//DOGM COMMANDS
#define LCD_ON      0xAF
#define LCD_OFF      0xAE
#define SET_PAGE    0xB0
#define SET_ADDRESS0  0x01
#define SET_ADDRESS1  0x00
#define NORMAL      0xA6
#define REVERSE      0xA7
#define ALL_OFF      0xA4
#define ALL_ON      0xA5
#define BIAS_SET_7    0xA3
#define BIAS_SET_9    0xA2
#define RESET      0xE2
#define MODE_SEL_NOR  0xC0
#define MODE_SEL_REV  0xC8
#define RES_SET      0x20
#define IND_ON_FL    0xAD01
#define IND_OFF_FL    0xAC01
#define IND_ON_NFL    0xAD00
#define IND_OFF_NFL    0xAC00
#define BOOST_SET_2    0xF800
#define BOOST_SET_5    0xF801
#define BOOST_SET_11  0xF802
#define PWR_SAVE    0x00
#define NOP        0xE3
/** MACROS ***********************************************************************************************************************/
#define SPI_WAITFOR() do { while ((SPSR & (1 << SPIF)) == 0) ; } while(0)
#define A0_HIGH()  PORTB |= A0;_delay_us(50);
#define A0_LOW()   PORTB &= ~A0;_delay_us(50);
#define RST_HIGH()   PORTB |= RST;//_delay_us(50);
#define RST_LOW()   PORTB &= ~RST;//_delay_us(50);
#define CS1B_HIGH() PORTB |= CS1B;_delay_us(50);
#define CS1B_LOW()   PORTB &= ~CS1B;_delay_us(50);
/** VARIABLES ********************************************************************************************************************/
volatile uint8_t init[] = { 0x40 ,0xA1 ,0xC0 ,0xA6 ,0xA2 ,0x2F ,0xF8 ,0x00 ,0x23 ,0x81 ,0x1F ,0xAC ,0x00 ,0xAF };
volatile uint16_t k,h,i;
/** FUNCTIONS ********************************************************************************************************************/
void dogm132_spi_init(void) {
  DDRB |= 0xFF/*(1<<PORTB3) | (1<<PORTB2) | (1<<PORTB4)*/;

  CS1B_HIGH();

  SPCR = 0;

  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPI2X) | (0<<DORD) | (1<<CPOL) | (1<<CPHA);

  uint8_t dummy = (SPSR);
  dummy=dummy;
}
/**-----------------------------------------------------------------------------------------------------------------------------**/
void dogm132_transmit(uint8_t data){
  CS1B_LOW();
  SPDR = data;
  SPI_WAITFOR();
  CS1B_HIGH();
}/**-----------------------------------------------------------------------------------------------------------------------------**/
void dogm132_transmit_data(uint8_t data){
  A0_HIGH();
  dogm132_transmit(data);
  A0_LOW();
}
/**-----------------------------------------------------------------------------------------------------------------------------**/
void dogm132_clear_lcd(void){
  uint8_t i,h;
  for(h=0;h<8;h++){
    for(i=0;i<132;i++){
      dogm132_transmit(SET_PAGE + h);
      dogm132_transmit_data(0x00);
    }
  }
}
/**-----------------------------------------------------------------------------------------------------------------------------**/
void dogm_home(void){
  dogm132_transmit(0x40);
  dogm132_transmit(SET_PAGE);
  dogm132_transmit(SET_ADDRESS0);
  dogm132_transmit(SET_ADDRESS1);
}
/**-----------------------------------------------------------------------------------------------------------------------------**/
void dogm132_init(void){
  uint8_t i;
  RST_HIGH();
  CS1B_LOW();
  _delay_us(50);
  RST_LOW();
  _delay_us(50);
  RST_HIGH();
  _delay_ms(1);
  for(i=0;i<14;i++){
    dogm132_transmit(init[i]);
  }
}
/** MAIN *************************************************************************************************************************/
int main(void){
  DDRA = 0x03;
  dogm132_spi_init();
  dogm132_init();
  for(i=0;i<8;i++){
    dogm_home();
    dogm132_clear_lcd();
  }
  _delay_ms(1000);
  for(;;){
    dogm_home();
    for(h=0;h<10;h++){
      for(i=0;i<4;i++){
        for(k=0;k<132;k++){
          dogm132_transmit(0xB0 | i);
          dogm132_transmit_data(0xAA+i);
        }
      }
    }
    _delay_ms(250);
    dogm_home();
    for(h=0;h<10;h++){
      for(i=0;i<4;i++){
        for(k=0;k<44;k++){
          dogm132_transmit(0xB0 | i);
          dogm132_transmit_data(0xAA);
        }
        for(k=0;k<44;k++){
          dogm132_transmit(0xB0 | i);
          dogm132_transmit_data(0x18);
        }
        for(k=0;k<44;k++){
          dogm132_transmit(0xB0 | i);
          dogm132_transmit_data(0x81);
        }
      }
    }
    _delay_ms(250);
    dogm_home();
    for(h=0;h<10;h++){
      for(i=0;i<4;i++){
        for(k=0;k<132;k++){
          dogm132_transmit(0xB0 | i);
          dogm132_transmit_data(0x55+i);
        }
      }
    }
    _delay_ms(250);      
  }
}

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>void dogm132_clear_lcd(void){
>  uint8_t i,h;
>  for(h=0;h<8;h++){
>    for(i=0;i<132;i++){
>      dogm132_transmit(SET_PAGE + h);
>      dogm132_transmit_data(0x00);
>    }
>  }
>}

Du sendest ständig 'dogm132_transmit(SET_PAGE + h)'. Ausserdem hat ein 
DOG132 nur 4 Pages.

void dogm132_clear_lcd(void){
  uint8_t i,h;
  for(h=0;h<8;h++){
    dogm132_transmit(SET_PAGE + h);
    for(i=0;i<132;i++){
            dogm132_transmit_data(0x00);
    }
  }
}

MfG Spess

Autor: Hubertchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das habe ich probeweise so reingeschrieben, hat natürlich nix 
gebracht(geändert) weil ich dachte das der controller(is der selbe wie 
für das 128x64) sich in der seite vertan hätte und die Page Auswahl hab 
ich so testweise reingeschrieben um zu sehen, ob sich dadurch was 
ändert.

Mein Problem is allerdings das ein clear() nicht das ganze Display 
löscht
void clear(void){
    for(i=0;i<4;i++){
        transmit(SET_PAGE | i)
        for(k=0;k<132;k++){
           transmit_data(0x00);
        }
    }
}

Als ob ich zwischendurch die RAM-Adresse ändern würde...

wenn ich erst ca 8mal das gesamte LCD mit 0xFF vollmülle und dann ein 
clear() sende, dannsieht das display etwa so aus:
|   *****************    |
|***                     |
|   *****************    |
|***                     |

ein * stellt einen Bereich mit ca 8x10 punkten dar

gleiches gilt, wenn ich eine bestimmte Stelle (zb page 2 column 44) 
überschreiben will, wird eine andere Stelle auf dem Display 
überschrieben.


|****                     | soll zu |++++                 | werden, aber es wird 
zu: |***++++                 | oder |++**              ++| das geschieht scheinbar 
zufällig

ich weis nicht woran es liegen könnte meine Verdächtigten sind nur das 
Steckbrett und die Leitngen (beide schlecht austauschbar.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich habe meine Routinen in Assembler geschrieben. Bei meinem clear setze 
nach dem Pagewechsel die Spalte auf 0. Bin mir aber nicht 100%ig sicher 
ob das notwendig ist.

was mir noch aufgefallen ist:

#define SET_ADDRESS0  0x01  müsste 0x10 sein. Würde einige deiner 
Probleme erklären.

MfG Spess

Autor: Robert Jähne (hubertchen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<#define SET_ADDRESS0  0x01  müsste 0x10 sein. Würde einige deiner
<Probleme erklären.

Ja das hat die Startadresszuordnung gelöst. Nur ist es weiterhin so, 
dass bei einem einmaligen Clear nicht das gesamte Display gelöscht wird, 
sondern einzelne Bereiche ungelöscht bleiben. das gleiche gilt für 
einmal mit einem Wert (FF) vollschreiben.
Könnte das mit unsauberen Pegeln zu tun haben?
oder ist das Display kaputt? - Nö bei enem zweiten genau dasselbe
oder liegts am mit 3V betrieben ATmega 16-16P?

Edith hat mir zugeflüstert: nach dem Pagewechsel die Spalte auf 0 zu 
setzen hat geholfen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>.....Edith hat mir zugeflüstert: nach dem Pagewechsel die Spalte auf 0 zu
setzen hat geholfen.

Soll das jetzt heissen : Es funktioniert?

MfG Spess

Autor: Robert Jähne (hubertchen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
äh... JAHAAA jetzt kann ich mir gedanken um den Zeichensatz machen und 
dann Zahlen und Buchstaben in verschiedenen Größen ausgeben.
Danke für deine Hilfe

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.