Gast
#177674
Wie drehe ich eine Bitreihenfolge mit WinAVR um?? zB 10000100 in 00100001
|
Anzeige
|
Wie drehe ich eine Bitreihenfolge um??
Gast
#177674
Wie drehe ich eine Bitreihenfolge mit WinAVR um?? zB 10000100 in 00100001
Gast
#177675
Durch Suchen im Forum. ;-)
Gast
#177676
Spiegeln
Gast
#177677
@Jörg Wunsch Wenn ich wüste wonach genau, wäre die antwort OK. Aber ich kann hier nicht mehrere hundert/Tausend Beiträge auf gut Glück durchlesen, um eventuell auf ein ähnliches Prolem zu stossen. Ein Denkanstoss wäre schon nett, dann kann ich nämlich die SuFu verwenden. @Christof Krüger JA. http://www.mikrocontroller.net/forum/forum.php?action=search&forum=2 http://www.mikrocontroller.net/forum/read-2-57577.html
Gast
#177679
Ich würde es erst in eine andre zahlensystem umwandeln z.B in Dezimal und dann wieder in Binär allerdings mit dem neuen wert.oder mit Bitweisse logik
Gast
#177680
@Andreas: ganz schön tiefgründig ;-)) Stefan
Gast
#177681
Ich hab da was aus nem Projekt letztes Semester...
/* for bit_reverse: 3, fo an 8 pt FFT, 4 for 16 pt etc...*/
#define BIT_WIDTH 7
//__________________________FFT specific
functions_______________________________
/* Reversing the bits in an integer. No asm instruction
available for this -> slow */
int bit_reverse(int in) {
int rev=0;
int i;
for (i = 0; i < BIT_WIDTH; i++) {
rev = (rev << 1) | (in & 1);
in >>=1;
}
return rev;
}
Mit Bitwidth angeben wie lang (in Bit) der unzudrehende Wert ist. Also
beim AVR z.B. 8 für ein uint8_t oder 16 für einen uint16_t
Gast
#177682
mit C++ wäre das keine problem oder? ich meine mit Felder!!! Gcc ist doch C wenn ich mich nicht irre.
Gast
#1494497
also ich muss das selbe mit einer 8 bit zahl machen.
int bit_reverse(int in) {
int rev=0;
int i;
for (i = 0; i < BIT_WIDTH; i++) {
rev = (rev << 1) | (in & 1);
in >>=1;
}
return rev;
}
Das habe ich einfach von oben übernommen. ich muss dann bitwidth auf 8
setzen? Mwin größtes problem ist, das ich nicht weiß wie ich die
funktion in der main aufrufe. Kann mir das jemand sagen?
Hans Mildenberger schrieb: > also ich muss das selbe mit einer 8 bit zahl machen. > > int bit_reverse(int in) { > int rev=0; > int i; > > for (i = 0; i < BIT_WIDTH; i++) { > rev = (rev << 1) | (in & 1); > in >>=1; > } > return rev; > } > > Das habe ich einfach von oben übernommen. ich muss dann bitwidth auf 8 > setzen? Mwin größtes problem ist, das ich nicht weiß wie ich die > funktion in der main aufrufe. Kann mir das jemand sagen? So wie jede andere Funktion auch
Hallo,
ich würde, wenns schnell gehen muß, eine Tabelle machen
unsigned char revtab[256] =
{0b00000000, 0b10000000, 0b01000000....
Gruß,
Michael
Gast
#1494523
in wirklichkeit läßt sich das ganze nur durch spiegelneuronen korrekt lösen
Gast
#1494529
Entschuldige meine delitantische Antwort, aber es geht nicht :-(
int main (int argc, char *argv[])
{
ausgangswert = 01101100
ergebnis= bit (ausgangswert);
}
int bit_reverse(int in) {
int rev=0;
int i;
for (i = 0; i < BIT_WIDTH; i++) {
rev = (rev << 1) | (in & 1);
in >>=1;
}
return rev;
}
was geht nicht genau?? probier mal so
"Es geht nicht" ist keine vernünftige Fehlerbeschreibung. Wie wäre es mit einem C-Lehrbuch?
Gast
#1494556
Es kommen fogende fehlermeldungen: invalid suffix "b01100000" on integer contant In function ínt main(int, char**)´: ausgabewert undeclared (first use in function) (Each undeclareded identifier is reported only once for each function it appears in.) bit reverse undeclared (first use in function) in function int bit_reverse(int): int bit reverse(int) used prior to declaration [Build Error] [main.0] Error 1 1000 Dank das ihr euch die Zeit nehmt. Man lese und staune:
>>> // ist nicht Standard C, aber der gcc kanns
Welchen Compiler verwendest du?
Gast
#1494567
dev-c++ Hans Mildenberger schrieb:
> dev-c++
Na dann
Gast
#1494578
Da bleibt nur noch einer übrig. Die anderen Fehlermeldungen gehen auch weg, wenn ich einfach das ich ausgangswqert = 01100001´; geschrieben hätte. In function ínt main(int, char**)´: ausgabewert undeclared (first use in function) (Each undeclareded identifier is reported only once for each function it appears in.) [Build Error] [main.0] Error 1 Hans Mildenberger schrieb: > Da bleibt nur noch einer übrig. > Die anderen Fehlermeldungen gehen auch weg, wenn ich einfach das ich > ausgangswqert = 01100001´; geschrieben hätte. Ja. Nur hätte das etwas ganz anderes gemacht als du dir auch nur in deinen wildesten Träumen vorstellen kannst. Oder sagen dir Oktalzahlen irgendetwas :-) > In function ínt main(int, char**)´: > ausgabewert undeclared (first use in function) > (Each undeclareded identifier is reported only once for each function it > appears in.) > [Build Error] [main.0] Error 1 Den behebst du jetzt schön selber. Der Compiler schreibt ja schon hin, was faul ist.
Gast
#1494589
Immer wieder gefragt:
avr
Gast
#1496593
#define smax 8
#include <stdio.h>
int bit_reverse(int in) {
int rev=0;
int i;
for ( i=0; i < smax; i++)
{
rev = (rev << 1 )| (in & 1);
in >>1;
}
return rev;
}
int main(int argc, char *argv[])
{
int ausgangswert = 0x6C;
int ergebnis = bit_reverse(ausgangswert);
while(1)
{
printf("ergebnis = %d\n", ergebnis); }
}
So sieht mein Programm inzwischen aus. Läuft auch fehlerfrei. Allerdings
bekomme ich immer die Ausgabe "ergebnis = 0".
Kann mir das jemand erklären?
Hans Mildenberger schrieb: > #define smax 8 > #include <stdio.h> > int bit_reverse(int in) { > int rev=0; > int i; > for ( i=0; i < smax; i++) > { > rev = (rev << 1 )| (in & 1); > in >>1; > } > return rev; > } > > > int main(int argc, char *argv[]) > { > int ausgangswert = 0x6C; > int ergebnis = bit_reverse(ausgangswert); > while(1) > { > printf("ergebnis = %d\n", ergebnis); } > } > > So sieht mein Programm inzwischen aus. Läuft auch fehlerfrei. Allerdings > bekomme ich immer die Ausgabe "ergebnis = 0". > Kann mir das jemand erklären? Wenn du den obigen Code kompilierst, solltest du eine Warnung bekommen:
Wenn du Dir dann nochmal Zeile 9 anschaust:
Und mit dem Code von oben vergleichst:
Stellst du fest das da ein Zeichen fehlt. Sebastian
Gast
#1496691
Die Methode von AVR ist richtig nett (und locker doppelt so schnell wie die Schleife), habe ich so noch nicht gesehen, obwohl es eigentlich ziemlich logisch ist. Allerdings nicht unbedingt für Anfänger geeignet, was das Verständnis betrifft. Aber für jemanden der meint er kann schon programmieren eine nette Fingerübung zum Nachvollziehen :-) Am schönsten gehts aber in 8051 Assembler:
Peter
Gast
#1496845
Diese Routine kann ich direkt verwerten. Bis Dato habe ich jedes Bit über C in eine bitadressierbare Variable geschrieben. Danke.
Gast
#1496868
Hallo Peter, die ist ja noch besser. Allerdings nur auf Rechner verwendbar bei denen man ein bitadressierbares move von und zum Carry hat. Hat der AVR oder PIC das? Wieder was gelernt :-)
Gast
#1496988
> Wie drehe ich eine Bitreihenfolge mit WinAVR um??
Man sollte für solche Aufgaben immer eine Funktion verwenden die einen
anderen Programmierer maximal verwirrt ;-) Just für diesen Zweck habe
ich vor etwas längerer Zeit folgende C Funktion geschrieben:
Mit x übergibt man die zu spiegelnden Daten, mit bits gibt man die Anzahl der Bits die gespiegelt werden. Will man nur ein Byte spiegeln nimmt man "bit_swap(x, 8)". Man kann aber auch nur zum Beispiel 5 Bits spiegeln lassen oder 13, ganz egal... klaus schrieb: > Man sollte für solche Aufgaben immer eine Funktion verwenden die einen > anderen Programmierer maximal verwirrt ;-) Just für diesen Zweck habe > ich vor etwas längerer Zeit folgende C Funktion geschrieben: Ziel verfehlt :-) Damit kannst du gestandene Lisp Programmierer nicht übertölpeln. Die schnallen sofort, dass du eine CAR (na ja) / CDR Zerlegung einer Liste von Bits auf C Art machst und aus den bearbeiteten Einzelteilen wieder eine neue Liste von Bits zusammensetzt :-) Frei nach dem Motto: Eine Liste wird umgedreht indem man die Liste in das erste Element und den Rest zerlegt. Dann dreht man den Rest um und hängt das erste Element hinten drann. (Schöne Arbeit!)
Gast
#1497010
Und wie sieht - bit_swap - aus? Martin schrieb:
> Und wie sieht - bit_swap - aus?
ROFL!
Gast
#1497024
> Und wie sieht - bit_swap - aus?
Owned! :D
Gast
#1497035
> Und wie sieht - bit_swap - aus?
Rekursion heißt das Zauberwort :-)
Gast
#1497040
Die Antwort die erwartete war:
size_t bit_swap(size_t x, size_t bits)
{
return bits ? (x & 1) << (bits - 1) | bit_swap(x >> 1, bits - 1) :
0;
}
Darauf hätte ich geschrieben:
Und wie sieht - bit_swap - aus?
usw.
Gast
#1497045
Hä? Und jetzt noch mal auf Deutsch bitte... klaus schrieb:
>
Ein sehr schönes Beispiel für die Unsinnigkeit von Rekursionen. Diese Routine maximiert wirklich alles negative: - höchster Codeverbrauch - höchster SRAM-Verbrauch - höchste Zyklenzahl Peter Peter Dannegger schrieb: > Am schönsten gehts aber in 8051 Assembler: Nein in ARM (Thumb-2) Assembler: RBIT r0, r0 ;-) Gruß Marcus http://www.doulos.com/arm/ Marcus Harnisch schrieb:
> Nein in ARM (Thumb-2) Assembler: RBIT r0, r0 ;-)
Kommt aber ganz was anderes heraus als bei seinem Mirror. ;-)
Gast
#1497064
Du läßt wohl keine Werbegelegenheit aus, Marcus.
Gast
#1497067
Die Rekursion ist auch klasse. Vor allem wenn man einen Hardwarestack mit der maximalen Tiefe von (4?) hat :-)) War das nicht bei einigen Microcontrollern so? Ich denke wir sind uns alle einig. Die Funktionen sind alle nicht so einfach verständlich wie die Schleife, aber manchmal muss es einfach schneller sein, und da sind durchaus auch Speziallösungen sinnvoll. Schön waren die Lösungen allemal. Gruß, Udo klaus schrieb: > Man sollte für solche Aufgaben immer eine Funktion verwenden die einen > anderen Programmierer maximal verwirrt ;-) Just für diesen Zweck habe > ich vor etwas längerer Zeit folgende C Funktion geschrieben: > > >
Wer auf einem Mikrocontroller rekursive Funktionen programmiert, der gehört mindestens erschossen, besser noch sollte er sein Studium komplett wiederholen müssen ;-) Klaus schrieb:
> Hä? Und jetzt noch mal auf Deutsch bitte...
Das war eine 'rekursive Frage' :-)
Gast
#1497091
oh man! Jetzt hab ichs auch verstanden :D Da stand ich wohl etwas auf der Leitung... ;)
Gast
#1497111
Wohin gehst du? Ins kino. Was läuft? Quo vadis! Was bedeutet das? Wohin gehst du? Ins kino. Was läuft? Quo vadis! Was bedeutet das? Wohin gehst du? Ins kino. Was läuft? Quo vadis! Was bedeutet das? Wohin gehst du? Ins kino. Was läuft? Quo vadis! Was bedeutet das? Wohin gehst du? Ins kino. Was läuft? Quo vadis! Was bedeutet das? Wohin gehst du? Ins kino. Was läuft? Quo vadis! Was bedeutet das?
Gast
#1497116
Stack overflow :-) A. K. schrieb:
> Kommt aber ganz was anderes heraus als bei seinem Mirror. ;-)
Na gut, dann eben:
Gruß Marcus http://www.doulos.com/arm/
Gast
#1497259
Peter Dannegger schrieb: > klaus schrieb: >> > >> size_t bit_swap(size_t x, size_t bits) >> { >> return bits ? (x & 1) << (bits - 1) | bit_swap(x >> 1, bits - 1) : >> 0; >> } >> > > > Ein sehr schönes Beispiel für die Unsinnigkeit von Rekursionen. > Diese Routine maximiert wirklich alles negative: > - höchster Codeverbrauch > - höchster SRAM-Verbrauch > - höchste Zyklenzahl Rekursionen sind nicht generell unsinnig, sondern werden nur traditio- nell in manchen Programmiersprachen häufiger genutzt als in anderen. Da Karl Heinz weiter oben den LISP-Programmierer ins Spiel gebracht hat: Dieser würde die Funktion (wenn er sich überhaupt in die C-Niederungen herablässt :)) so schreiben:
Dabei ist bit_swap2h eine Hilfsfunktion, die von bit_swap2 aufgeru- fen wird. Da der Compiler in diesem Fall die Rekursion auflöst, brauchen beide Funktionen zusammen ziemlich genau gleich viel Programmbytes, Datenbytes und Taktzyklen wie die folgende, C-typischere Implementierung mittels einer Schleife:
Der einzig verbleibende Nachteil der rekursiven Variante ist also, dass sie für einen C-Only-Programmierer nicht sofort verständlich ist ;-) Marcus Harnisch schrieb:
> Na gut, dann eben:
Ich hätte zur besseren Verwirrung ja das gemacht:
Gast
#1497367
>Der einzig verbleibende Nachteil der rekursiven Variante ist also, dass >sie für einen C-Only-Programmierer nicht sofort verständlich ist ;-) Ok, dann zeig mit doch mal den Lisp Interpreter für den AVR oder PIC :-) und die Ausführungszeit ist auch genausoschnell wie bei der Variante von Peter :-)))) Gruß und Spass, Udo Merke: nicht jeder nicht-Lisp-Fan ist ein C-Only-Programmierer oder die Crux mit der hinreichenden und notwendigen Voraussetzung :-))
Gast
#1497576
Udo R. S. schrieb: >> Der einzig verbleibende Nachteil der rekursiven Variante ist also, >> dass sie für einen C-Only-Programmierer nicht sofort verständlich ist >> ;-) > > Ok, dann zeig mit doch mal den Lisp Interpreter für den AVR oder PIC > :-) und die Ausführungszeit ist auch genausoschnell wie bei der > Variante von Peter :-)))) Ich habe ja nicht dafür plädiert, auf AVRs und PICs in LISP zu program- mieren, sondern wollte nur aufzeigen, dass rekursive Programmierung — richtig eingesetzt — bzgl. der von Peter genannten Kriterien nicht schlechter als iterative Programmierung sein muss. Ich behaupte aber auch nicht, dass sie besser ist ;-) (nicht, dass jetzt alle Programmiereinsteiger meinen, sie dürften keine Schleifen mehr verwenden)
Gast
#1501463
Ist es möglich den Code von Peter noch zu beschleunigen?
;C: ACC:
MIRROR: MOV C, ACC.1 ;1 76543210
RLC A ;7 65432101
MOV ACC.2, C ;7 65432701
MOV C, ACC.3 ;2 65432701
RLC A ;6 54327012
MOV ACC.4, C ;6 54367012
MOV C, ACC.5 ;3 54367012
RLC A ;5 43670123
MOV ACC.6, C ;5 45670123
SWAP A ;5 01234567
RET
Martin schrieb:
> Ist es möglich den Code von Peter noch zu beschleunigen?
Peter
Gast
#1501803
es geht doch mit sehr viel weniger code out porta, R16 in R16, portb jetzt nur PinA0 mit PinB7 PinA1 mit PinB6 PinA2 mit PinB5 PinA3 mit PinB4 PinA4 mit PinB3 PinA5 mit PinB2 PinA6 mit PinB1 PinA7 mit PinB0 verbinden und fertig.
Gast
#1501870
lol :D Und wie würdest du dann eine optimierte Division machen? Kein Programm ist so kurz, dass nicht noch Platz für einen Fehler wäre:
Bei einem AVR käme sowas besser:
Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|