#1
  1. No Profile Picture
    Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Mar 2017
    Posts
    31
    Rep Power
    1

    Question OSError: [Errno 16] Device or resource busy' for ralationship with ds1307


    i want to set time & date by ds1307 IC...I added rtc-ds1307 to /etc/modules my program is
    Code:
     from RTC_DS1307 import RTC
     
    rtc = RTC()
    rtc.setDate(seconds = 0, minutes = 47, hours = 9, dow = 3,
                day = 8, month = 6, year = 16)
    print ("Date set to:", rtc.getDateStr())]
    'setDate' is a function in 'RTC_DS1307.py' that gets value of 'second', 'minute','hour',... and then puts every one of these values in itself register by '_write' function & 'write_byte_data' command i considered a seperate register for 'second','minute',...by defining a hex value for every register. now, my problem is i get the following error..please helpppp

    Code:
    Traceback (most recent call last):
      File "/home/pi/start/time/set-get.py", line 5, in <module>
        day = 8, month = 6, year = 16)
      File "/home/pi/start/time/RTC_DS1307.py", line 124, in setDate
        self._write(self._REG_SECONDS, intToBcd(seconds))
      File "/home/pi/start/time/RTC_DS1307.py", line 54, in _write
        self._bus.write_byte_data(self._addr, register, data)
    OSError: [Errno 16] Device or resource busy]
    'RTC_DS1307.py' is as following

    Code:
    # RTC_DS1307.py
    # Code inspired from GitHub: sorz/DS1307.py
    
    import smbus
    
    def bcdToInt(bcd):
        '''
        Converts byte interpreted as two digit bcd to integer
        (e.g. 88 = b01011000->bcd0101'1000 = 58)
        '''
        out = 0
        for d in (bcd >> 4, bcd):
            for p in (1, 2, 4 ,8):
                if d & 1:
                    out += p
                d >>= 1
            out *= 10
        return out // 10
    
    def intToBcd(n):
        '''
        Converts integer 0..99 to byte interpreted in two digit bcd format.
        (e.g. 58 = bcd0101'1000->b01011000 = 88)
        '''
        bcd = 0
        for i in (n // 10, n % 10):
            for p in (8, 4, 2, 1):
                if i >= p:
                    bcd += 1
                    i -= p
                bcd <<= 1
        return bcd >> 1
    
    class RTC():
        _REG_SECONDS = 0x00
        _REG_MINUTES = 0x01
        _REG_HOURS = 0x02
        _REG_DOW = 0x03
        _REG_DAY = 0x04
        _REG_MONTH = 0x05
        _REG_YEAR = 0x06
        _REG_CONTROL = 0x07
    
        def __init__(self, type = 1, addr = 0x68):
            '''
            Creates a Real Time Clock abstraction using given SMBus type and I2C address
            @param type: 0 for RPi model A, 1 for higher versions (default: 1)
            @param addr: I2C address (default: 0x68)
            '''
            self._bus = smbus.SMBus(type)
            self._addr = addr
    
        def _write(self, register, data):
            self._bus.write_byte_data(self._addr, register, data)
            
    
        def _read(self, data):
            returndata = self._bus.read_byte_data(self._addr, data)
            return returndata
    
        def getSeconds(self):
            '''
            Returns current seconds.
            @return: seconds of current date/time (0..59)
            '''
            return bcdToInt(self._read(self._REG_SECONDS))
    
        def getMinutes(self):
            '''
            Returns current minutes.
            @return: minutes of current date/time (0..59)
            '''
            return bcdToInt(self._read(self._REG_MINUTES))
    
        def getHours(self):
            '''
            Returns current hours.
            @return: hours of current date/time (0..23)
            '''
            d = self._read(self._REG_HOURS)
            if (d == 0x64):
                d = 0x40
            return bcdToInt(d & 0x3F)
    
        def getDow(self):
            '''
            Returns current day of week.
            @return: day number of current date/time (1..7, 1 for Monday)
            '''
            return bcdToInt(self._read(self._REG_DOW))
    
        def getDay(self):
            '''
            Returns current day of month.
            @return: day of current date/time (1..31)
            '''
            return bcdToInt(self._read(self._REG_DAY))
    
        def getMonth(self):
            '''
            Returns current month.
            @return: month of current date/time (1..12)
            '''
            return bcdToInt(self._read(self._REG_MONTH))
    
        def getYear(self):
            '''
            Returns current year.
            @return: year of current date/time (0..99)
            '''
            return bcdToInt(self._read(self._REG_YEAR))
    
        def setDate(self, seconds = None, minutes = None, hours = None, dow = None,
                day = None, month = None, year = None):
            '''
            Sets the current date/time.
            Range: seconds [0,59], minutes [0,59], hours [0,23],
                   day_of_week [1,7], day [1-31], month [1-12], year [0-99].
            If a parameter is None (default), the current value is unchanged
            '''
            if seconds is not None:
                if seconds < 0 or seconds > 59:
                    raise ValueError('Seconds is out of range [0,59].')
                self._write(self._REG_SECONDS, intToBcd(seconds))
    
            if minutes is not None:
                if minutes < 0 or minutes > 59:
                    raise ValueError('Minutes is out of range [0,59].')
                self._write(self._REG_MINUTES, intToBcd(minutes))
    
            if hours is not None:
                if hours < 0 or hours > 23:
                    raise ValueError('Hours is out of range [0,23].')
                self._write(self._REG_HOURS, intToBcd(hours))
    
            if year is not None:
                if year < 0 or year > 99:
                    raise ValueError('Years is out of range [0,99].')
                self._write(self._REG_YEAR, intToBcd(year))
    
            if month is not None:
                if month < 1 or month > 12:
                    raise ValueError('Month is out of range [1,12].')
                self._write(self._REG_MONTH, intToBcd(month))
    
            if day is not None:
                if day < 1 or day > 31:
                    raise ValueError('Day is out of range [1,31].')
                self._write(self._REG_DAY, intToBcd(day))
    
            if dow is not None:
                if dow < 1 or dow > 7:
                    raise ValueError('Day Of Week is out of range [1,7].')
                self._write(self._REG_DOW, intToBcd(dow))
    
        def getDate(self):
            '''
            Returns the current date/time.
            @return: date/time in a tuple with order
            (year, month, day, dow, hours, minutes, seconds)
            '''
            return (self.getYear(), self.getMonth(), self.getDay(),
                    self.getDow(), self.getHours(), self.getMinutes(),
                    self.getSeconds())
    
        def getDateStr(self):
            '''
            Returns the current date/time.
            @return: date/time in a string with format
            year-month-day hours:minutes:seconds
            '''
            return "20%02d-%02d-%02d %02d:%02d:%02d" %(self.getYear(), self.getMonth(), self.getDay(), self.getHours(), self.getMinutes(), self.getSeconds())
    
    ]
  2. #2
  3. Not An Expert
    Devshed Newbie (0 - 499 posts)

    Join Date
    Jan 2015
    Posts
    404
    Rep Power
    3
    Hello!

    In the future, when placing Code tags, please make sure that you have [code] at the start of your code. Just placing an open "[" will not create the code boxes that preserve formatting on our forums.

    You are placing them correctly at the ends of your code, just not at the beginning

    Thank you!

IMN logo majestic logo threadwatch logo seochat tools logo