Yahoo Groups archive

AVR-Chat

Index last updated: 2026-04-28 22:41 UTC

Thread

SPI Part 2

SPI Part 2

2008-09-07 by englsprogeny

Can I program my AVR via SPI and use the SPI port on the AVR
immediately afterword?  It seems all should be OK [because when the
programming is done the SS and reset lines are allowed to go high]  It
seems from that point on, that the AVR should be able to run its SPI
software.  Could the SPI interface [going to my PC] be holding signals
after a download?  I've even tried disconnecting the SPI interface
[coming from the PC] and resetting the processor.  Still, I see no
signal on the clock or MOSI lines.

Here is the code I'm using:



include <avr\io.h>

#include <avr\delay.h>

#define DD_MOSI     PINB3
#define DD_SCK     PINB5
#define DDR_SPI    PORTB

char tx_buff[20] = {10,20,30,40,50,60,70,80,90};


void SendBuffer(void)
{

	//char count = 0;
	
	
	for(char index = 0; index<15; index++)
	{
	
		SPI_MasterTransmit(tx_buff[index]);
	
	}

}

void SPI_MasterInit(void)
{
	
	PORTC = 0x20;
	
	// Set MOSI and SCK output, all others input
	DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
	// Enable SPI, Master, set clock rate fck/16
	SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_MasterTransmit(char cData)
{
	
	
	/* Start transmission */
	SPDR = cData;
	/* Wait for transmission complete */
	//PORTC |= 0x10;
	while(!(SPSR & (1<<SPIF)));
	//_delay_ms(5);	
	//PORTC = 0x00;
}
int main(void) 
{	

	
	_delay_ms(10);	
	
	//set port c as all output
	DDRC = 0xff;


	
	SPI_MasterInit();
	_delay_ms(10);	
	
	PORTC |= 0x10;
	//SPI_MasterTransmit('A');
	SendBuffer();
	
	
	PORTC = 0x00;
	
	   while(1) { }
}

Thanks for any inputs.

David

help me interface atmega8535 ds1307 sht11

2009-03-13 by Ardian sandy

please help me how to interface ATMega8535 to RTC(DS1307) and Humidity sensor (SHT11) and SD/MM 1Gb and LCD 20x2 and USART to hyperterminal,,,
plese give my code and schematic  i am use codevision v 1.24
tanks your attention and solution master....   

 
Ardian     3oz^


      ___________________________________________________________________________
Dapatkan alamat Email baru Anda!
Dapatkan nama yang selalu Anda inginkan sebelum diambil orang lain!
http://mail.promotions.yahoo.com/newdomains/id/

[Non-text portions of this message have been removed]

Re: [AVR-Chat] help me interface atmega8535 ds1307 sht11

2009-03-13 by Jim Wagner

On Mar 12, 2009, at 5:00 PM, Ardian sandy wrote:

> please help me how to interface ATMega8535 to RTC(DS1307) and  
> Humidity sensor (SHT11) and SD/MM 1Gb and LCD 20x2 and USART to  
> hyperterminal,,,
> plese give my code and schematic i am use codevision v 1.24
> tanks your attention and solution master....
>
> Ardian 3oz^
>
> __________________________________________________________
> Dapatkan alamat Email baru Anda!
> Dapatkan nama yang selalu Anda inginkan sebelum diambil orang lain!
> http://mail.promotions.yahoo.com/newdomains/id/
>
> [Non-text portions of this message have been removed]
>
>
> 
Nobody here will give you code. Ir is time for you to start learning  
how to do it. Some of the things you list are pretty standard. Some  
are a little more challenging and some, like the SD/MM, are hard. So,  
its time to get working if you need to get this done. Nobody here will  
do it for you.

Jim Wagner
Oregon Research Electronics

[Non-text portions of this message have been removed]

Bls: [AVR-Chat] help me interface atmega8535 ds1307 sht11

2009-03-14 by Ardian sandy

give me sample code to interface it...
i can't display data from sht11 and ds1307 in my LCD, i am use sample c program from sht11 vendor,,
mybe u can correct my code inset this mail  
Ardian     3oz^



      Berbagi foto Flickr dengan teman di dalam Messenger. Jelajahi Yahoo! Messenger yang serba baru sekarang! http://id.messenger.yahoo.com

[Non-text portions of this message have been removed]

Re: Bls: [AVR-Chat] help me interface atmega8535 ds1307 sht11

2009-03-14 by Jim Wagner

On Mar 13, 2009, at 8:47 PM, Ardian sandy wrote:

>
>
> give me sample code to interface it...
> i can't display data from sht11 and ds1307 in my LCD, i am use  
> sample c program from sht11 vendor,,
> mybe u can correct my code inset this mail
> Ardian 3oz^
>
> Berbagi foto Flickr dengan teman di dalam Messenger. Jelajahi Yahoo!  
> Messenger yang serba baru sekarang! http://id.messenger.yahoo.com
>
> [Non-text portions of this message have been removed]
>
>
> 
Yahoo groups don't permit attachments. We cannot see your code. Just  
make code to be part of the message.

You can display code as part messages at AVRFreaks.

Jim Wagner

[Non-text portions of this message have been removed]

Bls: Bls: [AVR-Chat] help me interface atmega8535 ds1307 sht11

2009-03-14 by Ardian sandy

this my code jim....


/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.2b Professional
Automatic Program Generator
© Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.ro
e-mail:office@hpinfotech.ro

Project : Monitoring humidity and temperatur
Version : 0.0
Date    : 3/11/2009
Author  : Ardi                         
Company : 
Comments: 


Chip type           : ATmega8535
Program type        : Application
Clock frequency     : 11.059200 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 128
*****************************************************/

#include <mega8535.h>
#include <stdio.h>
#include <math.h>
#include <delay.h>
#include <stdlib.h>
// I2C Bus functions
#asm
   .equ __i2c_port=0x18 ;PORTB
   .equ __sda_bit=1
   .equ __scl_bit=2
#endasm
#include <i2c.h>

// DS1307 Real Time Clock functions
#include <ds1307.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// Get a character from the USART Receiver
#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char status,data;
while (1)
      {
      while (((status=UCSRA) & RX_COMPLETE)==0);
      data=UDR;
      if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
         return data;
      };
}
#pragma used-
#endif

// Write a character to the USART Transmitter
#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while ((UCSRA & DATA_REGISTER_EMPTY)==0);
UDR=c;
}
#pragma used-
#endif

// Declare your global variables here
typedef union
{ unsigned int i; float f;} value; 
 
 
enum {TEMP,HUMI};
 
sfrb PIND = 0x10;
sfrb PORTD = 0x12;
sfrb DDRD = 0x11;
      
#define    SHT_DATA_OUT        DDRD.2
#define    SHT_DATA_IN        PIND.2
#define    SHT_SCK            PORTD.3
#define    HEAT_SW            PIND.4            // Heater On or Off 
#define    noACK 0
#define    ACK 1
                            //adr  command  r/w
#define STATUS_REG_W 0x06   //000   0011    0
#define STATUS_REG_R 0x07   //000   0011    1
#define MEASURE_TEMP 0x03   //000   0001    1
#define MEASURE_HUMI 0x05   //000   0010    1
#define RESET        0x1e   //000   1111    0 

const float C1=-4.0;              // for 12 Bit
const float C2=+0.0405;           // for 12 Bit
const float C3=-0.0000028;        // for 12 Bit
const float T1=+0.01;             // for 14 Bit @ 5V
const float T2=+0.00008;          // for 14 Bit @ 5V                
                         
  
char lcd_buffer[33];
                                          

//SHT Functions
char SHT_WriteByte(unsigned char value);
char SHT_ReadByte(unsigned char ack);
void s_transstart(void);
void s_connectionreset(void);
char s_softreset(void);
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);
void calc_sth11(float *p_humidity ,float *p_temperature);
float calc_dewpoint(float h,float t); 
char s_write_statusreg(unsigned char *p_value); 
char s_read_statusreg(unsigned char *p_value, unsigned char *p_checksum);
unsigned char h,m,s;

 
void main(void)
{
// Declare your local variables here
value humi_val, temp_val;
unsigned char error,checksum;
float dew_point;
delay_ms(200);
s_connectionreset();



// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0 
PORTA=0x00;
DDRA=0x0F;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0 
PORTB=0x00;
DDRB=0x01;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x34;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 2 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 19200
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x8E;
UBRRH=0x00;
UBRRL=0x23;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;

// I2C Bus initialization
i2c_init();
delay_ms(250);
// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
rtc_init(0,0,0);
rtc_set_date(14,03,2009);
rtc_set_time(19,05,01);   

// LCD module initialization
lcd_init(20);

// Setup Sensibus Pins

PORTD.3    = 0;    // ClockLow
DDRD.3 = 1;     // SCK is an output
PORTD.2 = 0;    // Always Zero
              // Toggle DDRD.2 for Data 

/*
while (1)
    {
    s_transstart();                //transmission start
                     
    error+=SHT_WriteByte(MEASURE_TEMP);     //send command to sensor
         
      for (i=0;i<65535;i++) 
          if(SHT_DATA_IN==0) break;     //wait until sensor has finished the measurement
  
      if(SHT_DATA_IN) error+=1;        //or timeout (~2 sec.) is reached
  
      MSB  =SHT_ReadByte(ACK);    //read the first byte (MSB)
      LSB  =SHT_ReadByte(ACK);    //read the second byte (LSB)
      checksum =SHT_ReadByte(noACK);  //read checksum
  
      sprintf(lcd_buffer,"T= %u %u %u",MSB,LSB,checksum);
        lcd_gotoxy(0,1);
        lcd_puts(lcd_buffer);
 
    delay_ms(500);
    }
*/

while (1)
    {
    error=0;
    error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI);
    error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP);  
    error=0;
    if(error!=0) 
    s_connectionreset();
    else{
        humi_val.f=(float)humi_val.i;                   //converts integer to float
          temp_val.f=(float)temp_val.i;                   //converts integer to float
          calc_sth11(&humi_val.f,&temp_val.f);            //calculate humidity, temperature
          dew_point=calc_dewpoint(humi_val.f,temp_val.f); //calculate dew point
        sprintf(lcd_buffer,"T:%3.1fC RH:%3.1f%%",temp_val.f,humi_val.f);
        lcd_gotoxy(0,0);
    lcd_puts(lcd_buffer);
    
    rtc_get_time(&h,&m,&s) ;
    lcd_gotoxy(0,1);
    sprintf(lcd_buffer,"%i:%i:%i",h,m,s);
    lcd_puts(lcd_buffer);
      }
    // Global enable interrupts
    #asm("sei")     
      delay_ms(1000);
      #asm("cli")
      }
}

//----------------------------------------------------------------------------------
// writes a byte on the Sensibus and checks the acknowledge
//----------------------------------------------------------------------------------
char SHT_WriteByte(unsigned char value) 
{ 
  unsigned char i,error=0;  
  for (i=0x80;i>0;i/=2)                 //shift bit for masking
      { 
      if (i & value)     SHT_DATA_OUT=0;        //masking value with i , write to SENSI-BUS
    else SHT_DATA_OUT=1;                        
    SHT_SCK=1;                          //clk for SENSI-BUS
    delay_us(5);                        //pulswith approx. 5 us      
    SHT_SCK=0;
      }
  SHT_DATA_OUT=0;                       //release DATA-line
  SHT_SCK=1;                            //clk #9 for ack 
  error=SHT_DATA_IN;                    //check ack (DATA will be pulled down by SHT11)
  SHT_SCK=0;        
  return error;                         //error=1 in case of no acknowledge
}

//----------------------------------------------------------------------------------
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"
//----------------------------------------------------------------------------------
char SHT_ReadByte(unsigned char ack) 
{ 
  unsigned char i,val=0;
  SHT_DATA_OUT=0;                         //release DATA-line
  for (i=0x80;i>0;i/=2)                 //shift bit for masking
    { 
    SHT_SCK=1;                          //clk for SENSI-BUS
    if (SHT_DATA_IN) val=(val | i);       //read bit  
    SHT_SCK=0;                       
      }
  SHT_DATA_OUT=ack;                       //in case of "ack==1" pull down DATA-Line
  SHT_SCK=1;                            //clk #9 for ack
  delay_us(5);                             //pulswith approx. 5 us 
  SHT_SCK=0;                            
  SHT_DATA_OUT=0;                         //release DATA-line
  return val;
}

//----------------------------------------------------------------------------------
// generates a transmission start 
//       _____         ________
// DATA:      |_______|
//           ___     ___
// SCK : ___|   |___|   |______
//----------------------------------------------------------------------------------
void s_transstart(void)
{                                
   SHT_DATA_OUT=0; 
   SHT_SCK=0;                   //Initial state
   delay_us(1);
   SHT_SCK=1;
   delay_us(1);
   SHT_DATA_OUT=1;
   delay_us(1);
   SHT_SCK=0;  
   delay_us(5);
   SHT_SCK=1;
   delay_us(1);
   SHT_DATA_OUT=0;           
   delay_us(1);
   SHT_SCK=0;           
}

//----------------------------------------------------------------------------------
// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart
//       _____________________________________________________         ________
// DATA:                                                      |_______|
//          _    _    _    _    _    _    _    _    _        ___     ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|   |___|   |______
//----------------------------------------------------------------------------------

void s_connectionreset(void)
{  
  unsigned char i; 
  SHT_DATA_OUT=0; SHT_SCK=0;         //Initial state
  for(i=0;i<9;i++)                  //9 SCK cycles
      { 
      SHT_SCK=1;
      delay_us(1);
    SHT_SCK=0;
  }
  s_transstart();                   //transmission start
}

//----------------------------------------------------------------------------------
// resets the sensor by a softreset  
//----------------------------------------------------------------------------------
 
char s_softreset(void)
{ 
  unsigned char error=0;  
  s_connectionreset();              //reset communication
  error+=SHT_WriteByte(RESET);      //send RESET-command to sensor
  return error;                     //error=1 in case of no response form the sensor
}
 
//----------------------------------------------------------------------------------
// makes a measurement (humidity/temperature) with checksum
//----------------------------------------------------------------------------------
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
{ 
  unsigned error=0;
  unsigned int i;

  s_transstart();                   //transmission start
  switch(mode){                     //send command to sensor
    case TEMP    : error+=SHT_WriteByte(MEASURE_TEMP); break;
    case HUMI    : error+=SHT_WriteByte(MEASURE_HUMI); break;
    default     : break;     
  }
  for (i=0;i<65535;i++) if(SHT_DATA_IN==0) break; //wait until sensor has finished the measurement
  if(SHT_DATA_IN) error+=1;                // or timeout (~2 sec.) is reached
  *(p_value+1)  =SHT_ReadByte(ACK);    //read the first byte (MSB)
  *(p_value)  =SHT_ReadByte(ACK);    //read the second byte (LSB)
  *p_checksum =SHT_ReadByte(noACK);  //read checksum
  return error;
}   

//----------------------------------------------------------------------------------------
// calculates temperature [°C] and humidity [%RH] 
// input :  humi [Ticks] (12 bit) 
//          temp [Ticks] (14 bit)
// output:  humi [%RH]
//          temp [°C] 
//----------------------------------------------------------------------------------------

void calc_sth11(float *p_humidity ,float *p_temperature)
{ 

  //float rh=*p_humidity;             // rh:      Humidity [Ticks] 12 Bit 
  //float t=*p_temperature;           // t:       Temperature [Ticks] 14 Bit
  float rh_lin;                     // rh_lin:  Humidity linear
  float rh_true;                    // rh_true: Temperature compensated humidity
  float t_C;                        // t_C   :  Temperature [°C]

  t_C=*p_temperature*0.01 - 40;                  //calc. temperature from ticks to [°C]
  rh_lin=C3*(*p_humidity)*(*p_humidity) + C2*(*p_humidity) + C1;     //calc. humidity from ticks to [%RH]
  rh_true=(t_C-25)*(T1+T2*(*p_humidity))+rh_lin;   //calc. temperature compensated humidity [%RH]
  if(rh_true>100)rh_true=100;       //cut if the value is outside of
  if(rh_true<0.1)rh_true=0.1;       //the physical possible range

  *p_temperature=t_C;               //return temperature [°C]
  *p_humidity=rh_true;              //return humidity[%RH]
}

//--------------------------------------------------------------------
// calculates dew point
// input:   humidity [%RH], temperature [°C]
// output:  dew point [°C]
//--------------------------------------------------------------------

float calc_dewpoint(float h,float t)
{ 
  float logEx,dew_point;
  logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
  dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
  return dew_point;
}   

//----------------------------------------------------------------------------------
// reads the status register with checksum (8-bit)
//----------------------------------------------------------------------------------
char s_read_statusreg(unsigned char *p_value, unsigned char *p_checksum)
{ 
  unsigned char error=0;
  s_transstart();                   //transmission start
  error=SHT_WriteByte(STATUS_REG_R); //send command to sensor
  *p_value=SHT_ReadByte(ACK);        //read status register (8-bit)
  *p_checksum=SHT_ReadByte(noACK);   //read checksum (8-bit)  
  return error;                     //error=1 in case of no response form the sensor
}
  
//----------------------------------------------------------------------------------
// writes the status register with checksum (8-bit)
//----------------------------------------------------------------------------------
char s_write_statusreg(unsigned char *p_value)
{ 
  unsigned char error=0;
  s_transstart();                   //transmission start
  error+=SHT_WriteByte(STATUS_REG_W);//send command to sensor
  error+=SHT_WriteByte(*p_value);    //send value of status register
  return error;                     //error>=1 in case of no response form the sensor
}

Ardian     3oz^


      Lebih bergaul dan terhubung dengan lebih baik. Tambah lebih banyak teman ke Yahoo! Messenger sekarang! http://id.messenger.yahoo.com/invite/

[Non-text portions of this message have been removed]

Re: Bls: [AVR-Chat] help me interface atmega8535 ds1307 sht11

2009-03-14 by prkuve

--- In AVR-Chat@yahoogroups.com, Ardian sandy <ardi_sandi302@...> wrote:
Show quoted textHide quoted text
>
> 
> 
>  give me sample code to interface it...
> i can't display data from sht11 and ds1307 in my LCD, i am use sample c program from sht11 vendor,,
> mybe u can correct my code inset this mail  
> Ardian     3oz^
> 
> 
> 
>       Berbagi foto Flickr dengan teman di dalam Messenger. Jelajahi Yahoo! Messenger yang serba baru sekarang! http://id.messenger.yahoo.com
> 
> [Non-text portions of this message have been removed]
>

Re: Bls: [AVR-Chat] help me interface atmega8535 ds1307 sht11

2009-03-14 by prkuve

--- In AVR-Chat@yahoogroups.com, Ardian sandy <ardi_sandi302@...> wrote:
>
> 
> 
>  give me sample code to interface it...
> i can't display data from sht11 and ds1307 in my LCD, i am use sample c program from sht11 vendor,,
> mybe u can correct my code inset this mail  
> Ardian     3oz^
> 
> 
> 
>       Berbagi foto Flickr dengan teman di dalam Messenger. Jelajahi Yahoo! Messenger yang serba baru sekarang! http://id.messenger.yahoo.com
> 
> [Non-text portions of this message have been removed]
>
Hay I recently worked on SHT11 and PCD8544(Graphical LCD) using atmega32
I guess i can help u out..send me ur code hopfully I can figure out the problem.

Re: Bls: Bls: [AVR-Chat] help me interface atmega8535 ds1307 sht11

2009-03-14 by prkuve

--- In AVR-Chat@yahoogroups.com, Ardian sandy <ardi_sandi302@...> wrote:
>
> 
> 
>  this my code jim....
> 
> 
> /*****************************************************
> This program was produced by the
> CodeWizardAVR V1.24.2b Professional
> Automatic Program Generator
> © Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.
> http://www.hpinfotech.ro
> e-mail:office@...
> 
> Project : Monitoring humidity and temperatur
> Version : 0.0
> Date    : 3/11/2009
> Author  : Ardi                         
> Company : 
> Comments: 
> 
> 
> Chip type           : ATmega8535
> Program type        : Application
> Clock frequency     : 11.059200 MHz
> Memory model        : Small
> External SRAM size  : 0
> Data Stack size     : 128
> *****************************************************/
> 
> #include <mega8535.h>
> #include <stdio.h>
> #include <math.h>
> #include <delay.h>
> #include <stdlib.h>
> // I2C Bus functions
> #asm
>    .equ __i2c_port=0x18 ;PORTB
>    .equ __sda_bit=1
>    .equ __scl_bit=2
> #endasm
> #include <i2c.h>
> 
> // DS1307 Real Time Clock functions
> #include <ds1307.h>
> 
> // Alphanumeric LCD Module functions
> #asm
>    .equ __lcd_port=0x15 ;PORTC
> #endasm
> #include <lcd.h>
> 
> #define RXB8 1
> #define TXB8 0
> #define UPE 2
> #define OVR 3
> #define FE 4
> #define UDRE 5
> #define RXC 7
> 
> #define FRAMING_ERROR (1<<FE)
> #define PARITY_ERROR (1<<UPE)
> #define DATA_OVERRUN (1<<OVR)
> #define DATA_REGISTER_EMPTY (1<<UDRE)
> #define RX_COMPLETE (1<<RXC)
> 
> // Get a character from the USART Receiver
> #ifndef _DEBUG_TERMINAL_IO_
> #define _ALTERNATE_GETCHAR_
> #pragma used+
> char getchar(void)
> {
> char status,data;
> while (1)
>       {
>       while (((status=UCSRA) & RX_COMPLETE)==0);
>       data=UDR;
>       if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
>          return data;
>       };
> }
> #pragma used-
> #endif
> 
> // Write a character to the USART Transmitter
> #ifndef _DEBUG_TERMINAL_IO_
> #define _ALTERNATE_PUTCHAR_
> #pragma used+
> void putchar(char c)
> {
> while ((UCSRA & DATA_REGISTER_EMPTY)==0);
> UDR=c;
> }
> #pragma used-
> #endif
> 
> // Declare your global variables here
> typedef union
> { unsigned int i; float f;} value; 
>  
>  
> enum {TEMP,HUMI};
>  
> sfrb PIND = 0x10;
> sfrb PORTD = 0x12;
> sfrb DDRD = 0x11;
>       
> #define    SHT_DATA_OUT        DDRD.2
> #define    SHT_DATA_IN        PIND.2
> #define    SHT_SCK            PORTD.3
> #define    HEAT_SW            PIND.4            // Heater On or Off 
> #define    noACK 0
> #define    ACK 1
>                             //adr  command  r/w
> #define STATUS_REG_W 0x06   //000   0011    0
> #define STATUS_REG_R 0x07   //000   0011    1
> #define MEASURE_TEMP 0x03   //000   0001    1
> #define MEASURE_HUMI 0x05   //000   0010    1
> #define RESET        0x1e   //000   1111    0 
> 
> const float C1=-4.0;              // for 12 Bit
> const float C2=+0.0405;           // for 12 Bit
> const float C3=-0.0000028;        // for 12 Bit
> const float T1=+0.01;             // for 14 Bit @ 5V
> const float T2=+0.00008;          // for 14 Bit @ 5V                
>                          
>   
> char lcd_buffer[33];
>                                           
> 
> //SHT Functions
> char SHT_WriteByte(unsigned char value);
> char SHT_ReadByte(unsigned char ack);
> void s_transstart(void);
> void s_connectionreset(void);
> char s_softreset(void);
> char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);
> void calc_sth11(float *p_humidity ,float *p_temperature);
> float calc_dewpoint(float h,float t); 
> char s_write_statusreg(unsigned char *p_value); 
> char s_read_statusreg(unsigned char *p_value, unsigned char *p_checksum);
> unsigned char h,m,s;
> 
>  
> void main(void)
> {
> // Declare your local variables here
> value humi_val, temp_val;
> unsigned char error,checksum;
> float dew_point;
> delay_ms(200);
> s_connectionreset();
> 
> 
> 
> // Input/Output Ports initialization
> // Port A initialization
> // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out 
> // State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0 
> PORTA=0x00;
> DDRA=0x0F;
> 
> // Port B initialization
> // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out 
> // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0 
> PORTB=0x00;
> DDRB=0x01;
> 
> // Port C initialization
> // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
> // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
> PORTC=0x00;
> DDRC=0x00;
> 
> // Port D initialization
> // Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In 
> // State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T 
> PORTD=0x00;
> DDRD=0x34;
> 
> // Timer/Counter 0 initialization
> // Clock source: System Clock
> // Clock value: Timer 0 Stopped
> // Mode: Normal top=FFh
> // OC0 output: Disconnected
> TCCR0=0x00;
> TCNT0=0x00;
> OCR0=0x00;
> 
> // Timer/Counter 1 initialization
> // Clock source: System Clock
> // Clock value: Timer 1 Stopped
> // Mode: Normal top=FFFFh
> // OC1A output: Discon.
> // OC1B output: Discon.
> // Noise Canceler: Off
> // Input Capture on Falling Edge
> TCCR1A=0x00;
> TCCR1B=0x00;
> TCNT1H=0x00;
> TCNT1L=0x00;
> ICR1H=0x00;
> ICR1L=0x00;
> OCR1AH=0x00;
> OCR1AL=0x00;
> OCR1BH=0x00;
> OCR1BL=0x00;
> 
> // Timer/Counter 2 initialization
> // Clock source: System Clock
> // Clock value: Timer 2 Stopped
> // Mode: Normal top=FFh
> // OC2 output: Disconnected
> ASSR=0x00;
> TCCR2=0x00;
> TCNT2=0x00;
> OCR2=0x00;
> 
> // External Interrupt(s) initialization
> // INT0: Off
> // INT1: Off
> // INT2: Off
> MCUCR=0x00;
> MCUCSR=0x00;
> 
> // Timer(s)/Counter(s) Interrupt(s) initialization
> TIMSK=0x00;
> 
> // USART initialization
> // Communication Parameters: 8 Data, 2 Stop, No Parity
> // USART Receiver: On
> // USART Transmitter: On
> // USART Mode: Asynchronous
> // USART Baud rate: 19200
> UCSRA=0x00;
> UCSRB=0x18;
> UCSRC=0x8E;
> UBRRH=0x00;
> UBRRL=0x23;
> 
> // Analog Comparator initialization
> // Analog Comparator: Off
> // Analog Comparator Input Capture by Timer/Counter 1: Off
> // Analog Comparator Output: Off
> ACSR=0x80;
> SFIOR=0x00;
> 
> // I2C Bus initialization
> i2c_init();
> delay_ms(250);
> // DS1307 Real Time Clock initialization
> // Square wave output on pin SQW/OUT: Off
> // SQW/OUT pin state: 0
> rtc_init(0,0,0);
> rtc_set_date(14,03,2009);
> rtc_set_time(19,05,01);   
> 
> // LCD module initialization
> lcd_init(20);
> 
> // Setup Sensibus Pins
> 
> PORTD.3    = 0;    // ClockLow
> DDRD.3 = 1;     // SCK is an output
> PORTD.2 = 0;    // Always Zero
>               // Toggle DDRD.2 for Data 
> 
> /*
> while (1)
>     {
>     s_transstart();                //transmission start
>                      
>     error+=SHT_WriteByte(MEASURE_TEMP);     //send command to sensor
>          
>       for (i=0;i<65535;i++) 
>           if(SHT_DATA_IN==0) break;     //wait until sensor has finished the measurement
>   
>       if(SHT_DATA_IN) error+=1;        //or timeout (~2 sec.) is reached
>   
>       MSB  =SHT_ReadByte(ACK);    //read the first byte (MSB)
>       LSB  =SHT_ReadByte(ACK);    //read the second byte (LSB)
>       checksum =SHT_ReadByte(noACK);  //read checksum
>   
>       sprintf(lcd_buffer,"T= %u %u %u",MSB,LSB,checksum);
>         lcd_gotoxy(0,1);
>         lcd_puts(lcd_buffer);
>  
>     delay_ms(500);
>     }
> */
> 
> while (1)
>     {
>     error=0;
>     error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI);
>     error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP);  
>     error=0;
>     if(error!=0) 
>     s_connectionreset();
>     else{
>         humi_val.f=(float)humi_val.i;                   //converts integer to float
>           temp_val.f=(float)temp_val.i;                   //converts integer to float
>           calc_sth11(&humi_val.f,&temp_val.f);            //calculate humidity, temperature
>           dew_point=calc_dewpoint(humi_val.f,temp_val.f); //calculate dew point
>         sprintf(lcd_buffer,"T:%3.1fC RH:%3.1f%%",temp_val.f,humi_val.f);
>         lcd_gotoxy(0,0);
>     lcd_puts(lcd_buffer);
>     
>     rtc_get_time(&h,&m,&s) ;
>     lcd_gotoxy(0,1);
>     sprintf(lcd_buffer,"%i:%i:%i",h,m,s);
>     lcd_puts(lcd_buffer);
>       }
>     // Global enable interrupts
>     #asm("sei")     
>       delay_ms(1000);
>       #asm("cli")
>       }
> }
> 
> //----------------------------------------------------------------------------------
> // writes a byte on the Sensibus and checks the acknowledge
> //----------------------------------------------------------------------------------
> char SHT_WriteByte(unsigned char value) 
> { 
>   unsigned char i,error=0;  
>   for (i=0x80;i>0;i/=2)                 //shift bit for masking
>       { 
>       if (i & value)     SHT_DATA_OUT=0;        //masking value with i , write to SENSI-BUS
>     else SHT_DATA_OUT=1;                        
>     SHT_SCK=1;                          //clk for SENSI-BUS
>     delay_us(5);                        //pulswith approx. 5 us      
>     SHT_SCK=0;
>       }
>   SHT_DATA_OUT=0;                       //release DATA-line
>   SHT_SCK=1;                            //clk #9 for ack 
>   error=SHT_DATA_IN;                    //check ack (DATA will be pulled down by SHT11)
>   SHT_SCK=0;        
>   return error;                         //error=1 in case of no acknowledge
> }
> 
> //----------------------------------------------------------------------------------
> // reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"
> //----------------------------------------------------------------------------------
> char SHT_ReadByte(unsigned char ack) 
> { 
>   unsigned char i,val=0;
>   SHT_DATA_OUT=0;                         //release DATA-line
>   for (i=0x80;i>0;i/=2)                 //shift bit for masking
>     { 
>     SHT_SCK=1;                          //clk for SENSI-BUS
>     if (SHT_DATA_IN) val=(val | i);       //read bit  
>     SHT_SCK=0;                       
>       }
>   SHT_DATA_OUT=ack;                       //in case of "ack==1" pull down DATA-Line
>   SHT_SCK=1;                            //clk #9 for ack
>   delay_us(5);                             //pulswith approx. 5 us 
>   SHT_SCK=0;                            
>   SHT_DATA_OUT=0;                         //release DATA-line
>   return val;
> }
> 
> //----------------------------------------------------------------------------------
> // generates a transmission start 
> //       _____         ________
> // DATA:      |_______|
> //           ___     ___
> // SCK : ___|   |___|   |______
> //----------------------------------------------------------------------------------
> void s_transstart(void)
> {                                
>    SHT_DATA_OUT=0; 
>    SHT_SCK=0;                   //Initial state
>    delay_us(1);
>    SHT_SCK=1;
>    delay_us(1);
>    SHT_DATA_OUT=1;
>    delay_us(1);
>    SHT_SCK=0;  
>    delay_us(5);
>    SHT_SCK=1;
>    delay_us(1);
>    SHT_DATA_OUT=0;           
>    delay_us(1);
>    SHT_SCK=0;           
> }
> 
> //----------------------------------------------------------------------------------
> // communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart
> //       _____________________________________________________         ________
> // DATA:                                                      |_______|
> //          _    _    _    _    _    _    _    _    _        ___     ___
> // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|   |___|   |______
> //----------------------------------------------------------------------------------
> 
> void s_connectionreset(void)
> {  
>   unsigned char i; 
>   SHT_DATA_OUT=0; SHT_SCK=0;         //Initial state
>   for(i=0;i<9;i++)                  //9 SCK cycles
>       { 
>       SHT_SCK=1;
>       delay_us(1);
>     SHT_SCK=0;
>   }
>   s_transstart();                   //transmission start
> }
> 
> //----------------------------------------------------------------------------------
> // resets the sensor by a softreset  
> //----------------------------------------------------------------------------------
>  
> char s_softreset(void)
> { 
>   unsigned char error=0;  
>   s_connectionreset();              //reset communication
>   error+=SHT_WriteByte(RESET);      //send RESET-command to sensor
>   return error;                     //error=1 in case of no response form the sensor
> }
>  
> //----------------------------------------------------------------------------------
> // makes a measurement (humidity/temperature) with checksum
> //----------------------------------------------------------------------------------
> char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
> { 
>   unsigned error=0;
>   unsigned int i;
> 
>   s_transstart();                   //transmission start
>   switch(mode){                     //send command to sensor
>     case TEMP    : error+=SHT_WriteByte(MEASURE_TEMP); break;
>     case HUMI    : error+=SHT_WriteByte(MEASURE_HUMI); break;
>     default     : break;     
>   }
>   for (i=0;i<65535;i++) if(SHT_DATA_IN==0) break; //wait until sensor has finished the measurement
>   if(SHT_DATA_IN) error+=1;                // or timeout (~2 sec.) is reached
>   *(p_value+1)  =SHT_ReadByte(ACK);    //read the first byte (MSB)
>   *(p_value)  =SHT_ReadByte(ACK);    //read the second byte (LSB)
>   *p_checksum =SHT_ReadByte(noACK);  //read checksum
>   return error;
> }   
> 
> //----------------------------------------------------------------------------------------
> // calculates temperature [°C] and humidity [%RH] 
> // input :  humi [Ticks] (12 bit) 
> //          temp [Ticks] (14 bit)
> // output:  humi [%RH]
> //          temp [°C] 
> //----------------------------------------------------------------------------------------
> 
> void calc_sth11(float *p_humidity ,float *p_temperature)
> { 
> 
>   //float rh=*p_humidity;             // rh:      Humidity [Ticks] 12 Bit 
>   //float t=*p_temperature;           // t:       Temperature [Ticks] 14 Bit
>   float rh_lin;                     // rh_lin:  Humidity linear
>   float rh_true;                    // rh_true: Temperature compensated humidity
>   float t_C;                        // t_C   :  Temperature [°C]
> 
>   t_C=*p_temperature*0.01 - 40;                  //calc. temperature from ticks to [°C]
>   rh_lin=C3*(*p_humidity)*(*p_humidity) + C2*(*p_humidity) + C1;     //calc. humidity from ticks to [%RH]
>   rh_true=(t_C-25)*(T1+T2*(*p_humidity))+rh_lin;   //calc. temperature compensated humidity [%RH]
>   if(rh_true>100)rh_true=100;       //cut if the value is outside of
>   if(rh_true<0.1)rh_true=0.1;       //the physical possible range
> 
>   *p_temperature=t_C;               //return temperature [°C]
>   *p_humidity=rh_true;              //return humidity[%RH]
> }
> 
> //--------------------------------------------------------------------
> // calculates dew point
> // input:   humidity [%RH], temperature [°C]
> // output:  dew point [°C]
> //--------------------------------------------------------------------
> 
> float calc_dewpoint(float h,float t)
> { 
>   float logEx,dew_point;
>   logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
>   dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
>   return dew_point;
> }   
> 
> //----------------------------------------------------------------------------------
> // reads the status register with checksum (8-bit)
> //----------------------------------------------------------------------------------
> char s_read_statusreg(unsigned char *p_value, unsigned char *p_checksum)
> { 
>   unsigned char error=0;
>   s_transstart();                   //transmission start
>   error=SHT_WriteByte(STATUS_REG_R); //send command to sensor
>   *p_value=SHT_ReadByte(ACK);        //read status register (8-bit)
>   *p_checksum=SHT_ReadByte(noACK);   //read checksum (8-bit)  
>   return error;                     //error=1 in case of no response form the sensor
> }
>   
> //----------------------------------------------------------------------------------
> // writes the status register with checksum (8-bit)
> //----------------------------------------------------------------------------------
> char s_write_statusreg(unsigned char *p_value)
> { 
>   unsigned char error=0;
>   s_transstart();                   //transmission start
>   error+=SHT_WriteByte(STATUS_REG_W);//send command to sensor
>   error+=SHT_WriteByte(*p_value);    //send value of status register
>   return error;                     //error>=1 in case of no response form the sensor
> }
> 
> Ardian     3oz^
> 
> 
>       Lebih bergaul dan terhubung dengan lebih baik. Tambah lebih banyak teman ke Yahoo! Messenger sekarang! http://id.messenger.yahoo.com/invite/
> 
> [Non-text portions of this message have been removed]
>

Instead of your s_transstart(); Try the below code...and also i've some problem with codevisionAVR then switched to WINAVR then i'm able to get the out accurately..
Well ur rest of the code is OK...
All the best.

void s_transstart(void)
Show quoted textHide quoted text
> {                                
>    SHT_DATA_OUT=1; 
>    SHT_SCK=0;                   //Initial state
>    delay_us(1);

>    SHT_SCK=1;
>    delay_us(1);

>    SHT_DATA_OUT=0;
>    delay_us(1);
>    SHT_SCK=0;  
>    delay_us(5);
>    SHT_SCK=1;
>    delay_us(1);
>    SHT_DATA_OUT=1;           
>    delay_us(1);
>    SHT_SCK=0;           
> }
>

[AVR-Chat] help me interface atmega8535 ds1307 sht11

2009-03-16 by Ardian sandy

i am can't read valid humidity and temperature on my LCD???before i change transstart???


      Lebih bergaul dan terhubung dengan lebih baik. Tambah lebih banyak teman ke Yahoo! Messenger sekarang! http://id.messenger.yahoo.com/invite/

[Non-text portions of this message have been removed]

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.