Gast
#2577490
Hallo, wie kann man denn aus einer Variable tmp z.B. Bit3(0b00000100) auf ein anderes Bit eines PORTs übertragen(also z.B. PORTB.1)? Viele Grüße
|
Anzeige
|
Frage zur Bitmanipulation
Gast
#2577490
Hallo, wie kann man denn aus einer Variable tmp z.B. Bit3(0b00000100) auf ein anderes Bit eines PORTs übertragen(also z.B. PORTB.1)? Viele Grüße tmp & (1<<3) ? PORTB |= 1 : PORTB &= ~1;
Gast
#2577495
Ich würds übers T-Flag machen, mit BLD, und dann mit SBI und CBI arbeiten. Das ist am sichersten, weil man ja damit rechnen muss, dass sich der Inhalt von PORTB zwischen dem Lesen und Schreiben ändern kann - jedenfalls wenn dort auch Input-Pins verwendet werden - oder Output per Interrupt geschrieben wird. Peter K. hat uns allerdings nicht verraten, welchen Mikrocontroller er verwendet oder welche Programmiersprache er benutzt... Geheimnisvoll... ;-)
Gast
#2577509
Hi und Tschuldigung, ich benutze C und arbeite mit einem ATMega. Irgendwie krieg ich's ned hin. Ich möchte gerne die SoftPWM v.3 aus dem Forum benutzen (http://www.mikrocontroller.net/articles/Soft-PWM), die allerdings für einen ganzen Port geschrieben ist - ich bekomme von dieser ein Array aus 8 Elementen ausgegeben, die dann direkt auf einen ganzen Port umgesetzt werden. Ich habe aber leider keinen vollständigen Port zur Verfügung und versuche irgendwie, es umzubasteln. ... damit werden die PWM-Werte übergeben: pwm_setting[0] = x; // PD0 pwm_setting[1] = x; // PD1 pwm_setting[2] = x; // PD2 ... und hier die PORT-Bits gesetzt > aber dies darf halt so auch nicht mehr sein, da ich ja sonst PIN-Zustände, die ich anderweitig benutzen will, verändern würde: PWM_PORT = tmp; ... Und so bräuchte ich es... pwm_setting[0] = 50; // PD3 pwm_setting[1] = 100; // PB1 Jemand einen Rat? LG Hat sowas PORTB = (PORTB & 0b111101111) & (temp & 1<<3) nachteile gegebüber der if schleife? Julian S. schrieb: > > nachteile gegebüber der if schleife? Was ist eine if-schleife? Sowas gibts nicht.
Gast
#2577569
Peter K. schrieb: > wie kann man denn aus einer Variable tmp z.B. Bit3(0b00000100) auf ein Du weisst aber schon, das in deiner Binärzahl Bit2 und nicht Bit3 gesetzt ist.
Gast
#2577814
Peter K. schrieb: > wie kann man denn aus einer Variable tmp z.B. Bit3(0b00000100) auf ein > anderes Bit eines PORTs übertragen(also z.B. PORTB.1)? Das geht übrigens auch ohne if (ist aber nicht unbedingt schneller) PORTB = (PORTB & 0b11111101) | (tmp & 0b00000100) >> 1;
Gast
#2577942
Julian S. schrieb: > Hat sowas > > PORTB = (PORTB & 0b111101111) & (temp & 1<<3) > > nachteile gegebüber der if schleife? Es gibt keine if Schleifen, und sowas ist kaputt. Mal angenommen du ersetzt das mittlere & durch ein | dann hats folgende Vorteile: - Schneller auf Architekturen wo Sprünge teuer sind - Konstante Ausführungszeit Nachteile: - Bei auf Bitmanipulation optimierten Mikrokontroller Architektur potentiell langsamer weil längerer Code. - PORTB wird komplett neu beschrieben, problematisch wenn in Interrupts einzeln andere Bits des gleichen Port gesetzt/gelöscht werden.
Gast
#2578074
Hallöchen, ich weiß ned ganz... irgendwie komm ich absolut ned mit. Durch's rumprobieren komm ich aber auch ned weiter.:( Hier vielleicht einmal zum besseren Verständnis: In der besagten PWM-Funktion gibt es eine Variable 'tmp' mit 8 Bits für die I/Os des Ports D. Diese Funktion ist also so aufgebaut, dass immer der volle Port für PWM benutzt wird. Da ich aber z.B. PD0+1 für den UART benötige, dürfen diese Bits beim Beschreiben des Ports niemals verändert werden. Desweiteren benötige ich auch PORTB.1. Spezieller gesagt möchte ich PD3,PD5,PD6 und PB1 für die LEDs benutzen und sonst auch keinerlei Bits durch die Funktion verändern. Also wie bekommt man es hin, mit dem Funktionsaufruf... pwm_setting[0] = 50; //für PD3 pwm_setting[1] = 50; //für PD5 pwm_setting[2] = 50; //für PD6 pwm_setting[3] = 50; //für PB1 ... in der PWM-Routine auch die richtigen Ausgänge ansprechen zu können? (und natürlich auch in der Port-Beschreibung nur die Bits der LED-Pins zu verändern?) Bin für jeden Rat dankbar. Liebe Grüße
Gast
#2578476
Keiner einen Rat? Lg Peter K. schrieb: > ich weiß ned ganz... irgendwie komm ich absolut ned mit. Durch's > rumprobieren komm ich aber auch ned weiter.:( D.h. für dich erstmal Grundlagen Pauken. Dann denke weiter an dein PWM und sonstiges. Vorher wird das nichts. Also fang damit an, Bitmanipulationen und grundsätzlichen C Syntax zu verstehen. gruß cyblord Peter K. schrieb: > Keiner einen Rat? Mal das Tutorial lesen? Dazu ist es da!
Gast
#2578517
Das Tutorial hab ich glaub ich schon an die zwanzig Mal gelesen, genauso wie eine C-Referenz. Ich schnall es aber trotzdem irgendwie nicht.:( lg Peter K. schrieb: > Das Tutorial hab ich glaub ich schon an die zwanzig Mal gelesen, genauso > wie eine C-Referenz. Ich schnall es aber trotzdem irgendwie nicht.:( > > lg Völlig und in Gänze oder wie? Wenn du eine konkrete Frage hast, kannst du sie hier stellen. Ansonsten nicht nur lesen sondern ausprobieren. In kleinen Schritten. Lesen , Probieren Lesen usw.
Gast
#2578544
Danke, werd ich machen. Ich glaube, dass ich mit Hex-Werten doch ein größeres Problem habe, als ich dachte. Deshalb fällt's mir wahrscheinlich so schwer, eine Abfrage zu realisieren. Bis denne... lg Niemand zwingt dich Hex-Werte zu benutzen. Binär oder Dezimal geht auch. Nur sind Hex-Werte eigentlich optimal um Bytes oder Words für den Menschen dazustellen.
Gast
#2578564
Hmmm... ich glaub, ned ganz. Der µC ist wohl der einzige, dem Hex-Werte positiv gegenüberstehen.^^ Ich hab' wohl leichte Konzentrationsprobleme. Mit ein wenig mehr investierter Zeit klappt's nun endlich^^: if(tmp & 0x08) PORTB |= (1<<1); if(tmp & 0x04) PORTD |= (1<<3); if((tmp & 0x08) == 0) PORTB &= ~(1<<1); if((tmp & 0x04) == 0) PORTD &= ~(1<<3); Danke für die "Hilfe zur Selbsthilfe"!!!;-) Liebe Grüße Peter K. schrieb: > Hmmm... ich glaub, ned ganz. Der µC ist wohl der einzige, dem Hex-Werte > positiv gegenüberstehen.^^ Doch kannst mir glauben. Und der µC kennt nur Binärwerte. Andere Zahlendarstellungen sind ihm unbekannt. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|