//Я буду писать программу для 18F4550 с нуля,не чего не зная о нем и о USB модуле
//Для начала подключу ЖКИ и напишу код вывода на ЖКИ информации о присутствии на линии
//датчика температуры DS18B20
#include<p18cxxx.h>
#include<delays.h>
#include<xlcd.h> //Подключим библиотеку от Microchip для LCD
//Конфигурацию взял из PICDEM FS USB
#pragma config PLLDIV = 5 // (20 MHz кварцевый резонатор)
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2 // Clock source from 96MHz PLL/2
#pragma config FOSC = HSPLL_HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BOR = ON
#pragma config BORV = 3
#pragma config VREGEN = ON //USB Voltage Regulator
#pragma config WDT = OFF
#pragma config WDTPS = 32768
#pragma config MCLRE = ON
#pragma config LPT1OSC = OFF
#pragma config PBADEN = OFF
//#pragma config CCP2MX = ON
#pragma config STVREN = ON
#pragma config LVP = OFF
//#pragma config ICPRT = OFF // Dedicated In-Circuit Debug/Programming
#pragma config XINST = OFF // Extended Instruction Set
#pragma config CP0 = OFF
#pragma config CP1 = OFF
//#pragma config CP2 = OFF
//#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
//#pragma config WRT2 = OFF
//#pragma config WRT3 = OFF
#pragma config WRTB = OFF // Boot Block Write Protection
#pragma config WRTC = OFF
//#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
//#pragma config EBTR2 = OFF
//#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF
//###################################################################
#define tris_dallas TRISAbits.TRISA0
#define dallas LATAbits.LATA0
#define dallas_port PORTAbits.RA0
//###################################################################
#pragma udata
char dallas_ok[]="Dallas Reset";
char dallas_error[]="Error Dallas";
char error_dallas; //Флаг для датчика температуры
//###################################################################
#pragma code
void DelayFor18TCY(void) //Нужно обязательно для xlcd
{
Delay10TCYx(10);
}
void DelayPORXLCD(void)
{
Delay1KTCYx(75);
}
void DelayXLCD(void)
{
Delay1KTCYx(25);
}
//**********Прототипы функций для датчика температуры***************
void Delay480us(void);
void Delay60us(void);
void HowDelay(int);
char ResetDallas(void);
void DoutLow(void);
void DoutHigh(void);
//###################################################################
void main(void)
{
ADCON1 |= 0x0F;
OpenXLCD(FOUR_BIT&LINES_5X7); //У меня сразу не заработало
WriteCmdXLCD(CURSOR_OFF&BLINK_OFF); //Ошибку нашел в xlcd.h
//должно быть #define SHIFT_CUR_RIGHT 0b00001100,чтобы перекомпилить
//файлы из библиотеки ,нужно их добавить в проект.
while(1)
{
error_dallas=ResetDallas(); //Сброс датчика температуры
if(error_dallas){ //Если датчик не ответил
SetDDRamAddr(0x80);
putsXLCD(dallas_error);
}
else{ //Если датчик ответил
SetDDRamAddr(0x80);
putsXLCD(dallas_ok);
}
HowDelay(4); //Здаржка на большое время
}
}
//**********Функции для работы с датчиком температуры****************
char ResetDallas(void){ //Сброс датчика
char err=1;
DoutLow();
Delay480us();
DoutHigh();
Delay60us();
if(!dallas_port)
err=0;
Delay480us();
return err;
}
//Функции задержки
void Delay480us(void){
Delay100TCYx(24);
}
void Delay60us(void){
Delay100TCYx(6);
}
void HowDelay(int i){
int j=0;
for(;j<i;j++){
Delay10KTCYx(0);
}
}
//Функции протокола 1-wire
void DoutLow(void){ //устанавливает линию передачи в 0
dallas=0;
tris_dallas=0;
}
void DoutHigh(void){ //отпускает линию в 1 (+5В от резистора)
tris_dallas=1;
}
Только в железе работать не будет :(
Читаем datasheet на этот пик раздел 2.0 OSCILLATOR CONFIGURATIONS
#include<p18cxxx.h>
#include<delays.h>
#include<xlcd.h> //Подключим библиотеку от Microchip для LCD
//Конфигурацию взял из PICDEM FS USB
#pragma config PLLDIV = 5 // (20 MHz кварцевый резонатор)
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2 // Clock source from 96MHz PLL/2 контроллер работает на 48МГц
#pragma config FOSC = HSPLL_HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BOR = ON
#pragma config BORV = 3
#pragma config VREGEN = ON //USB Voltage Regulator
#pragma config WDT = OFF
#pragma config WDTPS = 32768
#pragma config MCLRE = ON
#pragma config LPT1OSC = OFF
#pragma config PBADEN = OFF
//#pragma config CCP2MX = ON
#pragma config STVREN = ON
#pragma config LVP = OFF
//#pragma config ICPRT = OFF // Dedicated In-Circuit Debug/Programming
#pragma config XINST = OFF // Extended Instruction Set
#pragma config CP0 = OFF
#pragma config CP1 = OFF
//#pragma config CP2 = OFF
//#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
//#pragma config WRT2 = OFF
//#pragma config WRT3 = OFF
#pragma config WRTB = OFF // Boot Block Write Protection
#pragma config WRTC = OFF
//#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
//#pragma config EBTR2 = OFF
//#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF
//###################################################################
#define tris_dallas TRISAbits.TRISA3
#define dallas LATAbits.LATA3
#define dallas_port PORTAbits.RA3
//###################################################################
#pragma udata
char dallas_ok[]="OK";
char dallas_error[]="Error Dallas";
char error_dallas; //Флаг для датчика температуры
//###################################################################
#pragma code
void DelayFor18TCY(void) //provides a 18 Tcy delay
{
Delay10TCYx(10);
}
void DelayPORXLCD(void) //provides at least 15ms delay
{
Delay1KTCYx(200);
}
void DelayXLCD(void) // provides at least 5ms delay
{
Delay1KTCYx(70);
}
//**********Прототипы функций для датчика температуры***************
void Delay480us(void);
void Delay60us(void);
void HowDelay(int);
char ResetDallas(void);
void DoutLow(void);
void DoutHigh(void);
//###################################################################
void main(void)
{
DelayFor18TCY();
DelayPORXLCD();
DelayXLCD();
ADCON1 |= 0x0F;
OpenXLCD(FOUR_BIT&LINES_5X7);
WriteCmdXLCD(CURSOR_OFF&BLINK_OFF);
while(BusyXLCD());
WriteCmdXLCD(SHIFT_CUR_RIGHT);
while(BusyXLCD());
while(1)
{
WriteCmdXLCD(0x01);
while(BusyXLCD());
HowDelay(6); //Сброс датчика температуры
ResetDallas();
if(error_dallas){ //Если датчик не ответил
SetDDRamAddr(0x80);
putsXLCD(dallas_error);
}
else{ //Если датчик ответил
SetDDRamAddr(0x80);
putsXLCD(dallas_ok);
}
HowDelay(12); //Здаржка на большое время
}
}
//**********Функции для работы с датчиком температуры****************
char ResetDallas(void){ //Сброс датчика
char err=1;
error_dallas=1;
DoutLow();
Delay480us();
DoutHigh();
Delay60us();
if(!dallas_port){
error_dallas=0;
err=0;
}
Delay480us();
return err;
}
//Функции задержки
void Delay480us(void){
Delay100TCYx(58);
}
void Delay60us(void){
Delay10TCYx(72);
}
void HowDelay(int i){
int j=0;
for(;j<i;j++){
Delay10KTCYx(0);
}
}
//Функции протокола 1-wire
void DoutLow(void){ //устанавливает линию передачи в 0
dallas_port=0;
tris_dallas=0;
Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();Nop();
}
void DoutHigh(void){ //отпускает линию в 1 (+5В от резистора)
tris_dallas=1;
Nop();Nop();
}