OC1A auf OC0A ändern?

OP #3536721
Lesenswert?

Ich habe auf meinem ATMega644 eine PWM programmiert, um einen Servo 
anzusteuern, und diese funktioniert auf PD5 (OC1A) einwandfrei.
1
#include <avr/io.h>
2

3
#ifndef F_CPU
4
#define F_CPU 16000000
5
#endif
6

7
#include <util/delay.h>
8
#include <avr/interrupt.h>
9
#include <stdio.h>
10
#include <avr/interrupt.h>
11

12
int main(void)
13
{
14
  DDRD = 0xFF;
15
  char value = 0;
16
  
17
  TCCR1A = 0b10100010;
18
  TCCR1B = 0b00011010;
19
  ICR1   = 0xFFFF;
20

21
  while(1)
22
  {
23
    OCR1A = 2500;
24
    _delay_ms(500);
25
    OCR1A = 4500;
26
    _delay_ms(2000);
27
  }
28
}

Da dieser Pin nun allerdings anderweitig verwendet wird würde ich den 
Servo gerne an einen anderen Kanal anschließen, hierfür habe ich den 
OC0A gewählt, der an PB3 liegt. Hierfür habe ich den Code nun 
folgendermaßen geändert:
1
#include <avr/io.h>
2

3
#ifndef F_CPU
4
#define F_CPU 16000000
5
#endif
6

7
#include <util/delay.h>
8
#include <avr/interrupt.h>
9
#include <stdio.h>
10
#include <avr/interrupt.h>
11

12
int main(void)
13
{
14
  DDRB = 0xFF;
15
  char value = 0;
16
  
17
  TCCR0A = 0b10100010;
18
  TCCR0B = 0b00011010;
19
  ICR1   = 0xFFFF;
20

21
  while(1)
22
  {
23
    OCR0A = 2500;
24
    _delay_ms(500);
25
    OCR0A = 4500;
26
    _delay_ms(2000);
27
  }
28
}

Ich habe also nur DDRD ind DDRB geändert und TCCR1A, TCCR1B und OCR1A zu 
TCCR0A, TCCR0B und OCR0A geändert, ICR1 bleibt soweit ich weiß 
unverändert bzw. könnte man es nicht sogar einfach weglassen?

Allerdings funktioniert das Programm leider nicht. Es lässt sich zwar 
compilieren und proggen, in der Praxis bewegt sich der Servo aber kein 
Stück.
Wo liegt das Problem? Habe ich eventuell etwas übersehen oder vergessen?
Gast #3536738
Lesenswert?

Obi schrieb:
>Es lässt sich zwar compilieren und proggen, in der Praxis bewegt sich der >Servo 
aber kein Stück.

Holger schrob:
>OCR0A ist ein 8 Bit Register. Da passt 2500 nicht rein.

Das ist aber schön, daß das der Kompiler nicht merkt und sich der 
Quelltext
trotzdem übersetzen läßt...
MfG Paul
Gast #3536745
Lesenswert?

Warnungen sind nunmal nicht zum Ignorieren da:

Warning  1  large integer implicitly truncated to unsigned type 
[-Woverflow]  D:\Chris\Documents\Atmel Studio\tmptest\tmptest\tmptest.c 
23  3  tmptest
Warning  2  large integer implicitly truncated to unsigned type 
[-Woverflow]  D:\Chris\Documents\Atmel Studio\tmptest\tmptest\tmptest.c 
25  3  tmptest
Warning  3  unused variable 'value' [-Wunused-variable] 
D:\Chris\Documents\Atmel Studio\tmptest\tmptest\tmptest.c  15  7 
tmptest
OP #3537033
Lesenswert?

Falls es jemand interessiert, so siehts dann aus wenns mit OC0A 
funktioniert:
1
#include <avr/io.h>
2

3
#ifndef F_CPU
4
#define F_CPU 16000000
5
#endif
6

7
#include <util/delay.h>
8
#include <avr/interrupt.h>
9
#include <stdio.h>
10

11
int main(void)
12
{
13
  DDRB = 0xFF;
14
  TCCR0A = 0b10000001;
15
  TCCR0B = 0b00000100;
16

17
  while(1)
18
  {
19
    OCR0A = 70;
20
    _delay_ms(2000);
21
  
22
    OCR0A = 50;
23
    _delay_ms(500);
24
  }
25

26
  return 0;
27
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren