]> git.defcon.no Git - avrfbosd/commitdiff
Timer-code. This works fine with my video-grabber. My LCD struggles, but that may...
authorJon Langseth <jon.langseth@lilug.no>
Sun, 22 Jul 2012 11:51:12 +0000 (13:51 +0200)
committerJon Langseth <jon.langseth@lilug.no>
Sun, 22 Jul 2012 11:51:12 +0000 (13:51 +0200)
syncgen/main.c

index 8ad9cb339f0e8dd686fabcbc9bdf323bec843121..e67d582bd0b1a1f15259934e26d1604af55f6846 100644 (file)
@@ -5,17 +5,17 @@
 #define ZERO  PORTB &= 0xFC
 #define BLACK PORTB |= 0x01
 
-//       -----..-----   ^
-//      |            |  |
-//     -| RST    VCC |-`
-//      |            |
-//   .--| X1     PB2 |-
-//  [ ] |            |  470R
-//   '--| X2     PB1 |--^v^v-.
-//      |            |       |----> VidOut
-//   .--| GND    PB0 |--^v^v-'
-//   |  |            |  1kR
-//-----  ------------
+//          -----..-----   ^
+//          | ___        |  |
+// Com RST -| RST    VCC |-`
+//          |            |
+// MegaClk -| CLKI  ADC1 |---< VidDetect
+//          |            |  470R
+// VSwithc -| PB4    PB1 |--^v^v-.
+//          |            |       |----> VidOut
+//       .--| GND    PB0 |--^v^v-'
+//       |  |            |  1kR
+//      ---  ------------
 
 #include "avrosdlogo.h"
 
@@ -82,7 +82,7 @@ void asm_render_line( void ) {
 
 void hsync(void)
 { 
-       line++;
+       line++; // Bumping the line-counter as part of hsync gives just the right front-porch ;D
        ZERO; _delay_us(4); // sync
        BLACK; _delay_us(8);  // Back porch
 }
@@ -94,38 +94,31 @@ void vsync(uint8_t odd_even)
 
        // Pre-equalization pulses
        b = odd_even ? 6 : 5;
-       for(a=0; a<b ; a++) // 6x short sync
+       for(a=0; a<b ; a++) // short sync
        {
                ZERO;
                _delay_us(2);
-
                BLACK;
                _delay_us(30);
-
        }
 
        // VSYNC
-       for(a=0; a<5 ; a++) // 5x long sync
+       for(a=0; a<5 ; a++) // long sync
        {
-
                ZERO;
                _delay_us(30);
-
                BLACK;
                _delay_us(2);
-
        }
 
        // Post-equalization pulses
        b = odd_even ? 5 : 4;
-       for(a=0; a<b ; a++) // 5x short sync
+       for(a=0; a<b ; a++) // short sync
        {
                ZERO;
                _delay_us(2);
-
                BLACK;
                _delay_us(30);
-
        }
        line = odd_even ? 5 : 317;
        renderLine = 0;
@@ -135,23 +128,27 @@ void vsync(uint8_t odd_even)
 
 ISR (TIMER0_COMPA_vect) 
 {
-       if(line == 310) vsync(0);
-       else if(line == 622) vsync(1);
-       else
+       if(line == 310) vsync(0); // End of ODD fields, start vsync'ing
+       else if(line == 622) vsync(1); // End of EVEN, start vsync'ing
+       else // In frame. Generate a hsync pulse, then do some drawing :)
        {
                hsync();
-               int t_line = line;
+
+               int t_line = line; // Reducing line-count complexity by half ;)
                t_line = ( line > 312 ) ? line - 312 : line;
 
+               // Draw the logo-image centered vertically
                if ( t_line > 118 && t_line < 118 + (2*testimg_height) )
                {
                        _delay_us(12);
                        asm_render_line();
 
+                       // Stretch the image vertically by repeating the same line twice
                        if( !stretch )
                        {
                                stretch = 1;
                                renderLine += hres;
+                               // Make sure we don't draw anything from RAM after the end of the image
                                if ( renderLine > ((testimg_height*hres)-1) ) renderLine = 0;
                        } else stretch--;
                }
@@ -159,13 +156,17 @@ ISR (TIMER0_COMPA_vect)
        return;
 }
 
-/*
-ISR (INT0_vect) 
+ISR (TIMER1_OVF_vect) 
 {
-       //PORTB ^= 0x10;
+       // If this interrupt-vector is run, Timer1 has overflowed, and that means
+       // we have not seen any signal of significant level for quite a while.
+       // This means Sync-generation is needed...
+
+       // Make sure sync-gen is running...
+       TIMSK |= (1<<OCIE0A); // Enable compare-mach-a interrupt for Timer0
+       // Open up the switch blocking attiny-generated video:
        PORTB |= 0x10;
 }
-*/
 
 int main(void)
 {  
@@ -192,6 +193,10 @@ int main(void)
        ADCSRA |= (1 << ADPS2)|(1 << ADPS1)|(0<<ADPS0); // set prescaler to 64
        DIDR0 |= (1<<ADC1D);   // Disable logic input for PB2
 
+       TCCR1 |= (1<<CS13)|(0<<CS12)|(0<<CS11)|(1<<CS10); // Prescale Timer1 to CK/256
+       // CK/32 @ 20MHz gives 0.05us*256*256 = 3276.8us per Overflow, or 51 lines.
+       TIMSK |= (1<<TOIE1); // Enable Timer Overflow interrupts for Timer1
+
        sei(); // We are ready to fire interrupts.
 
        // Here, we continue to do nothing...
@@ -204,23 +209,18 @@ int main(void)
                        // greater than some minimal value on ADC1/PB2.
                        // This approach requires a weak pulldown on the relevant
                        // video input to the circuit, but it beats not detecting anything.
-                       if (ADCH > 10)
+                       // 255/50*4=20, thus 0.4V
+                       if (ADCH > 20)
                        {
-                               // Dummy code. 
-                               // This needs to be replaced with something that triggers a timer ...
-                               /// Simply indicate on PB4 that we are seeing somethin.
-                               PORTB |= 0x10;
+                               // Make sure any signal generated by us does not leak back
+                               PORTB &= 0xEF; // Switch OFF VOut-switch for ATtiny
                                // The next statement stops sync-generation, thus also image-generation..
                                TIMSK &= ~(1<<OCIE0A); // Enable compare-mach-a interrupt
+                               // Reset Timer1 so we don't generate a TOVF..
+                               TCNT1 = 0;
                        }
-                       else
-                       {
-                               // Dummy code. Simply indicate on PB4 that we are below the threshold.
-                               PORTB &= 0xEF;
-
-                               // Make sure sync-gen is running...
-                               TIMSK |= (1<<OCIE0A); // Enable compare-mach-a interrupt
-                       }
+                       // If we did not see a signal above the treshold, TCNT1 will continue
+                       // to count up, until a TOV1 interrupt is generated.
                }
        };
 }