- 3D-Druck Einstieg und Tipps         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: dimensionierte Bits in einem Byte speichern

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Anzeige

    Powerstation Test
    Jo du solltest aber mal genau die Varianten testen, compilieren bedeutet bei Bascom nicht immer, dass es auch funktioniert - zumindest habe ich das die Tage beim XMEGA feststellen müssen...

  2. #12
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    50
    Beiträge
    381
    NACHTRAG:

    ich habe die Codegröße mal verglichen zwischen einem Overlay und der Verwendung von Alias:

    Code:
    $regfile = "m128def.DAT"
    $crystal = 16000000
    $baud = 57600
    $baud1 = 57600                                                                                                                                        ' ÄNDERUNG AUF HÖHERE RATE!!!!!!
    $hwstack = 70
    $swstack = 70
    $framesize = 70
    '$sim
    
    Dim Hd As Byte
    Dim A As Bit , B As Bit , C As Bit , D As Bit , E As Bit , F As Bit , G As Bit , H As Bit
    Dim Bit1 As Bit , Bit2 As Bit , Bit3 As Bit , Bit4 As Bit , Bit5 As Bit , Bit6 As Bit , Bit7 As Bit , Bit8 As Bit
    'A1 Alias Hd.1                                                                                                                                         'Flags für Anzeigebuttons nicht aktiv (nicht-invertiert)
    'Dim Rf12_dummy As Byte , Mem_dummy(2) As Byte
    
    Dim Byte1 As Byte At A Overlay
    Dim Byte2 As Byte At Bit1 Overlay
    
    Do
    A = 1
    B = 0
    C = 1
    D  = 0
    E  = 1
    F = 0
    G = 1
    H  = 0
    Bit1 = 1
    Bit2 = 0
    Bit3 = 1
    Bit4 = 0
    Bit5 = 1
    Bit6 = 0
    Bit7 = 1
    Bit8 = 0
    
    Print Bin(byte1)
    Print Bin(hd)
    
    Loop
    End
    = 230 Romimage
    Code:
    $regfile = "m128def.DAT"
    $crystal = 16000000
    $baud = 57600
    $baud1 = 57600                                                                                                                                        ' ÄNDERUNG AUF HÖHERE RATE!!!!!!
    $hwstack = 70
    $swstack = 70
    $framesize = 70
    '$sim
    
    
    
    Dim Hd As Byte
    Dim A As Bit , B As Bit , C As Bit , D As Bit , E As Bit , F As Bit , G As Bit , H As Bit
     Bit1 Alias Hd.1
     Bit2 Alias Hd.2
     Bit3 Alias Hd.3
     Bit4 Alias Hd.4
     Bit5 Alias Hd.5
     Bit6 Alias Hd.6
     Bit7 Alias Hd.7
     Bit8 Alias Hd.8
    
    Dim Byte1 As Byte At A Overlay
    
    Do
    A = 1
    B = 0
    C = 1
    D  = 0
    E  = 1
    F = 0
    G = 1
    H  = 0
    Bit1 = 1
    Bit2 = 0
    Bit3 = 1
    Bit4 = 0
    Bit5 = 1
    Bit6 = 0
    Bit7 = 1
    Bit8 = 0
    Print Bin(byte1)
    Print Bin(hd)
    
    
    Loop
    End
    =240 Romimage

    Also lieber nen Overlay oder?

  3. #13
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    50
    Beiträge
    381
    @Stefan_Z,

    habe es beidemale am Simulator getestet, dort lief es jedenfalls

    MAT

  4. #14
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Möchte es nur gesagt haben:
    "BIT" klingt so schön klein und sparsam, aaaaaaber

    Der AVR bzw. Bascom muss ganzschön rumwursteln, um mit einzelnen Bits zu arbeiten---> viel Code--> viele Cyclen

    http://www.rn-wissen.de/index.php/Ba..._Set_.26_Clear

    Sparen tut man am SRAM, das stimmt. Aber flott ist anders
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #15
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.10.2008
    Ort
    Kehnert
    Beiträge
    1.159
    STIMMT! aaaaaaber, wenns funktioniert und die Hardware das
    hergibt...... Achje, sorry, bin kein Programmierpurist. VG Micha

  6. #16
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    ...wenns funktioniert ...
    Letzlich das Einzige, was wirklich zählt.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #17
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    50
    Beiträge
    381
    Der AVR bzw. Bascom muss ganzschön rumwursteln, um mit einzelnen Bits zu arbeiten---> viel Code--> viele Cyclen
    wenn aber nur einzelne Bits, also einzelne Merker, gebraucht werden wie sollen diese dann gedimt werden? Ganze Byts nehmen oder wie wäre Dein Vorschlag PickNick?

  8. #18
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Wenn es flott sein soll, nehme ich für Schalter in der Tat ganze Bytes.
    Also z.B bei der Kommunikation zwischen ISR und Do-Loop.
    Da brauch' ich auch bei der ISR weniger bis nix Register zu sichern.

    Was anderes ist es, wenn man Speicherplatz sparen muss, also z.B. bei Datenloggern o.ä.

    Man kann übrigens auch BIT setzen durch OR und löschen durch AND

    BIT1_3 = 1 ist gleich BYTE1 = BYTE1 OR &H04
    BIT1_3 = 0 ist gleich BYTE1 = BYTE1 AND &HFB

    Wie immer beim Programmieren: Es kommt darauf an. Einen Königsweg, der immer passt, is nich
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #19
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    50
    Beiträge
    381
    Haaaa...

    jetzt habe ich aber ein neues Problem:

    * nach dem ich meine Bits mit einem Byte as Overlay abspeichern kann
    Code:
    Dim F_batt_pic_0 As Bit , F_batt_pic_1 As Bit , F_batt_laden As Bit , Automatik As Bit , Automatik_1 As Bit , Frei_1 As Bit , Frei_2 As Bit , Frei_3 As Bit       ' Merker für WWassersteuerung
    Dim Ds1307_sram4 As Byte At F_batt_pic_0 Overlay
    Dim Ds1307_buff(4) As Byte
    .
    .
    .
    Ds1307_sram_w:
          Slave_adress = &HD0
          Send_byte = 5
          Ds1307_w_d(1) = &H8
          Ds1307_w_d(2) = Ds1307_sram1
          Ds1307_w_d(3) = Ds1307_sram2
          Ds1307_w_d(4) = Ds1307_sram3
          Ds1307_w_d(5) = Ds1307_sram4
          Call Master_transmit(slave_adress , Send_byte , Ds1307_w_d(1))
    
     Return
    * hole ich mir diese so wieder und lege sie wieder in das Byte As Overlay:
    Code:
    Gosub Ds1307_sram_r
    Ds1307_sram1 = Ds1307_buff(1)
    Ds1307_sram2 = Ds1307_buff(2)
    Ds1307_sram3 = Ds1307_buff(3)
    Ds1307_sram4 = Ds1307_buff(4)
    
     Ds1307_sram_r:
          Slave_adress = &HD0
          Send_byte = 1
          Ds1307_w_d(1) = &H8
     Call Master_transmit(slave_adress , Send_byte , Ds1307_w_d(1))
    
         Twi_mst_addr = &HD1
         Twi_mr_cntr = 4
         Twi_mr_data = Varptr(ds1307_buff(1))
    
         Gosub Run_wait_master
    Print "ds1307 geholt"
    Return
    aber... da ich die gespeicherten daten in das Byte lege und dieses als overlay über den bits liegt, habe ich dann immer wieder die Werte in den Bits, egal ob ich diese ändere oder nicht.

    Wie kann ich nun die Daten aus dem Ds1307_buff() in die zugehörigen Bits schieben?

  10. #20
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Weiss nicht, ob ich die Frage richtig verstehe.
    Es gibt keine Notwendigkeit, die Bit-Bytes erst in einen Buffer zu übertragen, um sie von dort zu senden.
    Ebensowenig, einen eigenen EmpfangsBuffer einzurichten

    z.B würde reichen zum senden und empfangen:

    Code:
     
    
    DIM Twi_data  as byte
    DIM F_batt_pic_0 As Bit 
    DIM F_batt_pic_1 As Bit  
    DIM F_batt_laden As Bit  
    DIM Automatik As Bit  
    DIM Automatik_1 As Bit          ' Merker für Wassersteuerung 
    '--etc--      
    
    '--------------Durch diese DIM's liegen  
    '--------------------Twi-Data und das Bit-Byte hintereinander
    
    
    '---------------- senden --------------
    Ds1307_sram_w: 
          Slave_adress = &HD0 
          Send_byte = 5 
          Twi_data  = &H8 
          Call Master_transmit(slave_adress , Send_byte , Twi_data) 
     Return 
    
    '---------------- empfangen --------------
     Ds1307_sram_r: 
    
          Slave_adress = &HD0 
          Send_byte = 1 
          Twi_data  = &H8 
          Call Master_transmit(slave_adress , Send_byte , Twi_data) 
    
         Twi_mst_addr = &HD1 
         Twi_mr_cntr = 4 
         Twi_mr_data = Varptr(F_batt_pic_0) 
    
         Gosub Run_wait_master 
    Print "ds1307 geholt" 
    Return
    Ich denke, das sollte so gehen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test