Parallelport Speed

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Guten Tag ich machte aus meinem Parallelport via Python eine i2c

klappt auch wunderbar

nur der Speed mein Atmel 4mhz braucht zum kompletten beschreiben
eines i2C EEprom 24C16 mit zufall generierung aller speicherstellen 0,8sec

der PC für das gleiche via WX Gui und pyparallel 20 SEKUNDEN

mehr wie die datenpins wechseln kann ich ja nicht
warum braucht der so lange

Code: Alles auswählen

    # D0 = (0=scl) 1=NotSCL
    # D1 =  0=sda  1 = notSDA
    # sda=1, scl=1  =setData(0)
    # sda=1, scl=0  =setData(1)
    # sda=0, scl=1  =setData(2)
    # sda=0, scl=0  =setData(3)

    def start(self):
        self.p.setData(0)# sda=1, scl=1 
        self.p.setData(2)# sda=0, scl=1 
        self.p.setData(3)#( sda=0, scl=0
    def stop(self):
        self.p.setData(3)#( sda=0, scl=0
        self.p.setData(2)# sda=0, scl=1 
        self.p.setData(0)# sda=1, scl=1 
    def ack(self):
        self.p.setData(1)# sda=1, scl=0 
        self.p.setData(0)# sda=1, scl=1 
        time.sleep(0.01)
        self.p.setData(1)# sda=1, scl=0 
    def send(self,value):
        x=0x80
        while x:
            sda=(x & value) and 1
            if sda == 1 :
                self.p.setData(1)# sda=1, scl=0
                self.p.setData(0)# sda=1, scl=1
                self.p.setData(1)# sda=1, scl=0
            else:
                self.p.setData(3)#sda=0, scl=0
                self.p.setData(2)# sda=0, scl=1
                self.p.setData(3)#sda=0, scl=0
            x=x>>1
    def writeRegister(self,address, register, value,):
        self.start() 
        self.send(address)
        self.ack()
        self.send(register)
        self.ack() 
        self.send(value) 
        self.ack() 
        self.stop()
    def writePage(self,adresse,register,daten):
        self.start() 
        self.send(adresse)
        self.ack()
        self.send(register)
        self.ack() 
        for i in daten:
            self.send(i) 
            self.ack() 
        self.stop()
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Gibts jetzt auch 'ne Frage dazu? :?
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

warum braucht mein Atmel mit 4Mhz nur 1sec und der Pc mit Python 20sec für das ganze

geht das auch schneller

wo stell ich den speed des lpt datenportes ein ?????

TESTPROGRAMM
!!!!!!!!! ACHTUNG es wird auf den LPT ZUGEGRIFFEN !!!!!!!!!!!!

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import encodings
import wx
import time
import parallel
import random
import ctypes
import wx.lib.newevent 
import wx.lib.ticker

#wx.SetDefaultPyEncoding("iso-8859-15")

#---------------------------------------------------------------------------

class Frame(wx.Frame):
    def __init__(
            self, parent = None, ID = 1, title = u"FRAME", pos=wx.DefaultPosition,
            size=(400,400), style= wx.DEFAULT_FRAME_STYLE ^ (wx.RESIZE_BORDER | wx.MAXIMIZE_BOX)
            ):

        wx.Frame.__init__(self, parent, ID, title, pos, size, style)
        self.panel = wx.Panel(self, -1)
        self.panel.SetBackgroundColour((0,150,150))
        self.karteEingesteckt = 0

        #Button
        self.button = wx.Button(self.panel, 1003, "Beenden")
        self.button.SetPosition((150, 300))
        self.proggen =wx.Button(self.panel,1000,"Programmieren")
        self.proggen.SetBackgroundColour(wx.RED)
        self.proggen.SetPosition((130,260))
        self.prog =0
        #initialisierung
        self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button)
        self.Bind(wx.EVT_BUTTON, self.OnProggen, self.proggen)
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
        self.p = parallel.Parallel(port=0)

        # laufschrift
        self.ticker = wx.lib.ticker.Ticker(self.panel,pos=(150,180))
        self.txt = " !!! IC einschieben !!! "
        self.ticker.SetDirection("rtl")
        self.ticker.SetFont(self.ticker.GetFont())
        self.ticker.SetText(self.txt)
        self.ticker.SetBackgroundColour(wx.RED)
        

    #AcHTUNG die obige schaltung hat wenn lpt data  0 ist positives scl und sda
    #wenn D0 oder D1 = 1 dann ist SDA =0 oder SCL = o
        
    # D0 = (0=scl) 1=NotSCL
    # D1 =  0=sda  1 = notSDA
    # sda=1, scl=1  =setData(0)
    # sda=1, scl=0  =setData(1)
    # sda=0, scl=1  =setData(2)
    # sda=0, scl=0  =setData(3)

    def start(self):
        self.p.setData(0)# sda=1, scl=1 
        self.p.setData(2)# sda=0, scl=1 
        self.p.setData(3)#( sda=0, scl=0
    def stop(self):
        self.p.setData(3)#( sda=0, scl=0
        self.p.setData(2)# sda=0, scl=1 
        self.p.setData(0)# sda=1, scl=1 
    def ack(self):
        self.p.setData(1)# sda=1, scl=0 
        self.p.setData(0)# sda=1, scl=1 
        time.sleep(0.01)
        self.p.setData(1)# sda=1, scl=0 
    def send(self,value):
        x=0x80
        while x:
            sda=(x & value) and 1
            if sda == 1 :
                self.p.setData(1)# sda=1, scl=0
                self.p.setData(0)# sda=1, scl=1
                self.p.setData(1)# sda=1, scl=0
            else:
                self.p.setData(3)#sda=0, scl=0
                self.p.setData(2)# sda=0, scl=1
                self.p.setData(3)#sda=0, scl=0
            x=x>>1
    def writeRegister(self,address, register, value,):
        self.start() 
        self.send(address)
        self.ack()
        self.send(register)
        self.ack() 
        self.send(value) 
        self.ack() 
        self.stop()
    def writePage(self,adresse,register,daten):
        self.start() 
        self.send(adresse)
        self.ack()
        self.send(register)
        self.ack() 
        for i in daten:
            self.send(i) 
            self.ack() 
        self.stop()
        
    def OnCloseMe(self, event):
        self.Close(True)

    def OnCloseWindow(self, event):
        self.Destroy()

    def OnProggen(self,event):
        maxi = 128
        count = 0
        dlg = wx.ProgressDialog(" Programmieren ",
                           " IC wird Programmiert",
                           maximum = maxi,
                           parent=self,
                           style =  wx.PD_APP_MODAL
                            #| wx.PD_ELAPSED_TIME
                            #| wx.PD_ESTIMATED_TIME
                            #| wx.PD_REMAINING_TIME
                            )
        for page in range(0,8):
           for wordblock in xrange(16):
               seq = []
               seq = [random.randint(0, 255) for i in xrange(16)]
               adresse = 160 + (page*2)
               wordadresse = wordblock * 16
               self.writePage(adresse,wordadresse,seq)
               dlg.Update(count)
               count += 1
               time.sleep(0.01)
        self.prog = 1
        dlg.Destroy()

    def ic_geproggt(self, event):
        self.txt = "!!! IC Bitte entnehmen !!! "
        self.ticker.SetText(self.txt)
        self.ticker.SetBackgroundColour((0,255,0))

class MyApp(wx.PySimpleApp):
   
    def OnInit(self):
        # Frame anzeigen
        fenster = Frame()
        fenster.Center()
        fenster.Show()
       
        return True

def main():
    # App start
    app = MyApp()
    app.MainLoop()

if __name__ == "__main__":
    main()
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ah ... jetzt sehe ich eine Frage ;-)

Für so langen Code wird hier i.A. ein Pastebin-Servcie empfohlen, wie z.B. http://paste.pocoo.org/

Aus Deinem Code ist nicht sofort ersichtlich, was Du eigentlich an Daten hin schickst. Hast Du das mal ausgerechnet? Immerhin baust Du einen sleep(0.01) ein. Hast Du das mal kalkuliert?
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

kann ich auch 10ms warten lassen ist das nicht 0.01

das prog sendet ca 20000 bits!!! 2048Byte a 8 bit + die block page und service adresse zu je 8 bit

mein ja nur elegant ist halt am pc alles zu steuern aber der kleine atmel ist um das 20Fache schneller!!!
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

DANKE

Genial hätte man auch selber draufkommen können mal mit den Zeiten zu spielen!

im Datenblatt steht min 10ms für schreibzyklus des EEproms
test mit programm und leser ponyprog hat 0.005 als sichere datenrate JE
16Byte gegeben
und für den pin wechsel des LPT reicht 0.001 auch aus
das ist jetzt so um die 2seK

IST OK SO

MERCY
Antworten