Hallo zusammen,
ich habe das Problem, dass ich mit dem 16-Bit Timer 3 vom Arduino
Leonardo keine PWM erzeugen kann.
Ich bin folgendermaßen vorgegangen:
Ich habe einen Code für den ATmega32U4 mit Atmel Studio erstellt:
1 | // include statements
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 | int main(void)
|
6 | {
|
7 |
|
8 | cli(); // disable global interrupts
|
9 |
|
10 | // init output pins
|
11 | DDRC |= (1<<DDC6); // PC6 as output / OC3A as output / D5 as output // OC3A als PWM-Pin / Timer/Counter1
|
12 | DDRC |= (1<<DDC7); // onboard LED - Arduino Pin 13
|
13 |
|
14 | //PRR1 |= 1<<PRUSB; // disable usb
|
15 |
|
16 | TCCR3A |= (1<<COM3A0); // Toggle OC3A on compare match
|
17 | TCCR3B |= (1<<WGM32); // turn on CTC-Mode // Mode 4: CTC-Mode mit OCR3A als TOP
|
18 | TCCR3B |= (1<<CS31); // Pre-Scaler N=8
|
19 | TIMSK3 |= (1<<OCIE3A); // Output Compare A Match Interrupt Enable
|
20 |
|
21 | // set 25 Hz -- OCR3A --> 39.999
|
22 | OCR3A = 60000;
|
23 |
|
24 | sei(); // enable global interrupts
|
25 |
|
26 | while (1)
|
27 | {
|
28 | }
|
29 | }
|
30 |
|
31 | ISR(TIMER3_COMPA_vect)
|
32 | {
|
33 | PINC |= (1<<PINC7);
|
34 | }
|
Wenn ich diesen Code mit dem ARVISP mkII Programmer (
http://www.atmel.com/tools/avrispmkii.aspx ) auf den Arduino Leonardo
flashe (über die ISP-Schnittstelle auf dem Arduino), funktioniert die
PWM wunderbar.
Um danach den Bootloader wiederherzustellen, nutze ich einen Arduino UNO
und die Anleitung auf dieser Seite:
https://learn.sparkfun.com/tutorials/installing-an-arduino-bootloader
Danach kann ich den Arduino Leonardo wieder mit der Arduino IDE normal
benutzen. Meine Idee war, dass ich jetzt den Code aus dem Atmel Studio
in die Arduino IDE kopiere und den Timer dann von dort aus installiere.
Dass ich die Arduino IDE wieder benutzen möchte, hat den Hintergrund,
dass ich hier einfach auch die USB-Schnittstelle für UART-Kommunikation
zum PC nutzen kann. Ich möchte später auch andere Code-Teile nutzen, die
mit Arduino-Bibliotheken erstellt wurden.
Hier der Arduino-IDE-Code:
1 | // include statements
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 | void setup() {
|
6 | // put your setup code here, to run once:
|
7 | cli(); // disable global interrupts
|
8 |
|
9 | // init output pins
|
10 | DDRC |= (1<<DDC6); // PC6 as output / OC3A as output / D5 as output // OC3A als PWM-Pin / Timer/Counter1
|
11 | DDRC |= (1<<DDC7); // onboard LED - Arduino Pin 13
|
12 |
|
13 | //PRR1 |= 1<<PRUSB; // disable usb
|
14 |
|
15 | TCCR3A |= (1<<COM3A0); // Toggle OC3A on compare match
|
16 | TCCR3B |= (1<<WGM32); // turn on CTC-Mode // Mode 4: CTC-Mode mit OCR3A als TOP
|
17 | TCCR3B |= (1<<CS31); // Pre-Scaler N=8
|
18 | TIMSK3 |= (1<<OCIE3A); // Output Compare A Match Interrupt Enable
|
19 |
|
20 | // set 25 Hz -- OCR3A --> 39.999
|
21 | OCR3A = 60000;
|
22 |
|
23 | sei(); // enable global inte
|
24 | }
|
25 |
|
26 | void loop() {
|
27 | // put your main code here, to run repeatedly:
|
28 |
|
29 | }
|
30 |
|
31 | ISR(TIMER3_COMPA_vect)
|
32 | {
|
33 | PINC |= (1<<PINC7);
|
34 | }
|
Diesen Code kann ich hochladen, sodass die Meldung "Hochladen
abgeschlossen" erscheint, allerdings wird der Timer nicht gestartet, die
Debug-LED blinkt nicht und insgesamt passiert einfach nichts. Auch das
Auskommentieren von sei und cli hilft nicht.
Meine Fragen sind nun, woran das liegt, und vielleicht noch wichtiger,
wie ich das Problem beheben kann.
Schonmal vielen Dank für die Antworten !!