PIC problém s kompilací
Moderátor: Moderátoři
PIC problém s kompilací
Zdravím,
Může mi prosím někdo pomoct? Mám pic18F26K80 kompilátor XC8
v souboru XLCD.h mám deklaraci funkce
void CLCD_PutC(unsigned char);
a vsouboru XLCD.c je funkce
samozřejmě je zde includovan soubor xlcd.h
void CLCD_PutC(unsigned char ch) {
CLCD_SendData(ch);
}
No a při kompilaci to píše chybu
error: (1098) conflicting declarations for variable "_CLCD_PutC"
Nevíte někdo co s tím?
Může mi prosím někdo pomoct? Mám pic18F26K80 kompilátor XC8
v souboru XLCD.h mám deklaraci funkce
void CLCD_PutC(unsigned char);
a vsouboru XLCD.c je funkce
samozřejmě je zde includovan soubor xlcd.h
void CLCD_PutC(unsigned char ch) {
CLCD_SendData(ch);
}
No a při kompilaci to píše chybu
error: (1098) conflicting declarations for variable "_CLCD_PutC"
Nevíte někdo co s tím?
No co jsem vyčetl kdesi na foru microchipu tak nejsem jeinej komu to tohle dělalo a pokud jsem to dobře pochopil tak někdo u microchipu naprosto ženijálně vymyslel že ke starší verzi kompilátoru dá o něco novější knihovny a pak si to takhle nerozumí.Ale ono už je to jedno protože si tu hraju se starším LCD displejem 2x16 znaku nechce to chodit a datasheet od něja taky není je to typ OM1628-GNN a furt to nechce chodit až teď jsem našel prastarej program v asm o kterým vím že to s ním chodilo a nepoužíval jsem tam časování jako teď,ale čtení BUSY flagu tak to přepíšu..
Datasheet zde:
http://web.archive.org/web/200601081215 ... pec_r1.pdf
http://web.archive.org/web/200601081215 ... pec_r1.pdf
Tak jsem se k tomu zas na chvilku dostal,desku s 16F876 už nemám takže tenhle způsob ozkoušení je mimo hru.Displeje stále nechodí zkoušel jsem to znouze i v mikrobasicu a nic takže teď vezmu původní asm a zkusím to na 16F1509 a pokud to nebude chodit je po nich.Ale abych se vrátil k původnímu dotazu. Mám soubor main.c v něm volám funkci LCD_putchar("a") dekalrace této funkce je v souboru xlcd.h verze kompilátoru 1.33 píše chybu viz.1 příspěvek verze 2.36 to sežere normálně bez chyby. Ale když deklaraci funkce přesunu do souboru main.c tak to sežere i verze 1.33 to vypadá jako kdyby ta starší verze includovala soubor xlcd.h bůhví kam.Zatím co novější verze to dá pěkně na začátek a tím pádem je to bez chyby.By mě zajímalo jak to je...
Zdravím snad nebude vadit když se zeptám zde,už jse, zkusil 5 LCD displejů a bezvýsledně mám 3 displeje 2x16 na těch se rozsvítí horní řádek a polovina spodního u těch předpokládám že jsou k.o Potom mám 2x20 a u těch svítí jen horní žádek máte prosím někdo ověřenej kód pro 2x16 a 2x20 o který byste byli schopni se podělit.Kdysi mo to chodilo s tímhle http://prochazka.clanweb.eu/index.php?a=pic/lcd_4bit
ale teď ani ťuk.Díky
ale teď ani ťuk.Díky
Kód momentálně nemám, mám ho zahrabanej někde v archivu taky na DVD a není moc čas to hledat, ale když svítí jeden řádek a druhej ne, tak ti neproběhl ani init toho displeje.
Na té odkazované stránce jsem nenašel frekvenci krystalu k tomu kódu, ale je to tam samej delay, takže na tom záleží, a ten PIC18F26K80 umí až do 64MHz. Máš dobře nastavený oscilátor? Kmitá ti u toho 16F877 krystal (nebo máš nastavenej dobře ten 16F1509, na kterým to tedy asi zkoušíš, jestli jsem to dobře pochopil)?
Ještě můžeš zkusit použít kód od Asixu, tam je aspoň vše k věci známo:
https://asix.tech/_museum/pvk40_cz.htm
Na té odkazované stránce jsem nenašel frekvenci krystalu k tomu kódu, ale je to tam samej delay, takže na tom záleží, a ten PIC18F26K80 umí až do 64MHz. Máš dobře nastavený oscilátor? Kmitá ti u toho 16F877 krystal (nebo máš nastavenej dobře ten 16F1509, na kterým to tedy asi zkoušíš, jestli jsem to dobře pochopil)?
Ještě můžeš zkusit použít kód od Asixu, tam je aspoň vše k věci známo:
https://asix.tech/_museum/pvk40_cz.htm
Nijak jsem s tím nepohnul můžete se mi prosím na to někdo mrknout ? dík
soubor hw_set.h
a soubor hw_set.c
Kód: Vybrat vše
/*
* File: main.c
* Author: nop
*
* Created on 20. dubna 2020, 19:36
*/
// CONFIG1L
#pragma config RETEN = OFF // VREG Sleep Enable bit (Ultra low-power regulator is Disabled (Controlled by REGSLP bit))
#pragma config INTOSCSEL = HIGH // LF-INTOSC Low-power Enable bit (LF-INTOSC in High-power mode during Sleep)
#pragma config SOSCSEL = DIG // SOSC Power Selection and mode Configuration bits (High Power SOSC circuit selected)
#pragma config XINST = OFF // Extended Instruction Set (Enabled)
// CONFIG1H
#pragma config FOSC = INTIO2 // Oscillator (Internal RC oscillator)
#pragma config PLLCFG = ON // PLL x4 Enable bit (Disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor (Disabled)
#pragma config IESO = OFF // Internal External Oscillator Switch Over Mode (Disabled)
// CONFIG2L
#pragma config PWRTEN = OFF // Power Up Timer (Disabled)
#pragma config BOREN = SBORDIS // Brown Out Detect->Enabled in hardware, SBOREN disabled
#pragma config BORV = 3 // Brown-out Reset Voltage bits->1.8V
#pragma config BORPWR = ZPBORMV // BORMV Power level (ZPBORMV instead of BORMV is selected)
// CONFIG2H
#pragma config WDTEN = OFF // Watchdog Timer (WDT disabled in hardware; SWDTEN bit disabled)
#pragma config WDTPS = 1048576 // Watchdog Postscaler (1:1048576)
// CONFIG3H
#pragma config CANMX = PORTB // ECAN Mux bit (ECAN TX and RX pins are located on RB2 and RB3, respectively)
#pragma config MSSPMSK = MSK7 // MSSP address masking (7 Bit address masking mode)
#pragma config MCLRE = ON // Master Clear Enable (MCLR Disabled, RE3 Enabled)
// CONFIG4L
#pragma config STVREN = OFF // Stack Overflow Reset (Disabled)
#pragma config BBSIZ = BB1K // Boot Block Size (1K word Boot Block size)
// CONFIG5L
#pragma config CP0 = OFF // Code Protect 00800-03FFF (Disabled)
#pragma config CP1 = OFF // Code Protect 04000-07FFF (Disabled)
#pragma config CP2 = OFF // Code Protect 08000-0BFFF (Disabled)
#pragma config CP3 = OFF // Code Protect 0C000-0FFFF (Disabled)
// CONFIG5H
#pragma config CPB = OFF // Code Protect Boot (Disabled)
#pragma config CPD = OFF // Data EE Read Protect (Disabled)
// CONFIG6L
#pragma config WRT0 = OFF // Table Write Protect 00800-03FFF (Disabled)
#pragma config WRT1 = OFF // Table Write Protect 04000-07FFF (Disabled)
#pragma config WRT2 = OFF // Table Write Protect 08000-0BFFF (Disabled)
#pragma config WRT3 = OFF // Table Write Protect 0C000-0FFFF (Disabled)
// CONFIG6H
#pragma config WRTC = OFF // Config. Write Protect (Disabled)
#pragma config WRTB = OFF // Table Write Protect Boot (Disabled)
#pragma config WRTD = OFF // Data EE Write Protect (Disabled)
// CONFIG7L
#pragma config EBTR0 = OFF // Table Read Protect 00800-03FFF (Disabled)
#pragma config EBTR1 = OFF // Table Read Protect 04000-07FFF (Disabled)
#pragma config EBTR2 = OFF // Table Read Protect 08000-0BFFF (Disabled)
#pragma config EBTR3 = OFF // Table Read Protect 0C000-0FFFF (Disabled)
// CONFIG7H
#pragma config EBTRB = OFF // Table Read Protect Boot (Disabled)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
/*Pripojeni sispleje
* E - PORTB 5
* RS - PORTB 4
*
* D4 - PORTB 0
* D5 - PORTB 1
* D6 - PORTN 2
* D7 - PORTB 3
*/
// Standartni kmihovny
#include <xc.h>
#include <pic18f26k80.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
// Moje knihovny
// Init MCU
#include "hw_set.h"
//Displej
//#include "xlcd.h"
// Rychlost MCU
#define _XTAL_FREQ 64000000
// Casovani blikani led
#define delay 100
//Pojmenovani PINu
#define LED LATCbits.LATC0
//Displej
#define RS_PIN LATBbits.LATB4 /* PORT for RS */
#define E_PIN LATBbits.LATB5
//Prototypy funkci
void LCD_STROBE(void);
void LCD_WRITE(unsigned char c);
void LCD_PUTCH(unsigned char c);
void LCD_CLEAR(void);
void LCD_GOTO(unsigned char pos);
void LCD_INIT(void);
//Promenne
volatile unsigned int i ;
void LCD_STROBE(void)
{
E_PIN = 1;
__delay_us(10);
E_PIN =0;
}
/* write a byte to the LCD in 4 bit mode */
void LCD_WRITE(unsigned char c)
{
LATB = (LATB & 0xF0) | (c >> 4);
LCD_STROBE();
LATB = (LATB & 0xF0) | (c & 0x0F);
LCD_STROBE();
__delay_us(40);
}
//* Clear and home the LCD
void LCD_CLEAR(void)
{
RS_PIN = 0;
LCD_WRITE(0x1);
__delay_ms(2);
}
/* write one character to the LCD */
void LCD_PUTCH(unsigned char c)
{
RS_PIN = 1; // write characters
LATB = (LATB & 0xF0) | (c >> 4);
LCD_STROBE();
LATB = (LATB & 0xF0) | (c & 0x0F);
LCD_STROBE();
__delay_us(40);
}
//* Go to the specified position
void LCD_GOTO(unsigned char pos)
{
RS_PIN = 0;
LCD_WRITE(0x80+pos);
}
void LCD_INIT(void)
{
RS_PIN = 0; // write control bytes
__delay_ms(10); // power on delay
__delay_ms(5);
LATB = 0x3; // attention!
LCD_STROBE();
__delay_ms(5);
LCD_STROBE();
__delay_us(100);
LCD_STROBE();
__delay_ms(5);
LATB = 0x2; // set 4 bit mode
LCD_STROBE();
__delay_us(40);
LCD_WRITE(0x28); // 4 bit mode, 1/16 duty, 5x8 font
LCD_WRITE(0x08); // display off
LCD_WRITE(0x0F); // display on, blink curson on
LCD_WRITE(0x06); // entry mode
}
void main(void) {
hw_init();
LCD_INIT();
LCD_PUTCH("A");
while (1)
{
LED = 1;
// Cekani 1 sec
for (i=0; i < delay; i++){
__delay_ms(10);
}
LED = 0;
// Cekani 1 sec
for (i=0; i < delay; i++){
__delay_ms(10);
}
}
};
Kód: Vybrat vše
#ifndef _MODUL_setting_osc
#define _MODUL_setting_osc
#include <xc.h>
#define _XTAL_FREQ 64000000
// INIT HW
void hw_init(void);
#endif
Kód: Vybrat vše
#include <xc.h>
void hw_init(void){
//Nastaveni oscilatoru
OSCCON = 0b01110000; //Interni oscilator 16MHz
OSCCON2 = 0b00000000;
OSCTUNE = 0b01000000; //PLL zapnuta (bit6)
REFOCON = 0b00000000;
//Nastaveni portu
ODCON = 0b000000000; // Peripheral OPEN DRAIN control
SLRCON = 0b000000000;
//PortA
TRISA = 0b00000000;
PORTA = 0b00000000;
LATA = 0b00000000;
ANCON0 = 0b00000000;
//PortB
WPUB = 0b11111111;
TRISB = 0b00000000;
PORTB = 0b00000000;
LATB = 0b00000000;
ANCON1 = 0b00000000;
//PortC
TRISC = 0b00000000;
PORTC = 0b00000000;
LATC = 0b00000000;
// open drain
ODCON = 0b00000000;
//Preruseni
/*
INTCONbits.GIE_GIEH = 1; //Bit 7 Zapnuta vsechna HIGH-priority preruseni
INTCONbits.PEIE_GIEL = 1; //Bit 6 Zapnuta vsechna LOW-priority preruseni
INTCONbits.TMR0IE = 0; //Bit 5 TMR0 interrupt OFF
INTCONbits.INT0IE = 0; //Bit 4 INT0 external interrupt OFF
INTCONbits.RBIE = 0; //Bit 3 Change PORTB interrupt OFF
INTCONbits.TMR0IF = 0; //Bit 2 TMR0 flag
INTCONbits.INT0IF = 0; //Bit 1 INT0 External interrup flag
INTCONbits.RBIF = 0; //Bit 0 Change PORTB interrupt flag
*/
INTCON = 0b00000000; //Tento zapis je uspornejsi v poctu instrukci
/*
INTCON2bits.RBPU = 1; //PortB pull ups OFF
INTCON2bits.INTEDG0 = 0; //External Interrupt 0 Edge select bit = Falling
INTCON2bits.INTEDG1 = 0;
INTCON2bits.INTEDG2 = 0;
INTCON2bits.INTEDG3 = 0;
INTCON2bits.TMR0IP = 0; //Tmr0 interrupt priority bit 0 - LOW, 1 - HIGH
INTCON2bits.INT3IP = 0; //Int3 Extrnal interrupt priority bit
INTCON2bits.RBIP = 0; //RB port change interrupt priority bit
*/
INTCON2 = 0b00000000;
/*
INTCON3bits.INT2IP = 0; //Int2 external interrupt priority bit 0-LOW 1-HI
INTCON3bits.INT1IP = 0; //Int1
INTCON3bits.INT3IE = 0; //Int3 External interrupt enable bit 0-OFF 1-ON
INTCON3bits.INT2IE = 0; //Int2
INTCON3bits.INT1IE = 0; //Int1
INTCON3bits.INT3IF = 0; //Int3 external interrupt Flag bit
INTCON3bits.INT2IF = 0; //Int2
INTCON3bits.INT1IF = 0; //Int1
*/
INTCON3 = 0b00000000;
/*
//PIE registry zapinaji interrupt jednotlivejch periferii
//Bit7 podle DS je PSPIE
//Parallel Slave Port Read/write interrupt enable bit
* //ale naseptavac ho nejak nezna
PIE1bits.ADIE = 0; //A/D converter Interrupt enable bit
PIE1bits.RC1IE = 0; //Eusart1 Receive interrupt enable bit
PIE1bits.TX1IE = 0; //Eusart1 Transmit interrupt enable bit
PIE1bits.SSPIE = 0; //MSSP interrupt enable bit
PIE1bits.TMR1GIE = 0; //TMR1 gate interrupt Enabli bit
PIE1bits.TMR2IE = 0; //TMR2 Overflow Interrupt Enable bit
PIE1bits.TMR1IE = 0; //TMR1 Overflow Interrupt Enable bit
*/
PIE1 = 0b00000000;
/*
PIE2bits.OSCFIE = 0; //bit7 Oscilator fault Interrupt enable bit
//bit 6 Neimplementováno
//bit 5 taky
//bit 4 taky
PIE2bits.BCLIE = 0; //bit 3 Bus colision interrupt enabli bit
PIE2bits.HLVDIE = 0; //bit 2 High/Low Voltage detect interrupt enable bit
PIE2bits.TMR3IE = 0; //bit 1 TMR3 overflow interrupt enable bit
PIE2bits.TMR3GIE = 0; //bit 0 TMR3 gate interrupt enable bit
*/
PIE2 = 0b00000000;
/*
//bit 7 není
//bit 6 taky ne
PIE3bits.RC2IE = 0; //bit 5 Eusart2 Recieve interrupt enable bit
PIE3bits.TX2IE = 0; //bit 4 Eusart2 Transmit interrupt enable bit
PIE3bits.CTMUIE = 0; //bit 3 CTMU interrupt enable bit
PIE3bits.CCP2IE = 0; //bit 2 CCP2 interrupt enable bit
PIE3bits.CCP1IE = 0; //bit 1 CCP1 interrupt enable bit
//bit 0 nepritomen
*/
PIE3 = 0b00000000;
/*
PIE4bits.TMR4IE = 0; //TMR4 Overflow interrupt enable bit
PIE4bits.EEIE = 0; //Data EEDATA/FLASH write operation interrupt enable
PIE4bits.CMP2IE = 0; //CMP2 interrupt enable bit
PIE4bits.CMP1IE = 0; //CMP1 interrupt enable bit
//bit 3 neprizomen
PIE4bits.CCP5IE = 0; //CCP5 interrupt enable bit
PIE4bits.CCP4IE = 0; //CCP4 interrupt enable bit
PIE4bits.CCP3IE = 0; //CCP3 interrupt enable bit
*/
PIE4 = 0b00000000;
/*
PIE5bits.IRXIE = 0; //Invalid message received interrupt enable bit
PIE5bits.WAKIE = 0; //Bus wake-up activity interrupt enable bit
PIE5bits.ERRIE = 0; //Error interrupt enable bit (multiple sources in COMSTAT register)
PIE5bits.TXB2IE = 0; //Transmit buffer 2 interrupt enable bit
PIE5bits.TXB1IE = 0; //Transmit buffer 1 interrupt enable bit
PIE5bits.TXB0IE = 0; //Transmit buffer 0 interrupt enable bit
PIE5bits.RXB1IE = 0; //Receive buffer 1 interrupt enable bir
PIE5bits.RXB0IE = 0; //bit 0 Mod 0 - Receive buffer 0 enable bit
//Mod 1 - unimplemented
//Mod 2 - FIFOFIE FIFO full interrupt enable bit
*/
PIE5 = 0b00000000;
/*
//bit 7 je PSPIP Paralel slave port Read/Write
//interrupt priority bit ale naseptavac to nejak nezna
IPR1bits.ADIP = 0; //A/D coverter interrupt priority bit 0-LOW 1-HIGH
IPR1bits.RC1IP = 0; //Eusart1 Receive interrupt priority bit
IPR1bits.TX1IP = 0; //Eusart1 Transmit interrupt priority bit
IPR1bits.SSPIP = 0; //Master synchronous serial port interrupt priority bit
IPR1bits.TMR1GIP = 0; //TMR1 gate interrupt priority bit
IPR1bits.TMR2IP = 0; //TMR2 to PR2 Match interrupt priority bit
IPR1bits.TMR1IP = 0; //TMR1 overflow interrupt priority bit
*/
IPR1 = 0b00000000;
/*
IPR2bits.OSCFIP = 0; //bit7 Oscilator Fail interrupt priority bit
//bity 6-4 nejsou
IPR2bits.BCLIP = 0; //bit3 Bus collsion interrupt priority bit
IPR2bits.HLVDIP = 0; //bit2 High/Low Voltage detect interrupt priority bit
IPR2bits.TMR3IP = 0; //bit1 TMR3 Overflow interrupt priority bit
IPR2bits.TMR3GIP = 0; //bit0 TMR3 Gate interrupt priority bit
*/
IPR2 = 0b00000010;
/*
//bity 7-6 nejsou v IPR3
IPR3bits.RC2IP = 0; //bit5 Eusart2 Receive interrupt priority bit
IPR3bits.TX2IP = 0; //bit4 Eusart2 Transmit interupt ptiority bit
IPR3bits.CTMUIP = 0; //bit3 CTMU interrupt priority bit
IPR3bits.CCP2IP = 0; //bit2 CCP2 interrupt priority bit
IPR3bits.CCP1IP = 0; //bit1 CCP1 interrupt priority bit
//bit0 neni
*/
IPR3 = 0b00000000;
/*
IPR4bits.TMR4IP = 0; //bit7 TMR4 Overfloe interrupt priority bit
IPR4bits.EEIP = 0; //bit6 EE interrupt priority bit
IPR4bits.CMP2IP = 0; //bit5 CMP2 interrupt priority bit
IPR4bits.CMP1IP = 0; //bit4 CMP1 interrupt priority bit
//bit3 neni
IPR4bits.CCP5IP = 0; //bit2 CCP5 interrupt priority bit
IPR4bits.CCP4IP = 0; //bit1 CCP4 interrupt priority bit
IPR4bits.CCP3IP = 0; //bit0 CCP3 interrupt priority bit
*/
IPR4 = 0b00000000;
/*
IPR5bits.IRXIP = 0; //Invalid Message Received interrupt priority
IPR5bits.WAKIP = 0; //Bus wakeup activity interrupt priority
IPR5bits.ERRIP = 0; //CAN bus Error interrupt interrupt priority
IPR5bits.TXB2IP = 0; //Transmit buffer 2 interrupt priority
IPR5bits.TXB1IP = 0; //Transmit buffer 1 interrupt priority
IPR5bits.TXB0IP = 0; //Transmit buffer 0 interrupt priority
IPR5bits.RXB1IP = 0; //Receive buffer 1 interrupt priority
//Mode O: 0-Low priority 1-HIGH
//Mode 1: neni
//Mode 2: FIFOIE: FIFO Full interrup priority
*/
IPR5 = 0b00000000;
//Nastaveni RESET registru
RCONbits.IPEN = 1; //Interrupt priority on
return;
}
1. return; na konci hw_set.c tam nemá co dělat
2. xc.h stačí připojit jen jednou v main.c
3. CONFIG1H: FOSC = INTIO2 = FOSC<3:0> val. 1000 = internal RC oscillator
4. Až si správně nastavíš oscilátor, budeš muset kontrolovat bity OSTS a HFIOFS, tj. počkat až ti těch 64 MHz správně naběhne
5. Používej logický analyzér
2. xc.h stačí připojit jen jednou v main.c
3. CONFIG1H: FOSC = INTIO2 = FOSC<3:0> val. 1000 = internal RC oscillator
4. Až si správně nastavíš oscilátor, budeš muset kontrolovat bity OSTS a HFIOFS, tj. počkat až ti těch 64 MHz správně naběhne
5. Používej logický analyzér
JJ dík oscilátor jsem změnil na
Kontrolu těch bitů tam dopíšu,ale je divný že ta ledka na konci programu blikala i tak cca v sekundovejch intervalech jak má.Teď na to už nemám čas neb musím za chvilku do práce.
Kód: Vybrat vše
#pragma config FOSC = EC3 // Oscillator (EC oscillator (High power, 16 MHz - 64 MHz))