Velocità timer.

Settando i timer a mano arrivano alla velocità del cristallo ?

Domanda che non ha molto senso in quanto il clock in ingresso ai Timer è quello dell'oscillatore in uso, quarzo, rc o esterno.

Quindi se metto OCR1A = 1 ho ISR(TIMER1_COMPA_vect) ogni 0,0000000625 s ?
Se mi serve ogni 0,94 us metto OCR1A = 15 ?

:sweat_smile:

@ Faccina: dai un'occhiata QUI ... la parte "calcoli con i Timer" è completamente "free" :wink:

Guglielmo

gpb01:
@ Faccina: dai un'occhiata QUI ... la parte "calcoli con i Timer" è completamente "free" :wink:

Guglielmo

Grazie ma se metto 0.94 mi segna prescaler 1 con TCNTx 65520
65536 - 65520 = 16
e 16 mhz / 16 fa 1 mhz preciso
(ma si conta da 0..65535 quindi 65536 o 65535 ?)

a me serve da 0.94 us -> Hz 1.063.829,7872340425531914893617021
cmq con 15 sarebbe 1.066.666,6666666666666666666666667
quindi con un errore di Hz 2.836,8794306236666666666666666667

:sweat_smile:

Il valore che ti da è IL MIGLIORE ottenibile ... non tutti i valori sono possibili inoltre considera che anche i 16MHz di clock ... non è che siano il massimo della stabilità :smiling_imp: quindi ... NON contare su temporizzazioni esatte.

Se ti servono valori con notevole precisione, devi utilizzare un oscillatore esterno (... oltre tutto anche fatto molto bene), che sia termo-stabilizzato, alimentato con un'alimentazione estremamente stabile, ecc. ecc.

Guglielmo

gpb01:
Il valore che ti da è IL MIGLIORE ottenibile ... non tutti i valori sono possibili inoltre considera che anche i 16MHz di clock ... non è che siano il massimo della stabilità :smiling_imp: quindi ... NON contare su temporizzazioni esatte.

Se ti servono valori con notevole precisione, devi utilizzare un oscillatore esterno (... oltre tutto anche fatto molto bene), che sia termo-stabilizzato, alimentato con un'alimentazione estremamente stabile, ecc. ecc.

Guglielmo

Sto provando ad uscire sulla vga tutto lo schermo con un singolo colore, ho provato delle librerie già fatte e funzionano, ora stavo provando da 0... Non mi si sincronizza lo schermo, esce dalla modalità idle ma rimane tutto nero, sbaglio sicuramente coi timings ma non ho un oscilloscopio per controllare :slightly_frowning_face:

#define nop __asm__("nop\n\t"); 

void setup()
{
  // set pins 8..13 as output...
  DDRB  = B00000111;  
  PORTB = B00000011;   // 10 rgb 9 vsync 8 hsync
}

void linea()
{
  // HSYNC low
  PORTB ^= B00000001; // HSYNC
  // pausa 3.77 us
  delayMicroseconds(3);
  nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;
  nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;
  nop;nop;
  // HSYNC high
  PORTB ^= B00000001; // HSYNC
  // pusa 1.89 us
  delayMicroseconds(1);
  nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;
  nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;
  nop;nop;nop;nop;
  // RGB high
  PORTB ^= B00000100; // RGB
  // pausa 25.17 us
  delayMicroseconds(25);
  nop;nop;
  // RGB low ( qui ci sarebbe da clokkare i 640 px)
  PORTB ^= B00000100; // RGB
  // pausa 0.94 us
  nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;
  nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;
  nop;nop;nop;nop;nop;
  // ???
}

void loop()
{  
  // VSYNC low
  PORTB ^= B00000010; // VSYNC
  // pausa 64 us  
  delayMicroseconds(64);
  // VSYNC high
  PORTB ^= B00000010; // VSYNC
  // pausa 1.02 ms  
  delayMicroseconds(1020);
  // loppare linea 480 volte
  for (int i = 0; i < 480; i++)
  {
    linea();
  }
  // pausa 0.35 ms  
  delayMicroseconds(350);
}

Faccina:
... non ho un oscilloscopio per controllare :slightly_frowning_face:

... la vedo dura fare certe cose senza un minimo di strumentazione di base per chi si addentra in certi settori ... :roll_eyes: :roll_eyes: :roll_eyes:

Guglielmo