Danke Nachbar,
ich werd's mir mal Schritt für Schritt zu Gemüte führen - ist ja nicht gerade sooo einfach...
Hi pinsel,
also ich seh in Deinem Code keine Timerinitialisierung für die LED. Vorbehaltlich der Tatsache, dass ich mit dem mega168 arbeite - OC1A steuert bei mir den PB1 - sende ich Dir als Anhalt für Deine Programmierung meine Codeschnippsel. ACHTUNG - bei Dir/beim mega32 geht OC1A auf Pin19/PD5 - und es ist natürlich/vermutlich die Initialisierung mit anderen Registerwerten durchzuführen.
Die Anschlüsse an MEINEM mega168:
Die Timerinitialisierung zusammen mit der Subroutine, mit der OC1A gestellt wird, Basis ist ein Prozessortakt von 20 MHz:Code:--------------------==========----------------------- Vorgesehene/belegte Anschlüsse am (ATMega168)-R2D03: ================== (für ´168 d = Drive/Director) /RESET 1 28 PC5,(SCL) RxD,(PD0) 2 27 PC4,(SDA) TxD,(PD1)___3 26___PC3, ADC0 / Sharp GP2D120 (SigMot1) ExtINT0,(PD2) 4 25 PC2, SFH 5110, IN irDME 4 } vorgesehen (SigMot2) ExtINT1,(PD3) 5 24 PC1, SFH 5110, IN irDME 3 } evtl. auch in (E7) _|-- 3,4 Guz, PD4___6 23___PC0, SFH 5110, IN irDME 1-2 } ´168 n VCC 7 22 GND GND 8 21 AREF XTAL1 PB6___9 20___VCC XTAL2 PB7 10 19 PB5, Startblink (LED0), 3sec v Tmr0, Mehrzweck (E6) PWM 1,2 uz+Guz,PD5 11 18 PB4 _|-- 3,4 uz (E4) (hier oder PB3) (E5) PWM 3,4 uz+Guz,PD6___2 17___PB3, Reserve 2 (E8) _|-- 1,2 uz,PD7 13 16 PB2, Reserve 1 (E9) _|-- 1,2 Guz,PB0 14 15 PB1 SFH 415, OUT (irDME) */ /* ============================================================================== */
Übrigens fahre ich aus bestimmten Gründen mit 37 kHz, das müsstest Du entsprechend anpassen. Die setSRV1 wird mit dem gewünschten Parameter aufgerufen.Code:/* ============================================================================== */ /* == PWM-Routinen zur IRLED-ansteuerung auf OC1A/PB1 ======================= */ void TC1SRV_init(void) //Init Timer/Counter 1, PWM-Signal { // normale PWM aktivieren (nicht invertiert) TCCR1A |= (1<<COM1A1); //Clear/set OC1A on Compare Match, doc S132. // Edit: hier war ein falscher Kommentar // TCCR1A |= (1<<WGM11); //WGM10=0 => PWM, Phase Correct, doc S 133 TCCR1B |= (1<<CS10); // cs10 <=> clk/1 => no prescaling doc S 134 TCCR1B |= (1<<WGM13); // PWM, Phase+Frequency correct doc S 134 ICR1 = 270; // =>PWM-Frequenz 20MHz/(2*nn) => 37,0kHz/ /* Interrupts für Timer2 deaktivieren. Siehe Registerbelegung : mega168 Bit7 6 5 4 3 2 1 0 TIMSK1 – – ICIE1 – – OCIE1B OCIE1A TOIE1 im m168 ? ? ? ? ? ? ? ? */ // TIMSK1 &= ~(1<<OCIE1A)|(1<<OCIE1B); // Tmr/Cntr1 Oput CompA/B Mtch intrrpt disab TIMSK1 &= ~(1<<TOIE1); // Tmr/Cntr1 Overflow interrupt disabled } /* ============================================================================== */ void setSRV1(uint16_t speed1) //Relative Pulslänge auf OC1A/PB1 {OCR1A = speed1;} // z.B. für SFH5110 oder Servo /* ============================================================================== */
Aufruf Timerinitialisierung aus main:
Der Rest sollte Dir ja geläufig sein. Nochmal - wenn Du Teile dieses Codes verwendest, musst Du die Register an Deinen mega32 anpassen!!!Code:TC1SRV_init(); //Init Timer/Counter1 37,xkHz am 21feb08, 17:28
Ciao sagt der JoeamBerg
Danke Nachbar,
ich werd's mir mal Schritt für Schritt zu Gemüte führen - ist ja nicht gerade sooo einfach...
Ich habe mich jetzt an folgendem Ablauf versucht:
Der Asuro soll einen Fixen Abstand zu einem Gegenstand einhalten, egal ob wie der Gegenstand sich bewegt. Wenn der GST sich wegbewegt, soll der Asuro folgen, wenn der GST näherkommt, soll der Asuro zurückweichen. Wie ein Hund, der einen Einbrecher gestellt hat
Nur läuft es nicht so, wie ich's gerne hätte:
Wo ist mein Denkfehler?Code:/************************************************************************* Hauptprogramm *************************************************************************/ int main(void) { uint8_t n,m,diff; Init(); FrontLED(ON); while(1) { n=abstand_rechts(); m=abstand_links(); if ((n > 2) && (m > 2)) { diff = m - n; if(abs(diff) > 0) { MotorDir(FWD, FWD); MotorSpeed(255,155); } if (abs(diff) < 0) { MotorDir(FWD, FWD); MotorSpeed(155,255); } } else if ((n < 2) && (m < 2)) { diff = m - n; if(abs(diff) > 0) { MotorDir(RWD, RWD); MotorSpeed(155,255); } if (abs(diff) < 0) { MotorDir(RWD, RWD); MotorSpeed(255,155); } } else MotorSpeed(BREAK, BREAK); } }
Auch auf die Gefahr hin, in diesem Threat Selbstgespräche zu führen habe ich das o. a. Programm etwas überarbeitet:
Damit hält der Asuro einen bestimmten Abstand zu einem Hindernis ein, dass sich entfernt bzw. auf ihn zubewegt - allerdings ohne sich seitlich zu bewegen.Code:/************************************************************************* Hauptprogramm *************************************************************************/ int main(void) { uint8_t n,m,diff; Init(); FrontLED(ON); while(1) { n=abstand_rechts(); m=abstand_links(); if ((n > 2) || (m > 2)) { StatusLED(GREEN); MotorDir(FWD, FWD); MotorSpeed(100,100); } else if ((n < 2) || (m < 2)) { StatusLED(RED); MotorDir(RWD, RWD); MotorSpeed(100,100); } else MotorSpeed(BREAK, BREAK); } }
Ich möchte nun einbauen dass sich der Asuro immer mit beiden "Augen" auf das Hindernis ausrichtet und den Abstand beibehält.
Hätte ev. einer von euch einen Tipp, wie ich dies machen könnte?
Danke in voraus für eure Unterstützung.
Hallo pinsel120866,
irre ich mich, oder ist das nicht die gleiche Aufgabe wie in dem Thread von raid_ox ? Der hatte dort auch einen Codeabschnitt veröffentlicht. Hattest Du dort nicht auch schon mal gepostet?
Ciao sagt der JoeamBerg
Hallo Oberallgeier,
du irrst dich nicht, allerdings kann ich den Code von Raid nicht auf meine Anforderung übertragen, ich hab's versucht aber leider ohne Erfolg.
Da ich ja im Programmieren nicht gerade der Beste bin, hab ich trotzdem mal versucht selber einen passenden Code zu erstellen.
Hallo Miteinander,
der Vollständigkeit halber habe ich ein Video meiner Erweiterung hier abgelegt:
http://de.youtube.com/watch?v=zOv8ilG39kc
Aber hallo, nicht mal zwei Monate - und dann DER Fortschritt. Klasse! (Im Hintergrund hört man jetzt rauschenden Beifall). Im Ernst, ich finde das s..gut! Und die Bande hält ja auch vielfach höhere Geschwindigkeiten aus - da ist also schon wieder ein Fortschritt absehbar.
PS: So was kann mein asuro nicht.
Ciao sagt der JoeamBerg
Lieber Nachbar,
auch wenn mich das leise Gefühl beschleicht dass bei deiner Antwort eine kräftige Portion Ironie drinsteckt, danke ich dir sehr herzlich für das Lob!
Ich versuche nur mit meinen sehr begrenzten Mitteln die Technik der kleinen Schritte anzuwenden, was auch nur kleine Erfolge zulässt.
Wer weiß, vielleicht werde ich mal DerAltevom(Rhein)Tal.![]()
Nein - wirklich nicht - keinerlei Ironie. Fällt mir garnicht ein. Wie gesagt - so etwas kann mein asuro nicht - warum wohl - weil ICH so ein Programm nicht hinkrieg.
Immerhin wäre das ein Titel der keinen so entsetzlich schlechten Ruf hat. Obwohl ich mich mit dem früheren Träger des gleichen Namens in keinerle Weise ähnlich fühle oder gar ähnlich sein wollte.... Wer weiß, vielleicht werde ich mal DerAltevom(Rhein)Tal.
[OT] Alt wird man von selbst - weil die Zeit nix anderes zu tun hat als zu verstreichen. Aber ob man was lernt und kann . . . [/OT]
Ciao sagt der JoeamBerg
Lesezeichen