Hi,
ich habe die for schleife komplett raus genommen und nur
OCRA++ mit 10 ms warten
Dazu oben noch die Impulszeiten geändert.
Wie bekomme ich jetzt 2 ansteuerungen von Servos hin?
habe schon Ausgänge und OCRB benutzt, aber klappt nicht.
Druckbare Version
Hi,
ich habe die for schleife komplett raus genommen und nur
OCRA++ mit 10 ms warten
Dazu oben noch die Impulszeiten geändert.
Wie bekomme ich jetzt 2 ansteuerungen von Servos hin?
habe schon Ausgänge und OCRB benutzt, aber klappt nicht.
Hallo
Ich lese nun schon seit ein paar Tagen mit und verstehe nicht, warum ihr nicht einfach den Beispielcode aus dem RN-Wissen zu den Servos verwendet. Ein Timer im CTC-Mode und eine kleine ISR dazu steuert mehrere Servos, z.B. ein ATMega32 mit 8MHz und drei Servos:
GrußCode:#include <avr/io.h> // I/O Port definitions
#include <avr/interrupt.h> // Interrupt macros
uint8_t x, y, z;
void init(void)
{
DDRA |= 16; // E_INT1 als Ausgang
DDRC |= 3; // SCL und SDA als Ausgang
TCCR0 = (0 << WGM00) | (1 << WGM01); // CTC-Mode
TCCR0 |= (0 << COM00) | (0 << COM01); // ohne OCR-Pin
TCCR0 |= (0 << CS02) | (1 << CS01) | (0 << CS00); // prescaler /8
TIMSK = (1 << OCIE0); // Interrupt ein
OCR0 = 9; // 100kHz?
sei();
}
ISR(TIMER0_COMP_vect)
{
static uint16_t count=0;
if(count>z) PORTA &= ~16; else PORTA |= 16; // E_INT1 (Pin8)
if(count>y) PORTC &= ~1; else PORTC |= 1; // SCL (Pin10)
if(count>x) PORTC &= ~2; else PORTC |= 2; // SDA (Pin12)
if(count<2000)count++; else count=0;
}
int main(void)
{
init();
x=y=z=100;
while(1);
return 0;
}
mic
Hi Radbuch,
Danke für dein Beispielcode!!!
Ich habe es grade mal kopiert und compilliert.
Erhalte aber einige Fehlermeldung dazu:
Compiling: main.c
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst -std=gnu99 -DF_OSC=3686400 -MD -MP -MF .dep/main.o.d main.c -o main.o
main.c: In function 'init':
main.c:8: error: 'DDRA' undeclared (first use in this function)
main.c:8: error: (Each undeclared identifier is reported only once
main.c:8: error: for each function it appears in.)
main.c:11: error: 'WGM00' undeclared (first use in this function)
main.c:11: error: 'WGM01' undeclared (first use in this function)
main.c:12: error: 'COM00' undeclared (first use in this function)
main.c:12: error: 'COM01' undeclared (first use in this function)
main.c:14: error: 'OCIE0' undeclared (first use in this function)
main.c:15: error: 'OCR0' undeclared (first use in this function)
main.c: At top level:
main.c:18: warning: 'TIMER0_COMP_vect' appears to be a misspelled signal handler
main.c: In function 'TIMER0_COMP_vect':
main.c:21: error: 'PORTA' undeclared (first use in this function)
main.c:32:2: warning: no newline at end of file
make.exe: *** [main.o] Error 1
> Process Exit Code: 2
> Time Taken: 00:02
Mein altes Program läuft ja! Also mit 2 Taster 1 Servo.
Deswegen versuche ich mal das alte progamm zu erweitern.
Will aber jetzt 4 Taster und 2 Servos anschliesen.
Hab das hier mal versucht:
Und dachte mir das ich jetzt auf PinB2 den 2 Servo steuern könnte, tut sich aber nichts...Code:// Timer1 initialisieren
void timer1_init(void)
{
DDRB = ( 1 << PB1 )|( 1 << PB2 ); //PB1 und PB2 Als Ausgänge
TCCR1A |= (1<<WGM11)|(1<<WGM10)|(1<<COM1A1);
TCCR1B = (1<<CS11);
OCR1A = 75; // Servo1 auf Mittelposition vorstellen (40-120)
OCR1B = 75; // Servo2 auf Mittelposition vorstellen (40-120)
}
Hi,
Danke für deinen Code!!!
Ich kriege aber mehrere Fehlermeldung beim compillieren:
main.c: In function 'init':
main.c:8: error: 'DDRA' undeclared (first use in this function)
main.c:8: error: (Each undeclared identifier is reported only once
main.c:8: error: for each function it appears in.)
main.c:11: error: 'WGM00' undeclared (first use in this function)
main.c:11: error: 'WGM01' undeclared (first use in this function)
main.c:12: error: 'COM00' undeclared (first use in this function)
main.c:12: error: 'COM01' undeclared (first use in this function)
main.c:14: error: 'OCIE0' undeclared (first use in this function)
main.c:15: error: 'OCR0' undeclared (first use in this function)
main.c: At top level:
main.c:18: warning: 'TIMER0_COMP_vect' appears to be a misspelled signal handler
main.c: In function 'TIMER0_COMP_vect':
main.c:21: error: 'PORTA' undeclared (first use in this function)
main.c:32:2: warning: no newline at end of file
make.exe: *** [main.o] Error 1
> Process Exit Code: 2
> Time Taken: 00:01
Wie schon gesagt, mein altes Programm mit 2 Taster und 1 Servo geht ja jetzt. Will es jetzt erweitern und zwar die gleiche funktion wie bei Servo1 an Servo2. Habe dafür folgendes geschreiben:
Aber leider tut sich nichts an PB2Code:void timer1_init(void)
{
DDRB = (1<<PB1)|(1<<PB2); /* Pin PB1, PB2 als Ausgang für Servo1/Servo2 */
TCCR1A |= (1<<WGM11)|(1<<WGM10)|(1<<COM1A1);
TCCR1B = (1<<CS11);
OCR1A = 80; //Servo1
OCR1B = 80; //Servo2
}
Frage, dieses PWM was ich erzeuge, kann ich nur 3 Servos damit an einen Atmega8 ansteuern? Oder kann ich dieses PWM für mehrere benutzten?
Mein Ziel, 2 Servos und noch eine L293D (mit 2 Gleichstrommotoren) zu betreiben.
Die Fehler kommen da der Code für einen Mega32 geschrieben ist.
Sorry, ich hätte auch dazuschreiben sollen, dass es ein Beispiel für einen ATMega32 ist. Wenn man aber irgendwo in diesem Thread auf ein blaues "Servo" klickt, kommt man direkt zur RN-Wissenseite. Dort ist das Beispiel zu finden, das als Vorlage zu meinem Code diente. 8-[
Ich dachte, du willst noch zwei Motoren per PWM ansteuern. Das wird aber schwierig, wenn du schon die Servos über PWM ansteuerst. Der ATMega8 hat nur 3 PWM-Kanäle...Zitat:
Wie schon gesagt, mein altes Programm mit 2 Taster und 1 Servo geht ja jetzt.
Für's Ansteuern von OC1B(PB2) muss im TCCR1A auch das COM1B1-Bit gesetzt sein, oder? Und um Probleme durch falsch gesetze Bits zu vermeiden sollte man TCCR1A hier nicht mit |= sondern besser nur mit = beschreiben.Code:TCCR1A |= (1<<WGM11)|(1<<WGM10)|(1<<COM1A1);
mic
Ich dachte man könnte die PWM für die 2 Gleichstrommotoren (über L293D) ansteuern und die 2 Servo dan über Software programmieren.
Geht überhaubt sowas?
Hier mal der Code für 2 Servos
Da auch noch SW-PWM dazumachen für die Motoren ist sicher auch noch eine knifflige Sache.Code:#include <avr/io.h>
#include <stdbool.h>
#include <stdlib.h>
#include <avr/io.h>
#include <AVR/iom8.h>
#include <inttypes.h>
//#include <util/delay.h>
#define F_CPU 12000000 // clock
// Timer1 initialisieren
void timer1_init(void)
{
TCCR1A |= (1<<WGM11)|(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0); // initalize mega8 Timer1 with 9Bit, inverted, Prescaler 256
TCCR1B = (1<<CS12); // this gives us a signal with 21.76ms at 12MHz
OCR1A = 476; // pulse of 1.5ms 512- 1500*(F_CPU/256/1000000)/2
OCR1B = 476;
}
int main (void)
{
timer1_init();
DDRB = (1<<PB1)|(1<<PB2); /* Pin PB1 2 als Ausgang für Servo */
DDRD &= (~ (1<<PD2)|(1<<PD3)|(1<<PD0)|(1<<PD1)); /* Pin D als Eingang */
PORTD |= (1<<PD2)|(1<<PD3)|(1<<PD0)|(1<<PD1); /* Pull Up aktivieren */
while(1){
if (!( PIND & (1<<PIND2))) /* mache was wenn PinD2 low ist */
{
OCR1A=450;
}
if (!( PIND & (1<<PIND3))) /* mache was wenn PinD3 low ist */
{
OCR1A=499;
}
if (( PIND & (1<<PIND2))&&(PIND & (1<<PIND3))) { /* Mitte wenn keine Taste */
OCR1A = 476;
}
if (!( PIND & (1<<PIND0))) /* mache was wenn PinD0 low ist */
{
OCR1B=450;
}
if (!( PIND & (1<<PIND1))) /* mache was wenn PinD1 low ist */
{
OCR1B=499;
}
if (( PIND & (1<<PIND0))&&(PIND & (1<<PIND1))) { /* Mitte wenn keine Taste */
OCR1B=476;
}
}
}
Edit: Welche Frequenz hast du dir für die PWM vorgestellt.
Hi,
werde ich gleich mal testen. Ich habe 8Mhz eingestellt.
Er meinte die Frequenz mit der die Spannung für die Motoren "zerkackt" werden soll. Hier ein (vielleicht) passernder Thread dazu:
https://www.roboternetz.de/phpBB2/ze...?p=72521#72521
Ups, der Link zum Datenblatt in dem Thread funzt nimmer:
http://www.the-starbearer.de/Files/d...tter/l293d.pdf
Man ist das zäh, auf Seite drei steht da:
PRR ist dann wohl die Max-Frequenz.Zitat:
NOTES: A. The pulse generator has the following characteristics: tr 3 10 ns, tf 3 10 ns, tw = 10 ms, PRR = 5 kHz, ZO = 50 W
Gruß
mic