PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Logische Operation zum Verändern einzelner Bits



Che Guevara
30.07.2010, 21:14
Hallo Leute,

für eine "Musiklautstärke-8-Led-Anzeige" hab ich bei meinem Atmega32 den ADC auf Free-Run eingestellt. Das ganze allerdings durch Ansprechen der Register und nicht mit dem BASCOM-Config-Geraffel!

Hier mal mein Code:


$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 80
$hwstack = 80
$swstack = 80


Ddrc = 255
Portc = 255

Ddra.0 = 0
Porta.0 = 0


Admux = &B01100000
Adcsra = &B11100010
Sfior = &B00000000

Dim X As Byte
Dim Maxamp As Byte
Dim Adchold As Byte
Dim Teiler As Byte
Dim Count As Word

X = 0
Maxamp = 0
Adchold = 0
Teiler = 0
Count = 0

Const Zustande = 8


Do

'(
While Adch = 0
Incr Count
Waitms 1
Wend
If Count >= 500 Then Adchold = 0
Count = 0
')
If Adch > Adchold Then Maxamp = Adch
Teiler = Maxamp / Zustande
X = Adch / Teiler
Adchold = Adch

Select Case X
Case 0 To 1
Portc = &B11111110
Case 1 To 2
Portc = &B11111100
Case 2 To 3
Portc = &B11111000
Case 3 To 4
Portc = &B11110000
Case 4 To 5
Portc = &B11100000
Case 5 To 6
Portc = &B11000000
Case 6 To 7
Portc = &B10000000
Case 7 To 8
Portc = &B00000000
End Select


Loop

End


Nun möchte ich mittels einer (oder auch mehreren xD) logischen Operation die MUX-Bits in ADMUX verändern, jedoch den Rest so belassen.

Also z.B.:
Admux = &B01100000 --> MUX-Bits: 00000 (Pina.0)
Nun möchte ich auf Pina.1 umschalten:
MUX-Bits: 00001 --> Admux = &B01100001

Wenns geht, sollte ich nur sagen müssen:
"Ich will jetzt auf Pina.x umschalten".
z.B.:


...
...
Dim Mux as Byte
...
Mux = 1 'für Pina.1
...
Mux = 2 'für Pina.2
...


Und dann wollte ich noch wissen, ob ich dann, wenn ich ADMUX verändert habe (bzw. die Mux-Bits), ob ich dann die erste Wandlung verwerfen muss oder ob ich eine bestimmte Zeit warten muss??

Vielen Dank im Voraus
Gruß
Chris

TheDarkRose
30.07.2010, 21:44
Zum setzen eine Bitmaske oder verknüpfen

zum löschen eine bitmaske invertieren und mit und verknüpfen.

Che Guevara
30.07.2010, 22:44
Hallo TheDarkRose,

erstmal danke für deine Antwort, allerdings hab ich noch nie wirklich mit Bitmasken gearbeitet.

Könntest du mir mal ein Beispiel geben oder das ganze etwas genauer erläutern, v.a. das


mit und verknüpfen.
Wäre wirklich sehr nett von dir!

Gruß
Chris

Kampi
30.07.2010, 23:19
Und Verknüpfung machste mit Bascom einfach mit AND (If Bedingung 1 = 1 AND Bedingung 2 = 1 then Ergebniss = 1).
Und wie meinst du das mit Wandlung verwefen? Jedesmal wenn der ADC eine neue Wandlung macht, wird der Registerinhalt überschrieben.

Che Guevara
30.07.2010, 23:48
Das mit dem AND bei If-Abfragen ist mir klar, allerdings meinte ich das nicht, sondern sowas in der Art:


A = A or B
.... usw.


Wenn ich das Register (z.b. ADMUX) überschreibe, ist die erste Wandlung dann Mist oder kann ich dieser Vertrauen?

Kampi
30.07.2010, 23:54
Wieso sollte es Mist sein? Der ADC macht eine Wandlung mit den eingestellten Parametern. Wenn du nach der Wandlung die Parameter änderst sollte das eigentlich nichts am Ergebniss ändern.

Dirk
31.07.2010, 13:29
@Che Guevara:

1) ADMUX = ADMUX Or &B00000001
2) ADMUX = ADMUX And &B11111110

(Prinzip!)

Gruß Dirk

BoGe-Ro
31.07.2010, 18:34
sub adc_kanal(_channel as byte)
local _temp as byte
_temp = Admux And &B11110000 'oberes Nibble retten
Admux = _temp Or _channel 'Kanal setzen
end sub



so hab ichs gelöst



Gruß BoGe-Ro

BMS
31.07.2010, 20:17
Geht sogar noch einfacher. Das 5. und 6. Bit in ADMUX soll ja auf 1 bleiben.
(&B01100000)
Dann kannst du einfach die Summe bilden


Admux = &B01100000 + _channel

oder dezimal:


Admux = 96 + _channel

Funktioniert aber nur solange du die oberen Bits nicht während dem Betrieb nochmal ändern möchtest.
Gruß Bernhard