servos mit pwm: ja.
backleds mit piezo: ebenfalls ja.
spannungsregler usw: wenn du insgesamt auf mindesens 5V kommst - ja.
Hallo,
ich bin noch relativ neu dabei mit dem Asuro, habe aber schon Erfahrungen mit dem Crashbobby sammeln können.
Der Prozessor des Asuro spricht doch seine Motoren über 2 digitale Ein/Ausgänge und 2 PWM-Ports an, oder nicht? Da sollte es doch möglich sein einen Haufen Hardware von der Platine wieder zu entfernen und mit den PWM-Signalen direkt Modellbauservos anzusprechen, wenn man nur die Library noch passend modifiziert. Gleichzeitig hat man die digitalen Eingänge gewonnen...Odometrie muss man dann halt gleich mit anpassen, und wahrscheinlich neu anordnen, aber wenn man eh schon dabei ist..
Da es mir die Sound Funktion schon angetan hat, könnte man dann nicht gleich noch auf eine der Back-leds verzichten und einen kleinen Piezospeaker anbauen?
Kann ich auch einen einfachen Spannungsregler mit einem 2 zelligem Lipo zur Stromversorgung verwenden?
vielen Dank!
Johannes
servos mit pwm: ja.
backleds mit piezo: ebenfalls ja.
spannungsregler usw: wenn du insgesamt auf mindesens 5V kommst - ja.
Ich hab mich jetzt noch weiter eingelesen in das setzen der bits währen der Initialisierung.
Um die Servos mit dem PWM für die Motoren zu speißen müsste ich wohl den Timer ändern, so wie hier beschrieben:
http://mil.ufl.edu/~achamber/servoPWMfaq.html
ansich kein Problem, aber ich bin mir in der Flut von Biblioteken jetzt gar nicht sicher ob noch andere Prozesse vom Timer Nr1 abhängen, denke aber nicht, oder? ^^
und liege ich dann recht in der Annahme, das sich eigentlich alle Änderungen dann in asuro.h und asuro.c abspielen? Ist es schlimm wenn zum Beispiel die Initialisierungsfunktion die Motorenbefehle aufrufen will welche dann gar nicht mehr vorhanden sind in den anderen Biblioteken? Oder beschwert sich dann der Compiler, sodass ich dann relativ schnell derartige Probleme beseitigen kann?
am timer nummer 1 hängt viel denke ich... die modulation für infrarot... die sleep() funktion...
oder ist das timer2? ich glaub nich
Es gäbe da die Möglichkeit den Mega168 zu verwenden, wenn du einen ISP Programmer hast und/oder bauen kannst.
Der Mega168 is pinkompatibel mit dem Mega8, hat 16KByte Flash und, in diesem Fall interessant, hat sechs PWM Kanäle.
Hmm, Mega168, später vielleicht mal, aber schonmal danke für diesen Tipp.
Der Infrarot empfänger hängt definitiv am Timer 2, steht in asuro.c
Die PWM Ports über Timer 1 zu nutzen würde Sinn machen, da dieser die doppelte Auflösung aufweißt. Die Sleepfunktionen hängen laut time.c mit dem Interrupt des Timer 2 zusammen. Damit sollte der Käse schon fast gefressen sein. Wenn doch noch was über Timer 1 laufen sollte, kann man die Funktion ja auch sicher auf den Takt von Timer 2 angleichen.
Jetzt hab ich auch ne Menge gelesen, aber so ganz werd ich noch nicht drauß schlau. OCR1A und B sind meine Einstellwerte im späteren Programm, dann gibt es da noch etliche weitere bits. Aber wie kann ich die Einstellwerte den füttern? Im Moment haben sie ide Auflösung von 256, und werden dort in der Motorfunktion einfahc mit char gespeißt. ich bräuchte für meine Höhere Auflösung dann ja int, kann ich wirklich einfach sagen OCR1A = int auflösung?
Nur so ganz verstehe ich nie was diese Operationen zu bedeuten haben:
portb1 |= (1<<portb1) z.b.
was bedeutet hier das "<<" |= bedeutet nur trifft zu und &= bedeutet trifft nicht zu und würde damit das bit z.b. löschen, oder nicht?
Wenn jemand was ähnliches schonmal gemacht hat und mir ein bischen auf die Sprünge helfen könnte welche Bits ich setzen muss, das wäre ganz nett.. Könnte ich eigentlich mit modifizirter bibliotek in diesem punkt meine hardware schrotten? im prinzip ändere ich ja erstmal nur die frequenz des pwm-signals, sodass wahrscheinlich die motoren gar nicht mehr laufen, modellbau braucht ja wenig einschaltdauer. weil bevor ich mir den bot zerlöte wollte ich doch lieber schauen ob alles so geklappt hat, verständlich.. ^^
Also wenn schon jemand wiess wie es geht und mir einfach nur die Bitnamen sagen kann, das will ich:
PWM 50Hz, Eingabewert gibt den Highanteil an, und möglichst gut Einstellbar, mit einem Teilerwert (oder was auch immer das ist) von 8 komm ich auf eine Auflösung von 20k, damit könnte ich gut leben.
naja, man merkt vielleicht schon das ich ein wenig wirr schreibe, deshalb lieber gute nacht leute
aaahaalso.. =)
| bedeutet oder.
0|0 = 0
0|1 = 1
1|0 = 1
1|1 = 1
& bedeutet und.
0|0 = 0
0|1 = 0
1|0 = 0
1|1 = 1
~ bedeutet NICHT.
~1 = 0
~0 = 1
<< bedeutet linksschiebung, >> bedeutet rechtsschiebung.
1<<3 = 1000
1<<4 = 10000
1<<1 = 10
1<<0 = 1 usw.
das wort, ws dahinter steht ist eingentlich auch bloß eine zahl, die dem compiler vorher mitgeteilt wurde, oder eine variable.
0101 << 3 = 0101000
es werden also ganze zahlen verschoben. so kann man zB eine eins durch einen port wandern lassen mit einer einzigen schleife:
PORTB = 0x01 //00000001
PORTB = PORTB<<1 //00000010
PORTB = PORTB<<1 //00000100
PORTB = PORTB<<1 //00001000
PORTB = PORTB<<1 //00010000
PORTB = PORTB<<1 //00100000
usw. immer mit edm gleicheb befehl wird der wert nach links geschoben.
jetzt zu den kompleyxeren sachen.
stell dir vor, du hast ein register (zB PORTB), dessen inhalt du nicht exakt kennst bzw der veränderlich ist. du willst das bit 2 setzen. du könntest folgendes machen:
PORTB = 1<<2;
nachteil: alle anderen bits im register werden auf null gesetzt, denn 1<<2 = 00000100. das ist aber selten das ziel. folgendes ist besser:
PORTB = PORTB | (1<<2);
es wird also jedes bit aktiviert, was vorher schon aktiviert war ODER durch 1<<2 definiert wurde. die kurzvorm davon ist
PORTB |= (1<<2);
jetzt wollen wir das bit löschen. wir könnten scheiben:
PORTB = 0;
jetzt sind aber alle bits null.alternative:
PORTB = ~(1<<2);
wir schreiben hier also 00000100, invertieren das zu 11111011, und schreiben das rein. auch nicht besonders gut.besser so:
PORTB = PORTB & ~(1<<2);
es werden also nur die bits aktiv, die vorher aktiv waren UND duch ~(1<<2) definiert sind. das bit an stelle zwei wird also gelöscht, alle anderen bleiben. auch davon eine kurzform:
PORTB &= ~(1<<2);
also:
bit setzen:
REGISTER |= (1<<STELLE);
bit löschen:
REGISTER &= ~(1<<STELLE);
Ok, vielen Dank!
Ich werde dann wohl demnächst mal damit anfangen die passenden Register rauszusuchen und eine Aufstellung zu machen.
Nur was muss ich machen, nachdem ich die richtigen Bits setzen kann, wo pack ich sie am besten in die Lib damit sie auch eingebunden werden wenn ich sie brauche? Einfach in die init? wäre wohl am sinnvollsten..
schreib dir eine funktion, die du aufrufst wenn du sie benötigst
So was zum Bleistift:
Ich muß allerdinges sagen, das diese Makros aus der avr-libc stammen und es so aussieht als seien sie nicht mehr in Verwendung. Trotzdem immer noch ganz nette Dinger.Code:#define inp(port) (port) #define outp(val, port) (port) = (val) #define inb(port) (port) #define outb(port, val) (port) = (val) #define sbi(port, bit) (port) |= (1 << (bit)) #define cbi(port, bit) (port) &= ~(1 << (bit))
Zusätzlich gibt es in <avr/sfr_defs.h> auch noch einige andere nützliche Makros.
Lesezeichen