PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM problem mit Atmega 8



Enterprise
22.08.2008, 00:13
Hallo zusammen,

Ich bin Neuling in C und bräuchte eure Hilfe.
Ich benutze das Bord vem Embedit USC008 oder Robo008.
Das Board ist mit einem Atmega 8 und einem SN754410 bestückt.
Ich benutze RB35 Motoren diese möchte ich über beide PWM ansteuern.
Quartz 14,745600 Hz

Mit meinem Script möchte ich als erstes mal den PWM zum laufen haben.
Um zu lernen und verstehen wie dieses funktioniert.

Es soll als etrstes mit Taster PD2 links herum und mit PD3 rechts herum drehen.

Funktioniert fast, Ich kann den 0C1A und 0C1B zuweisen was ich möchte.
Beider Motoren drehen immer gleich schnell.

Hier in diesem Script habe ich alle Werte auf 0 gesetzt, um zusehen und merken, dass beide Motoren sich drehen.

Nun meine Frage warum ?





/* ================================================== ======================== */
/* */
/* PWM_Robot_8_Board_Atmega8_1.c */
/* (c) 2008 Enterprise */
/* */
/* Mit Taster PD3 drehen die beide Motoren links herum. */
/* */
/* Mit Taster PD3 drehen die beide Motoren rechts herum. */
/* */
/* ================================================== ======================== */

#include <avr/io.h>
#include <stdint.h>


void main()
{

//Prescaler 256
TCCR1B |= (1<<CS12);

// Timer in den Fast PWM Mode, 8 Bit schalten
TCCR1A |= (1<<WGM10);
TCCR1B |= (1<<WGM12);

// Compare Output mode einstellen: Pin geht auf high bei Compare match, auf low bei Überlauf. Ergibt nichtinvertierte PWM.
TCCR1A |= (1<<COM1A1) | (1<<COM1B1) ;

// PWM-Wert abgelegt. Erlaubter Bereich: 0 bis 255.
OCR1A = 0; // M1 Geschwindigkeit
OCR1B = 0; // M2 Geschwindigkeit

// PWM-Signal liegt an den Pins an!
DDRD |= (1<<PD4) | (1<< PD6); // M2 und M1 Drehrichtung links
DDRD |= (1<<PD7) | (1<< PD5); // M2 und M1 Drehrichtung rechts

// Port PD2 und PD3 Taster
PORTD = (1<<PD2) | (1<< PD3);


while(1){

if ( PIND & (1<<PIND2) ) {
PORTD |= ((1<<PD4) | (1<<PD7));
OCR1A = 0;
OCR1B = 0;
}
else {
PORTD &= ~((1<<PD4) | (1<<PD7));
OCR1A = 0;
OCR1B = 0;
}

if ( PIND & (1<<PIND3) ) {
PORTD |= ((1<<PD6) | (1<<PD5));
OCR1A = 0;
OCR1B = 0;
}
else {
PORTD &= ~((1<<PD6) | (1<<PD5));
OCR1A = 0;
OCR1B = 0;
}

}

}




mfg
Enterprise

linux_80
22.08.2008, 00:44
Hallo,

ich glaub da gehen noch 2 Ports ab, die auf Ausgang zu stellen sind. Nämlich PB1 und PB2 an denen OC1A und OC1B "rauskommen".

Enterprise
22.08.2008, 00:56
Danke Linux_80,

Für die noch so späte Hilfe.

Jetz funktioniert es.

Hier den code:




/* ================================================== ======================== */
/* */
/* PWM_Robot_8_Board_Atmega8_1.c */
/* (c) 2008 Enterprise */
/* */
/* Mit Taster PD3 drehen die beide Motoren links herum. */
/* */
/* Mit Taster PD3 drehen die beide Motoren rechts herum. */
/* */
/* ================================================== ======================== */

#include <avr/io.h>
#include <stdint.h>


void main()
{

//Prescaler 256
TCCR1B |= (1<<CS12);

// Timer in den Fast PWM Mode, 8 Bit schalten
TCCR1A |= (1<<WGM10);
TCCR1B |= (1<<WGM12);

// Compare Output mode einstellen: Pin geht auf high bei Compare match, auf low bei Überlauf. Ergibt nichtinvertierte PWM.
TCCR1A |= (1<<COM1A1) | (1<<COM1B1) ;

// Port PB1 "0C1A" und PB2 "0C1B" als Ausgang geschaltet.
DDRB |= (1<<PB1) | (1<< PB2);

// PWM-Wert abgelegt. Erlaubter Bereich: 0 bis 255.
OCR1A = 0; // M1 Geschwindigkeit
OCR1B = 0; // M2 Geschwindigkeit

// PWM-Signal liegt an den Pins an!
DDRD |= (1<<PD4) | (1<< PD6); // M2 und M1 Drehrichtung links
DDRD |= (1<<PD7) | (1<< PD5); // M2 und M1 Drehrichtung rechts

// Port PD2 und PD3 Taster
PORTD = (1<<PD2) | (1<< PD3);


while(1){

if ( PIND & (1<<PIND2) ) {
PORTD |= ((1<<PD4) | (1<<PD7));
OCR1A = 255;
OCR1B = 255;
}
else {
PORTD &= ~((1<<PD4) | (1<<PD7));
OCR1A = 0;
OCR1B = 0;
}

if ( PIND & (1<<PIND3) ) {
PORTD |= ((1<<PD6) | (1<<PD5));
OCR1A = 255;
OCR1B = 255;
}
else {
PORTD &= ~((1<<PD6) | (1<<PD5));
OCR1A = 0;
OCR1B = 0;
}

}

}




mfg
Enterprise