From fa12096630adaeb4a9d253101afc5c6516b93397 Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Sun, 30 Jun 2013 14:57:44 -0600 Subject: [PATCH] Fix timers in main program too --- Makefile | 40 ++++++++++++++++++++-- Makefile.avr | 42 ----------------------- Makefile.ti | 17 ---------- avr.c | 48 +++++++++++--------------- main.c | 95 ++++++++++++++++++++++++++-------------------------- ti.c | 34 ------------------- ti.h | 28 ---------------- 7 files changed, 104 insertions(+), 200 deletions(-) delete mode 100644 Makefile.avr delete mode 100644 Makefile.ti delete mode 100644 ti.c delete mode 100644 ti.h diff --git a/Makefile b/Makefile index 23e3b14..0cacd4d 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,40 @@ -ARCH = avr +PROG = main -CFLAGS += -DARCH=$(ARCH) +MCU = attiny84 -include Makefile.$(ARCH) +CC = avr-gcc +CFLAGS += -mmcu=$(MCU) +CFLAGS += -Os +CFLAGS += -w +LDFLAGS += -mmcu=$(MCU) + +AVDFLAGS += -p $(MCU) +AVDFLAGS += -c usbtiny + +CLOCK_HZ = 16000000 +FUSES += -U lfuse:w:0xff:m +FUSES += -U hfuse:w:0xd9:m +FUSES += -U efuse:w:0xff:m + + +upload: .upload + +.upload: $(PROG).hex + avrdude $(AVDFLAGS) -U flash:w:$< + touch $@ + +fuses: + avrdude $(AVDFLAGS) $(FUSES) + +main: main.o avr.o + +$(PROG).hex: $(PROG) + avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@ + +clean: + rm -f $(PROG) *.o *.hex .upload + + + + diff --git a/Makefile.avr b/Makefile.avr deleted file mode 100644 index a4d0aef..0000000 --- a/Makefile.avr +++ /dev/null @@ -1,42 +0,0 @@ -PROG = main - -MCU = attiny84 - -CC = avr-gcc -CFLAGS += -mmcu=$(MCU) -CFLAGS += -Os -CFLAGS += -w - -LDFLAGS += -mmcu=$(MCU) - -AVDFLAGS += -p $(MCU) -AVDFLAGS += -c usbtiny - -FUSES += -U lfuse:w:0xff:m -FUSES += -U hfuse:w:0xd9:m -FUSES += -U efuse:w:0xff:m - - -upload: .upload - -.upload: $(PROG).hex - avrdude $(AVDFLAGS) -U flash:w:$< - touch $@ - -fuses: - avrdude $(AVDFLAGS) $(FUSES) - -$(PROG).hex: $(PROG) - avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@ - -main: main.o avr.o - -#main.o: avr.h -#avr.o: avr.h - -clean: - rm -f $(PROG) *.o *.hex .upload - - - - diff --git a/Makefile.ti b/Makefile.ti deleted file mode 100644 index 9cfdc4c..0000000 --- a/Makefile.ti +++ /dev/null @@ -1,17 +0,0 @@ -CC = msp430-gcc -LDFLAGS += -mmcu=msp430g2553 -CFLAGS += -mmcu=msp430g2553 -CFLAGS += -Wall -CFLAGS += -Os -CFLAGS += -w - -upload: .upload - -.upload: main - mspdebug rf2500 "prog $<" - touch $@ - -main: main.o ti.o - -clean: - rm -f main *.o .upload diff --git a/avr.c b/avr.c index e88c250..c6b1ba9 100644 --- a/avr.c +++ b/avr.c @@ -4,49 +4,39 @@ #include #include "avr.h" +/* This only works out for a 16MHz or 8MHz clock */ +#define CLOCK_HZ 16000000 +#define TICKS_PER_SECOND (CLOCK_HZ / 256) +#define TICKS_PER_JIFFY (TICKS_PER_SECOND / 10) + #define cbi(byt, bit) (byt &= ~_BV(bit)) #define sbi(byt, bit) (byt |= _BV(bit)) extern volatile bool tick; extern volatile uint32_t jiffies; -// Count microseconds -volatile uint32_t micros = 0; - -// Interrupt called every 256 * 64 microseconds -ISR(TIM0_OVF_vect) +// Interrupt called every jiffy +ISR(TIM1_COMPA_vect) { - uint32_t m = micros; - - m += (256 * 64); - if (m >= JIFFY_uS) { - m -= JIFFY_uS; - tick = true; - jiffies += 1; - } - micros = m; + jiffies += 1; + tick = true; } - void init(void) { - // Set prescaler to 16, so we get clock ticks at exactly 1MHz - CLKPR = _BV(CLKPCE); - CLKPR = 0x04; - - // Set timer 0 interrupt clock divider to 64 - TCCR0B = _BV(CS01) + _BV(CS00); - - // enable timer 0 overflow interrupt - TIMSK0 |= _BV(TOIE0); //enable compare match interrupt; - - // Enable interrupts - sei(); + int i; DDRA = ~(_BV(NESOUT)); DDRB = 0xff; - PORTA = 0; - PORTB = 0xff; + TCCR1A = 0; + TCCR1B = 0; + TCNT1 = 0; + OCR1A = TICKS_PER_JIFFY - 1; + TCCR1B |= (1 << WGM12); + TCCR1B |= (1 << CS12); + TIMSK1 |= (1 << OCIE1A); + + sei(); } diff --git a/main.c b/main.c index 34e73ca..197a88c 100644 --- a/main.c +++ b/main.c @@ -5,22 +5,25 @@ #include #include -#if ARCH == avr -# include "avr.h" -#else -# include "ti.h" -#endif +#include "avr.h" // Number of shift registers in your scoreboard // If you want scores to go over 199, you need 8 const int nsr = 6; -// +// // Timing stuff -// +// + +// +// 2**32 deciseconds = 13.610221 years +// +// As long as you unplug your scoreboard once every 10 years or so, +// you're good. +// +volatile uint32_t jiffies = 0; // Elapsed time in deciseconds +volatile bool tick = false; // Set high when jiffy clock ticks -volatile uint32_t jiffies = 0; -volatile bool tick = false; // Set high when jiffy clock ticks // Clocks are in deciseconds uint16_t score_a = 0; @@ -75,11 +78,11 @@ write(uint8_t number) { int i; int j; - + // MSB first for (i = 7; i >= 0; i -= 1) { sin(number & (1 << i)); - + for (j = 0; j < 12; j += 1) { pulse(); } @@ -94,7 +97,7 @@ write_num(uint16_t number, int digits) for (i = 0; i < digits; i += 1) { uint16_t n = (number / divisor) % 10; - + write(seven_segment_digits[n]); divisor *= 10; } @@ -108,11 +111,11 @@ draw() { uint16_t clk; - //XXX testing + // XXX testing + - write_num(score_b, 2); - + if (state == SETUP) { write(setup_digits[2]); write(setup_digits[1]); @@ -120,10 +123,10 @@ draw() write(setup_digits[0]); } else { clk = (abs(jam_clock / 600) % 10) * 1000; - clk += abs(jam_clock) % 600; + clk += abs(jam_clock) % 600; write_num(clk, 4); } - + write_num(score_a, 2); @@ -137,7 +140,7 @@ draw() clk += abs(period_clock / 10) % 60; write_num(clk, 4); } - + latch(); pulse(); } @@ -153,7 +156,7 @@ nesprobe() nesltch(true); nesltch(false); - + for (i = 0; i < 8; i += 1) { state <<= 1; if (nesout()) { @@ -164,7 +167,7 @@ nesprobe() nesclk(true); nesclk(false); } - + // Only report button down events. return state; } @@ -173,10 +176,10 @@ void update_controller() { static uint8_t last_val = 0; - uint8_t cur; + uint8_t cur; uint8_t pressed; int inc = 1; - + cur = nesprobe(); pressed = (last_val ^ cur) & cur; last_val = cur; @@ -185,9 +188,9 @@ update_controller() state = JAM; jam_clock = jam_duration; } - + if ((pressed & BTN_B) && ((state != LINEUP) || (jam_clock == 0))) { - state = LINEUP; + state = LINEUP; jam_clock = lineup_duration; } @@ -195,7 +198,7 @@ update_controller() state = TIMEOUT; jam_clock = 1; } - + if (cur & BTN_SELECT) { inc = -1; @@ -205,7 +208,7 @@ update_controller() if (pressed & BTN_LEFT) { score_a += inc; } - + if (pressed & BTN_RIGHT) { score_b += inc; } @@ -223,7 +226,7 @@ setup() { int i; - // Datasheet says you have to do this before DC initialization. + // TLC5941 datasheet says you have to do this before DC initialization. // In practice it doesn't seem to matter, but what the hey. draw(); @@ -244,28 +247,29 @@ loop() if (tick) { tick = false; - - update_controller(); - if (jiffies % 66 == 0) { + update_controller(); + + if (jiffies % 10 == 0) { PORTB ^= 0xff; } - if (jiffies % (JIFFIES_PER_SECOND / 10) == 0) { + + if (jiffies == 0) { switch (state) { - case SETUP: - break; - case JAM: - case LINEUP: - if (period_clock) { - period_clock += 1; - } - // fall through - case TIMEOUT: - if (jam_clock) { - jam_clock += 1; - } + case SETUP: + break; + case JAM: + case LINEUP: + if (period_clock) { + period_clock += 1; + } + // fall through + case TIMEOUT: + if (jam_clock) { + jam_clock += 1; + } } - + draw(); } } @@ -281,6 +285,3 @@ main(void) } return 0; } - - - diff --git a/ti.c b/ti.c deleted file mode 100644 index 17d8853..0000000 --- a/ti.c +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -#include "ti.h" - -extern volatile bool tick; -extern volatile uint32_t jiffies; - -// Count microseconds -volatile uint32_t micros = 0; - -// Interrupt called every 1024 µs -__attribute__((interrupt(TIMER0_A0_VECTOR))) -void -timer_a(void) -{ - tick = true; - jiffies += 1; -} - - - -void -init() -{ - WDTCTL = WDTPW + WDTHOLD; // Disable Watchdog Timer - P1DIR = ~(_BV(NESOUT)); - P1OUT = 0; - - CCTL0 |= CCIE; // Trigger interrupt on A checkpoint - TACTL = TASSEL_2 + MC_1; // Set timer A to SMCLCK, up mode - TACCR0 = 0x4444; // Interrupt 60 times per second - - __enable_interrupt(); -} diff --git a/ti.h b/ti.h deleted file mode 100644 index c6bf051..0000000 --- a/ti.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef TI_H -#define TI_H - -#include -#include - -#define _BV(x) (1 << x) - -#define JIFFIES_PER_SECOND 60 - -#define bit(pin, bit, on) pin = (on ? (pin | bit) : (pin & ~bit)) - -#define mode(on) bit(P1OUT, _BV(0), on) -#define sin(on) bit(P1OUT, _BV(1), on) -#define sclk(on) bit(P1OUT, _BV(2), on) -#define xlat(on) bit(P1OUT, _BV(3), on) -// Connect GSCLK to SCLK -// Connect BLANK to XLAT -// TRUST ME, THIS TOTALLY WORKS - -#define NESOUT 6 -#define nesclk(on) bit(P1OUT, _BV(4), on) -#define nesltch(on) bit(P1OUT, _BV(5), on) -#define nesout() ((P1IN & _BV(NESOUT)) << NESOUT) - -void init(); - -#endif