2011-10-15 11:32:43 +02:00
|
|
|
/*
|
2011-10-19 00:04:59 +02:00
|
|
|
* Based on the code of the Mini-LED-Cube 1.0
|
2011-10-15 11:32:43 +02:00
|
|
|
*
|
2011-10-19 00:04:59 +02:00
|
|
|
* Copyright (C) 2009 Paul Wilhelm <paul@mosfetkiller.de>
|
|
|
|
* http: *mosfetkiller.de/?s=miniledcube
|
2011-10-15 11:32:43 +02:00
|
|
|
*
|
|
|
|
* Changed by Kai Lauterbach (klaute at web dot de)
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "main.h"
|
|
|
|
|
2011-10-19 00:04:59 +02:00
|
|
|
// Main
|
2011-08-20 15:22:47 +02:00
|
|
|
int main(void)
|
|
|
|
{
|
2011-10-19 00:04:59 +02:00
|
|
|
// Initialisierung
|
2011-10-15 11:32:43 +02:00
|
|
|
init();
|
|
|
|
init_usb();
|
|
|
|
|
2011-10-19 00:04:59 +02:00
|
|
|
// Hauptschleife
|
|
|
|
//while (1)
|
|
|
|
for (;;)
|
2011-10-15 11:32:43 +02:00
|
|
|
{
|
|
|
|
//wdt_reset(); // we are alive, so don't reset the µC
|
|
|
|
usbPoll(); // keep connected
|
|
|
|
|
2011-11-05 16:52:02 +01:00
|
|
|
// hier pause einfügen
|
|
|
|
_delay_ms(50); // beispielsweise 50 ms => muss angepasst werden an usb kommunikation
|
|
|
|
|
2011-10-15 11:32:43 +02:00
|
|
|
}
|
2011-08-20 15:22:47 +02:00
|
|
|
}
|
|
|
|
|
2011-10-19 00:04:59 +02:00
|
|
|
// Initialisierung
|
2011-08-20 15:22:47 +02:00
|
|
|
void init()
|
|
|
|
{
|
2011-10-19 00:04:59 +02:00
|
|
|
// Ports vorbereiten
|
|
|
|
DDRB = 0b11111111; // PB0-PB7: LED 1-8 (Kathoden)
|
|
|
|
PORTB = 0b11111111; // HIGH
|
2011-08-20 15:22:47 +02:00
|
|
|
|
2011-10-19 00:04:59 +02:00
|
|
|
DDRD = 0b1111000; // PD6: LED 9 (Kathode); PD5-PD3: A-C (Anoden)
|
2011-10-15 11:32:43 +02:00
|
|
|
PORTD = 0b1000000;
|
2011-08-20 15:22:47 +02:00
|
|
|
|
2011-10-19 00:04:59 +02:00
|
|
|
// Timer-Interrupt "TIMER1" vorbereiten
|
|
|
|
//cli(); //
|
2011-08-20 15:22:47 +02:00
|
|
|
|
2011-10-15 11:32:43 +02:00
|
|
|
set_bit(TIMSK, OCIE1A);
|
|
|
|
set_bit(TCCR1B, WGM12);
|
2011-08-20 15:22:47 +02:00
|
|
|
|
2011-10-19 00:04:59 +02:00
|
|
|
// Animations-Geschwindigkeit
|
2011-11-05 16:52:02 +01:00
|
|
|
// (vergleichswert bei dem der Interrupt ausgelöst wird)
|
2011-10-15 11:32:43 +02:00
|
|
|
OCR1AH = 0x01;
|
|
|
|
OCR1AL = 0x00;
|
2011-08-20 15:22:47 +02:00
|
|
|
|
2011-11-05 16:52:02 +01:00
|
|
|
// anpassen auf reihenweise ausgabe
|
2011-10-19 00:04:59 +02:00
|
|
|
clear_bit(TCCR1B, CS12); // Prescaler 64
|
2011-10-15 11:32:43 +02:00
|
|
|
set_bit(TCCR1B, CS11);
|
|
|
|
set_bit(TCCR1B, CS10);
|
2011-08-20 15:22:47 +02:00
|
|
|
|
2011-10-15 11:32:43 +02:00
|
|
|
sei();
|
2011-08-20 15:22:47 +02:00
|
|
|
}
|
|
|
|
|
2011-10-19 00:04:59 +02:00
|
|
|
// Interruptvektor von TIMER1
|
2011-11-05 16:52:02 +01:00
|
|
|
//SIGNAL(SIG_OUTPUT_COMPARE1A) // alte schreibweise
|
|
|
|
ISR (TIMER1_COMPA_vect)
|
2011-08-20 15:22:47 +02:00
|
|
|
{
|
2011-10-19 00:04:59 +02:00
|
|
|
|
2011-11-05 16:53:24 +01:00
|
|
|
// Vorgang für reihenweise Ausgabe.
|
2011-11-05 16:52:02 +01:00
|
|
|
// Alle Pins von PORTD auf LOW setzen
|
|
|
|
// Höchstes Bit in PORTA auf 0 setzen (Leitung 9 für letzte Reihe)
|
|
|
|
|
|
|
|
// bei cube_row_offset % 3 eine Ebene weiter schalten (ABC-Leitungen durch rotieren)
|
|
|
|
// bei Systemstart muss A aktiviert sein.
|
|
|
|
|
|
|
|
// bits der anzuzeigenden reihe auslesen (cube & (0b00000111 << cube_row_offset))
|
|
|
|
// und in PORTD und Pin 8 von PORTA setzen
|
|
|
|
|
|
|
|
// cube_row_offset += 3 // immer um 3 Bits weiter springen in 32Bit Variable
|
|
|
|
|
|
|
|
// cube_row_offset auf 0 setzen wenn maximum überschritten (27-3 = 24)
|
2011-10-19 00:04:59 +02:00
|
|
|
|
2011-08-20 15:22:47 +02:00
|
|
|
}
|
2011-10-19 00:04:59 +02:00
|
|
|
|