mirror of
https://github.com/mcgurk/Arduino-USB-HID-RetroJoystickAdapter
synced 2024-11-21 16:45:08 -05:00
Update c64_usb_mouse.ino
This commit is contained in:
parent
f95abb34f4
commit
bebcfd3ccf
@ -1,27 +1,16 @@
|
|||||||
|
#define USBHOST
|
||||||
|
|
||||||
|
#ifdef USBHOST
|
||||||
#include <hidboot.h>
|
#include <hidboot.h>
|
||||||
#include <usbhub.h>
|
#include <usbhub.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/*#define SENSEPORT PORTD ///< SID sense port
|
#define POTSENSE 4 //ICP1 (Arduino Pro Micro: pin4, Arduino Uno: pin8)
|
||||||
#define SENSEDDR DDRD ///< SID sense data direction
|
|
||||||
#define SENSEPIN PIND ///< SID sense input*/
|
|
||||||
#define POTSENSE 3 ///< INT1 attached to PORTD.3,
|
|
||||||
|
|
||||||
/*#define POTPORT PORTB ///< POT-controlling outputs X and Y
|
|
||||||
#define POTDDR DDRB ///< POT outputs data direction
|
|
||||||
#define POTPIN PINB ///< POT outputs input ;)*/
|
|
||||||
#define POTX 9 ///< X-line, also OC1A
|
#define POTX 9 ///< X-line, also OC1A
|
||||||
#define POTY 10 ///< Y-line, also OC1B
|
#define POTY 10 ///< Y-line, also OC1B
|
||||||
#define LBTN 4 ///< Joystick FIRE switch
|
#define LBTN 5 ///< Joystick FIRE switch
|
||||||
#define RBTN 5 ///< Joystick UP switch
|
#define RBTN 6 ///< Joystick UP switch
|
||||||
|
|
||||||
/*#define JOYPORT PORTC ///< Joystick pins
|
|
||||||
#define JOYDDR DDRC ///< Joystick pins data direction (out = switch closed to gnd)
|
|
||||||
#define JOYPIN PINC ///< Joystick in*/
|
|
||||||
/*#define JOYUP 5 ///< Joystick UP switch
|
|
||||||
#define JOYDOWN 6 ///< Joystick DOWN switch
|
|
||||||
#define JOYLEFT 7 ///< Joystick LEFT switch
|
|
||||||
#define JOYRIGHT 8 ///< Joystick RIGHT switch
|
|
||||||
#define JOYFIRE 9 ///< Joystick FIRE switch*/
|
|
||||||
|
|
||||||
//#define DEBUG
|
//#define DEBUG
|
||||||
|
|
||||||
@ -30,9 +19,8 @@ int16_t dy=0;
|
|||||||
uint8_t buttons=0;
|
uint8_t buttons=0;
|
||||||
|
|
||||||
uint8_t update = 0;
|
uint8_t update = 0;
|
||||||
#define FIX_START 90
|
|
||||||
int16_t fix = FIX_START;
|
|
||||||
|
|
||||||
|
#ifdef USBHOST
|
||||||
class MouseRptParser : public MouseReportParser {
|
class MouseRptParser : public MouseReportParser {
|
||||||
protected:
|
protected:
|
||||||
void OnMouseMove(MOUSEINFO *mi);
|
void OnMouseMove(MOUSEINFO *mi);
|
||||||
@ -67,7 +55,6 @@ void MouseRptParser::OnLeftButtonDown(MOUSEINFO *mi) {
|
|||||||
#endif
|
#endif
|
||||||
buttons |= 1;
|
buttons |= 1;
|
||||||
update = 1;
|
update = 1;
|
||||||
fix++;
|
|
||||||
};
|
};
|
||||||
void MouseRptParser::OnRightButtonUp(MOUSEINFO *mi) {
|
void MouseRptParser::OnRightButtonUp(MOUSEINFO *mi) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -82,7 +69,6 @@ void MouseRptParser::OnRightButtonDown(MOUSEINFO *mi) {
|
|||||||
#endif
|
#endif
|
||||||
buttons |= 2;
|
buttons |= 2;
|
||||||
update = 1;
|
update = 1;
|
||||||
fix--;
|
|
||||||
};
|
};
|
||||||
void MouseRptParser::OnMiddleButtonUp(MOUSEINFO *mi) {
|
void MouseRptParser::OnMiddleButtonUp(MOUSEINFO *mi) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -93,7 +79,6 @@ void MouseRptParser::OnMiddleButtonDown(MOUSEINFO *mi) {
|
|||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Serial.println("M Butt Dn");
|
Serial.println("M Butt Dn");
|
||||||
#endif
|
#endif
|
||||||
fix = FIX_START;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
USB Usb;
|
USB Usb;
|
||||||
@ -101,13 +86,7 @@ USBHub Hub(&Usb);
|
|||||||
HIDBoot<USB_HID_PROTOCOL_MOUSE> HidMouse(&Usb);
|
HIDBoot<USB_HID_PROTOCOL_MOUSE> HidMouse(&Usb);
|
||||||
|
|
||||||
MouseRptParser Prs;
|
MouseRptParser Prs;
|
||||||
|
#endif
|
||||||
|
|
||||||
enum _potmode {
|
|
||||||
POTMOUSE_C1351 = 0, //<! proportional mode
|
|
||||||
POTMOUSE_JOYSTICK //<! joystick mode
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static uint8_t potmouse_xcounter; ///< x axis counter
|
static uint8_t potmouse_xcounter; ///< x axis counter
|
||||||
static uint8_t potmouse_ycounter; ///< y axis counter
|
static uint8_t potmouse_ycounter; ///< y axis counter
|
||||||
@ -115,19 +94,15 @@ static uint8_t potmouse_ycounter; ///< y axis counter
|
|||||||
static volatile uint16_t ocr1a_load; ///< precalculated OCR1A value (YPOT)
|
static volatile uint16_t ocr1a_load; ///< precalculated OCR1A value (YPOT)
|
||||||
static volatile uint16_t ocr1b_load; ///< precalculated OCR1B value (XPOT)
|
static volatile uint16_t ocr1b_load; ///< precalculated OCR1B value (XPOT)
|
||||||
|
|
||||||
#define OCR_ZERO 320 ///< zero point (320us)
|
|
||||||
|
|
||||||
//static volatile uint8_t mode; ///< mouse mode
|
|
||||||
uint8_t mode; ///< mouse mode
|
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
|
delay(200);
|
||||||
Serial.println("Start");
|
Serial.println("Start");
|
||||||
Serial.flush();
|
Serial.flush();
|
||||||
delay(200);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USBHOST
|
||||||
if (Usb.Init() == -1) {
|
if (Usb.Init() == -1) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Serial.println("OSC did not start.");
|
Serial.println("OSC did not start.");
|
||||||
@ -135,184 +110,159 @@ void setup() {
|
|||||||
}
|
}
|
||||||
delay(200);
|
delay(200);
|
||||||
HidMouse.SetReportParser(0, &Prs);
|
HidMouse.SetReportParser(0, &Prs);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Serial.flush();
|
Serial.flush();
|
||||||
delay(200);
|
delay(200);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mode = POTMOUSE_C1351;
|
|
||||||
pinMode(LBTN, INPUT); pinMode(RBTN, INPUT);
|
pinMode(LBTN, INPUT); pinMode(RBTN, INPUT);
|
||||||
|
|
||||||
pinMode(POTX, OUTPUT); pinMode(POTY, OUTPUT);
|
pinMode(POTX, OUTPUT); pinMode(POTY, OUTPUT);
|
||||||
digitalWrite(POTX, HIGH); digitalWrite(POTY, HIGH);
|
digitalWrite(POTX, HIGH); digitalWrite(POTY, HIGH);
|
||||||
pinMode(POTSENSE, INPUT); // pullup off, hi-biased by OC1A
|
pinMode(POTSENSE, INPUT); // pullup off, hi-biased by OC1A
|
||||||
attachInterrupt(digitalPinToInterrupt(POTSENSE), potSenseInt, FALLING);
|
|
||||||
|
|
||||||
potmouse_movt(0,0,0);
|
potmouse_movt(0,0,0);
|
||||||
|
|
||||||
// prepare INT1
|
startTimers();
|
||||||
//GICR &= ~_BV(INT1); // disable INT1
|
|
||||||
//MCUCR &= ~(_BV(ISC11)|_BV(ISC10));
|
#ifndef USBHOST
|
||||||
//MCUCR |= _BV(ISC11); // ISC11:ISC10 == 10, @negedge
|
TIMSK0 = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
|
#ifdef USBHOST
|
||||||
Usb.Task();
|
Usb.Task();
|
||||||
if (update) {
|
if (update) {
|
||||||
potmouse_movt(dx, dy, buttons);
|
potmouse_movt(dx, dy, buttons);
|
||||||
update = 0;
|
update = 0;
|
||||||
}
|
}
|
||||||
delayMicroseconds(200);
|
delayMicroseconds(200);
|
||||||
//potmouse_movt(dx, dy, buttons);
|
#endif
|
||||||
/*noInterrupts();
|
|
||||||
if(digitalRead(POTSENSE
|
#ifndef USBHOST
|
||||||
interrupts();*/
|
potmouse_movt(0, 0, buttons);
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
volatile uint8_t counter = 0;
|
||||||
|
volatile uint8_t upd = 0;
|
||||||
|
|
||||||
void potmouse_movt(int16_t dx, int16_t dy, uint8_t button) {
|
void potmouse_movt(int16_t dx, int16_t dy, uint8_t button) {
|
||||||
uint16_t a, b;
|
uint16_t a, b;
|
||||||
|
|
||||||
switch (mode) {
|
#ifndef USBHOST
|
||||||
case POTMOUSE_C1351:
|
if (upd) {
|
||||||
/*potmouse_xcounter = (potmouse_xcounter + dx) & 077; // modulo 64
|
potmouse_xcounter++;
|
||||||
//potmouse_ycounter = (potmouse_ycounter + dy) & 077;
|
potmouse_ycounter++;
|
||||||
potmouse_ycounter = (potmouse_ycounter - dy) & 077;*/
|
upd = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
//potmouse_xcounter = (potmouse_xcounter + (dx/2)) & 077; // modulo 64
|
potmouse_xcounter = (potmouse_xcounter + (dx/2)) & 0177; // modulo 128
|
||||||
//potmouse_ycounter = (potmouse_ycounter - (dy/2)) & 077;
|
potmouse_ycounter = (potmouse_ycounter - (dy/2)) & 0177;
|
||||||
potmouse_xcounter = (potmouse_xcounter + (dx/4)) & 077; // modulo 64
|
|
||||||
potmouse_ycounter = (potmouse_ycounter - (dy/4)) & 077;
|
|
||||||
|
|
||||||
|
//for testing
|
||||||
//potmouse_xcounter = (millis()>>6) & 077; // modulo 64
|
//potmouse_xcounter = (millis()>>6) & 077; // modulo 64
|
||||||
//potmouse_ycounter = (millis()>>6) & 077;
|
//potmouse_ycounter = (millis()>>6) & 077;
|
||||||
/*(button & 001) ? (JOYDDR |= _BV(JOYFIRE)) : (JOYDDR &= ~_BV(JOYFIRE));
|
|
||||||
(button & 002) ? (JOYDDR |= _BV(JOYUP)) : (JOYDDR &= ~_BV(JOYUP));
|
|
||||||
(button & 004) ? (JOYDDR |= _BV(JOYDOWN)) : (JOYDDR &= ~_BV(JOYDOWN));*/
|
|
||||||
|
|
||||||
(button & 001) ? pinMode(LBTN, OUTPUT) : pinMode(LBTN, INPUT);
|
(button & 001) ? pinMode(LBTN, OUTPUT) : pinMode(LBTN, INPUT);
|
||||||
(button & 002) ? pinMode(RBTN, OUTPUT) : pinMode(RBTN, INPUT);
|
(button & 002) ? pinMode(RBTN, OUTPUT) : pinMode(RBTN, INPUT);
|
||||||
|
|
||||||
|
|
||||||
// scale should be 2x here, but for this particular chip, 66 counts work better where
|
// scale should be 2x here, but for this particular chip, 66 counts work better where
|
||||||
// 64 counds should be. so 66/64=100/96 and times two
|
// 64 counds should be. so 66/64=100/96 and times two
|
||||||
//a = (OCR_ZERO + potmouse_xcounter*200/96)*2; // "*2" because 16MHz, not 8MHz //yli
|
//a = 320*2 + ((uint32_t)potmouse_xcounter)*200/fix;
|
||||||
//b = (OCR_ZERO + potmouse_ycounter*200/96)*2; // "*2" because 16MHz, not 8MHz
|
//b = 320*2 + ((uint32_t)potmouse_ycounter)*200/fix;
|
||||||
//a = OCR_ZERO + potmouse_xcounter*2; // "*2" because 16MHz, not 8MHz
|
//a = 320*200/fix + potmouse_xcounter*2;
|
||||||
//b = OCR_ZERO + potmouse_ycounter*2; // "*2" because 16MHz, not 8MHz
|
//b = 320*200/fix + potmouse_ycounter*2;
|
||||||
//a = (OCR_ZERO + potmouse_xcounter*200/90)*2; // "*2" because 16MHz, not 8MHz
|
a = 320*2 + potmouse_xcounter*2;
|
||||||
//b = (OCR_ZERO + potmouse_ycounter*200/90)*2; // "*2" because 16MHz, not 8MHz
|
b = 320*2 + potmouse_ycounter*2;
|
||||||
//a = OCR_ZERO*2 + potmouse_xcounter*400/85; // "*2" because 16MHz, not 8MHz
|
|
||||||
//b = OCR_ZERO*2 + potmouse_ycounter*400/85; // "*2" because 16MHz, not 8MHz
|
|
||||||
//a = OCR_ZERO*2 + potmouse_xcounter*400/80; // "*2" because 16MHz, not 8MHz //ali
|
|
||||||
//b = OCR_ZERO*2 + potmouse_ycounter*400/80; // "*2" because 16MHz, not 8MHz
|
|
||||||
//a = OCR_ZERO*2 + potmouse_xcounter*400/93; // "*2" because 16MHz, not 8MHz //vois olla lähellä
|
|
||||||
//b = OCR_ZERO*2 + potmouse_ycounter*400/93; // "*2" because 16MHz, not 8MHz
|
|
||||||
//a = OCR_ZERO*2 + potmouse_xcounter*400/91; // "*2" because 16MHz, not 8MHz //vois olla lähellä
|
|
||||||
//b = OCR_ZERO*2 + potmouse_ycounter*400/91; // "*2" because 16MHz, not 8MHz
|
|
||||||
//a = OCR_ZERO*2-1 + potmouse_xcounter*400/94; // "*2" because 16MHz, not 8MHz
|
|
||||||
//b = OCR_ZERO*2-1 + potmouse_ycounter*400/94; // "*2" because 16MHz, not 8MHz
|
|
||||||
//a = OCR_ZERO*2-2 + potmouse_xcounter*400/92; // "*2" because 16MHz, not 8MHz
|
|
||||||
//b = OCR_ZERO*2-2 + potmouse_ycounter*400/92; // "*2" because 16MHz, not 8MHz
|
|
||||||
//a = OCR_ZERO*2+2 + potmouse_xcounter*400/92; // "*2" because 16MHz, not 8MHz //valuu vasemmalle alas
|
|
||||||
//b = OCR_ZERO*2+2 + potmouse_ycounter*400/92; // "*2" because 16MHz, not 8MHz
|
|
||||||
|
|
||||||
//a = OCR_ZERO*2 + potmouse_xcounter*400/fix; // "*2" because 16MHz, not 8MHz
|
|
||||||
//b = OCR_ZERO*2 + potmouse_ycounter*400/fix; // "*2" because 16MHz, not 8MHz
|
|
||||||
|
|
||||||
//a = OCR_ZERO*2-20 + potmouse_xcounter*400/fix; // "*2" because 16MHz, not 8MHz
|
|
||||||
//b = OCR_ZERO*2-20 + potmouse_ycounter*400/fix; // "*2" because 16MHz, not 8MHz
|
|
||||||
|
|
||||||
a = OCR_ZERO*2 + potmouse_xcounter*400/92; // "*2" because 16MHz, not 8MHz
|
|
||||||
b = OCR_ZERO*2 + potmouse_ycounter*400/92; // "*2" because 16MHz, not 8MHz
|
|
||||||
|
|
||||||
ocr1a_load = a;
|
ocr1a_load = a;
|
||||||
ocr1b_load = b;
|
ocr1b_load = b;
|
||||||
break;
|
|
||||||
case POTMOUSE_JOYSTICK:
|
|
||||||
/*JOYDDR &= ~(_BV(JOYFIRE) | _BV(JOYUP) | _BV(JOYDOWN) | _BV(JOYLEFT) | _BV(JOYRIGHT));
|
|
||||||
|
|
||||||
(dx < 0) ? (JOYDDR |= _BV(JOYLEFT)) : (JOYDDR &= ~_BV(JOYLEFT));
|
|
||||||
(dx > 0) ? (JOYDDR |= _BV(JOYRIGHT)): (JOYDDR &= ~_BV(JOYRIGHT));
|
|
||||||
(dy < 0) ? (JOYDDR |= _BV(JOYDOWN)) : (JOYDDR &= ~_BV(JOYDOWN));
|
|
||||||
(dy > 0) ? (JOYDDR |= _BV(JOYUP)) : (JOYDDR &= ~_BV(JOYUP));
|
|
||||||
(button & 001) ? (JOYDDR |= _BV(JOYFIRE)) : (JOYDDR &= ~_BV(JOYFIRE));
|
|
||||||
(button & 002) ? (POTDDR |= _BV(POTX)) : (POTDDR &= ~_BV(POTX));
|
|
||||||
|
|
||||||
TCNT1 = 65535-256;
|
|
||||||
TCCR1A = 0;
|
|
||||||
TCCR1B = _BV(CS12)|_BV(CS10);
|
|
||||||
TIFR |= _BV(TOV1);
|
|
||||||
TIMSK |= _BV(TOIE1);*/
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// SID measuring cycle detected.
|
inline void startTimers() {
|
||||||
///
|
|
||||||
/// 1. SID pulls POTX low\n
|
|
||||||
/// 2. SID waits 256 cycles us\n
|
|
||||||
/// 3. SID releases POTX\n
|
|
||||||
/// 4. 0 to 255 cycles until the cap is charged\n
|
|
||||||
///
|
|
||||||
/// This handler stops the Timer1, clears OC1A/OC1B outputs,
|
|
||||||
/// loads the timer with values precalculated in potmouse_movt()
|
|
||||||
/// and starts the timer.
|
|
||||||
///
|
|
||||||
/// OC1A/OC1B (YPOT/XPOT) lines will go up by hardware.
|
|
||||||
/// Normal SID cycle is 512us. Timer will overflow not before 65535us.
|
|
||||||
/// Next cycle will begin before that so there's no need to stop the timer.
|
|
||||||
/// Output compare match interrupts are thus not used.
|
|
||||||
|
|
||||||
void potSenseInt() {
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Serial.println("PotSenseInt"); Serial.flush();
|
Serial.println("startTimers"); Serial.flush();
|
||||||
#endif
|
#endif
|
||||||
// SID started to measure the pots, uuu
|
cli();
|
||||||
|
|
||||||
// disable INT1 until the measurement cycle is complete
|
// Prepare TIMER1
|
||||||
// stop the timer
|
//TCCR1A = 0;
|
||||||
TCCR1B = 0;
|
|
||||||
|
|
||||||
// clear OC1A/OC1B:
|
// ICIE1: Timer/Counter Input Capture Interrupt Enable, ISR(TIMER1_CAPT_vect)
|
||||||
|
// TOIE1: Timer/Counter Overflow Interrupt Enable
|
||||||
|
TIMSK1 = _BV(ICIE1); // ICIE1: Timer/Counter1, Input Capture Interrupt Enable
|
||||||
|
|
||||||
|
// Start timer1, Input Capture setup
|
||||||
|
// ICNC1: Input Capture Noise Canceller (Bit 7 of register TCCR1B)
|
||||||
|
// ICES1: Input Capture Edge Select (Bit 6 of register TCCR1B) 0 = FALLING, 1 = RISING
|
||||||
|
// CS12, CS11, CS10: Set prescaler (CS11 TIMER1: F_CPU/8)
|
||||||
|
TCCR1B = _BV(ICNC1) | _BV(CS11);
|
||||||
|
//TCCR1B = _BV(CS11);
|
||||||
|
|
||||||
|
TIFR1 = 0xff; // Clear all pending TIMER1 interrupt flags
|
||||||
|
|
||||||
|
sei();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ISR(TIMER1_CAPT_vect) {
|
||||||
|
// Now we little after start of SID reading process
|
||||||
|
// SID trigger pulse timer value is in ICR1
|
||||||
|
|
||||||
|
uint16_t a = ICR1;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
Serial.println("TIMER1_CAPT_vect:");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef USBHOST
|
||||||
|
counter++;
|
||||||
|
counter &= 63;
|
||||||
|
if (counter == 0) upd = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// clear OC1A/OC1B (9 and 10 to LOW):
|
||||||
// 1. set output compare to clear OC1A/OC1B ("10" in table 37 on page 97)
|
// 1. set output compare to clear OC1A/OC1B ("10" in table 37 on page 97)
|
||||||
TCCR1A = _BV(COM1A1) | _BV(COM1B1);
|
TCCR1A = _BV(COM1A1) | _BV(COM1B1); // Clear OC1A / OC1B on Compare Match (Set output to low level).
|
||||||
// 2. force output compare to make it happen
|
// 2. force output compare to make it happen (doesn't raise interrupts)
|
||||||
TCCR1C |= _BV(FOC1A) | _BV(FOC1B);
|
TCCR1C |= _BV(FOC1A) | _BV(FOC1B); // FOC1A / FOC1B Force Output Compare A and B (that are in register TCCR1C)
|
||||||
|
|
||||||
|
// OCIE1A: Timer/Counter Output Compare Match Interrupt Enable A, ISR(TIMER1_COMPA_vect) // disable ICIE1, Input Capture Interrupt
|
||||||
|
TIMSK1 = _BV(OCIE1A);
|
||||||
|
|
||||||
|
// init the output compare values
|
||||||
|
OCR1A = ocr1a_load + a;
|
||||||
|
OCR1B = ocr1b_load + a;
|
||||||
|
|
||||||
// Set OC1A/OC1B on Compare Match (Set output to high level)
|
// Set OC1A/OC1B on Compare Match (Set output to high level)
|
||||||
// WGM13:0 = 00, normal mode: count from BOTTOM to MAX
|
// WGM13:0 = 00, normal mode: count from BOTTOM to MAX
|
||||||
TCCR1A = _BV(COM1A1) | _BV(COM1A0) | _BV(COM1B1) | _BV(COM1B0);
|
TCCR1A = _BV(COM1A1) | _BV(COM1A0) | _BV(COM1B1) | _BV(COM1B0); // Set OC1A / OC1B on Compare Match (Set output to high level).
|
||||||
|
|
||||||
// load the timer
|
#ifdef DEBUG
|
||||||
TCNT1 = 0;
|
Serial.print(c); Serial.print(" "); Serial.print(a); Serial.print(" "); Serial.println(b);
|
||||||
|
Serial.flush();
|
||||||
// init the output compare values
|
#endif
|
||||||
OCR1A = ocr1a_load;
|
|
||||||
OCR1B = ocr1b_load;
|
|
||||||
|
|
||||||
// start timer with prescaler clk/8 (1 count = 1us) // (with 16MHz, 1 count = 0.5us)
|
|
||||||
TCCR1B = _BV(CS11);
|
|
||||||
|
|
||||||
// TEST!!!
|
|
||||||
//TCCR1B = _BV(CS12) | _BV(CS10); // Prescaler clock/1024
|
|
||||||
|
|
||||||
//TEST!!!:
|
|
||||||
/*OCR1A = 15625*2; // 16 000 000 / 1024 / 15625 = 1s
|
|
||||||
OCR1B = 15625/2;
|
|
||||||
TCCR1B = _BV(CS12) | _BV(CS10); // Prescaler clock/1024*/
|
|
||||||
|
|
||||||
|
TIFR1 = 0xff; //clear all timer1 interrupt flags
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
ISR(TIMER1_COMPA_vect) {
|
||||||
/// TIMER1 Overflow vector
|
// now potx are sent. we don't know if poty is still in progress.
|
||||||
///
|
// POTX is HIGH from OC1A TIMER1 compare match. POTY is ?.
|
||||||
/// Ends joystick emulator pulse.
|
|
||||||
ISR(TIMER1_OVF_vect) {
|
|
||||||
//JOYDDR &= ~(_BV(JOYFIRE) | _BV(JOYUP) | _BV(JOYDOWN) | _BV(JOYLEFT) | _BV(JOYRIGHT));
|
|
||||||
//POTDDR &= ~_BV(POTX);
|
|
||||||
TIMSK1 &= ~_BV(TOIE1);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
Serial.println("TIMER1_COMPA_vect"); Serial.flush();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TIMSK1 = _BV(ICIE1); // ICIE1: Timer/Counter1, Input Capture Interrupt Enable // disable TIMER1 interrupts (Compare Match Interrupt A)
|
||||||
|
TIFR1 = 0xff; //clear all timer1 interrupt flags
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user