1
\$\begingroup\$

DS2401 is a 64-bit ROM memory that used as a hardware-serial-number. [Datasheet : here] It has only two pin. One of them is ground and one of them is Data/Power pin. So for communicate with this chip there is a protocol that called 1-Wire. [1-Wire tutorial : here and here . ]

I want to read my DS2401 chip with AVR ATmega32 , and I use 1wire.h library in codevision. As mentioned in Codevision AVR User Manual [Here] I must use w1_read() function to read a byte of DS2401. but it returns me only 255 [On the LCD]!

This is my codevision code:

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 7/19/2014
Author  : 
Company : 
Comments: 


Chip type               : ATmega32A
Program type            : Application
AVR Core Clock frequency: 1.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 512
*****************************************************/

#include <mega32a.h>
#include <delay.h>
#include <stdio.h>

// 1 Wire Bus interface functions
#include <1wire.h>

// Alphanumeric LCD Module functions
#include <alcd.h>

// Declare your global variables here

void main(void)
{
int init_res,read_byte,i;
char read_byte_char[64];
// Declare your local variables here

// Input/Output Ports initialization
// Port A 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 
PORTA=0x00;
DDRA=0x00;

// Port B 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 
PORTB=0x00;
DDRB=0x00;

// 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=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 
PORTD=0x00;
DDRD=0x00;

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

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
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: Timer2 Stopped
// Mode: Normal top=0xFF
// 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
// USART disabled
UCSRB=0x00;

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

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// 1 Wire Bus initialization
// 1 Wire Data port: PORTB
// 1 Wire Data bit: 2
// Note: 1 Wire port settings must be specified in the
// Project|Configure|C Compiler|Libraries|1 Wire IDE menu.
// w1_init(); <-------------------------

// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTA Bit 1
// EN - PORTA Bit 2
// D4 - PORTA Bit 4
// D5 - PORTA Bit 5
// D6 - PORTA Bit 6
// D7 - PORTA Bit 7
// Characters/line: 16
lcd_init(16);

while (1)
      {
      init_res = w1_init();

      if (init_res ==1)
      {
         lcd_clear(); 
         lcd_gotoxy(1,0);
         lcd_puts("Chip Connected");   
         delay_ms(1000);

         lcd_clear();
         lcd_gotoxy(1,0);
         lcd_puts("Serial Number:"); 

         for (i=1;i<9;i++)
            {
               read_byte=w1_read();
               lcd_gotoxy(i,1);
               sprintf(read_byte_char,"%i",read_byte); 
               lcd_puts(read_byte_char);   
               delay_ms(1000);
            };


      }
      else
      {

        lcd_clear();
        lcd_gotoxy(1,1);
        lcd_puts("Chip Not Found");
      } 
      delay_ms(2000);
      }
}

Q1: Why?

Q2: Each time that I call w1_read function, DS2401 send me next 1 byte? or the same first 1 byte? or total of the ROM?

\$\endgroup\$
1
\$\begingroup\$

I don't think you're sending the ROM Command after you have initialized the bus. According to the datasheet, page 4:

The sequence for accessing the DS2401 via the 1-Wire port is as follows:

  • Initialization
  • ROM Function Command
  • Read Data

The command you probably want is

Read ROM [33h] or [0Fh]


Also, are you really running at 1MHz, as stated in the auto-comment? Timing could also be the cause of these problems.

\$\endgroup\$
  • \$\begingroup\$ In the while loop , I used w1-read() after w1-init(). I think w1-init() is the initialization command and w1-read() is the Read Rom command. \$\endgroup\$ – TheGoodUser Jul 20 '14 at 3:34
  • \$\begingroup\$ @TheGoodUser I don't think that's quite right. IMO you're supposed to write the Read ROM command using w1_write(0x33), and then read 8 consecutive bytes. \$\endgroup\$ – Dzarda Jul 20 '14 at 14:19

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.