Check the I/O chapter of the datasheet. It may well explain why you have problems with digital inputs on PORTD. I am not clued in to how Hitech C initializes the ports, a quick look at the assembler file could tell all.clrf ANSELD? clrf ANSELE??
#include <htc.h>
#define _XTAL_FREQ 16000000
#include "i2c.h"
int led4;
int led8;
int led12;
int led15;
/*
* I2C functions for HI-TECH PIC C - master mode only
*/
/*
* TIMING - see Philips document: THE I2C-BUS SPECIFICATION
*/
/*
* Send stop condition
* - data low-high while clock high
*/
void
i2c_Stop(void)
{
/* don't assume SCL is high on entry */
SCL_LOW();
SDA_LOW(); /* ensure data is low first */
__delay_us(I2C_TM_DATA_SU);
SCL_DIR = I2C_INPUT; /* float clock high */
__delay_us(I2C_TM_STOP_SU);
SDA_HIGH(); /* the low->high data transistion */
__delay_us(I2C_TM_BUS_FREE); /* bus free time before next start */
SDA_DIR = I2C_INPUT; /* float data high */
return;
}
/*
* Send (re)start condition
* - ensure data is high then issue a start condition
* - see also i2c_Start() macro
*/
void
i2c_Restart(void)
{
SCL_LOW(); /* ensure clock is low */
SDA_HIGH(); /* ensure data is high */
__delay_us(I2C_TM_DATA_SU);
SCL_DIR = I2C_INPUT; /* clock pulse high */
__delay_us(I2C_TM_SCL_HIGH);
SDA_LOW(); /* the high->low transition */
__delay_us(I2C_TM_START_HD);
return;
}
/*
* Send a byte to the slave
* - returns true on error
*/
unsigned char
i2c_SendByte(unsigned char byte)
{
signed char i;
for(i=7; i>=0; i--)
{
SCL_LOW(); /* drive clock low */
/* data hold time = 0, send data now */
SDA_DIR = ((byte>>i)&0x01);
if ((byte>>i)&0x01) { /* bit to send */
SDA_HIGH();
}else {
SDA_LOW();
}
__delay_us(I2C_TM_DATA_SU);
SCL_DIR = I2C_INPUT; /* float clock high */
if(i2c_WaitForSCL()) /* wait for clock release */
return TRUE; /* bus error */
__delay_us(I2C_TM_SCL_HIGH); /* clock high time */
}
return FALSE;
}
/*
* send an address and data direction to the slave
* - 7-bit address (lsb ignored)
* - direction (FALSE = write )
*/
unsigned char
i2c_SendAddress(unsigned char address, unsigned char rw)
{
return i2c_SendByte(address | (rw?1:0));
}
/*
* Check for an acknowledge
* - returns ack or ~ack, or ERROR if a bus error
*/
signed char
i2c_ReadAcknowledge(void)
{
unsigned char ack;
SCL_LOW(); /* make clock is low */
SDA_DIR = I2C_INPUT; /* disable data line - listen for ack */
__delay_us(I2C_TM_SCL_TO_DATA); /* SCL low to data out valid */
SCL_DIR = I2C_INPUT; /* float clock high */
__delay_us(I2C_TM_DATA_SU);
ack = SDA; /* read the acknowledge */
/* wait for slave to release clock line after processing byte */
if(i2c_WaitForSCL())
return I2C_ERROR;
return ack;
}
/*
* Read a byte from the slave
* - returns the byte, or I2C_ERROR if a bus error
*/
int
i2c_ReadByte(void)
{
unsigned char i;
unsigned char byte = 0;
for(i=0; i<8; i++)
{
SCL_LOW(); /* drive clock low */
__delay_us(I2C_TM_SCL_LOW); /* min clock low period */
SDA_DIR = I2C_INPUT; /* release data line */
SCL_DIR = I2C_INPUT; /* float clock high */
if(i2c_WaitForSCL())
return I2C_ERROR;
__delay_us(I2C_TM_SCL_HIGH);
byte = byte << 1; /* read the next bit */
byte |= SDA;
}
return (int)byte;
}
/*
* Send an (~)acknowledge to the slave
* - status of I2C_LAST implies this is the last byte to be sent
*/
void
i2c_SendAcknowledge(unsigned char status)
{
SCL_LOW();
if ( status & 0x01) {
SDA_LOW(); /* drive line low -> more to come */
}else {
SDA_HIGH();
}
__delay_us(I2C_TM_DATA_SU);
SCL_DIR = I2C_INPUT; /* float clock high */
__delay_us(I2C_TM_SCL_HIGH);
return;
}
/*
* Send a byte to the slave and acknowledges the transfer
* - returns I2C_ERROR, ack or ~ack
*/
signed char
i2c_PutByte(unsigned char data)
{
if(i2c_SendByte(data))
return I2C_ERROR;
return i2c_ReadAcknowledge(); /* returns ack, ~ack */
}
/*
* Get a byte from the slave and acknowledges the transfer
* - returns true on I2C_ERROR or byte
*/
int
i2c_GetByte(unsigned char more)
{
int byte;
if((byte = i2c_ReadByte()) == I2C_ERROR)
return I2C_ERROR;
i2c_SendAcknowledge(more);
return byte;
}
/*
* Send an array of bytes to the slave and acknowledges the transfer
* - returns number of bytes not successfully transmitted
*/
int
i2c_PutString(const unsigned char *str, unsigned char length)
{
signed char error;
while(length)
{
if((error = i2c_PutByte(*str)) == I2C_ERROR)
return -(int)length; /* bus error */
else
if(error)
return (int)length; /* non acknowledge */
str++;
length--;
}
return FALSE; /* everything OK */
}
/*
* Reads number bytes from the slave, stores them at str and acknowledges the transfer
* - returns number of bytes not successfully read in
*/
unsigned char
i2c_GetString(unsigned char *str, unsigned char number)
{
int byte;
while(number)
{
if((byte = i2c_GetByte(number-1)) == I2C_ERROR)
return number; /* bus error */
else
*str = (unsigned char)byte;
str++;
number--;
}
return FALSE; /* everything OK */
}
/*
* Opens communication with a device at address. mode
* indicates I2C_READ or I2C_WRITE.
* - returns TRUE if address is not acknowledged
*/
unsigned char
i2c_Open(unsigned char address, unsigned char mode)
{
i2c_Start();
i2c_SendAddress(address, mode);
if(i2c_ReadAcknowledge())
return TRUE;
return FALSE;
}
/*
* wait for the clock line to be released by slow slaves
* - returns TRUE if SCL was not released after the
* time out period.
* - returns FALSE if and when SCL released
*/
unsigned char
i2c_WaitForSCL(void)
{
/* SCL_DIR should be input here */
if(!SCL)
{
__delay_us(I2C_TM_SCL_TMO);
/* if the clock is still low -> bus error */
if(!SCL)
return TRUE;
}
return FALSE;
}
void
i2c_Free()
{
unsigned char ucI;
SDA_DIR=I2C_INPUT;
for(ucI=0;ucI!=9;ucI++)
{
SCL_HIGH();
__delay_us(5);
SCL_LOW();
__delay_us(5);
}
}
unsigned char i2c_read(unsigned char ucAdr)
{
unsigned char ucDat;
if (i2c_ReadFrom(ucAdr)==0)
{
ucDat=i2c_GetByte(I2C_MORE);
i2c_Stop();
}
return(ucDat);
}
main(void){
TRISA = 0xFF;
ANSELD =0x00;
TRISD = 0xFF;
TRISE = 0x01;
TRISB = 0x00;
PORTB = 0x00;
if(RA7==1){led4|=1<<6;}//sæt int led4 plads 0 til 1 - indgang 2 til diode 1
if(RA7==0){led4|=0<<6;}//sæt int led4 plads 0 til 0
if(RC0==1){led4|=1<<4;}//sæt int led4 plads 2 til 1 - indgang 4 til diode 3
if(RC0==0){led4|=0<<4;}//sæt int led4 plads 2 til 0
if(RC1==1){led4|=1<<2;}//sæt int led4 plads 4 til 1 - indgang 3 til diode 2
if(RC1==0){led4|=0<<2;}//sæt int led4 plads 4 til 0
if(RC2==1){led4|=1<<0;}//sæt int led4 plads 6 til 1 - indgang 5 til diode 4
if(RC2==0){led4|=0<<0;}//sæt int led4 plads 6 til 0
if(RC5==1){led8|=1<<6;}//sæt int led8 plads 0 til 1 - indgang 6 til diode 5
if(RC5==0){led8|=0<<6;}//sæt int led8 plads 0 til 0
if(RC6==1){led8|=1<<4;}//sæt int led8 plads 2 til 1 - indgang 7 til diode 6
if(RC6==0){led8|=0<<4;}//sæt int led8 plads 2 til 0
if(RC7==1){led8|=1<<2;}//sæt int led8 plads 4 til 1 - indgang 8 til diode 7
if(RC7==0){led8|=0<<2;}//sæt int led8 plads 4 til 0
if(RD0==1){led8|=1<<0;}//sæt int led8 plads 6 til 1 - indgang 9 til diode 8
if(RD0==0){led8|=0<<0;}//sæt int led8 plads 6 til 0
if(RD1==1){led12|=1<<6;}//sæt int led12 plads 0 til 1 - indgang 6 til diode 5
if(RD1==0){led12|=0<<6;}//sæt int led12 plads 0 til 0
if(RD2==1){led12|=1<<4;}//sæt int led12 plads 2 til 1 - indgang 7 til diode 6
if(RD2==0){led12|=0<<4;}//sæt int led12 plads 2 til 0
if(RD3==1){led12|=1<<2;}//sæt int led12 plads 4 til 1 - indgang 8 til diode 7
if(RD3==0){led12|=0<<2;}//sæt int led12 plads 4 til 0
if(RD4==1){led12|=1<<0;}//sæt int led12 plads 6 til 1 - indgang 9 til diode 8
if(RD4==0){led12|=0<<0;}//sæt int led12 plads 6 til 0
if(RD5==1){led15|=1<<6;}//sæt int led15 plads 0 til 1 - indgang 6 til diode 5
if(RD5==0){led15|=0<<6;}//sæt int led15 plads 0 til 0
if(RD6==1){led15|=1<<4;}//sæt int led15 plads 2 til 1 - indgang 7 til diode 6
if(RD6==0){led15|=0<<4;}//sæt int led15 plads 2 til 0
if(RD7==1){led15|=1<<2;}//sæt int led15 plads 4 til 1 - indgang 8 til diode 7
if(RD7==0){led15|=0<<2;}//sæt int led15 plads 4 til 0
//output til b-alarm output 1
if(led4|=0){RE1=1;}
if(led8|=0){RE1=1;}
if(led12|=0){RE1=1;}
if(led15|=0){RE1=1;}
if(led4==0&&led8==0&&led12==0&&led15==0){RE1=0;}
//Start af i2c moduler
i2c_WriteTo(0x28); //starter i2c på adresse 28(grøn)
i2c_PutByte(0x00); //mode 1
i2c_PutByte(0x00); //sender 0 til mode 1
i2c_Stop();
i2c_WriteTo(0x2A); //gul adresse
i2c_PutByte(0x00);
i2c_PutByte(0x00);
i2c_Stop();
//første 4 dioder gul
i2c_WriteTo(0x2A);
i2c_PutByte(0x17);
i2c_PutByte(led4);
i2c_Stop();
//næste 4 dioder gul
i2c_WriteTo(0x2A);
i2c_PutByte(0x16);
i2c_PutByte(led8);
i2c_Stop();
//næste 4 dioder gul
i2c_WriteTo(0x2A);
i2c_PutByte(0x15);
i2c_PutByte(led12);
i2c_Stop();
//næste 3 dioder gul
i2c_WriteTo(0x2A);
i2c_PutByte(0x14);
i2c_PutByte(led15);
i2c_Stop();
// lampetest
if(RA6==1){
i2c_WriteTo(0x2A);
i2c_PutByte(0x14);
i2c_PutByte(0x55);
i2c_Stop();
i2c_WriteTo(0x2A);
i2c_PutByte(0x15);
i2c_PutByte(0x55);
i2c_Stop();
i2c_WriteTo(0x2A);
i2c_PutByte(0x16);
i2c_PutByte(0x55);
i2c_Stop();
i2c_WriteTo(0x2A);
i2c_PutByte(0x17);
i2c_PutByte(0x55);
i2c_Stop();
}
if(RA6==0){
i2c_WriteTo(0x2A);
i2c_PutByte(0x14);
i2c_PutByte(0x00);
i2c_Stop();
i2c_WriteTo(0x2A);
i2c_PutByte(0x15);
i2c_PutByte(0x00);
i2c_Stop();
i2c_WriteTo(0x2A);
i2c_PutByte(0x16);
i2c_PutByte(0x00);
i2c_Stop();
i2c_WriteTo(0x2A);
i2c_PutByte(0x17);
i2c_PutByte(0x00);
i2c_Stop();
}
}
if(RA7==1){led4|=1<<6;}//sæt int led4 plads 0 til 1 - indgang 2 til diode 1
if(RA7==0){led4|=0<<6;}//sæt int led4 plads 0 til 0
if(RC0==1){led4|=1<<4;}//sæt int led4 plads 2 til 1 - indgang 4 til diode 3
if(RC0==0){led4|=0<<4;}//sæt int led4 plads 2 til 0
if(RC1==1){led4|=1<<2;}//sæt int led4 plads 4 til 1 - indgang 3 til diode 2
if(RC1==0){led4|=0<<2;}//sæt int led4 plads 4 til 0
if(RC2==1){led4|=1<<0;}//sæt int led4 plads 6 til 1 - indgang 5 til diode 4
if(RC2==0){led4|=0<<0;}//sæt int led4 plads 6 til 0
if(RC5==1){led8|=1<<6;}//sæt int led8 plads 0 til 1 - indgang 6 til diode 5
if(RC5==0){led8|=0<<6;}//sæt int led8 plads 0 til 0
if(RC6==1){led8|=1<<4;}//sæt int led8 plads 2 til 1 - indgang 7 til diode 6
if(RC6==0){led8|=0<<4;}//sæt int led8 plads 2 til 0
if(RC7==1){led8|=1<<2;}//sæt int led8 plads 4 til 1 - indgang 8 til diode 7
if(RC7==0){led8|=0<<2;}//sæt int led8 plads 4 til 0
if(RD0==1){led8|=1<<0;}//sæt int led8 plads 6 til 1 - indgang 9 til diode 8
if(RD0==0){led8|=0<<0;}//sæt int led8 plads 6 til 0
if(RD0==1){led15|=1<<0;}
if(RD0==0){led15|=0<<0;}
i2c_WriteTo(0x2A);
i2c_PutByte(0x17);
i2c_PutByte(led4);
i2c_Stop();
//næste 4 dioder gul
i2c_WriteTo(0x2A);
i2c_PutByte(0x16);
i2c_PutByte(led8);
i2c_Stop();
//næste 4 dioder gul
i2c_WriteTo(0x2A);
i2c_PutByte(0x15);
i2c_PutByte(led12);
i2c_Stop();
//næste 3 dioder gul
i2c_WriteTo(0x2A);
i2c_PutByte(0x14);
i2c_PutByte(led15);
i2c_Stop();
int count//to store the counted value in
if(RA7==1&&count<5000){//if my input is high and the counter is less than 5000 then delay and count
__delay_ms(10);
count++;
}
if (count==5000){led4|=1<<6;}//if my countvalue is 5000 the the led should go on
if (RE0==1){count=0;}//resetbutton to reset the timer
if(RA7==1&&count<5000){//if my input is high and the counter is less than 5000 then delay and count
__delay_ms(10);
count++;
}
if(RC0==1){led4|=1<<4;}//it will move on to the rest of the code after the 10ms delay. and therefore i will only have 10ms delay in the program
by Duane Benson
by Duane Benson
by Duane Benson