- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: Zwei Word Variablen in einer anderen verpacken Schieberegist

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    25.01.2007
    Beiträge
    20

    Zwei Word Variablen in einer anderen verpacken Schieberegist

    Anzeige

    Powerstation Test
    Hallo, liebe Forengemeinde.

    Hab gerade ein Problem bei der Programmierung meines Atmega16.

    Ich benötige zum Ansteuern eines seriellen Schieberegisters, LM7001
    eine 24Bit lange Zahlenfolge.

    Ich würde nun gerne die Teilerinfo 14Bit (Dezimalzahlenwert, Word) und die Steuerinfo 10Bit (Bitfolge, auch Word) zusammen in einer Variable "verpacken" und dann auf dem Schieberegister ausgeben.

    Welchen Befehl gibt es dafür in Bascom?

    Makeint geht doch nur für Bytes, wenn ich das richtig sehe.

    Danke schonmal für eure Antworten

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Also in der Bascom Hilfe steht zu MAKEINT:
    ...The equivalent code is: varn = (256 * MSB) + LSB...

    Entsprechend könntest du ja deine
    Ausgabevariable = (65536 * MSB) + LSB machen.

    Die Ausgabevariable sollte dann eine LONG sein (4 Byte).

    Versuchs mal, würde mich auch interessieren...

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Die Ecke daran sind die zwei Bit, die du erstmal überlappen mußt.
    Welche Bits von der Steuerinfo sollen denn nach bit 14, 15 von der Teilerinfo ?
    Und in welcher Reihenfolge sollen die Bits dann ausgegeben werden ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    25.01.2007
    Beiträge
    20
    Hi,

    @stefan_z

    habs gerade getestet.

    Es klappt nicht, sondern man erhält Fehlermeldungen, also wäre dankbar für weitere Tipps.

    @Picnick

    Also mit der Teilerzahl dass sind die 14Bits, fängt die Übertragung an, danach kommen dann die Steuerinfos, das ganze fängt laut DB mit dem LSB an, daran sollen dann die Steuerinfos gehängt werden. Die Steuerinfo die dann nach der Teilerzahl aus dem Port dann rauskommt soll die Folge 0000000101 haben.

    Wass mach ich eigentlich wenn mein derzeitiger Teilerwert nicht die ganzen 14Bit lang ist, was muss ich dann in das Schieberegister schreiben, damit der ganze Rest dann an die richtige Stelle wandert?

    Ich häng mal das Datenblatt vom LM an.
    Angehängte Dateien Angehängte Dateien

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ah, ja, alles klar.
    Also: die zwei fraglichen Bits sind sowieso immer 0, als kein Problem
    Du hast also:
    Code:
    DIM DWort as WORD   ' das sind die Bits  D0 --- D13 
                                     ' T0 u. T1 sind da automatisch als 0 dabei 
    DIM Sinfo as WORD     ' B0, B1, B2, TB   R0, R1, R2, S   
    
    '  eine möglichkeit, wenn du die 3 Bytes einzeln ausgeben willst
    
    DIM sendebytes(4) as byte at DWort OVERLAY
    DIM index as Byte
    
    FOR index = 1 TO 3 
           *sende  Sendebytes(Index)         
    NEXT
    
    '  andere möglichkeit, ganz einfach z.B.
    
    Printbin Sendebytes(1) ; 3
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Hmm das kann natürlich daran liegen, dass LONG einen Zahlenbereich von -2147483648 bis 2147483647 abdeckt - es kann also keine positive Zahl von 32 Bit Größe enthalten. Das eigentliche Bitmuster kann aber was du brauchst.
    Versuchs dann mal mit SHIFT oder ROTATE.
    Erste Variable in die LONG rein, dann verschieben und 2. Variable mit AND drüberlegen... sowas in der Art...

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    25.01.2007
    Beiträge
    20
    Hi,

    danke für eure Tipps.

    Hier mal Codeausschnitte im Anhang, dürfte es nun so gehen?

    Hat jemand vielleicht notfalls auch noch nen Testprogramm, wenn es nicht geht?
    Angehängte Dateien Angehängte Dateien

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Na, obs geht würde ich mal am Objekt testen.
    Oder zumindest im Simulator die Ausgabe-Variable begutachten...

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    25.01.2007
    Beiträge
    20
    Hi theoretisch müsste es aber klappen oder?

    Habs jetzt schon öfters probiert und musste halt jedesmal den Atmega ausbauen, um ihn dann beschreiben zu können, das nervt halt etwas und dem Flash-Speicher tut ständig schreiben ja auch nicht so gut...

    Edit:

    Hat leider natürlich nicht geklappt

    Was mach ich noch falsch?

    Noch nen bisschen Offtopic,

    Wie lang sollten denn die Leitungen vom MC zum Ic maximal sein??

  10. #10
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Das könnte die Sende-routine sein (nicht elegant, sollte aber funzen)

    Code:
    dim xx as byte
    
    
    '..........................Steuerinfos und Frequenz übertragen            ......
    Initialisieren:                                             'Control und Frequenzword übertragen
       'Squelch = 1                                                 'Squelch einschalten
       Controlw = &B00000101
       Gosub Senden
    Return
    
    Senden:
       Dat = 0                                                  'Dat
       Dlen = 0                                                 'CE
       Clb = 0                                                  'Cl
              ' start sending-------------------------------------
       Dlen = 1
       For Index = 1 To 3
          Controls = Sendebytes(index)
          For I = 0 To 7                                        'Bits 0-7 ausgeben
                xx = Controls And 1            ' daten pin setzen 
                Dat = Xx.0
                Clb = 1                                         ' Clock 1
                Shift Controls , right , 1
                Clb = 0                                         ' Clock 0
          Next
       Next I
              ' stop sending-------------------------------------
       Dlen = 0
       Return
    Die Waitms Befehle wirst du nicht brauchen, denk ich, die ganze sache ist langsam genug
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus