LED Cube an Arduino Micro

Guten Tag,

Ich bin recht neu in der Welt von Arduino. Ich habe mir vor einiger Zeit einen LED Cube gebaut. Diesen möchte ich jetzt auf einen Arduino umrüsten. Dazu habe ich einen Code gefunden, welcher auch prima mit dem Arduino Uno funktioniert.

Ich möchte jedoch den Arduino Micro verwenden und bekomme den Code nicht angepasst.
Kann mir da eventuell jemand helfen?

Den Code findet ihr im Anhang. Ich bekomme folgende Fehlermeldungen:

wuerfel.ino: In function 'void setup()':
wuerfel:22: error: 'TCCR2A' was not declared in this scope
wuerfel:23: error: 'TCCR2B' was not declared in this scope
wuerfel:25: error: 'WGM21' was not declared in this scope
wuerfel:26: error: 'OCR2A' was not declared in this scope
wuerfel:27: error: 'TCNT2' was not declared in this scope
wuerfel:28: error: 'CS22' was not declared in this scope
wuerfel:28: error: 'CS21' was not declared in this scope

Mit freundlichen Grüßen,
LeBruns

wuerfel.ino (12.8 KB)

Ein Nano wäre besser gewesen, der ist zum Arduino Uno (Atmega168/328) kompatibel. Das der Fehler kommt, ist verständlich. Die Timereinstellungen machst du in der setup. Jedoch ist auf dem Arduino Mirco der Atmega32U4 verbaut, der intern von den Registern anders aufgebaut ist.

Der Micro hat keinen 2. 8-Bit Timer.

In deinem Sketch scheint Timer1 (ua millis()) nicht genutzt zu werden. Versuche mal folgendes umzubennen
TCCR2A → TCCR0A
TCCR2B → TCCR0B
WGM21 → WGM01
OCR2A → OCR0A
TCNT2 → TCNT0
CS22 → CS02
CS21 → CS01

TIMER2_COMPA_vect → TIMER0_COMPA_vect

Alternativ mal mit Timer1 versuchen. Bin mir nicht 100% sicher, ob du den 16Bit Timer ohne weiteres als 8Bit Timer “missbrauchen” kannst.

void setup()
{
	// ...
TCCR1A = 0;
TCCR1B = 0;

TCCR1A |= (0x01<<WGM11);
OCR1A = 10;
TCNT1 = 0;
TCCR1B |= (0x01<<CS12) | (0x01<<CS11);
TIMSK1 |= (0x01<<OCIE1A);
}

ISR(TIMER1_COMPA_vect)
{
	// ...
}

P.S.: Solche Sketche sind für Anfänger absoluter Mist. Lernen tut man da eigentlich garnichts, da man nichts davon versteht, was man kopiert.

Dafür hättest du keinen Arduino nehmen müssen. Da hättest du dir den auch einfach von jemanden brennen lassen können und direkt einbauen ohne selber was zu programmieren.

Bester Weg zur Besserung, Sketch löschen, Basics erlernen und Stück für Stück sich an das Projekt wagen.

Der Atmega32U4 hat statt dessen einen Timer3 mit 16 Bit (funktioniert wie Timer1)

Dafür gibt es eine Library: https://www.pjrc.com/teensy/td_libs_TimerOne.html (Anleitung) https://github.com/PaulStoffregen/TimerThree

Laut dem läuft das auf dem Leonardo und sollte daher auch auf dem Micro gehen

@sschultewolter Bei der Portierung der Prescaler Einstellungen von Timer2 auf andere sollte man vorsichtig sein. Der Timer2 hat mehr Prescaler Optionen als die anderen Timer. Von daher läuft das dann mit einer anderen Geschwindigkeit wenn man nicht aufpasst.

Nachtrag: Mal nachgesehen: Prescaler 256 auf Timer0 ist nur CS02 gesetzt! CS01 + CS02 ist externe Taktung! Würde also gar nicht laufen

Hab es unter Vorbehalt geschrieben. Hatte jetzt nicht die Lust, für einen cp-Code auch noch die Arbeit zu erledigen, die Datenblätter nach den passenden Einstellungen zu durchwühlen.

Hier geht es doch nur darum alle x ms einen Interrupt auszurufen oder?

Dafür würde ich hier empfehlen eine der Timer Libraries verwenden. Dann muss man die Interna nicht verstehen.