PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Library editieren und Ports anders zu nutzen?



jodertan
04.01.2008, 16:37
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

damaltor
04.01.2008, 21:25
servos mit pwm: ja.
backleds mit piezo: ebenfalls ja.
spannungsregler usw: wenn du insgesamt auf mindesens 5V kommst - ja.

jodertan
04.01.2008, 22:41
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?

damaltor
04.01.2008, 22:45
am timer nummer 1 hängt viel denke ich... die modulation für infrarot... die sleep() funktion...

oder ist das timer2? ich glaub nich

Warringer
04.01.2008, 23:53
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.

jodertan
05.01.2008, 00:21
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 :D

damaltor
05.01.2008, 02:24
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);

jodertan
05.01.2008, 15:11
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..

damaltor
05.01.2008, 15:52
schreib dir eine funktion, die du aufrufst wenn du sie benötigst

Warringer
05.01.2008, 16:34
So was zum Bleistift:


#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))

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.

Zusätzlich gibt es in <avr/sfr_defs.h> (http://www.nongnu.org/avr-libc/user-manual/group__avr__sfr.html) auch noch einige andere nützliche Makros.

jodertan
08.01.2008, 22:03
So, geschafft ^^ Jetzt noch die Servos umbauen und mal schauen wie die so laufen.

Ist eigentlich echt halb so schwer, nur ist es halt auf den ersten schlag doch recht kompliziert mit diesen Datenblättern. Aber in C die Bits zu setzten ja der reinste Traum ^^

Wenn er dann soweit fertig ist mach ich auch mal ein Foto. Einen Piepser anstelle der Backled war keine so gute Idee, ist irgendwie sehr leise. Kann das daran liegen das ich ihn mit 1000Hz betrieben habe? Oder doch eehr daran das der kleine den Leds normalerweise nicht so viel A zuspricht. Den Wiederstand direkt bei der LED hab ich natürlich rausgenommen.

damaltor
09.01.2008, 01:10
probier mal den piepser andersrum zu polen. und probiere ihn nicht frequenzabhängig zu betreiben, sondern gib ihm dauerstrom, die frequenzgeneration ist bei vielen bereits eingebaut.

jodertan
09.01.2008, 11:58
Hm, auf dem Piepser ist die Polung aber angegeben, das wollte ich jetzt nicht unbedingt einfach übergehen..

Den Piepser habe ich aus einem PC genommen, kann es sein das dieser keine eignee Frequenzgeneration hat? Am Pc kann man ja auch die verschiedensten Töne damit erzeugen und nicht nur 1/0

Das erste Programm war wohl auch eher ein wenig doof, da ich ihn 1ms an hatte, ausgeschaltet habe und eigentlich sofort wieder anschaltete.
Wenn ich hier die Einschaltdauer auf echte 50% reduziere dann ist er schon deutlich lauter. Das selbe gilt dann auch für einen Zustand mit je 2ms Pause.

Also denke ich wirklich das liegt nurnoch an der Stromreduzierung, sieht auch so aus als würden die Backleds direkt am µC hängen. Ich mach mir denke ich einfach ne kleine Schaltung sodass der Controller nurnoch nen Transistor schalten muss.

Und wenn ich schon dabei bin das komplette ding zu modifiziren kommt als nächstes die Odometrie :roll:

Deswegen jetzt auch doch nicht so schnell die Fotos, sieht noch viel zu schlimm aus der kleine :P ^^

damaltor
09.01.2008, 14:57
probier mal ihm dauerstrom zu geben. ich hatte einen aus einem alten pc der dann einen gleichmäßigen ton ausgegeben hat.