Go Down

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

Michele Menniti

Mi sono spiegato male, ho sbagliato riferimento....TUTTE le prove fatte fin qui domostrano che:
- il Timer 0 funziona (tutti i test blink OK)
- gli altri timer, o almeno il Timer 1, sembrano non funzionare

Ti chiedevo di modificare il mio codice per far funzionare il pwm del timer 0, meglio ancora un minimini-sketch in cui si possano provare alternativamente i due timer:
step a: blink 0 (sul pin pwm del timer 0)
step b: blink 1 (sul pin pwm del timer 1)
step c: 38KHz sullo stesso pin pwm dello step a
step d: 38KHz sullo stesso pin pwm dello step b
(in realtà così facciamo tre test sul timer 0 ed uno solo sul timer 1, ma va benissimo così, è il riepilogo di quanto fatto finora)
così tagliamo la testa al toro..... :)
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


Mi sono spiegato male, ho sbagliato riferimento....TUTTE le prove fatte fin qui domostrano che:
- il Timer 0 funziona (tutti i test blink OK)
- gli altri timer, o almeno il Timer 1, sembrano non funzionare

E' stato fatto un semplice analogWrite(10, 128) per vedere se si riesce a dimmerare un LED sul pin 10?
Se così no va, allora o la sua scheda è buggata oppure c'è qualcosa che non va nel core di Arduino. Ma pensare che il core sia difettoso mi pare strano perché nessuno ha mai usato un PWM sulla Mega?

Quote

Ti chiedevo di modificare il mio codice per far funzionare il pwm del timer 0, meglio ancora un minimini-sketch in cui si possano provare alternativamente i due timer:
step a: blink 0 (sul pin pwm del timer 0)
step b: blink 1 (sul pin pwm del timer 1)
step c: 38KHz sullo stesso pin pwm dello step a
step d: 38KHz sullo stesso pin pwm dello step b
(in realtà così facciamo tre test sul timer 0 ed uno solo sul timer 1, ma va benissimo così, è il riepilogo di quanto fatto finora)
così tagliamo la testa al toro..... :)


Il codice a cui ho pensato è questo (non testato perché non ho una scheda MEGA sottomano, e sono a lavoro):
Code: [Select]

void setup() {               
}

void loop() {
    fadeLed(11);
    fadeLed(13);
    setTimer1();
    delay(10000);
    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);
}


Fa il blink sul pin 11 (timer 1); poi fa il blink sul pin 13 (timer 0);
poi dovrebbe fare i 38 kHz per 10" sul pin 11 e poi i 38 kHz sul pin 13 (per sempre).

Ho invertito i test perché toccando il timer 0 poi saltano i delay, quindi i 38 kHz sul timer 0 li ho messi alla fine. Uso i canali A di entrambi i

Michele Menniti

il Maestro sei tu, quindi ovviamente si fa come dici :)
l'analogWrite non è stato fatto e vedo che lo hai previsto, penso che da questa prova avremo finalmente il quadro chiaro.
Me esiste un modo per "disabilitare" i timer di un micro, che tu sappia?
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

garide

Un grazie a tutti per il proseguo della discussione, sono stato fuori tutto il mattino a clienti e leggo solo ora le vostre risposte.

Adesso mangio e dopo provo quanto scritto.

Ieri sera ho avuto un segnale positivo con il led ir sul pin 9 con lo sketch iresenddemo.
Non ho avuto tempo di fare delle controprove, non vorrei che sul MEGA il pin di default PWM sia il 9 e nn il 3

Comunque dopo vi faccio sapere il risultato delle prove

leo72


Non ho avuto tempo di fare delle controprove, non vorrei che sul MEGA il pin di default PWM sia il 9 e nn il 3


I pin PWM sono già tutti preimpostati dal core di Arduino per cui un analogWrite deve funzionare sempre e comunque.

Questa sotto è la piedinatura della MEGA2560
http://arduino.cc/en/uploads/Hacking/PinMap2560.png

Michele Menniti

Nell'ultimo sketch di Leo DEVI usare i pin 11 e 13 contemporaneamente, montando due LED (anche normali: rossi, verdi, ....) con le relative R; poi esegui lo sketch e dicci che risultati hai ottenuto.
BUON APPETITO!
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

Sul pin 13 non servono né Led né resistenza, dovrebbe avere il led integrato come la UNO.

Michele Menniti


Sul pin 13 non servono né Led né resistenza, dovrebbe avere il led integrato come la UNO.

VERO, ma se mette l'infrarosso lo controlla comunque in "parallelo", ormai balliamo....
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

Speriamo solo che quei setup funzionino, li ho scritti senza poter provare nulla  :smiley-sweat:

garide

#69
Jan 09, 2013, 01:27 pm Last Edit: Jan 09, 2013, 02:01 pm by garide Reason: 1
allora cerco di riassumere e far chiarezza su cosa succede, ho fatto un bel po di prove solo con arduino senza shield :

Programma di IRsendDemo led IR su pin 9 funziona (led lampeggia) , il resto dei pin 1/2/3/4/5/6/7/8/10/11/12/13 (li ho provati tutti ) non funziona (nessun lampeggio)

Programma di leo72 led IR su pin 11 funziona(led lampeggia in modalita fade ), il pin 13 non funziona

Programma di leo72 led Normale Rosso su pin 11 e 13 non funziona ( nessun lampeggio), tranne in fase di caricamento che il 13 lampeggia come quello sulla skeda

Programma di Garide qui sotto led IR su pin 9 funziona, la stufa riceve il comando, si accende e spegne, il resto dei pin 1/2/3/4/5/6/7/8/10/11/12/13 (li ho provati tutti ) non funziona

Code: [Select]

#include <IRremote.h>
 
  IRsend led;
  unsigned int code[22] = {6750,2500,3350,1700,850,850,800,1700,1700,850,800,1700,850,850,850,1650,1700,850,1650,1700,1650};
  //           Raw (22): 14036 6750 -2500 3350 -1700 850 -850 800 -1700 1700 -850 800 -1700 850 -850 850 -1650 1700 -850 1650 -1700 1650
 
  void setup()
  {
  }
 
  void loop() {
   
      for (int i = 0; i < 3; i++) {
        led.sendRaw(code, 22,38);
        delay(100);
      }
   

  }


questo è quello che succede ....

domanda siccome sia il mio programma che quello de IRsendDemo non definisce il pin di OUTPUT, non è che il MEGA abbia come uscita principale il pin 9. leo72 ha gia risposto, ma non ho compreso l'affermazione fatta.... sono alle prime armi e non ci arrivo subito  :P

Michele Menniti

io non ci capisco più nulla, ora va tutto al rovescio, poi ti ci metti pure tu ad aggiungere decine di prove senza senso :smiley-sweat:
non so più che dire, spero che Leo ne tiri fuori info utili.
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

garide


io non ci capisco più nulla, ora va tutto al rovescio, poi ti ci metti pure tu ad aggiungere decine di prove senza senso :smiley-sweat:
non so più che dire, spero che Leo ne tiri fuori info utili.


Ciao, siamo in 2 ...   :~

sulle guide c'è scritto di collegare il led IR su pin3, ve bene che usavano la uno/2009.
Ci ho sbattuto sopra na settimana per capire come mai non funzionava .... per poi trovare che è solo sul pin 9 va tutto, e no lo sò perchè.

vediamo se Leo ci sa spiegare come mai..

leo72

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

Michele Menniti

Leo che fanno cli e sei? ricordo che ne avevi parlato una volta....
anche i 38khz del led 11 devono durare 10 secondi?
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

tonid

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

Go Up