Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 06.02.2017, 11:27   #1
CERGEI
Senior Member
 
Аватар для CERGEI
 
Регистрация: 11.07.2009
Возраст: 36
Сообщений: 526
Вес репутации: 183/40
CERGEI has a spectacular aura aboutCERGEI has a spectacular aura about
По умолчанию XC8 memset

Не пойму что ему не понравилось в применении memset,я ее применил для обнуления массива символов.А он мне обижается что я ее переопределил.
Код:
C:\Program Files (x86)\Microchip\xc8\v1.38\sources\common\memset.c:8: error: (1098) conflicting declarations for variable "_memset" (LCDBlocking.c:153)
main.c
Код:

#include <xc.h>                     // подключение процессора
#include <string.h>
//#include "LCDHD44780.h"
#include "LCDBlocking.h"
#define _XTAL_FREQ	4000000         // тактовая частота

//#define FOUR_BIT_MODE  
//#define Nop()				asm("nop")
//typedef unsigned char           BYTE;

// под жки
//    #define LCD_RS_TRIS			(TRISB4)
//	#define LCD_RS_IO			(RB4)
//	#define LCD_E_TRIS			(TRISB5)
//	#define LCD_E_IO			(RB5)
//    #define LCD_DATA0_TRIS      (TRISB0)
//    #define LCD_DATA0_IO       	(RB0)
//    #define LCD_DATA1_TRIS      (TRISB1)
//    #define LCD_DATA1_IO       	(RB1)
//    #define LCD_DATA2_TRIS      (TRISB2)
//    #define LCD_DATA2_IO       	(RB2)
//    #define LCD_DATA3_TRIS      (TRISB3)
//    #define LCD_DATA3_IO       	(RB3)


// LCDText is a 32 byte shadow of the LCD text.  Write to it and 
// then call LCDUpdate() to copy the string into the LCD module.
//unsigned char LCDText[16*2+1];

//typedef unsigned char           BYTE; 

//WDTE =	Watchdog Timer Enable bit
#pragma config WDTE = OFF        // ON	WDT disable
//#pragma config WDTE = ON        // ON	WDT enabled
//PWRTE =	Power-up Timer Enable bit
#pragma config PWRTE = OFF      // OFF	PWRT disable
//#pragma config PWRTE = ON      // OFF	PWRT enabled
//CP =	Flash Program Memory Code Protection bits
#pragma config CP  = OFF         // OFF	Code protection off
//#pragma config CP  = ALL         // OFF	Code protection off
//BOREN =	Brown-out Reset Enable bit
#pragma config BOREN = ON       //ON	Enabled
//DEBUG =	In-Circuit Debugger Mode bit
#pragma config DEBUG = OFF      //OFF	In-Circuit Debugger disabled, RB6 and RB7 are general purpose I/O pins
//LVP =	Low Voltage In-Circuit Serial Programming Enable bit
#pragma config LVP = OFF
//CPD =	Data EE Memory Code Protection
#pragma config CPD = OFF
//#pragma config CPD = ON
//WRT =	FLASH Program Memory Write Enable
#pragma config WRT = OFF
//FOSC =	Oscillator Selection bits
#pragma config FOSC = HS        //HS	HS oscillator


//void LCDWrite(BYTE RS, BYTE Data);
//void LCDInit(void);
//void LCDUpdate(void);







//__EEPROM_DATA(
//0x00, 0x01,         // 
//0x00, 0x00,         //
//0x00, 0x00,         //
//0x00, 0x00);		//
//------------------------------------------------------------------------------



void main(void) 
{
    //CLRWDT();	// сброс сторожевого таймера
  
// настройка портов
	// настройка порта А
	TRISA	= 0b00000000; 	// RA0 вход датчика температуры
	PORTA	= 0;
	// настройка порта B
	TRISB	= 0b11110000; 	// 
	PORTB	= 0;
	// настройка порта C
	TRISC	= 0b00000000;	//
	PORTC	= 0;
	// настройка порта D
	//TRISD	= 0b00000000;	// вход контроля датчика освещенности
	//PORTD	= 0;
	// настройка порта E
	//TRISE	= 0;
	//PORTE	= 0;
    
	ADCON1 = 0x06;	// Digital I/O
//-----------------------------------------------------------------------------
    CLRWDT();	// сброс сторожевого таймера
    ei();	// включить прерывания
    
    LCDInit();
    //LCDUpdate();
   // LCDWrite(1, 'd');
   // LCDWrite(1, 0x49);
   // strcpypgm2ram((char*)LCDText, "IP:192.168.25.123");
    //LCDWrite(0, 0xC0);
	__delay_us(50);
    //LCDWrite(1, 't');
//------------------------------------------------------------------------------
    while (1)
    {
        CLRWDT();	// сброс сторожевого таймера
    
        
    }//конец главного цикла
}// конец программы




//-----------------------------------------------------------------

// прерывания
void interrupt isr(void)
{
   

//----------------------------------------------------------------------------	
}//
LCDBlocking.h
Код:
#ifndef XC_HEADER_TEMPLATE_H
#define	XC_HEADER_TEMPLATE_H

#include <xc.h> // include processor files - each processor file is guarded.  

#define _XTAL_FREQ	4000000         // тактовая частота

#define FOUR_BIT_MODE  
#define Nop()				asm("nop")

// под жки
    #define LCD_RS_TRIS			(TRISB4)
	#define LCD_RS_IO			(RB4)
	#define LCD_E_TRIS			(TRISB5)
	#define LCD_E_IO			(RB5)
    #define LCD_DATA0_TRIS      (TRISB0)
    #define LCD_DATA0_IO       	(RB0)
    #define LCD_DATA1_TRIS      (TRISB1)
    #define LCD_DATA1_IO       	(RB1)
    #define LCD_DATA2_TRIS      (TRISB2)
    #define LCD_DATA2_IO       	(RB2)
    #define LCD_DATA3_TRIS      (TRISB3)
    #define LCD_DATA3_IO       	(RB3)


// LCDText is a 32 byte shadow of the LCD text.  Write to it and 
// then call LCDUpdate() to copy the string into the LCD module.
unsigned char LCDText[16*2+1];
typedef unsigned char BYTE; 


void LCDWrite(BYTE RS, BYTE Data);
void LCDInit(void);
void LCDUpdate(void);

#ifdef	__cplusplus
extern "C" {
#endif /* __cplusplus */

    // TODO If C++ is being used, regular C code needs function names to have C 
    // linkage so the functions can be used by the c code. 

#ifdef	__cplusplus
}
#endif /* __cplusplus */

#endif	/* XC_HEADER_TEMPLATE_H */
LCDBlocking.c
Код:

#include "LCDBlocking.h"



/******************************************************************************
 * Function:        static void LCDWrite(BYTE RS, BYTE Data)
 *
 * PreCondition:    None
 *
 * Input:           RS - Register Select - 1:RAM, 0:Config registers
 *					Data - 8 bits of data to write
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        Controls the Port I/O pins to cause an LCD write
 *
 * Note:            None
 *****************************************************************************/
void LCDWrite(BYTE RS, BYTE Data)
{
    unsigned char temp=0;
	#if defined(LCD_DATA_TRIS)
		LCD_DATA_TRIS = 0x00;
	#else
		LCD_DATA0_TRIS = 0;
		LCD_DATA1_TRIS = 0;
		LCD_DATA2_TRIS = 0;
		LCD_DATA3_TRIS = 0;
		#if !defined(FOUR_BIT_MODE)
		LCD_DATA4_TRIS = 0;
		LCD_DATA5_TRIS = 0;
		LCD_DATA6_TRIS = 0;
		LCD_DATA7_TRIS = 0;
		#endif
	#endif
	LCD_RS_TRIS = 0;
//	LCD_RD_WR_TRIS = 0;
//	LCD_RD_WR_IO = 0;
	LCD_RS_IO = RS;

#if defined(FOUR_BIT_MODE)
	#if defined(LCD_DATA_IO)
		LCD_DATA_IO = Data>>4;
	#else
        temp=Data&0x10;
        if(temp)
            LCD_DATA0_IO = 1;
        else LCD_DATA0_IO =0;
        temp=Data&0x20;
        if(temp)
            LCD_DATA1_IO = 1;
        else LCD_DATA0_IO =0;
        temp=Data&0x40;
        if(temp)
            LCD_DATA2_IO = 1;
        else LCD_DATA2_IO = 0;
        temp=Data&0x80;
        if(temp)
            LCD_DATA3_IO = 1;
        else LCD_DATA3_IO = 0;
	#endif
	Nop();					// Wait Data setup time (min 40ns)
	Nop();
	LCD_E_IO = 1;
	Nop();					// Wait E Pulse width time (min 230ns)
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	LCD_E_IO = 0;
#endif

	#if defined(LCD_DATA_IO)
		LCD_DATA_IO = Data;
	#else
		LCD_DATA0_IO = ((Data & 0x01) == 0x01);
		LCD_DATA1_IO = ((Data & 0x02) == 0x02);
		LCD_DATA2_IO = ((Data & 0x04) == 0x04);
		LCD_DATA3_IO = ((Data & 0x08) == 0x08);
		#if !defined(FOUR_BIT_MODE)
		LCD_DATA4_IO = ((Data & 0x10) == 0x10);
		LCD_DATA5_IO = ((Data & 0x20) == 0x20);
		LCD_DATA6_IO = ((Data & 0x40) == 0x40);
		LCD_DATA7_IO = ((Data & 0x80) == 0x80);
		#endif
	#endif
	Nop();					// Wait Data setup time (min 40ns)
	Nop();
	LCD_E_IO = 1;
	Nop();					// Wait E Pulse width time (min 230ns)
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	Nop();
	LCD_E_IO = 0;

//	// Uncomment if you want the data bus to go High-Z when idle
//	// Note that this may make analog functions work poorly when using 
//	// Explorer 16 revision 5 boards with a 5V LCD on it.  The 5V LCDs have 
//  // internal weak pull ups to 5V on each of the I/O pins, which will 
//  // backfeed 5V weekly onto non-5V tolerant PIC I/O pins.
//	#if defined(LCD_DATA_TRIS)
//		LCD_DATA_TRIS = 0xFF;
//	#else
//		LCD_DATA0_TRIS = 1;
//		LCD_DATA1_TRIS = 1;
//		LCD_DATA2_TRIS = 1;
//		LCD_DATA3_TRIS = 1;
//		#if !defined(FOUR_BIT_MODE)
//		LCD_DATA4_TRIS = 1;
//		LCD_DATA5_TRIS = 1;
//		LCD_DATA6_TRIS = 1;
//		LCD_DATA7_TRIS = 1;
//		#endif
//	#endif
//	LCD_RS_TRIS = 1;
//	LCD_RD_WR_TRIS = 1;
}


/******************************************************************************
 * Function:        void LCDInit(void)
 *
 * PreCondition:    None
 *
 * Input:           None
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        LCDText[] is blanked, port I/O pin TRIS registers are 
 *					configured, and the LCD is placed in the default state
 *
 * Note:            None
 *****************************************************************************/
void LCDInit(void)
{
	BYTE i;
    memset(LCDText,' ',5);
	//memset(LCDText, ' ', 5/*sizeof(LCDText)-1*/);
	LCDText[sizeof(LCDText)-1] = 0;

	// Setup the I/O pins
	LCD_E_IO = 0;
	//LCD_RD_WR_IO = 0;


	#if defined(LCD_DATA_TRIS)
		LCD_DATA_TRIS = 0x00;
	#else
		LCD_DATA0_TRIS = 0;
		LCD_DATA1_TRIS = 0;
		LCD_DATA2_TRIS = 0;
		LCD_DATA3_TRIS = 0;
		#if !defined(FOUR_BIT_MODE)
		LCD_DATA4_TRIS = 0;
		LCD_DATA5_TRIS = 0;
		LCD_DATA6_TRIS = 0;
		LCD_DATA7_TRIS = 0;
		#endif
	#endif
	//LCD_RD_WR_TRIS = 0;
	LCD_RS_TRIS = 0;
	LCD_E_TRIS = 0;


	// Wait the required time for the LCD to reset
	__delay_ms(40);

	// Set the default function
	// Go to 8-bit mode first to reset the instruction state machine
	// This is done in a loop 3 times to absolutely ensure that we get 
	// to 8-bit mode in case if the device was previously booted into 
	// 4-bit mode and our PIC got reset in the middle of the LCD 
	// receiving half (4-bits) of an 8-bit instruction
	LCD_RS_IO = 0;
	#if defined(LCD_DATA_IO)
		LCD_DATA_IO = 0x03;
	#else
		LCD_DATA0_IO = 1;
		LCD_DATA1_IO = 1;
		LCD_DATA2_IO = 0;
		LCD_DATA3_IO = 0;
		#if !defined(FOUR_BIT_MODE)
		LCD_DATA4_IO = 0;
		LCD_DATA5_IO = 0;
		LCD_DATA6_IO = 0;
		LCD_DATA7_IO = 0;
		#endif
	#endif
	Nop();					// Wait Data setup time (min 40ns)
	Nop();
    
	for(i = 0; i < 3u; i++)
	{
		LCD_E_IO = 1;
        //while(1);
		__delay_us(10);			// Wait E Pulse width time (min 230ns)
		LCD_E_IO = 0;
		__delay_ms(2);
	}
	
#if defined(FOUR_BIT_MODE)
		#if defined(LCD_DATA_IO)
			LCD_DATA_IO = 0x02;
		#else
			LCD_DATA0_IO = 0;
			LCD_DATA1_IO = 1;
			LCD_DATA2_IO = 0;
			LCD_DATA3_IO = 0;
		#endif
		Nop();					// Wait Data setup time (min 40ns)
		Nop();
		LCD_E_IO = 1;
		__delay_us(10);			// Wait E Pulse width time (min 230ns)
		LCD_E_IO = 0;
#else
	// Use 8-bit mode with two lines
    //LCDWrite(0, 0x28);
	LCDWrite(0, 0x38);
#endif
	__delay_us(50);
	LCDWrite(0, 0x28);
    __delay_us(50);
	// Set the entry mode
	LCDWrite(0, 0x08);	// Increment after each write, do not shift
	__delay_us(50);

	// Set the display control
	LCDWrite(0, 0x01);		// Turn display on, no cusor, no cursor blink
	
    __delay_ms(2);
	// Clear the display
	LCDWrite(0, 0x0E);	
	__delay_us(50);
    while(1);
	
}


/******************************************************************************
 * Function:        void LCDUpdate(void)
 *
 * PreCondition:    LCDInit() must have been called once
 *
 * Input:           LCDText[]
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        Copies the contents of the local LCDText[] array into the 
 *					LCD's internal display buffer.  Null terminators in 
 *					LCDText[] terminate the current line, so strings may be 
 *					printed directly to LCDText[].
 *
 * Note:            None
 *****************************************************************************/
void LCDUpdate(void)
{
	BYTE i, j;

	// Go home
	LCDWrite(0, 0x02);
	__delay_ms(2);

	// Output first line
	for(i = 0; i < 16u; i++)
	{
		// Erase the rest of the line if a null char is 
		// encountered (good for printing strings directly)
		if(LCDText[i] == 0u)
		{
			for(j=i; j < 16u; j++)
			{
				LCDText[j] = ' ';
			}
		}
		LCDWrite(1, LCDText[i]);
		__delay_us(50);
	}
	
	// Set the address to the second line
	LCDWrite(0, 0xC0);
	__delay_us(50);

	// Output second line
	for(i = 16; i < 32u; i++)
	{
		// Erase the rest of the line if a null char is 
		// encountered (good for printing strings directly)
		if(LCDText[i] == 0u)
		{
			for(j=i; j < 32u; j++)
			{
				LCDText[j] = ' ';
			}
		}
		LCDWrite(1, LCDText[i]);
		__delay_us(50);
	}
}
Миниатюры
2017-02-06_16-23-47.png  
CERGEI вне форума   Ответить с цитированием
Старый 06.02.2017, 11:34   #2
CERGEI
Senior Member
 
Аватар для CERGEI
 
Регистрация: 11.07.2009
Возраст: 36
Сообщений: 526
Вес репутации: 183/40
CERGEI has a spectacular aura aboutCERGEI has a spectacular aura about
По умолчанию Re: XC8 memset

Решено,нужно было подключить файл string.h в LCDBlocking.h для объявления функции memset.
CERGEI вне форума   Ответить с цитированием
Старый 06.02.2017, 12:15   #3
CERGEI
Senior Member
 
Аватар для CERGEI
 
Регистрация: 11.07.2009
Возраст: 36
Сообщений: 526
Вес репутации: 183/40
CERGEI has a spectacular aura aboutCERGEI has a spectacular aura about
По умолчанию Re: XC8 memset

Как соединить две строки в xc8 ? Первая строка константа,вторая обычная char.
Есть функции strcat,но принимает чтоб первая обычная char,а вторая константа.
Хочу собирать строку Temp=34 С , при том что температуру буду брать с датчика преобразовывая в строку с помощью itoa.
CERGEI вне форума   Ответить с цитированием
Старый 06.02.2017, 12:27   #4
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 32
Сообщений: 1,320
Вес репутации: 2246/74
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: XC8 memset

Цитата:
Сообщение от CERGEI Посмотреть сообщение
Как соединить две строки в xc8 ? Первая строка константа,вторая обычная char.
Есть функции strcat,но принимает чтоб первая обычная char,а вторая константа.
Хочу собирать строку Temp=34 С , при том что температуру буду брать с датчика преобразовывая в строку с помощью itoa.
Код:
sprintf(pMystr, "Temp=%dC", sensor_temperature);
Рак вне форума   Ответить с цитированием
Старый 06.02.2017, 12:43   #5
CERGEI
Senior Member
 
Аватар для CERGEI
 
Регистрация: 11.07.2009
Возраст: 36
Сообщений: 526
Вес репутации: 183/40
CERGEI has a spectacular aura aboutCERGEI has a spectacular aura about
По умолчанию Re: XC8 memset

Спасибо,сейчас пробну ваш пример.
Я так извратился немного:
Код:
memset(Temp, ' ', sizeof(Temp)-1);
	Temp[sizeof(Temp)-1] = 0;
    
    memset(LCDTemp, ' ', sizeof(LCDTemp)-1);
	LCDText[sizeof(LCDTemp)-1] = 0;
    
    //strcpy(LCDTemp,'C')
    if(minus)
        strcpy(LCDText, " temp=-");
    else
        strcpy(LCDText, " temp=");
    itoa(Temp, ds18b20, 10);
    //strcat(Temp,'C')
    strcat(LCDText,Temp);
    strcat(LCDText,"c");
    LCDUpdate();
Раньше помню извращался,выводил по буквам на индикатор.Потом преобразовывал в двоично десятичный код(цифры по отдельности),выводил их по цифрам......
Миниатюры
2017-02-06_17-41-36.png  
CERGEI вне форума   Ответить с цитированием
Старый 06.02.2017, 12:58   #6
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 32
Сообщений: 1,320
Вес репутации: 2246/74
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: XC8 memset

Цитата:
Сообщение от CERGEI Посмотреть сообщение
Спасибо,сейчас пробну ваш пример.
Я так извратился немного:
Код:
memset(Temp, ' ', sizeof(Temp)-1);
	Temp[sizeof(Temp)-1] = 0;
    
    memset(LCDTemp, ' ', sizeof(LCDTemp)-1);
	LCDText[sizeof(LCDTemp)-1] = 0;
    
    //strcpy(LCDTemp,'C')
    if(minus)
        strcpy(LCDText, " temp=-");
    else
        strcpy(LCDText, " temp=");
    itoa(Temp, ds18b20, 10);
    //strcat(Temp,'C')
    strcat(LCDText,Temp);
    strcat(LCDText,"c");
    LCDUpdate();
Раньше помню извращался,выводил по буквам на индикатор.Потом преобразовывал в двоично десятичный код(цифры по отдельности),выводил их по цифрам......
Я ранее тоже изголялся, все такты и байты экономил. Из-за этого получил боязнь чужих библиотек, сейчас "лечусь" потихоньку. Тот же memcpy у ARM с определенного кол-ва копируемых байт переходит в режим аппаратного копирования по 4 байта, что бы ускорится. А вывод на дисплей не такая уж и частая задача.
Рак вне форума   Ответить с цитированием
Старый 06.02.2017, 13:47   #7
CERGEI
Senior Member
 
Аватар для CERGEI
 
Регистрация: 11.07.2009
Возраст: 36
Сообщений: 526
Вес репутации: 183/40
CERGEI has a spectacular aura aboutCERGEI has a spectacular aura about
По умолчанию Re: XC8 memset

Цитата:
Сообщение от Рак Посмотреть сообщение
Я ранее тоже изголялся, все такты и байты экономил. Из-за этого получил боязнь чужих библиотек
Я не экономил,просто пытался все в ручную делать.Это типа такого контроля тотально,все вручную.
CERGEI вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
XC8 Pro или XC8 Standart? NSS Продукция MICROCHIP 27 03.02.2016 14:19
xc8 besogon Вопросы начинающих 197 10.05.2015 13:05
XC8 ругает на размер массива. djoni-kga Вопросы начинающих 19 10.10.2014 18:29
XC8 & OSA вопрос tester-y SSH Инструментарий 3 03.03.2013 07:44
mplabx проект на XC8 с модулем на асм. EugenOS Продукция MICROCHIP 8 08.11.2012 21:26


Часовой пояс GMT +3, время: 16:07.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot