PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : dimensionierte Bits in einem Byte speichern



mat-sche
03.01.2011, 19:26
Hallo liebe Gemeinde!

in meinem Programm habe ich einige Variablen als Bits dimensioniert:

dim a as bit, b as bit.....

nun will ich diese Bits in einem Byte speichern und dieses dann im EEProm hinterlegen. Leider fehlt mir gerade der Faden wie ich an die Sache herangehen muss, kann mir einer bitte helfen :)

Grüße MAT

Sauerbruch
03.01.2011, 19:53
...vielleicht so?




Dim A as bit
Dim B as bit
Dim C as bit
...

Dim ByteA as byte
Dim ByteE as Eram Byte

ByteA.0 = A
ByteA.1 = B
ByteA.2 = C
...

ByteE = ByteA



Oder seh´ ich den Wald vor lauter Bäumen nicht? ...

Michael
03.01.2011, 19:55
Hallo mat-sche,

die Hilfe von Bascom verbietet nicht "Dim A As Eram Bit" zu schreiben.


nun will ich diese Bits in einem Byte speichern und dieses dann im EEProm hinterlegen.
Dim E_byte as Eram Byte
Dim S_Byte As Byte
A Alias S_Byte.0
B Alias S_Byte.1 etc.

Lesen:
S_Byte = E_Byte

Schreiben:
A = 1
B = 0
E_Byte = S_Byte

Gruß, Michael

mat-sche
03.01.2011, 20:00
He Sauerbruch,

neee, so war das eigentlich nicht gedacht. Mal etwas ausschweifend.....

die einzelnen Bits , 24 an der Zahl, müssen in 3 Byte kopiert werden. Diese 3 Byte will ich dann in einem RTC DS1307 speichern. Habe ich ein Stromausfall, kann ich danach die 3 Byte wieder aus dem s-ram vom DS 1307 holen und dann müssen die 3 Byte wieder auf die Bits aufgeteilt werden. So weiß das Programm wie der letzte Stand war.

Hmmm wie geht das nur?

hardware.bas
04.01.2011, 09:21
3 Speicherbyte dimensionieren und dann die Bits so einbauen:
Speicher1 = Speicher1 + Bit1 * 1
Speicher1 = Speicher1 + Bit2 * 2
.
.
Speicher3 = Speicher3 + Bit24 * 8
Muss man nur noch ne vernünftige Routine zu schreiben, jedoch sollte
das vom Prinzip her gehen und man hat dann jeweils ein niedriges,
mittleres und hohes Byte. VG Micha

stefan_Z
04.01.2011, 09:38
Oder die 24 Bit hintereinander dimmen und dann drei Bytes als Overlay drüber, falls du die auch komplett auslesen musst.

PicNick
04.01.2011, 11:13
Die @Stefan_Z - Methode könnte man so machen:


Dim Bit1_1 As Bit
Dim Bit1_2 As Bit
Dim Bit1_3 As Bit
Dim Bit1_4 As Bit
Dim Bit1_5 As Bit
Dim Bit1_6 As Bit
Dim Bit1_7 As Bit
Dim Bit1_8 As Bit

Dim Bit2_1 As Bit
Dim Bit2_2 As Bit
Dim Bit2_3 As Bit
Dim Bit2_4 As Bit
Dim Bit2_5 As Bit
Dim Bit2_6 As Bit
Dim Bit2_7 As Bit
Dim Bit2_8 As Bit

Dim Bit3_1 As Bit
Dim Bit3_2 As Bit
Dim Bit3_3 As Bit
Dim Bit3_4 As Bit
Dim Bit3_5 As Bit
Dim Bit3_6 As Bit
Dim Bit3_7 As Bit
Dim Bit3_8 As Bit

Dim Byte1 As Byte At Bit1_1 Overlay
Dim Byte2 As Byte At Bit2_1 Overlay
Dim Byte3 As Byte At Bit3_1 Overlay


Es muss aber garnicht so geschlossen hintereinander gedimmt werden.

Richard
04.01.2011, 16:50
Hallo liebe Gemeinde!

in meinem Programm habe ich einige Variablen als Bits dimensioniert:

dim a as bit, b as bit.....

nun will ich diese Bits in einem Byte speichern und dieses dann im EEProm hinterlegen. Leider fehlt mir gerade der Faden wie ich an die Sache herangehen muss, kann mir einer bitte helfen :)

Grüße MAT

Irgendwo in der Bascom Hilfe...........

Für jedes Bit belegt Bascom (intern) ein Komplettes Byte. Wenn also 3 Bit Deklariert werden, belegt Bascom dafür 3 Byte, " wenn ich das richtig (wo?) gelesen habe".

Gruß Richard

PicNick
04.01.2011, 17:06
@Richard: So bescheuert ist bascom auch wieder nicht.
Er reserviert ein Byte und stellt 8 Bit-dims rein, dann fängt er das nächste Byte an
Auszug bascom-report


ERR Bit 0006 6
BIT1_1 Bit 0060 96
BIT1_2 Bit 0060 96
BIT1_3 Bit 0060 96
BIT1_4 Bit 0060 96
BIT1_5 Bit 0060 96
BIT1_6 Bit 0060 96
BIT1_7 Bit 0060 96
BIT1_8 Bit 0060 96
BIT2_1 Bit 0061 97
BIT2_2 Bit 0061 97
BIT2_3 Bit 0061 97
BIT2_4 Bit 0061 97
BIT2_5 Bit 0061 97
BIT2_6 Bit 0061 97
BIT2_7 Bit 0061 97
---etc---

mat-sche
04.01.2011, 17:37
Hallo,

PicNick ist mal wieder mein Held! So kann man es natürlich auch machen,


Dim Bit1_1 As Bit
Dim Bit1_2 As Bit
Dim Bit1_3 As Bit
Dim Bit1_4 As Bit
Dim Bit1_5 As Bit
Dim Bit1_6 As Bit
Dim Bit1_7 As Bit
Dim Bit1_8 As Bit

Dim Bit2_1 As Bit
Dim Bit2_2 As Bit
Dim Bit2_3 As Bit
Dim Bit2_4 As Bit
Dim Bit2_5 As Bit
Dim Bit2_6 As Bit
Dim Bit2_7 As Bit
Dim Bit2_8 As Bit

Dim Bit3_1 As Bit
Dim Bit3_2 As Bit
Dim Bit3_3 As Bit
Dim Bit3_4 As Bit
Dim Bit3_5 As Bit
Dim Bit3_6 As Bit
Dim Bit3_7 As Bit
Dim Bit3_8 As Bit

Dim Byte1 As Byte At Bit1_1 Overlay
Dim Byte2 As Byte At Bit2_1 Overlay
Dim Byte3 As Byte At Bit3_1 Overlay


obwohl ich habe es gestern schon so in der Art probiert.
Und nun weiß ich auch wo mein Fehler lag:
ich hatte zu erst "Dim Byte1 As Byte At Bit1_1 Overlay " und dann die Bits dimensioniert und bekam somit eine Fehlermeldung. Ich hätte das Overlay am Schluss machen sollen ](*,)

Aber hier noch eine weitere Möglichkeit, die mir eben noch eingefallen ist:



Dim Hd As Byte
Bit1 Alias Hd.1



Ok... dann kann es nun schön weiter gehen im Text!

Danke Euch allen :D

stefan_Z
04.01.2011, 17:57
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...

mat-sche
04.01.2011, 18:06
NACHTRAG:

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



$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


$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?

mat-sche
04.01.2011, 18:09
@Stefan_Z,

habe es beidemale am Simulator getestet, dort lief es jedenfalls :D

MAT

PicNick
04.01.2011, 19:15
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/Bascom_Inside-Code#BIT_Set_.26_Clear

Sparen tut man am SRAM, das stimmt. Aber flott ist anders

hardware.bas
04.01.2011, 20:12
STIMMT! aaaaaaber, wenns funktioniert und die Hardware das
hergibt...... Achje, sorry, bin kein Programmierpurist. VG Micha

PicNick
04.01.2011, 20:43
...wenns funktioniert ...
Letzlich das Einzige, was wirklich zählt. :-)

mat-sche
04.01.2011, 21:15
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?

PicNick
05.01.2011, 07:54
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

mat-sche
05.01.2011, 21:42
Haaaa...

jetzt habe ich aber ein neues Problem:

* nach dem ich meine Bits mit einem Byte as Overlay abspeichern kann


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:



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?

PicNick
06.01.2011, 09:08
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:




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.

mat-sche
07.01.2011, 22:47
Hallo PickNick,

nun... ich habe es so wie Du vorgeschlagen hast ausprobiert. Leider hat es nicht funktioniert. kann es vielleicht daran liegen wie ich die Bits dimensioniert habe?:


Dim Ds1307_sram As Byte
Dim F_bad_pic_0 As Bit , F_kue_pic_0 As Bit , F_wo_pic_0 As Bit , F_wo_rechts_pic_0 As Bit , F_wo_mitte_pic_0 As Bit , F_wo_links_pic_0 As Bit


Müssen alle Bits in der Art:


dim F_bad_pic_0 As Bit
dim F_kue_pic_0 As Bit
.
.

untereinander geschrieben werden und erkennt das BAscom nur dann so?
ich habe nun es mit nem "Alias" gemacht und es funktioniert so.

Gruß MAT

PicNick
08.01.2011, 08:19
Nicht notwendig, ich schreibe es nur so wegen der Übersichtlichkeit (Gewohnheit).
Du müsstes dein Programm posten, dann kann ich checken, WAS nicht funzt.

mat-sche
08.01.2011, 09:16
Danke für Dein Angebot!
Ich werde in der Sache erst einmal nicht weitermachen da der Code so läuft. Muss jetzt mich mal mit was anderem beschäftigen... es gibt noch andere Sklaven :D

Dank aber dennoch!