Seite 1 von 1

Hilfe bei einem "kopierten" Programm

Verfasst: Donnerstag 28. April 2022, 19:16
von Schlangenmensch
Hallo,

ich versuche neben den Phyton Tutorials kleinere spielereien voranzutreiben und diese auch zu verstehen.

Nun hänge ich wieder einmal an einer Fehlermeldung.

Traceback (most recent call last):
File "<stdin>", line 24, in <module>
TypeError: function takes 4 positional arguments but 2 were given

Das Programm ruft von einem Treiber die Daten ab in dem offensichtlich nur 2 von 4 Argumenten vorhanden sind. Ich bin leider noch nicht so weit, daß ich den Fehler finden kann und würde Euch um Unterstützung bitten.

Das "Programm"

Code: Alles auswählen

from machine import I2C, Pin
from ds1302 import DS1302
import utime

#Pins für Kommunikation deklarieren

sclPin = Pin(1) # Bezeichnung Dat auf RTC
sdaPin = Pin(0) # Bezeichnung Clk auf RTC

i2c_object = I2C(0,
                  scl = sclPin,
                  sda = sdaPin,
                  freq = 4000 )

result = I2C.scan(i2c_object)

print("I2C scan result : ", result)
if result !=[]:
    print("I2C connection successfull")
    
else:
    print("retry")
    
clockObject = DS1302(i2c_object)

clockObject.halt(False)

choice = input("Would you like to change the default date time data ( y / n ) ")

if choice == "y":

    print("set the default date time data")
    year = int(input("Year : "))
    month = int(input("month (Jan --> 1 , Dec --> 12): "))
    date = int(input("date : "))
    
    day = int(input("day (1 --> monday , 2 --> Tuesday ... 0 --> Sunday): "))
    
    hour = int(input("hour (24 Hour format): "))
    minute = int(input("minute : "))
    second = int(input("second : "))
    
    now = (year,month,date,day,hour,minute,second,0)
    clockObject.datetime(now)
   
else:
    print("Default data is not changed ")
    print("Default date time settings : ")
    default = clockObject.datetime()
    print("Year : ",default[0])
    print("month : ",default[1])
    print("date : ",default[2])
    print("day : ",default[3])
    print("hour : ",default[4])
    print("minute : ",default[5])
    print("second : ",default[6])
    
    utime.sleep(5)
    
while True:
    (year,month,day,hour,minute,second,p1)=clockObject.datetime()
    print(clockObject.datetime())
    
Die "Treiberdatei"

Code: Alles auswählen

from machine import Pin

DS1302_REG_SECOND = (0x80)
DS1302_REG_MINUTE = (0x82)
DS1302_REG_HOUR   = (0x84)
DS1302_REG_DAY    = (0x86)
DS1302_REG_MONTH  = (0x88)
DS1302_REG_WEEKDAY= (0x8A)
DS1302_REG_YEAR   = (0x8C)
DS1302_REG_WP     = (0x8E)
DS1302_REG_CTRL   = (0x90)
DS1302_REG_RAM    = (0xC0)

class DS1302:
    def __init__(self, clk, dio, cs):
        self.clk = clk
        self.dio = dio
        self.cs = cs
        self.clk.init(Pin.OUT)
        self.cs.init(Pin.OUT)

    def _dec2hex(self, dat):
        return (dat//10) * 16 + (dat % 10)

    def _hex2dec(self, dat):
        return (dat//16) * 10 + (dat % 16)

    def _write_byte(self, dat):
        self.dio.init(Pin.OUT)
        for i in range(8):
            self.dio.value((dat >> i) & 1)
            self.clk.value(1)
            self.clk.value(0)

    def _read_byte(self):
        d = 0
        self.dio.init(Pin.IN)
        for i in range(8):
            d = d | (self.dio.value() << i)
            self.clk.value(1)
            self.clk.value(0)
        return d

    def _get_reg(self, reg):
        self.cs.value(1)
        self._write_byte(reg)
        t = self._read_byte()
        self.cs.value(0)
        return t

    def _set_reg(self, reg, dat):
        self.cs.value(1)
        self._write_byte(reg)
        self._write_byte(dat)
        self.cs.value(0)

    def _wr(self, reg, dat):
        self._set_reg(DS1302_REG_WP, 0)
        self._set_reg(reg, dat)
        self._set_reg(DS1302_REG_WP, 0x80)

    def start(self):
        t = self._get_reg(DS1302_REG_SECOND + 1)
        self._wr(DS1302_REG_SECOND, t & 0x7f)

    def stop(self):
        t = self._get_reg(DS1302_REG_SECOND + 1)
        self._wr(DS1302_REG_SECOND, t | 0x80)

    def second(self, second=None):
        if second == None:
            return self._hex2dec(self._get_reg(DS1302_REG_SECOND+1)) % 60
        else:
            self._wr(DS1302_REG_SECOND, self._dec2hex(second % 60))

    def minute(self, minute=None):
        if minute == None:
            return self._hex2dec(self._get_reg(DS1302_REG_MINUTE+1))
        else:
            self._wr(DS1302_REG_MINUTE, self._dec2hex(minute % 60))

    def hour(self, hour=None):
        if hour == None:
            return self._hex2dec(self._get_reg(DS1302_REG_HOUR+1))
        else:
            self._wr(DS1302_REG_HOUR, self._dec2hex(hour % 24))

    def weekday(self, weekday=None):
        if weekday == None:
            return self._hex2dec(self._get_reg(DS1302_REG_WEEKDAY+1))
        else:
            self._wr(DS1302_REG_WEEKDAY, self._dec2hex(weekday % 8))

    def day(self, day=None):
        if day == None:
            return self._hex2dec(self._get_reg(DS1302_REG_DAY+1))
        else:
            self._wr(DS1302_REG_DAY, self._dec2hex(day % 32))

    def month(self, month=None):
        if month == None:
            return self._hex2dec(self._get_reg(DS1302_REG_MONTH+1))
        else:
            self._wr(DS1302_REG_MONTH, self._dec2hex(month % 13))

    def year(self, year=None):
        if year == None:
            return self._hex2dec(self._get_reg(DS1302_REG_YEAR+1)) + 2000
        else:
            self._wr(DS1302_REG_YEAR, self._dec2hex(year % 100))

    def date_time(self, dat=None):
        if dat == None:
            return [self.year(), self.month(), self.day(), self.weekday(), self.hour(), self.minute(), self.second()]
        else:
            self.year(dat[0])
            self.month(dat[1])
            self.day(dat[2])
            self.weekday(dat[3])
            self.hour(dat[4])
            self.minute(dat[5])
            self.second(dat[6])

    def ram(self, reg, dat=None):
        if dat == None:
            return self._get_reg(DS1302_REG_RAM + 1 + (reg % 31)*2)
        else:
            self._wr(DS1302_REG_RAM + (reg % 31)*2, dat)
Bin für jeden Hinweis dankbar.

Re: Hilfe bei einem "kopierten" Programm

Verfasst: Donnerstag 28. April 2022, 19:42
von Sirius3
Die Klasse DS1302 erwartet kein I²C-Objekt, sondern drei Pins.

Re: Hilfe bei einem "kopierten" Programm

Verfasst: Donnerstag 28. April 2022, 19:50
von Schlangenmensch
...sprich diese 3 ?

self.clk.init(Pin.OUT)
self.cs.init(Pin.OUT)
self.dio.init(Pin.OUT)

Re: Hilfe bei einem "kopierten" Programm

Verfasst: Donnerstag 28. April 2022, 20:40
von Dennis89
Hallo,

für die drei von dir aufgezählten Pins, musst du der Klasse drei Pins übergeben.
Du hast deine RTC mit an die Pins CS, CLK und DIO angeschlossen. Diese drei Pins, als Pin-Objekte, musst du übergeben.

Grüße
Dennis

Re: Hilfe bei einem "kopierten" Programm

Verfasst: Donnerstag 28. April 2022, 22:07
von Schlangenmensch
Danke Euch, dann werde ich versuchen das Programm dementsprechend zu ändern.