Offline
Sr. Member
Karma: 2
Posts: 466
|
 |
« Reply #75 on: January 09, 2013, 02:23:18 pm » |
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..
|
|
|
|
|
Logged
|
|
|
|
|
Montebelluna
Offline
Newbie
Karma: 0
Posts: 21
|
 |
« Reply #76 on: January 09, 2013, 03:21:42 pm » |
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 (;;) {}; }
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
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16485
Don't know what I do
|
 |
« Reply #77 on: January 09, 2013, 04:12:22 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10279
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #78 on: January 09, 2013, 04:14:21 pm » |
Ma ora sembrerebbe che non vada il timer 0, io non ci capisco più nulla da qualche ora, ora meno che meno 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16485
Don't know what I do
|
 |
« Reply #79 on: January 09, 2013, 04:15:07 pm » |
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à.
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16485
Don't know what I do
|
 |
« Reply #80 on: January 09, 2013, 04:17:14 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16485
Don't know what I do
|
 |
« Reply #81 on: January 09, 2013, 04:18:14 pm » |
Ma ora sembrerebbe che non vada il timer 0, io non ci capisco più nulla da qualche ora, ora meno che meno  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
|
|
|
|
|
Logged
|
|
|
|
|
Montebelluna
Offline
Newbie
Karma: 0
Posts: 21
|
 |
« Reply #82 on: January 09, 2013, 04:24:34 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16485
Don't know what I do
|
 |
« Reply #83 on: January 09, 2013, 04:39:28 pm » |
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)?
|
|
|
|
|
Logged
|
|
|
|
|
Montebelluna
Offline
Newbie
Karma: 0
Posts: 21
|
 |
« Reply #84 on: January 09, 2013, 05:46:15 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16485
Don't know what I do
|
 |
« Reply #85 on: January 10, 2013, 12:32:39 am » |
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); }
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10279
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #86 on: January 10, 2013, 03:56:59 am » |
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?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16485
Don't know what I do
|
 |
« Reply #87 on: January 10, 2013, 04:30:00 am » |
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ì.
|
|
|
|
|
Logged
|
|
|
|
|
Montebelluna
Offline
Newbie
Karma: 0
Posts: 21
|
 |
« Reply #88 on: January 10, 2013, 02:15:56 pm » |
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
|
|
|
|
« Last Edit: January 10, 2013, 02:18:17 pm by garide »
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10279
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #89 on: January 10, 2013, 02:20:55 pm » |
quindi ora ti funzionano entrambi i LED sui due pin?
|
|
|
|
|
Logged
|
|
|
|
|
|