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...
Druckbare Version
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...
NACHTRAG:
ich habe die Codegröße mal verglichen zwischen einem Overlay und der Verwendung von Alias:
= 230 RomimageCode:$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
=240 RomimageCode:$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
Also lieber nen Overlay oder?
@Stefan_Z,
habe es beidemale am Simulator getestet, dort lief es jedenfalls :D
MAT
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
STIMMT! aaaaaaber, wenns funktioniert und die Hardware das
hergibt...... Achje, sorry, bin kein Programmierpurist. VG Micha
Letzlich das Einzige, was wirklich zählt. :-)Zitat:
...wenns funktioniert ...
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?Zitat:
Der AVR bzw. Bascom muss ganzschön rumwursteln, um mit einzelnen Bits zu arbeiten---> viel Code--> viele Cyclen
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
Haaaa...
jetzt habe ich aber ein neues Problem:
* nach dem ich meine Bits mit einem Byte as Overlay abspeichern kann
* hole ich mir diese so wieder und lege sie wieder in das Byte As Overlay: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
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.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
Wie kann ich nun die Daten aus dem Ds1307_buff() in die zugehörigen Bits schieben?
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:
Ich denke, das sollte so gehen.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