-
        

Ergebnis 1 bis 9 von 9

Thema: Logische Operation zum Verändern einzelner Bits

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544

    Logische Operation zum Verändern einzelner Bits

    Anzeige

    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:
    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.:
    Code:
    ...
    ...
    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    11.08.2008
    Ort
    Hallein
    Alter
    26
    Beiträge
    802
    Zum setzen eine Bitmaske oder verknüpfen

    zum löschen eine bitmaske invertieren und mit und verknüpfen.
    Kultuverein Metal Resurrection, für mehr Bands und Konzerte in Österreich (:

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    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

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

    Gruß
    Chris

  4. #4
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    28
    Beiträge
    3.517
    Blog-Einträge
    9
    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.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    Das mit dem AND bei If-Abfragen ist mir klar, allerdings meinte ich das nicht, sondern sowas in der Art:
    Code:
    A = A or B
    .... usw.
    Wenn ich das Register (z.b. ADMUX) überschreibe, ist die erste Wandlung dann Mist oder kann ich dieser Vertrauen?

  6. #6
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    28
    Beiträge
    3.517
    Blog-Einträge
    9
    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.

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    @Che Guevara:

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

    (Prinzip!)

    Gruß Dirk

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    19.02.2010
    Beiträge
    67
    Code:
    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

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    26
    Beiträge
    1.192
    Geht sogar noch einfacher. Das 5. und 6. Bit in ADMUX soll ja auf 1 bleiben.
    (&B01100000)
    Dann kannst du einfach die Summe bilden
    Code:
    Admux = &B01100000 + _channel
    oder dezimal:
    Code:
    Admux = 96 + _channel
    Funktioniert aber nur solange du die oberen Bits nicht während dem Betrieb nochmal ändern möchtest.
    Gruß Bernhard

Berechtigungen

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