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
1 | wie kann man denn aus einer Variable tmp z.B. Bit3(0b00000100) auf ein |
2 | anderes Bit eines PORTs übertragen(also z.B. PORTB.1)? |
3 | |
4 | if ((tmp & 0b100) > 0) |
5 | PORTB |= 0b1; |
6 | else
|
7 | PORTB &= ~0b1; |
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... ;-)
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.
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.
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;
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.
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
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
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.
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.
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.