]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
timer 3
authorJack Humbert <jack.humb@gmail.com>
Mon, 11 Jan 2016 22:52:35 +0000 (17:52 -0500)
committerJack Humbert <jack.humb@gmail.com>
Mon, 11 Jan 2016 22:52:35 +0000 (17:52 -0500)
quantum/beeps.c
tmk_core/common/avr/timer.c

index edcc84aca453204cd37f7d9425bd1ec7d128ac60..08b35abbd84474989f5c82054c9f4a063faaff03 100644 (file)
@@ -32,33 +32,9 @@ bool sliding = false;
 #define RANGE 1000
 volatile int i=0; //elements of the wave
 
-// uint8_t sine[128];
-// uint8_t tri[128];
-// uint8_t squ[128];
-// uint8_t* sine_start;
-// uint8_t* sine_end;
-// uint8_t* tri_start;
-// uint8_t* tri_end;
-
-// uint8_t* s_start;
-// uint8_t* s_end;
-// uint8_t* s_ptr;
-
-
-
-void beeps() {
-    play_notes();
-}
-
-void send_freq(double freq, int vol) {
-    int duty = (((double)F_CPU) / freq);
-    ICR3 = duty; // Set max to the period
-    OCR3A = duty >> (0x10 - vol); // Set compare to half the period
-}
-
 void stop_all_notes() {
     voices = 0;
-    TIMSK0 &= ~_BV(OCIE0A);
+    TIMSK3 &= ~_BV(OCIE3A);
     frequency = 0;
     volume = 0;
 
@@ -86,7 +62,7 @@ void stop_note(double freq) {
     if (voices < 0)
         voices = 0;
     if (voices == 0) {
-        TIMSK0 &= ~_BV(OCIE0A);
+        TIMSK3 &= ~_BV(OCIE3A);
         frequency = 0;
         volume = 0;
     } else {
@@ -106,7 +82,6 @@ void stop_note(double freq) {
             }
             sliding = false;
         }
-        // send_freq(freq, vol);
         frequency = freq;
         volume = vol;
     }
@@ -114,18 +89,6 @@ void stop_note(double freq) {
 
 void init_notes() {
 
-    // for(int i = 0; i < 128; i++) {
-    //     sine[i] = sin(i * PI / 64) * 128 + 128;
-    //     tri[i] = 256 - abs((i - 64) * 4);
-    // }
-    // sine_start = &sine;
-    // sine_end = &sine + 128;
-    // tri_start = &tri;
-    // tri_end = &tri + 128;
-
- // new
-
-
   PLLFRQ = _BV(PDIV2);
   PLLCSR = _BV(PLLE);
   while(!(PLLCSR & _BV(PLOCK)));
@@ -139,28 +102,6 @@ void init_notes() {
   /* Enable the OC4A output */
   DDRC |= _BV(PORTC6);
 
-
-
-       /* First disable the timer overflow interrupt while we're configuring */
-  // TIMSK0 &= ~(1<<TOIE0);
-  // /* Configure timer4 in normal mode (pure counting, no PWM etc.) */
-  // TCCR0A &= ~((1<<WGM01) | (1<<WGM00));
-  // TCCR0B &= ~(1<<WGM02);
-
-  // /* Disable Compare Match A interrupt enable (only want overflow) */
-  // TIMSK0 &= ~(1<<OCIE0A);
-  
-  // TCCR0B |= (1<<CS01); // Set bits
-  // TCCR0B &= ~(1<<CS00) | ~(1<<CS02);             // Clear bit
-   
-  // /* Save value globally for later reload in ISR */
-  // tcnt0 = 45 - 1; 
-
-  // /* Finally load end enable the timer */
-  // TCNT0 = tcnt0;
-  // TIMSK0 |= (1<<TOIE0);
-
 }
 
 int max = 0xFF;
@@ -168,28 +109,7 @@ float sum = 0;
 int value = 128;
 float place = 0;
 
-ISR(TIMER0_COMPA_vect) {
-
-
-
-    // value = *(sine_start+=(long)frequencies[0]);
-    // OCR4A = value;
-    // if (sine_start >= sine_end) {
-    //     sine_start = &sine[(sine_start - sine_end) % 128];
-    // }
-
-
-    // OCR4A = pgm_read_byte(sine_start);
-    // // sine_start = &sine[(sine_start - &sine[0] + (int)frequencies[0]) % 128];
-    // sine_start +=  (int)frequencies[0];
-    // if (sine_start >= sine_end) {
-    //     sine_start = &sine[(sine_start - sine_end) % 128];
-    // }
-    
-    // OCR4A = pgm_read_byte(s_ptr);
-    // s_ptr = s_start + (uint8_t)place;
-    // OCR4A = pgm_read_byte(s_ptr);
-
+ISR(TIMER3_COMPA_vect) {
 
     // SINE
     OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]);
@@ -217,24 +137,10 @@ ISR(TIMER0_COMPA_vect) {
 
 }
 
-
-ISR(TIMER0_COMPB_vect)
-{
-
-  /* Disable the interrupt */
-  TIMSK0 &= ~_BV(OCIE0B);
-
-}
-
 void play_note(double freq, int vol) {
 
     freq = freq / SAMPLE_RATE;
     if (freq > 0) {
-
-        // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (1 << WGM30);
-        // TCCR3B = (0 << WGM33) | (1 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30);
-
-      // TIMSK3 = 0x0;
         if (frequency != 0) {
             double starting_f = frequency;
             if (frequency < freq) {
@@ -247,59 +153,20 @@ void play_note(double freq, int vol) {
                 }
             }
         }
-        // send_freq(freq, vol);
         frequency = freq;
         volume = vol;
 
         frequencies[voices] = frequency;
         volumes[voices] = volume;
         voices++;
-        // position = 0;
-        // TCNT0 = 0;
     }
-    // ICR3 = 0xFFFF;
-    // for (int i = 0; i < 10000; i++) {
-    //     OCR3A = round((sin(i*freq)*.5)+.5)*0xFFFF;
-    //     // _delay_us(50);
-    // }
 
-    // TCCR3A = 0;
-    // TCCR3B = 0;
+    TIMSK3 &= ~_BV(OCIE3A);
 
+    TCCR3A = 0x0; 
+    TCCR3B = _BV(CS31) | _BV(WGM32);
+    OCR3A = SAMPLE_DIVIDER - 1;
 
-    TIMSK0 &= ~_BV(OCIE0A) | ~_BV(OCIE0B);
-
-    TCCR0A = _BV(WGM01); 
-    TCCR0B = _BV(CS01);
-    OCR0A = SAMPLE_DIVIDER - 1;  
-    OCR0B = 1;
-
-    TIMSK0 |= _BV(OCIE0A);
-    // sei();
-
-}
-
-// void note(int x, float length) {
-//     DDRC |= (1<<6);
-//     int t = (int)(440*pow(2,-x/12.0)); // starting note
-//     for (int y = 0; y < length*1000/t; y++) { // note length
-//         PORTC |= (1<<6);
-//         delay_us(t);
-//         PORTC &= ~(1<<6);
-//         delay_us(t);
-//     }
-//     PORTC &= ~(1<<6);
-// }
+    TIMSK3 |= _BV(OCIE3A);
 
-// void true_note(float x, float y, float length) {
-//     for (uint32_t i = 0; i < length * 50; i++) {
-//             uint32_t v = (uint32_t) (round(sin(PI*2*i*640000*pow(2, x/12.0))*.5+1 + sin(PI*2*i*640000*pow(2, y/12.0))*.5+1) / 2 * pow(2, 8)); 
-//             for (int u = 0; u < 8; u++) {
-//                     if (v & (1 << u) && !(PORTC&(1<<6)))
-//                     PORTC |= (1<<6);
-//                 else if (PORTC&(1<<6))
-//                     PORTC &= ~(1<<6);
-//             }
-//     }
-//     PORTC &= ~(1<<6);
-// }
\ No newline at end of file
+}
\ No newline at end of file
index 1a695a9aae123577914021ba6f7c4666826686e3..292b41c3a6c29fca9e4319114a0759473ea3e7e3 100644 (file)
@@ -29,24 +29,24 @@ volatile uint32_t timer_count = 0;
 void timer_init(void)
 {
     // Timer0 CTC mode
-    TCCR1A = 0x02;
+    TCCR0A = 0x02;
 
 #if TIMER_PRESCALER == 1
-    TCCR1B = 0x01;
+    TCCR0B = 0x01;
 #elif TIMER_PRESCALER == 8
-    TCCR1B = 0x02;
+    TCCR0B = 0x02;
 #elif TIMER_PRESCALER == 64
-    TCCR1B = 0x03;
+    TCCR0B = 0x03;
 #elif TIMER_PRESCALER == 256
-    TCCR1B = 0x04;
+    TCCR0B = 0x04;
 #elif TIMER_PRESCALER == 1024
-    TCCR1B = 0x05;
+    TCCR0B = 0x05;
 #else
 #   error "Timer prescaler value is NOT vaild."
 #endif
 
-    OCR1A = TIMER_RAW_TOP;
-    TIMSK1 = (1<<OCIE1A);
+    OCR0A = TIMER_RAW_TOP;
+    TIMSK0 = (1<<OCIE0A);
 }
 
 inline
@@ -111,7 +111,7 @@ uint32_t timer_elapsed32(uint32_t last)
 }
 
 // excecuted once per 1ms.(excess for just timer count?)
-ISR(TIMER1_COMPA_vect)
+ISR(TIMER0_COMPA_vect)
 {
     timer_count++;
 }