Habe folgendes Programm zur Ansteuerung meiner 4 Motoren über PWM
geschrieben! Die Funkton setMotorSpeed() soll wie der Name schon sagt
die Geschwindigkeit der Motoren setzen! Das wird über den OCRnx Wert
gemacht, um so die PWM-Breiten zu verändern! Nur wie schreibe ich diesen
Wert in das 16-Bit Register OCRnx! Das OCRnxH Register ist dabei immer
0, da ich nur einen 8-Bit PWM verwende! So wie's da ist geht's irgendwie
nicht! Wie beschreibe ich diese 16-Bit Register richtig? Verwende einen
ATmega128! Besten Dank!
#include <avr/io.h>
#include <avr/interrupt.h>
//function definition
void setMotorSpeed(unsigned char motorSpeed1, unsigned char motorSpeed2,
unsigned char motorSpeed3, unsigned char motorSpeed4);
int main(void){
sei();
//setting PWM-Ports as output
DDRB|=(1<<PB7)|(1<<PB6)|(1<<PB5);
DDRE|=(1<<PE3);
// PWM,Phase correct,8-Bit mode
TCCR1A|=(1<<WGM10);
TCCR3A|=(1<<WGM30);
// Timer running on MCU clock/8
TCCR1B|=(1<<CS11);
TCCR3B|=(1<<CS31);
//set Motor Speed
setMotorSpeed(200,100,160,220);
while(1);
return 0;
}
void setMotorSpeed(unsigned char motorSpeed1, unsigned char
motorSpeed2,unsigned char motorSpeed3, unsigned char motorSpeed4){
unsigned char sreg;
//store global interrupt flag
sreg=SREG;
//turn off interrupts
cli();
OCR1AH=0;
OCR1AL=motorSpeed1;
OCR1BH=0;
OCR1BL=motorSpeed2;
OCR1CH=0;
OCR1CL=motorSpeed4;
OCR3AH=0;
OCR3AL=motorSpeed4;
SREG=sreg;
}
....
OCR1A=motorSpeed1;
OCR1B=motorSpeed2;
OCR1C=motorSpeed3;
OCR3A=motorSpeed4;
....
Wenn ich das so mit deiner Variante simuliere (in AVR Studio) wird OCR1A
zwar noch korrekt beschrieben, OCR1B aber schon nicht mehr! Der Wert von
OCR1B wird in das H-Register geschrieben! Bei OCR1C und OCR3A wird dann
gar nichts mehr geschrieben!
Ist im Simulator der richtige Controller eingestellt?
(muss du ja noch mal extra machen)
Außerdem sind die 16Bit-Register im Simulator mit Vorsicht zu genießen,
siehe "Help"->"Simulator"->"Known Issues".
Zu deiner main() im ersten Post: mach das sei() am besten erst als
letztes vor der Endlosschleife, dann können die Interrupts nicht in die
Initialisierung reinspielen.
hth. Jörg
Eine eigene Frage?
Dieser Thread ist über 19 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.