Go Down

Topic: Consiglio resistenze per due IR Led (Read 5403 times) previous topic - next topic

superzaffo

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...  ;)
Se riesco liberare il mio Mega avrei la curiosità di fare qualche prova anche io... vediamo questa sera se riesco..

garide


Il programmino che ho scritto aveva qualche bug.

Riprova questo, poi dimmi come va:
Code: [Select]

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 (;;) {};
}


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


leo72


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.

Michele Menniti

Ma ora sembrerebbe che non vada il timer 0, io non ci capisco più nulla da qualche ora, ora meno che meno :smiley-sad-blue:
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

leo72


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à.

leo72


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.

leo72


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

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

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



leo72


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):
Code: [Select]
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)?

garide

Quote from: leo72

Punto 2):
Code: [Select]
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

leo72

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?

Code: [Select]

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);
}

Michele Menniti

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?
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

leo72


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ì.


garide

#88
Jan 10, 2013, 08:15 pm Last Edit: Jan 10, 2013, 08:18 pm by garide Reason: 1


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ì.



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

Michele Menniti

quindi ora ti funzionano entrambi i LED sui due pin?
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Go Up