Ok, ecco il codice:
- Codice: Seleziona tutto
/*
* File: display_18f.c
* Author: Teo
*
* Created on 17 February 2020, 10:44
*/
#include "display_18f.h"
#include <stdio.h>
#include <stdlib.h>
#include <delays.h>
#include <xlcd.h>
#include <xc.h>
#define LED1 LATCbits.LATC4
#define LED2 LATCbits.LATC5
void init_XLCD(void); //Initialize LCD display
void DelayFor18TCY( void ); //18 cycles delay
void DelayPORXLCD (void); // Delay of 15ms
void DelayXLCD (void); // Delay of 5ms
void init_XLCD(void) //Initialize LCD display
{
OpenXLCD(FOUR_BIT&LINES_5X7); //configure LCD in 4-bit Data Interface mode
//and 5x7 characters, multiple line display
while(BusyXLCD()); //Check if the LCD controller is not busy
//before writing some commands?
WriteCmdXLCD(DON); //start lcd
while(BusyXLCD()); //Check if the LCD controller is not busy
WriteCmdXLCD(0x06); // move cursor right, don?t shift display
while(BusyXLCD()); //Check if the LCD controller is not busy
WriteCmdXLCD(0x0C); //turn display on without cursor
}
void DelayFor18TCY( void ) //18 cycles delay with 8MHz clock
{
Delay10TCYx(20);
}
void DelayPORXLCD(void)// 15ms delay
{
Delay1KTCYx(30);// 15ms delay with 8MHz Clock
}
void DelayXLCD(void) // 5ms delay
{
Delay1KTCYx(10); // 5ms delay with 8MHz Clock
}
void main(void)
{
// init_XLCD(); //Call the Initialize LCD display function
/*
// PSPMODE=0; //parallel port (put in general purpose)
// PSPIE=0; // parallel slave port disable
// PSPIP=0; //dsable priority parallel slave
// TRISD = 0; // set port d as output
putrsXLCD("Hello World"); //Display "Hello World"
SetDDRamAddr(0x40); //shift cursor to beginning of second line
putrsXLCD("LCD Display"); //Display "LCD display"
for (int i = 1; i < 30; ++i)
{
__delay_ms (25);
}
WriteCmdXLCD(0x01); //celar screen
putrsXLCD("Holy poopy");
SetDDRamAddr(0x40); //shift cursor to beginning of second line
*/
for (int i = 1; i < 30; ++i)
{
__delay_ms (25);
}
TRISC5 = 0;
TRISC4 = 0;
LED1 = 0;
LED2 = 0;
while(1)
{
LED1 = 1;
LED2 = 0;
for (int i = 1; i < 30; ++i)
{
__delay_ms (25);
}
/* WriteCmdXLCD(0x01); //celar screen
while(BusyXLCD()); //Check if the LCD controller is not busy
putrsXLCD("Teo");
while(BusyXLCD()); //Check if the LCD controller is not busy
*/
LED1 = 0;
LED2 = 1;
for (int i = 1; i < 30; ++i)
{
__delay_ms (25);
}
/*
SetDDRamAddr(0x40); //shift cursor to beginning of second line
WriteCmdXLCD(0x01); //celar screen
putrsXLCD("I knew it");
while(BusyXLCD()); //Check if the LCD controller is not busy
*/
}
}
Questo è l'header, ma credo che qui non ci sia nulla di errato (illuso)
- Codice: Seleziona tutto
/*
* File: display_18f.h
* Author: Teo
*
* Created on 17 February 2020, 10:45
*/
#ifndef DISPLAY_18F_H
#define DISPLAY_18F_H
#ifdef __cplusplus
extern "C" {
#endif
// PIC18F4520 Configuration Bit Settings
// 'C' source line config statements
#undef _XTAL_FREQ
#define _XTAL_FREQ 8000000
#include <xc.h>
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
// CONFIG1H
#pragma config OSC = HS
//#pragma config OSC = INTIO67 // Oscillator Selection bits (Internal oscillator block, port function on RA6 and RA7)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
// CONFIG2L
#pragma config PWRT = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = SBORDIS // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config BORV = 3 // Brown Out Reset Voltage bits (Minimum setting)
// CONFIG2H
#pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 32768 // Watchdog Timer Postscale Select bits (1:32768)
// CONFIG3H
#pragma config CCP2MX = PORTC // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
#pragma config PBADEN = OFF // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
#pragma config LPT1OSC = OFF // Low-Power Timer1 Oscillator Enable bit (Timer1 configured for higher power operation)
#pragma config MCLRE = ON // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
// CONFIG4L
#pragma config STVREN = ON // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = ON // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
#pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
// CONFIG5L
#pragma config CP0 = OFF // Code Protection bit (Block 0 (000800-001FFFh) not code-protected)
#pragma config CP1 = OFF // Code Protection bit (Block 1 (002000-003FFFh) not code-protected)
#pragma config CP2 = OFF // Code Protection bit (Block 2 (004000-005FFFh) not code-protected)
#pragma config CP3 = OFF // Code Protection bit (Block 3 (006000-007FFFh) not code-protected)
// CONFIG5H
#pragma config CPB = OFF // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)
#pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
// CONFIG6L
#pragma config WRT0 = OFF // Write Protection bit (Block 0 (000800-001FFFh) not write-protected)
#pragma config WRT1 = OFF // Write Protection bit (Block 1 (002000-003FFFh) not write-protected)
#pragma config WRT2 = OFF // Write Protection bit (Block 2 (004000-005FFFh) not write-protected)
#pragma config WRT3 = OFF // Write Protection bit (Block 3 (006000-007FFFh) not write-protected)
// CONFIG6H
#pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
#pragma config WRTB = OFF // Boot Block Write Protection bit (Boot block (000000-0007FFh) not write-protected)
#pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
// CONFIG7L
#pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000800-001FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (002000-003FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (004000-005FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (006000-007FFFh) not protected from table reads executed in other blocks)
// CONFIG7H
#pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) not protected from table reads executed in other blocks)
#ifdef __cplusplus
}
#endif
#endif /* DISPLAY_18F_H */
In allegato il circuito in test su breadboard e la foto della scheda che dovrebbe pilotare il display ed altro già montata e realizzata. Ho rifatto tutto su bredboard perché il resto va ma con il display non ho mai giocato.
Come si vede, sotto il void main (void) ho commentato tante righe. Così i due led lampeggiano alla frequenza giusta. Quindi clock impostato corretto e port ok. Appena decommento la sola riga sotto il void main (void) che è init_xlcd, si pianta. Quindi do la colpa al modo di spostare le porte. Ho seguito pedissequamente quando descritto nel video youtube e nel manuale mplab c compiler libraries. Ma non va un tubo! quindi sbaglio, ma dove?
Ovviamente il display si alimenta, retro illuminazione ok, contrasto ok. Vedo la prima riga con tutti i quadrati più scuri e la seconda spenta.
Con l'oscilloscopio, su uno dei piedini da d4 a d7 non vedo "muoversi nulla" quindi il micro non sta facendo nulla.
thanks