Consiglio resistenze per due IR Led

Leo che fanno cli e sei? ricordo che ne avevi parlato una volta....
anche i 38khz del led 11 devono durare 10 secondi?

Se non ricordo male con cli() si bloccano gli interrup e con sei() si riattivano

Esatto, io le uso normalmente per conteggi di certe frequenze tramite interrupt.
Probabilmente Leo li disabilita in modo che non creino in qualche modo qualche disturbo o perchè quei valori vanno settati a interrupt spenti.
Vediamo cosa scriverà Leo... :wink:
Se riesco liberare il mio Mega avrei la curiosità di fare qualche prova anche io... vediamo questa sera se riesco..

leo72:
Il programmino che ho scritto aveva qualche bug.

Riprova questo, poi dimmi come va:

void setup() {                

}

void loop() {
    fadeLed(11);
    fadeLed(13);
    setTimer1();
    delay(10000);
    pinMode(13, INPUT);
    setTimer0(); //da qui in poi muore perché il delay viene sballato
    for (;:wink: {};
}

void fadeLed(byte tempLed) {
    pinMode(tempLed, OUTPUT);
    for (byte tempJ = 0; tempJ < 4; tempJ++) {
        for (byte tempI = 0; tempI <=255; tempI++) {
            analogWrite(tempLed, tempI);
            delay(10);
        }
    }
    pinMode(tempLed, INPUT);
}

void setTimer1() {
//Phase Correct PWM con toggle su OCR1A
    cli();
    OCR1A = 105;
    TCCR1A = ((1<<WGM10) | (1<<WGM11) | (1<<COM1A0));
    TCCR1B = (1<<WGM13);
    sei();
    pinMode(11, OUTPUT);
}

void setTimer0() {
//Phase Correct PWM con toggle su OCR1A
    cli();
    OCR0A = 208;
    TCCR0A = ((1<<COM0A0) | (1<<WGM01) | (1<<WGM00));
    TCCR0B = ((1<<WGM02) | (1<<CS00));
    sei();
    pinMode(13, OUTPUT);
}




La sequenza dovrebbe essere:
1) fade sul led 11
2) fade sul led 13
3) 38 kHz sul led 13 per 10 secondi
4) 38 kHz sul led 11

ciao

questo sera ho provato il nuovo sketch, allora nel pin 11 sia con led normale che con il led IR avvine il lampeggio in modalita fedein,
mentre nel pin 13 entrambi i led non danno nessun sengale, aparte quelli che avvengono durante il caricamento.
comunque anche il led nella skeda è sempre spento una volta caricato il sketch rimane sempre spento

tonid:
Se non ricordo male con cli() si bloccano gli interrup e con sei() si riattivano

Sì, esatto.
Li ho messi per non manipolare direttamente il registro SREG per disattivare globalmente gli interrupt.

Ma ora sembrerebbe che non vada il timer 0, io non ci capisco più nulla da qualche ora, ora meno che meno :disappointed_relieved:

superzaffo:
Probabilmente Leo li disabilita in modo che non creino in qualche modo qualche disturbo o perchè quei valori vanno settati a interrupt spenti.

Quando si manipolano i timer non è cattiva abitudine quella di disattivare preventivamente gli interrupt, in modo da evitare che non si vada a modificare qualche registro del timer mentre è in corso una chiamata ad una ISR (che resetta alcuni flag e potrebbe anche modificare per proprio conto i registri) nonché per evitare che altri interrupt del micro blocchino l'operazione a metà.

garide:
questo sera ho provato il nuovo sketch, allora nel pin 11 sia con led normale che con il led IR avvine il lampeggio in modalita fedein,
mentre nel pin 13 entrambi i led non danno nessun sengale, aparte quelli che avvengono durante il caricamento.
comunque anche il led nella skeda è sempre spento una volta caricato il sketch rimane sempre spento

Ricapitoliamo, seguendo lo sketch:

  1. fade del led sul pin 11: OK
  2. fade del led sul pin 13: NEGATIVO
  3. 38 kHz sull pin 11: OK
  4. 38 kHz sul pin 13: NEGATIVO

E' giusto? Lo confermi? Perché da quello che hai scritto non ho capito se hai controllato i 38 kHz.

A me pare di aver usato i giusti pin. Il problema è che:

  1. non ho una MEGA (i test li ho fatti solo su una UNO)
  2. non ho un oscilloscopio per controllare l'effettiva frequenza in uscita sui pin

Quindi devo basarmi sui test che sta conducendo il nostro amico

neanch'io ho un oscilloscopio e quindi non riesco ha verificare la frequenza

  1. fade del led sul pin 11: OK
  2. fade del led sul pin 13: NEGATIVO

questo è quello che succede

garide:
neanch'io ho un oscilloscopio e quindi non riesco ha verificare la frequenza

  1. fade del led sul pin 11: OK
  2. fade del led sul pin 13: NEGATIVO

questo è quello che succede

Punto 2):

void setup() {}
void loop() {
  static byte tempFade = 0;
  analogWrite(13, tempFade);
  tempFade++;
  delay(10);
}

Che cosa ti fa questo sketch? Lo fa il fading sul led 13 (quello integrato basta oppure provane anche uno esterno)?

si così, si. sia in scheda che esterno

Bene, allora lo sketch che ho scritto per il fade nel precedente test è buggato. Appurato questo, attivando i 38 kHz, li vedi i led accesi oppure no?

void setup() {                
}

void loop() {
    setTimer1();
    delay(10000);
    pinMode(13, INPUT);
    setTimer0(); //da qui in poi muore perché il delay viene sballato
    for (;;) {};
}


void setTimer1() {
//Phase Correct PWM con toggle su OCR1A
    cli();
    OCR1A = 105;
    TCCR1A = ((1<<WGM10) | (1<<WGM11) | (1<<COM1A0));
    TCCR1B = (1<<WGM13);
    sei();
    pinMode(11, OUTPUT);
}

void setTimer0() {
//Phase Correct PWM con toggle su OCR1A
    cli();
    OCR0A = 208;
    TCCR0A = ((1<<COM0A0) | (1<<WGM01) | (1<<WGM00)); 
    TCCR0B = ((1<<WGM02) | (1<<CS00));
    sei();
    pinMode(13, OUTPUT);
}

Leo, eventualmente facciamo un passo inidetro, lasciamo da parte i 38KHz ed usiamo il "normale" analogWrite, ma il dubbio è: quale timer lo gestisce il comando? sempe lo stesso o dipende dal pin in uso?

L'analogWrite altro non fa che regolare il duty cicle del timer a cui il pin è agganciato. La regolazione dei timer viene fatta dal core prima dell'avvio dello sketch. Una volta impostati, i timer non vengono più modificati dall'Arduino.
Se io scrivo analogWrite(3, 128) sulla UNO, la funzione prima di tutto controlla se su quel pin c'è la funzionalità PWM, in caso affermativo estrae il numero di timer ed il canale corrispondente. Nel caso del pin D3, che corrisponde al pin PD1 dell'Atmega328, il core trova il canale B del timer 2, quindi OC2B. A questo punto regola semplicemente il registro OCR2B (comune ad entrambi) a 128 (questo regola il duty cicle), collega il pin al canale del timer (quindi OC2B) e tutto il gioco finisce lì.

leo72:

[quote author=Michele Menniti link=topic=133550.msg1065418#msg1065418 date=1357808219]
Leo, eventualmente facciamo un passo inidetro, lasciamo da parte i 38KHz ed usiamo il "normale" analogWrite, ma il dubbio è: quale timer lo gestisce il comando? sempe lo stesso o dipende dal pin in uso?

L'analogWrite altro non fa che regolare il duty cicle del timer a cui il pin è agganciato. La regolazione dei timer viene fatta dal core prima dell'avvio dello sketch. Una volta impostati, i timer non vengono più modificati dall'Arduino.
Se io scrivo analogWrite(3, 128) sulla UNO, la funzione prima di tutto controlla se su quel pin c'è la funzionalità PWM, in caso affermativo estrae il numero di timer ed il canale corrispondente. Nel caso del pin D3, che corrisponde al pin PD1 dell'Atmega328, il core trova il canale B del timer 2, quindi OC2B. A questo punto regola semplicemente il registro OCR2B (comune ad entrambi) a 128 (questo regola il duty cicle), collega il pin al canale del timer (quindi OC2B) e tutto il gioco finisce lì.

[/quote]

wow ragazzi .... guiro che di quello che vi siete detti non c'ho capito nulla .....
bè spero un giorno di ruiscir capirne qualcosa ...

ho provato l'ultimo sketch, anche il led 13 va in fade

quindi ora ti funzionano entrambi i LED sui due pin?

No con l'ultimo sketch sono il pin 13, cambia intensita di luminosita rimanendo sempre acceso.

il pin11 non lavora

ma nello sketch non e presente come fade

Ascolta, indipendentemente dall'uso timer, i pin PWM devono funzionare come PWM.Secondo il sito i pin PWM sulla MEGA sono:

PWM: 2 to 13 and 44 to 46. Provide 8-bit PWM output with the analogWrite() function

Quindi crea uno sketch come ti pare, un semplice for o quello che è, e provali tutti. Se con un banale analogWrite ti funzionano tutti, i pin sono a posto ed i timer sono utilizzabili. Se qualcuno non va, potresti avere la scheda danneggiata.