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


von Robert J. (hubertchen)


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?
1
#ifndef F_CPU
2
#define F_CPU 8000000UL
3
#endif
4
/** INCLUDES *********************************************************************************************************************/
5
#include <avr/interrupt.h>
6
#include <avr/sleep.h>
7
#include <avr/eeprom.h>
8
/** DEFINES **********************************************************************************************************************/
9
#define F_CPU 8000000UL
10
#define A0 0x04
11
#define CS1B 0x08
12
#define RST 0x10
13
#define DD_DOGM_PORT DDRB
14
//DOGM COMMANDS
15
#define LCD_ON      0xAF
16
#define LCD_OFF      0xAE
17
#define SET_PAGE    0xB0
18
#define SET_ADDRESS0  0x01
19
#define SET_ADDRESS1  0x00
20
#define NORMAL      0xA6
21
#define REVERSE      0xA7
22
#define ALL_OFF      0xA4
23
#define ALL_ON      0xA5
24
#define BIAS_SET_7    0xA3
25
#define BIAS_SET_9    0xA2
26
#define RESET      0xE2
27
#define MODE_SEL_NOR  0xC0
28
#define MODE_SEL_REV  0xC8
29
#define RES_SET      0x20
30
#define IND_ON_FL    0xAD01
31
#define IND_OFF_FL    0xAC01
32
#define IND_ON_NFL    0xAD00
33
#define IND_OFF_NFL    0xAC00
34
#define BOOST_SET_2    0xF800
35
#define BOOST_SET_5    0xF801
36
#define BOOST_SET_11  0xF802
37
#define PWR_SAVE    0x00
38
#define NOP        0xE3
39
/** MACROS ***********************************************************************************************************************/
40
#define SPI_WAITFOR() do { while ((SPSR & (1 << SPIF)) == 0) ; } while(0)
41
#define A0_HIGH()  PORTB |= A0;_delay_us(50);
42
#define A0_LOW()   PORTB &= ~A0;_delay_us(50);
43
#define RST_HIGH()   PORTB |= RST;//_delay_us(50);
44
#define RST_LOW()   PORTB &= ~RST;//_delay_us(50);
45
#define CS1B_HIGH() PORTB |= CS1B;_delay_us(50);
46
#define CS1B_LOW()   PORTB &= ~CS1B;_delay_us(50);
47
/** VARIABLES ********************************************************************************************************************/
48
volatile uint8_t init[] = { 0x40 ,0xA1 ,0xC0 ,0xA6 ,0xA2 ,0x2F ,0xF8 ,0x00 ,0x23 ,0x81 ,0x1F ,0xAC ,0x00 ,0xAF };
49
volatile uint16_t k,h,i;
50
/** FUNCTIONS ********************************************************************************************************************/
51
void dogm132_spi_init(void) {
52
  DDRB |= 0xFF/*(1<<PORTB3) | (1<<PORTB2) | (1<<PORTB4)*/;
53
54
  CS1B_HIGH();
55
56
  SPCR = 0;
57
58
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPI2X) | (0<<DORD) | (1<<CPOL) | (1<<CPHA);
59
60
  uint8_t dummy = (SPSR);
61
  dummy=dummy;
62
}
63
/**-----------------------------------------------------------------------------------------------------------------------------**/
64
void dogm132_transmit(uint8_t data){
65
  CS1B_LOW();
66
  SPDR = data;
67
  SPI_WAITFOR();
68
  CS1B_HIGH();
69
}/**-----------------------------------------------------------------------------------------------------------------------------**/
70
void dogm132_transmit_data(uint8_t data){
71
  A0_HIGH();
72
  dogm132_transmit(data);
73
  A0_LOW();
74
}
75
/**-----------------------------------------------------------------------------------------------------------------------------**/
76
void dogm132_clear_lcd(void){
77
  uint8_t i,h;
78
  for(h=0;h<8;h++){
79
    for(i=0;i<132;i++){
80
      dogm132_transmit(SET_PAGE + h);
81
      dogm132_transmit_data(0x00);
82
    }
83
  }
84
}
85
/**-----------------------------------------------------------------------------------------------------------------------------**/
86
void dogm_home(void){
87
  dogm132_transmit(0x40);
88
  dogm132_transmit(SET_PAGE);
89
  dogm132_transmit(SET_ADDRESS0);
90
  dogm132_transmit(SET_ADDRESS1);
91
}
92
/**-----------------------------------------------------------------------------------------------------------------------------**/
93
void dogm132_init(void){
94
  uint8_t i;
95
  RST_HIGH();
96
  CS1B_LOW();
97
  _delay_us(50);
98
  RST_LOW();
99
  _delay_us(50);
100
  RST_HIGH();
101
  _delay_ms(1);
102
  for(i=0;i<14;i++){
103
    dogm132_transmit(init[i]);
104
  }
105
}
106
/** MAIN *************************************************************************************************************************/
107
int main(void){
108
  DDRA = 0x03;
109
  dogm132_spi_init();
110
  dogm132_init();
111
  for(i=0;i<8;i++){
112
    dogm_home();
113
    dogm132_clear_lcd();
114
  }
115
  _delay_ms(1000);
116
  for(;;){
117
    dogm_home();
118
    for(h=0;h<10;h++){
119
      for(i=0;i<4;i++){
120
        for(k=0;k<132;k++){
121
          dogm132_transmit(0xB0 | i);
122
          dogm132_transmit_data(0xAA+i);
123
        }
124
      }
125
    }
126
    _delay_ms(250);
127
    dogm_home();
128
    for(h=0;h<10;h++){
129
      for(i=0;i<4;i++){
130
        for(k=0;k<44;k++){
131
          dogm132_transmit(0xB0 | i);
132
          dogm132_transmit_data(0xAA);
133
        }
134
        for(k=0;k<44;k++){
135
          dogm132_transmit(0xB0 | i);
136
          dogm132_transmit_data(0x18);
137
        }
138
        for(k=0;k<44;k++){
139
          dogm132_transmit(0xB0 | i);
140
          dogm132_transmit_data(0x81);
141
        }
142
      }
143
    }
144
    _delay_ms(250);
145
    dogm_home();
146
    for(h=0;h<10;h++){
147
      for(i=0;i<4;i++){
148
        for(k=0;k<132;k++){
149
          dogm132_transmit(0xB0 | i);
150
          dogm132_transmit_data(0x55+i);
151
        }
152
      }
153
    }
154
    _delay_ms(250);      
155
  }
156
}

von spess53 (Gast)


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

von Hubertchen (Gast)


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
1
void clear(void){
2
    for(i=0;i<4;i++){
3
        transmit(SET_PAGE | i)
4
        for(k=0;k<132;k++){
5
           transmit_data(0x00);
6
        }
7
    }
8
}

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.

von spess53 (Gast)


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

von Robert J. (hubertchen)


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.

von spess53 (Gast)


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

von Robert J. (hubertchen)


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

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.