Forum: Mikrocontroller und Digitale Elektronik OC1A auf OC0A ändern?


von Jannik O. (jannipanni)


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?

von holger (Gast)


Lesenswert?

OCR0A = 2500;

OCR0A ist ein 8 Bit Register. Da passt 2500 nicht rein.

von Paul Baumann (Gast)


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

von chris (Gast)


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

von Jannik O. (jannipanni)


Lesenswert?

Achja darauf habe ich gar nicht geachtet und die Warnungen sind bei mir 
komischerweise auch nicht aufgetreten?
Aber das wirds wohl sein, danke.

von Jannik O. (jannipanni)


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
}

: Bearbeitet durch User
von T.roll (Gast)


Lesenswert?

Obi Wan schrieb:
> Achja darauf habe ich gar nicht geachtet und die Warnungen sind bei mir
> komischerweise auch nicht aufgetreten?

Du musst die Warnungen auch einschalten.
-Wall
-Wextra

von Jannik O. (jannipanni)


Lesenswert?

Die Warnungen waren eingeschaltet. Aber komischerweise hat er später 
dann manchmal eine Warnung rausgehauen, manchmal aber auch nicht, mehr 
so nach Zufallsprinzip.

von Karl H. (kbuchegg)


Lesenswert?

Obi Wan schrieb:
> Falls es jemand interessiert, so siehts dann aus wenns mit OC0A
> funktioniert:

Solange du das so schreibst
>
1
>   TCCR0A = 0b10000001;
2
>   TCCR0B = 0b00000100;
3
>

und zu einer ordentlichen Schreibweise zu faul bist
a) gehört es dir nicht anders als das es nicht funktioniert
b) interessiert das keinen

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
Noch kein Account? Hier anmelden.