From 58a7f128267c36d6bf06243dee752cf03bea3d56 Mon Sep 17 00:00:00 2001 From: klaute Date: Tue, 29 Nov 2011 23:48:54 +0100 Subject: [PATCH] Timer configured and first implementation of the ISR. --- firmware/main.c | 36 +++++++++++++++++++----------------- firmware/main.h | 4 ++-- firmware/usb.c | 4 ++-- firmware/usb.h | 8 ++++---- 4 files changed, 27 insertions(+), 25 deletions(-) diff --git a/firmware/main.c b/firmware/main.c index 083c55d..5855a1d 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -42,40 +42,42 @@ void init() // Timer-Interrupt "TIMER1" vorbereiten //cli(); // - set_bit(TIMSK, OCIE1A); - set_bit(TCCR1B, WGM12); + set_bit(TIMSK, OCIE1A); // Interrupt für ISR COMPA + set_bit(TCCR1B, WGM12); // Überlauf // Animations-Geschwindigkeit // (vergleichswert bei dem der Interrupt ausgelöst wird) - OCR1AH = 0x01; - OCR1AL = 0x00; + // 625d = 0x271 = 0b00000010, 0b01110001 + OCR1AH = 0b00000010; + OCR1AL = 0b01110001; // anpassen auf reihenweise ausgabe + // Vorteiler durch 64 (0x011) ----> CS12=0, CS11=1, CS10=1 clear_bit(TCCR1B, CS12); // Prescaler 64 set_bit(TCCR1B, CS11); set_bit(TCCR1B, CS10); - sei(); + + + sei(); // Set enable interrupt bit (Muss gesetzt werden damit es überhaupt aufgerufen wird) } // Interruptvektor von TIMER1 //SIGNAL(SIG_OUTPUT_COMPARE1A) // alte schreibweise ISR (TIMER1_COMPA_vect) { + // PORTD = __, 9, C, B, A,D+,D-,__ + PORTD &= 0b11000111; // Reset durch Bitmaske + PORTD |= ((1 << (cube_level))<< 3); // Level setzen (A=0, B=1, C=2) - // Vorgang für reihenweise Ausgabe. - // Alle Pins von PORTD auf LOW setzen - // Höchstes Bit in PORTA auf 0 setzen (Leitung 9 für letzte Reihe) + // PORTB = 1..8 + // 0 = leuchtet, 1 = leuchtet nicht (invertiert!) + PORTB = ~(cube & (0b11111111 << (cube_level*9))); - // 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) + PORTD &= 0b10111111; // 7tes Bit löschen (9) + PORTD |= ~((cube & (1 << (cube_level*9+8))) << 6); + //cube_level++; + //if (cube_level > 2) cube_level = 0; } diff --git a/firmware/main.h b/firmware/main.h index 243866a..0cc7dc8 100644 --- a/firmware/main.h +++ b/firmware/main.h @@ -20,9 +20,9 @@ //#include // Cube-Data -volatile uint32_t cube = 0x00000000; +volatile uint32_t cube = 0x0000000F; // Aktuelle Frame // Bit Offset in Cube-Data -volatile uint8_t cube_row_offset = 0x00; +volatile uint8_t cube_level = 0; // Ebene // Prototypen void init(void); diff --git a/firmware/usb.c b/firmware/usb.c index 3915e30..dfaebf5 100644 --- a/firmware/usb.c +++ b/firmware/usb.c @@ -26,7 +26,7 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) if (rq->wIndex.bytes[0] == 2) cube[0][0][2] = 1; if (rq->wIndex.bytes[0] == 3) - cube[0][1][0] = 1;*/ + cube[0][1][0] = 1; if (rq->wIndex.bytes[0] == 0) x = rq->wValue.bytes[0]; @@ -39,7 +39,7 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) else if (rq->wIndex.bytes[0] == 3) cube[x][y][z] = rq->wValue.bytes[0]; - +*/ } else if ( rq->bRequest == CUSTOM_RQ_GET_STATUS ) { // Send one byte to the USB host. diff --git a/firmware/usb.h b/firmware/usb.h index f1e4c03..1142f12 100644 --- a/firmware/usb.h +++ b/firmware/usb.h @@ -55,13 +55,13 @@ PROGMEM char usbHidReportDescriptor[22] = { /* USB report descriptor */ void init_usb(void); -volatile uint8_t x; -volatile uint8_t y; -volatile uint8_t z; +//volatile uint8_t x; +//volatile uint8_t y; +//volatile uint8_t z; // usb buffer //extern uint8_t buffer[3][3][3]; // Framebuffer -extern uint8_t cube[3][3][3]; // Framebuffer +//extern uint8_t cube[3][3][3]; // Framebuffer #endif // __usb_h__