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
hier nochmals das fertige Programm (COM Register korrigiert!) wäre froh 
wenn das mal jemand simulieren könnte und die OCRA1 Register usw 
beobachten ! passiert einfach nicht wirklich das was hier programmiert 
ist! liegt das wirklich am avr studio?
#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);
//no-inverting PWM
TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<COM1C1);
TCCR3A|=(1<<COM3A1);
// 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();
OCR1A=motorSpeed1;
OCR1B=motorSpeed2;
OCR1C=motorSpeed3;
OCR3A=motorSpeed4;
SREG=sreg;
}
  Ist wohl ein Simulatorproblem: der erzeugte Assembler Code sieht korrekt aus.
| 1 | void setMotorSpeed(uint8_t motorSpeed1, uint8_t motorSpeed2, | 
| 2 | uint8_t motorSpeed3, uint8_t motorSpeed4) | 
| 3 | {
 | 
| 4 | ce: ef b7 in r30, 0x3f ; 63 | 
| 5 | uint8_t sreg; | 
| 6 | //store global interrupt flag | 
| 7 | sreg=SREG; | 
| 8 | //turn off interrupts | 
| 9 | cli(); | 
| 10 | d0: f8 94 cli | 
| 11 | OCR1A=motorSpeed1; | 
| 12 | d2: 99 27 eor r25, r25 | 
| 13 | d4: 9b bd out 0x2b, r25 ; 43 | 
| 14 | d6: 8a bd out 0x2a, r24 ; 42 | 
| 15 | OCR1B=motorSpeed2; | 
| 16 | d8: 77 27 eor r23, r23 | 
| 17 | da: 79 bd out 0x29, r23 ; 41 | 
| 18 | dc: 68 bd out 0x28, r22 ; 40 | 
| 19 | OCR1C=motorSpeed3; | 
| 20 | de: 55 27 eor r21, r21 | 
| 21 | e0: 50 93 79 00 sts 0x0079, r21 | 
| 22 | e4: 40 93 78 00 sts 0x0078, r20 | 
| 23 | OCR3A=motorSpeed4; | 
| 24 | e8: 33 27 eor r19, r19 | 
| 25 | ea: 30 93 87 00 sts 0x0087, r19 | 
| 26 | ee: 20 93 86 00 sts 0x0086, r18 | 
| 27 | SREG=sreg; | 
| 28 | f2: ef bf out 0x3f, r30 ; 63 | 
| 29 | f4: 08 95 ret | 
Das wirst du wohl in Hardware testen 'müssen' ;) hth. Jörg
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
  
  Bestehender Account
  
  
  
  Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
  Noch kein Account? Hier anmelden.
 Thread beobachten
 Thread beobachten Seitenaufteilung abschalten
 Seitenaufteilung abschalten