Forum: Mikrocontroller und Digitale Elektronik Displayplatine Problem mit SPI DOGL128-6


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von CG (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
hoffe mir kann jemand helfen.
Ich habe eine Displayplatine mit einem ATMEGA32A und einem DOGL128-6 
aufgebaut jedoch tauchen leider ein paar Probleme beim Display auf.

Ich schaffe es das Display zu inizialisieren und anschließend drei mal 
eine Ausgabe aufs Display zu schreiben. Anschließend hängt sich mein 
Programm an der Stelle
while(! (SPSR & (1<<SPIF)));  // warten bis die Übertragung beendet ist
auf. (Habe ich mit den LED's kontrolliert)

Kann es sein das ich auch ein Hardwarefehler habe? Oder mache ich was in 
der Software falsch?

Verwendeter Microcontroller ATMEGA32A mit 16MHz
gesetzte Fuses:
JTAGEN, SPIEN
Bootsz -> Boot Flash size=2048 words start address=$3800
BODLEVEL -> Brown-out detection at VCC=2,7V
SUT_CKSEL -> Ext. Crystal/Resonator High Freq Start-up time: 16K CK 
+64ms


Hoffe mir kann da jemand helfen. :-)
Falls Eckdaten fehlen sollten bitte einfach bescheid sagen

Zum Code:
/*
 * SoftwareTerrariumDisplay.c
 *
 * Created: 23.09.2014 09:04:12
 *  Author: u308488
 */ 
#define F_CPU 16000000

#include <avr/io.h>      // Header-Datei f. IO-Register
#include <avr/interrupt.h>  // Header-Datei f. Interruptfunktion
#include <stdint.h>         // Header-Datei f. standard Datentypen
#include <avr/pgmspace.h>
#include <util/delay.h>

#include "SoftwareTerrariumDisplay.h"
#include "Treiber/eadog128-6.h"

/********************************************************************************
Function Prototypes
********************************************************************************/
void initPort(void);

/********************************************************************************
Variablen
********************************************************************************/
int zustand_taster1, zustand_taster2, zustand_taster3, zustand_taster4, zustand_taster5;
int i, count;

/********************************************************************************
Main Programm
********************************************************************************/
int main(void)
{
  initPort();          // Portinitalisierung
  display_init();        // Inizialisierung Display
  
  SET_LED_TASTER_HIGH;
  SET_DISPLAY_BRIGHTNESS_ON; //Hintergrundbeleuchung einschalten
  
    while(1)
    {
    SWITCH_LED1;  
    display_write("TEST",0,1);  
    _delay_ms(500);
  }
}

/********************************************************************************
PortInizialisierung
********************************************************************************/
void initPort(void)
{    
  // Portinitialisierung LED1 bis 3 definiren
  DDR_LED |= (1<<PIN_LED1) | (1<<PIN_LED2) | (1<<PIN_LED3); // LED's als Ausganggang definieren
  CLEAR_LED1;  // LED1 ausschalten 
  CLEAR_LED2; // LED2 ausschalten
  CLEAR_LED3; // LED3 ausschalten
  
  // Portinitialisierung Tasterhintergrundbeleuchtung 
  DDR_V_LED_TASTER |=  (1<<PIN_V_LED_TASTER); // als Ausganggang definieren
  CLEAR_LED_TASTER_HIGH;  // Hintergrundbeleuchtung ausschalten 
  
  // Portinitialisierung Taster 
  DDR_TASTER &= ~(1<<PIN_TASTER1) | (1<<PIN_TASTER2) | (1<<PIN_TASTER3) | (1<<PIN_TASTER4) | (1<<PIN_TASTER5)  ; // als Eingang definieren
}

/*
 * SoftwareTerrariumDisplay.h
 *
 * Created: 22.01.2015 09:29:02
 *  Author: u308488
 */ 


#ifndef GLOABAL_H_
#define GLOABAL_H_
#define F_CPU 16000000
//const PROGMEM char pic1[] = LOGO;

//V_LED_TASTER PC7
#define PORT_V_LED_TASTER      PORTA
#define DDR_V_LED_TASTER       DDRA
#define PIN_V_LED_TASTER       4    //PA4
#define SET_LED_TASTER_HIGH    PORT_V_LED_TASTER |= (1<<PIN_V_LED_TASTER)    // LED Hintergurndbeleuchtung an
#define CLEAR_LED_TASTER_HIGH  PORT_V_LED_TASTER &= ~(1<<PIN_V_LED_TASTER)    // LED Hintergurndbeleuchtung aus

//LED Pins
#define PORT_LED        PORTA
#define DDR_LED         DDRA
#define PIN_LED1         7    //PA7
#define PIN_LED2         6    //PA6
#define PIN_LED3         5    //PA5
#define SET_LED1      PORT_LED &= ~(1<<PIN_LED1);
#define SET_LED2      PORT_LED &= ~(1<<PIN_LED2);
#define SET_LED3      PORT_LED &= ~(1<<PIN_LED3);
#define CLEAR_LED1      PORT_LED |= (1<<PIN_LED1);
#define CLEAR_LED2      PORT_LED |= (1<<PIN_LED2);
#define CLEAR_LED3      PORT_LED |= (1<<PIN_LED3);
#define SWITCH_LED1      PORT_LED ^= (1 << PIN_LED1);    // LED1 umschalten
#define SWITCH_LED2      PORT_LED ^= (1 << PIN_LED2);    // LED2 umschalten
#define SWITCH_LED3      PORT_LED ^= (1 << PIN_LED3);    // LED3 umschalten

// TASTER Pins
#define PORT_TASTER      PORTC
#define DDR_TASTER      DDRC
#define PIN_TASTER_EINGANG  PINC
#define PIN_TASTER1      7    // PC7
#define PIN_TASTER2      6    // PC6
#define PIN_TASTER3      5    // PC5
#define PIN_TASTER4      4    // PC4
#define PIN_TASTER5      3    // PC3

// ###############  Pinfestlegung Display
//A0 Port
#define PORT_A0        PORTB
#define DDR_A0         DDRB
#define PIN_A0         2    //PB2

//Reset Port
#define PORT_RST       PORTB
#define DDR_RST        DDRB
#define PIN_RST        3    //PB3

//SPI Port
#define PORT_SPI      PORTB
#define DDR_SPI        DDRB
#define PIN_SPI_CS1B    0    //PB0
#define PIN_SPI_CS3      4    //PB4
#define PIN_SPI_MOSI    5    //PB5
#define PIN_SPI_MISO    6    //PB6  
#define PIN_SPI_SCK      7    //PB7  

//Hintergrundbeleuchtung PWM
#define BRIGHTNESS_PWM_DDR        DDRD
#define BRIGHTNESS_PWM_PORT        PORTD
#define BRIGHTNESS_PWM_PIN        7    //PD7
#define SET_DISPLAY_BRIGHTNESS_OFF    BRIGHTNESS_PWM_PORT &= ~(1<<BRIGHTNESS_PWM_PIN)  // Hintergrundbeleuchtung OFF
#define SET_DISPLAY_BRIGHTNESS_ON    BRIGHTNESS_PWM_PORT |=(1<<BRIGHTNESS_PWM_PIN) // Hintergrundbeleuchtung ON

#endif /* GLOABAL_H_ */

/*
 * eadog128_6.h
 *
 * Created: 22.01.2015 09:17:18
 *  Author: Dipl.- Ing. C. Graci
 */ 


#ifndef EADOG128_6_H_
#define EADOG128_6_H_


#define DISPLAY_OFFSET    4  
  
#define LINE1        5      
  
#define LINE2        1
  
//size of the LCD
#define LCD_WIDTH      128
#define LCD_HEIGHT      64
  
// ###############  Funkions
void display_init(void);
void display_write_byte(unsigned cmd_data, unsigned char data);
void display_clear(void);
void display_go_to (unsigned char x, unsigned char y);
void display_write(unsigned char *string, int x, int y);

volatile unsigned char char_x,char_y,char_height_mul,char_width_mul;

  

//write to lc-display command or data register
#define CMD    1
#define DATA  0
  
//Befehlstabelle EA DOGM128-6 Seite 5
// (1) Display ON/OFF
#define DISPLAY_ON             0xAF  //LCD_DISPLAY_ON
#define DISPLAY_OFF            0xAE  //LCD_DISPLAY_OFF

// (3) Page address set
#define DISPLAY_PAGE_ADDRESS    0xB0

// (4) Column address set upper bit
#define DISPLAY_COL_ADDRESS_MSB    0x10
// (4) Column address set lower bit
#define DISPLAY_COL_ADDRESS_LSB    0x00  

// (5) Status read (doesn't work in SPI mode)

// (6) Display data write
  
// (7) Display data read (doesn't work in SPI mode)
  
// (8) ADC select
#define DISPLAY_BOTTOMVIEW      0xA0  
#define DISPLAY_TOPVIEW        0xA1  

// (9) Display normale/reverse
#define DISPLAY_NORMAL         0xA6
#define DISPLAY_REVERSE        0xA7

// (10) Display all points ON/OFF
#define DISPLAY_SHOW_NORMAL      0xA4
#define DISPLAY_SHOW_ALL_POINTS    0xA5

// (11) LCD bias set
#define DISPLAY_BIAS_1_9      0xA2
#define DISPLAY_BIAS_1_7      0xA3

// (12) Read-modify-write (doesn't work in SPI mode)

// (13) End clear read/modify/write (doesn't work in SPI mode)

// (14) RESET
#define DISPLAY_RESET_CMD      0xE2

// (15) Common output mode select
#define DISPLAY_SCAN_DIR_NORMAL    0xC0  
#define DISPLAY_SCAN_DIR_REVERSE  0xC8  

// (16) Power control set
#define DISPLAY_POWER_CONTROL    0x28
#define DISPLAY_POWER_LOW_POWER    0x2F
#define DISPLAY_POWER_WIDE_RANGE  0x2F 
#define DISPLAY_POWER_LOW_VOLTAGE  0x2B 

// (17) V0 voltage regulator internal resistor ratio set
#define DISPLAY_VOLTAGE            0x20

// (18) Electronic volume mode set
#define DISPLAY_VOLUME_MODE_1      0x81
// (18) Register
#define DISPLAY_VOLUME_MODE_2      0x00

// (19) Static indicator ON/OFF
#define DISPLAY_INDICATOR_ON         0xAD  
#define DISPLAY_INDICATOR_OFF        0xAC  
// (19) Static indicator register set
#define DISPLAY_INDICATOR_MODE_OFF   0x00
#define DISPLAY_INDICATOR_MODE_1HZ   0x01
#define DISPLAY_INDICATOR_MODE_2HZ   0x10
#define DISPLAY_INDICATOR_MODE_ON    0x11

// (20) Booster ratio set
#define DISPLAY_BOOSTER_SET        0xF8
#define DISPLAY_BOOSTER_234        0x00
#define DISPLAY_BOOSTER_5          0x01
#define DISPLAY_BOOSTER_6          0x03

// (21) Power save

// (22) NOP
#define LCD_NOP                  0xE3

#endif /* EADOG128_6_H_ */

/*
 * eadog128_6.c
 *
 * Created: 22.01.2015 09:17:05
 *  Author: Dipl.- Ing. C. Graci
 */ 


#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/io.h>
#include <stdlib.h>
#include <stdarg.h>
#include <ctype.h>
#include <string.h>

#include "eadog128-6.h"
#include "font.h"
#include "../SoftwareTerrariumDisplay.h"

//##############################################################################################
//Init LC-Display
//##############################################################################################
void display_init(void)
{
  //Set TIMER0 (PWM OC2 Pin)
/*
  BRIGHTNESS_PWM_DDR |= (1<<BRIGHTNESS_PWM_PIN);//PWM PORT auf Ausgang (OC2)
  TCCR2 |= (1<<WGM21|1<<WGM20|1<<COM21|1<<CS20);  
  OCR2 = 50;
*/  
  //set outputs AO und RESET
  DDR_A0  |= (1<<PIN_A0);             
  DDR_RST |= (1<<PIN_RST);
  
  //Set SPI PORT
  DDR_SPI |= (1<<PIN_SPI_SCK)|(1<<PIN_SPI_MOSI)|(1<<PIN_SPI_CS1B);
  PORT_SPI |= (1<<PIN_SPI_CS1B);
  //Enable SPI, SPI in Master Mode
  SPCR = (1<<SPE)|(1<<MSTR);   
 
    //Reset the Display Controller
  PORT_RST &= ~(1<<PIN_RST);                   
  PORT_RST |= (1<<PIN_RST);
//  asm("nop");
  
  // init commands to Display
/*  display_write_byte(CMD, 0x40);    // set display start line to 0 
  display_write_byte(CMD, 0xa1);    // ADC set to reverse 
  display_write_byte(CMD, 0xc0);    // common output mode  
  display_write_byte(CMD, 0xa6);    // display normal
  display_write_byte(CMD, 0xa2);    // LCD bias 1/9 
  display_write_byte(CMD, 0x2f);    // all power  control circuits on 
  display_write_byte(CMD, 0xf8);    // set booster ratio to 
  display_write_byte(CMD, 0x00);    // 4x 
  display_write_byte(CMD, 0x27);    // set V0 voltage resistor ratio to large
  display_write_byte(CMD, 0x81);    // set contrast 
  display_write_byte(CMD, 0x10);    // contrast value, EA default: 0x016 
  display_write_byte(CMD, 0xac);    // indicator 
  display_write_byte(CMD, 0x00);    // disable 
  display_write_byte(CMD, 0xaf);    // display on 
*/    
  display_write_byte(CMD, 0x40);    // set display start line to 0 
  display_write_byte(CMD, 0xa0);    // ADC set to not reverse 
  display_write_byte(CMD, 0xc8);    // common output mode 
  display_write_byte(CMD, 0xa6);    // display normal, bit val 0: LCD pixel off. 
  display_write_byte(CMD, 0xa2);    // LCD bias 1/9 
  display_write_byte(CMD, 0x2f);    // all power  control circuits on 
  display_write_byte(CMD, 0xf8);    // set booster ratio to 
  display_write_byte(CMD, 0x00);    // 4x 
  display_write_byte(CMD, 0x27);    // set V0 voltage resistor ratio to large
  display_write_byte(CMD, 0x81);    // set contrast 
  display_write_byte(CMD, 0x18);    // contrast value, EA default: 0x016 
  display_write_byte(CMD, 0xac);    // indicator 
  display_write_byte(CMD, 0x00);    // disable 
  display_write_byte(CMD, 0xaf);    // display on 
  
  display_clear();
  
  display_go_to(0,0);
}

//##############################################################################################
//Writes one byte to data or cmd register
//##############################################################################################
void display_write_byte(unsigned cmd_data, unsigned char data) 
{
  PORT_SPI &= ~(1<<PIN_SPI_CS1B);
  _delay_us(10);
  if(cmd_data == 0)
  {
    PORT_A0 |= (1<<PIN_A0);
  }
  else
  {
    PORT_A0 &= ~(1<<PIN_A0);
  }
  _delay_us(10);
  SPDR = data;
  while(! (SPSR & (1<<SPIF)));  // warten bis die Übertragung beendet ist
//  spi_send (data, PIN_SPI_CS1B);
  PORT_SPI |= (1<<PIN_SPI_CS1B);
  _delay_us(10);
}

/********************************************************************************
Function to clear Display
********************************************************************************/
void display_clear(void)
{
  unsigned char page, col;
  
  for(page=0;page<8;page++) 
  {
    display_go_to(1,page);
  
    for (col=0;col<LCD_WIDTH;col++)
    {
      display_write_byte(0,0x00);
    }
  }
  display_go_to(0,0);
}

/********************************************************************************
Function to go to x,y
********************************************************************************/
void display_go_to (unsigned char x, unsigned char y)
{
  // x = x + 4;  // offset von 4 mit einrechnen
  display_write_byte(1,DISPLAY_PAGE_ADDRESS | ((y) & 0x0F));
  display_write_byte(1,DISPLAY_COL_ADDRESS_MSB | ((x>>4) & 0x0F));
  display_write_byte(1,DISPLAY_COL_ADDRESS_LSB | ((x) & 0x0F));
  return;
}

/********************************************************************************
Ausgabe einer Zeichenkette
********************************************************************************/
void display_write(unsigned char *string, int x, int y)
{
  char data[128];
  int i;
  x = x + 4;  // offset von 4 mit einrechnen
  display_go_to(x,y);    // an Stelle x,y springen

  for(i=0; i<128; i++)  // Datenspeicher löschen
  {
    data[i] = 0x00;
  }
  
  for(i=0; i<strlen(string); i++) // Umwandlung in Grafikzeichen
  {
    memcpy(data + 8*i, cs[string[i]], 8);
  }
  
  for(i=0; i<128; i++)  // Schreiben der Daten ans Display
  {
    display_write_byte(0, data[i]);
  }
}



von spess53 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi

>#define PIN_SPI_CS3      4    //PB4

Das wird im Programm nicht verwendet und hängt, wenn ich nichts 
übersehen habe, in der Schaltung in der Luft. Da das aber das SS-Pin vom 
SPI ist und es auf Eingang liegt, kann es passieren, das das SPI durch 
Einstreuungen auf den Pin in den Slave-Mode wechselt. Siehe Datenblatt:

 19.3 SS Pin Functionality

MfG Spess

von dummy (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>Anschließend hängt sich mein
>Programm an der Stelle
>
>while(! (SPSR & (1<<SPIF)));  // warten bis die Übertragung beendet ist
>
>auf.

Das passiert wenn der SS Pin kein Ausgang ist.

von CG (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Oh mann danke für eure Hilfe
das war der Fehler :-)
Hab es gerade ausprobiert und siehe da es geht.... das habe ich ganz 
übersehen!
Super dankeschön :-)

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.