PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD-Display mit dspic30f6011a



Chandler
09.06.2015, 11:22
Hallo,
ich habe ein dsPIC30F6011A und möchte damit ein LCD-Display www.reichelt.de/Background-green/LCD-162C-LED/3/index.html?&ACTION=3&LA=2&ARTICLE=31653&GROUPID=3005&artnr=LCD+162C+LED ansteuern. Allerdings scheitere ich schon an der Initialisierung. Ich möchte zunächst sehen, dass die Initialisierung geklappt hat und den Cursor an der ersten stelle des Displays blinken lassen.


#include <p30fxxxx.h>
#include <p30F6011A.h>
#include <xc.h>
#include <stdio.h>
#include "system.h"
#include <libpic30.h>

// Konfigurationbits
_FOSC(CSW_FSCM_OFF & ECIO_PLL8); //Run this project using an external crystal routed via the PLL in 8x multiplier mode
_FWDT(WDT_OFF); //Turn off the Watch-Dog Timer.
_FBORPOR(MCLR_EN & PWRT_OFF); //Enable MCLR reset pin and turn off the power-up timers.
_FGS(CODE_PROT_OFF); //Disable Code Protection

int main (void)
{
configure_pin();
__delay_ms(2000);
LATBbits.LATB12 = 0;
lcd_init();
while (1) {
__delay_ms(100);
LATBbits.LATB12 = !LATBbits.LATB12;
}
LATBbits.LATB13 = 0;
return 0;
}


void lcd_init( void )
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;

// LCD Soft Reset
__delay_ms(15);
lcd_nibble(0x03);
__delay_ms(5);
lcd_nibble(0x03);
__delay_us(100);
lcd_nibble(0x03);
__delay_ms(5);
lcd_nibble(0x02);
// Display settings
lcd_cmd(0x28 ); //
lcd_cmd(0x08);
lcd_cmd(0x01);
lcd_cmd(0x06);
lcd_cmd(0x0F);
}

void lcd_cmd( unsigned int data )
{
LCD_RS = 0; // RS auf 0 setzen
lcd_nibble(data >> 4);
lcd_nibble(data & 0x0F);
__delay_us( 45 );
}

static void lcd_nibble(unsigned char nibble)
{
LATGbits.LATG6 = (nibble>>3)&1;
LATGbits.LATG7 = (nibble>>2)&1;
LATGbits.LATG8 = (nibble>>1)&1;
LATGbits.LATG9 = (nibble>>0)&1;
lcd_enable();
}

static void lcd_enable( void )
{
LCD_EN = 1;
__delay_us(50);
LCD_EN = 0;
}


Allerdings zeigt mir das Display nach dem Durchlauf immer noch nur die erste Zeile mit Balken an. Die Verbindungen vom Controller zum Display sind alle vorhanden (auch richtig). Hat das schon einmal jemand gemacht und kann mir da evtl. einen Tip geben, wass ich noch berücksichtigen muss?

RoboHolIC
09.06.2015, 22:57
Hallo Chandler.

Vorweg die Frage: Hast du bereits anderweitige Erfahrung bzw. Erfolge mit diesem Controller?
Ich bin nämlich irritiert über die CONFIGs:
a) Startup-Timers deaktivieren: dafür sollte man schon einen guten Grund haben, diese Timer haben fast nur Vorteile
b) ECIO ist meines Wissens External Clock mit (dann unnützem) Oscillator-Out-Pin als I/O, keinesfalls aber ein Quarzoszillator für externen Quarz
c) Erfahrung mit PLL? Da gibt es ein, zwei Fallstricke bzgl. des nutzbaren Wertebereichs von Eingangsfrequenz und Multiplikator

Wenn es unglücklich läuft, arbeitet dein Controller hier mit dem internen Not-Taktgeber im zig-Kilohertz-Bereich und alle deine Zeiten sind rund tausendmal länger als erwartet.

Das Programm erscheint mir unvollständig, zumindest mangels include-Dateien schwer nachvollziehbar.
Kannst du uns auch den Schaltplan zeigen?

Noch ein paar Anmerkungen:
- welche Funktion hat LATBbits.LATB12 ? Eine Debugging-LED?
- Die Aktion auf LATBbits.LATB13 wird wegen des davor platzierten while (1) {} wohl niemals ausgeführt werden
- Warum wird für die Datenbits zum LCD mal ein unsigned char, mal ein unsigned int verwendet? Wenn es vielleicht auch nicht schadet, so hat es doch Fehlerpotential
- heißer Tipp: (viel) mehr Kommentare im Code !

Meine Empfehlungen:
- stelle den korrekten Prozessortakt sicher, z.B. anhand einer Debugging-LED, die im Sekundentakt blinken soll und auch in dieser Frequenz blinkt
- verlangsame das Timing; das LCD kommt auch mit quasi-stationären Signalen zurecht.
- notfalls stoppe nach jedem I/O-Vorgang den Programmablauf und prüfe, ob sich tatsächlich die erwarteten Leitungspegel einstellen

Zum Schluss:
Nicht böse sein, wenn ich dir Ratschläge unter deinem Niveau gegeben haben sollte. Ich kann nicht herauslesen, ob deine ziemlich unscharfe Anfrage auf Nachlässigkeit oder fehlender Erfahrung beruht.

Gruß
Christian.

Chandler
12.06.2015, 13:21
Oh, ja,
das war falsch von mir. ECIO ist für externe clock. das hatte ich falsch. da ich bei einem oszillator keinen multiplier einstellen kann, bin ich auf einen normalen quarz gegangen. jetzt läuft das display, aber kein can.

RoboHolIC
13.06.2015, 00:32
jetzt läuft das display, aber kein can. Ja super für das LCD! Aber was ist mit CAN? Ist das was Grundsätzliches wegen des Quarzes? Klappte CAN früher schon mal?

Edit:
Hab grade deinen Thread zum CAN auf dsPIC4011/6011 entdeckt.