Pages: 1 [2] 3 4 ... 12   Go Down
Author Topic: Barriera Infrarossi  (Read 11375 times)
0 Members and 1 Guest are viewing this topic.
Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12678
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
1 - c'è una combinazione di tasti per far uscire le due parentesi graffe nell'editazione?
Usa la tastiera tedesca; li si arriva con
alt graph + 7 per {
alt graph + 0 per }  smiley-wink smiley-wink smiley-wink

La differnza tra sleep.h e Narcoleptic.h dovrebbe essere che Narcoleptic.h ha piú funzionalitá nel senso piú trigger di risveglio rispetto la sleep.h. Non avendo usata ne l' una ne l' altra non sono sicuro in questo.

Ciao Uwe
La tastiera tedesca?  smiley-sweat
Ho visto che la narcoleptic usa un comando che dovrebbe racchiudere un paio di comendi della sleep, comunque alla fine il risultato è quello, non ho grandi esigenze. Ora sto cercando di farlo addormentare il bimbo, ma non ne vuole sapere, eppure non è la prima volta, i miei nanetti a quest'ora dormono beati e non consumano nulla  smiley-wink
Logged


Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 335
Posts: 23123
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora con Linux basta fare "Alt-Gr" + "[", su qualunque tastiera  smiley-razz

@Mike:
1) con il 555 immagino non avrai problemi.
2) sì, in un interrupt nessuna funzione temporale di Arduino va perché delay, millis & co. è tutta agganciata al timer 0, a sua volta gestito da un interrupt. E dentro ad un interrupt, gli altri interrupt sono inibiti.
3) Tu scrivi:
Quote
il riferimento all'RTC era perché volevo capire come far uscire da un pin del micro una frequenza di riferimento di 38KHz, usando quindi il timer interno, ma non ho idea di come si possa fare.
Allora non ho capito io. Il segnale di clock lo vuoi spedire dal micro all'RTC o lo vuoi ricevere dall'RTC sul micro?
Nel secondo caso basta abilitare il segnale di clock esterno (variando i registri dell'RTC) però, come ti ho detto, max arrivi ad avere 32 kHz (che è la frequenza del clock usato dall'RTC). Peccato perché il PCF8563 ha anche un pin INT su cui esce un segnale di interrupt ogni qual volta un contatore interno si resetta. Molto utile per pilotare altri chip.
Logged


Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12678
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non, sono io che mi spiego malissimo:
Io ho bisogno di 38KHz per pilotare il LED infrarosso; volevo solo capire se invece del code HIGH/LOW che sto usando, posso farli generare al micro a partire dal timer interno; RTC esterni non ne sto usando e non mi servono.
Il vero problema è che se (ammesso che  smiley-roll-sweat) riesco a mandare a riposo il micro, automaticamente la frequenza generata, a prescindere dal metodo usato, si spegne e quindi si paralizza tutto.
Logged


Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 335
Posts: 23123
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dati di fatto, datasheet alla mano:
1)
in tutti e 3 gli sleep mode supportati il clock della CPU viene spento per cui il tuo codice non prosegue. Se non prosegue, non puoi generare il segnale usando il metodo che hai usato (ossia ciclo loop()).

2)
in nessuno dei 3 modi sleep supportati il modulo INT0 & PIN CHANGE va in standby.

Secondo me ne esci solo usando un generatore esterno per il segnale PWM e svegliando il micro tramite l'INT0 quando qualcosa succede sul sensore.

EDIT:
Non avevo letto questo:
Quote
7.1.1 Idle Mode
When the SM[1:0] bits are written to 00, the SLEEP instruction makes the MCU enter Idle mode,
stopping the CPU but allowing Analog Comparator, ADC, USI, Timer/Counter, Watchdog, and
the interrupt system to continue operating. This sleep mode basically halts clkCPU and clkFLASH,
while allowing the other clocks to run
Quindi in teoria un timer continuerebbe ad andare. E se va il timer, puoi usare quello agganciato all'INT0, seguendo l'esempio presente nel link che ti ho postato (ovviamente adattando il codice all'Attiny).

EDIT2:
uhm... però si ripresenterebbe il problema che in un interrupt non puoi usare la delay per generare i ritardi. Potresti forse inserisci una cascata di asm volatile ("NOP") per rallentare il programma: ogni NOP è 1 ciclo di clock. Però poi rallenteresti anche il tuo codice, quando il micro si risveglia...
Sicuro che non vuoi usare un 555?  smiley-grin
« Last Edit: July 24, 2011, 01:23:16 pm by leo72 » Logged


Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12678
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dati di fatto, datasheet alla mano:
1)
in tutti e 3 gli sleep mode supportati il clock della CPU viene spento per cui il tuo codice non prosegue. Se non prosegue, non puoi generare il segnale usando il metodo che hai usato (ossia ciclo loop()).

2)
in nessuno dei 3 modi sleep supportati il modulo INT0 & PIN CHANGE va in standby.

Secondo me ne esci solo usando un generatore esterno per il segnale PWM e svegliando il micro tramite l'INT0 quando qualcosa succede sul sensore.
Già, è quello che stavo provando. Ho messo il generatore di frequenze a 38KHz per pilotare il led, tutto il resto su Arduino e funziona, ora devo tarare lo sketch perché chiaramente ragionava in modo diverso.
Intanto lo faccio funzionare poi decido cosa fare realmente, l'idea iniziale era un'altra, non vorrei uscire "fuori tema".
Logged


Guidonia
Offline Offline
Full Member
***
Karma: 0
Posts: 214
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

grazie menniti e uwe
per le info che mi avete dato, gli sto dando una guardata (ma non è poi così semplice, l'inglese non è la mia seconda lingua smiley-razz).

Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12678
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
EDIT:
Non avevo letto questo:
Quote
7.1.1 Idle Mode
When the SM[1:0] bits are written to 00, the SLEEP instruction makes the MCU enter Idle mode,
stopping the CPU but allowing Analog Comparator, ADC, USI, Timer/Counter, Watchdog, and
the interrupt system to continue operating. This sleep mode basically halts clkCPU and clkFLASH,
while allowing the other clocks to run
Quindi in teoria un timer continuerebbe ad andare. E se va il timer, puoi usare quello agganciato all'INT0, seguendo l'esempio presente nel link che ti ho postato (ovviamente adattando il codice all'Attiny).
Aspetta, aspetta, io avevo visto nella tabella che l’idle mode non spegneva tutto, ma siccome mi fido ciecamente di Voi anglofoni….  smiley-twist
Il link che mi hai postato per me non significa nulla, ogni riga ci metto due ore a leggerla, se vuoi fare le cose per bene copincollami il code che ci sbatto un po’  smiley-sweat

Quote
EDIT2:
uhm... però si ripresenterebbe il problema che in un interrupt non puoi usare la delay per generare i ritardi. Potresti forse inserisci una cascata di asm volatile ("NOP") per rallentare il programma: ogni NOP è 1 ciclo di clock. Però poi rallenteresti anche il tuo codice, quando il micro si risveglia...
mi autoquoto
Quote
il Reference spiega   che lanciando una routine tramite interrupt i delay & Co & timer non funzionano, quindi ho aggirato il problema.
questo problema lo avevo risolto, usando una variabile “volatile int”, seguendo il Reference del comando attachInterrupt, infatti mi funzionava benissimo, ovviamente senza spegnere il micro.
Poiché ho letto che i pin interrupt non devono essere dichiarati e che possono svolgere la loro funzione anche se parallelamente sono settati come OUTPUT, a questo punto faccio uscire la frequenza da questo pin, imposto la modalità idle e lo uso come interrupt per risvegliare; ma non la vedo così facile la cosa….
Quote
Sicuro che non vuoi usare un 555?   
Con quello ovviamente è già tutto risolto, il problema è che questo vorrebbe essere uno schema didattico per il risparmio energetico, anche se in realtà sarà alimentato con un alimentatore esterno; il 555 non lo posso spegnere e continuerebbe a consumare corrente. La mia idea era di fare qualcosa come quella dei nanetti. Faccio queste ultime prove e poi me ne vado, sono scoppiato.
Logged


Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 335
Posts: 23123
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Stiamo dicendo la stessa cosa, ossia che la modalità "idle" non spenge tutte le funzioni del micro, difatti i timer e l'Int0 continuano ad andare.

Il link che ti ho postato linka ad una discussione in cui c'è a metà del codice di esempio... MA! è per l'Atmega168: andrebbe controllato se usando le librerie Tiny Core si riesce a compilarlo correttamente.
Sarebbe questo:
Quote
#include <avr/interrupt.h> 
#include <avr/io.h>

//Timer2 overflow interrupt vector handler, called (16,000,000/256)/256 times per second
ISR(TIMER2_OVF_vect) {
  //let 10 indicates interrupt fired
  digitalWrite(10,true);
}; 

void setup() {
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);

  //Timer2 Settings: Timer Prescaler /256, WGM mode 0
  TCCR2A = 0;
  TCCR2B = 1<<CS22 | 1<<CS21;

  //Timer2 Overflow Interrupt Enable 
  TIMSK2 = 1<<TOIE2;

  //reset timer
  TCNT2 = 0;

  //led 9 indicate ready
  digitalWrite(9,true);
}

void loop() {
}

Va provato, ripeto. Non so come vada. Va inoltre adattato perché come vedi usa pin non presenti sull'Attiny.
I pin di interrupt non li puoi dichiarare per il semplice motivo che sono fisicamente legati a particolari pin. Quindi devi per forza usare quelli.
Logged


MI
Offline Offline
Jr. Member
**
Karma: 0
Posts: 96
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


1 - c'è una combinazione di tasti per far uscire le due parentesi graffe nell'editazione?


io uso alt+123 per {
e alt+125 per }

abitudine presa a scuola quando programmavo in c++/c#

non sapevo invece degli altri 2 modi
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12678
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie pdor90, figlio di kmer65  smiley-lol, comunque ormai ho preso la mano con il consiglio di astrobeed, l'avro usato 100 volte stasera.

@ leo:
ho risolto continuando a seguire la strada che avevo iniziato, con le librerie, come giustamente dici tu, non si sa mai; lo so che dicevamo la stessa cosa, solo che io non ne ero sicuro e tu me l'hai detto dopo 3-4000 mila prove in cui davo per scontato che non si potesse  smiley-sweat
In pratica sto idle non spegne una pitocchia, infatti sono curioso di vedere quanto consumerà il tiny.
Con Arduino ho risolto così (grandi linee, sono troppo morto per farla lunga  smiley-eek-blue):
1 - Un pin digitale qualsiasi mi genera la frequenza
2 - Uno dei pin INT (col tiny ne avrò solo uno, ma ho sempre la libreria specifica che mi fa scegliere quale voglio usare) mi serve per il controllo del TSOP
3 - appena parte la barriera funziona, non è interrotta, led verde
4 - appena interrompo la barriera il TSOP va HIGH e l'INT mi attiva una routine per il cambio stato della variabile che ti dicevo e si accende il led rosso, spegnendo il verde; l'oscillatore non oscilla più
5 - fintanto che la barriera è interrotta resta su rosso (in questo caso però l'oscillatore oscilla)
6 - appena la barriera è libera un delay imposta un giusto ritardo quindi si riaccende il led verde; l'oscillatore continua a non oscillare
7 - dopo un ulteriore x tempo senza che la barriera sia stata interrotta il micro va in idle, si spegne anche il led verde e l'oscillatore riprende ad oscillare ripristinando iml controllo della barriera.
Mi resta solo il problema che mentre è verde, se la barriera viene interrotta non se ne accorge perché l'oscillatore non oscilla, ma questo è il problema della prossima volta, devo risolvere via software penso, forse con i NOP dello sketcvh iniziale di astrobeeed e di cui mi parlavi prima tu, vedremo.
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 138
Posts: 9866
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

In pratica sto idle non spegne una pitocchia, infatti sono curioso di vedere quanto consumerà il tiny.

Lo stato idle è quello a maggior consumo tra i modi sleep, ma è anche quello che lascia in funzione tutte le periferiche, p.e. se sei in idle puoi ricevere un dato da I2C oppure dalla seriale, quando sarà pronto nel buffer il micro viene risvegliato.
Con nessuna modalità di sleep puoi generare i 38 kHz tramite software, ovvero utilizzando le nop, o le delay, all'interno di un ciclo, però puoi generarli via hardware tramite un timer in due modi.
Il primo è programmare un timer per il semiperiodo dei 38 kHz con interrupt attivo e ogni volta che il micro viene risvegliato cambi stato al pin e ricarichi il timer, non è possibile ottenere 38 kHz esatti perché il periodo è 26.316 us, un valore non ottenibile con la base tempi che ha un periodo di 0.0625 us, infatti il rapporto è 421.056, solo se il rapporto tra i due periodi è un valore intero è possibile ottenere l'esatta frequenza.
Il secondo modo è utilizzare un timer in modalità pwm con duty al 50% per generare una frequenza il più possibile vicina a 38kHz, anche in questo caso non è possibile ottenere il valore esatto e tocca verificare se è possibile avvicinarsi perché il carrier del pwm non è impostabile a piacere su tutte le frequenze possibili.
Andando a memoria credo sia possibile arrivare molto vicini ai 38 kHz con il pwm, quasi sicuramente con un valore entro la banda ammessa, più tardi in mattinata verifico in pratica.

Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12678
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, in effetti quando va in idle continua a generare la frequenza; il problema ora è quando è sveglio, cioè quando inizio la gestione dei led (punti 6 e 7 del mio precedente post) ovviamente la frequenza si interrompe perché il micro non lavora in multitasking; per cui concordo che l'unica soluzione possibile sia quella di dissociare i 38KHz dal software, come suggerisci tu, spero proprio che tu riesca a fare le prove e trovare una soluzione. Grazie.  smiley-lol
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 138
Posts: 9866
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ovviamente la frequenza si interrompe perché il micro non lavora in multitasking

Non è un problema di multitasking, è un problema di velocità del micro, se deve generare a software dei ritardi di pochi us non hai modo di fare altre cose nel frattempo, infatti i timer/counter servono proprio per scaricare la cpu dai compiti di conteggio tempo e/o eventi implementandoli in hardware.
Tra parentesi qualunque micro può lavorare in multitasking/multithread, questo vale pure per una piccola mcu a 8 bit, è una questione più software che hardware visto che comunque la cpu può eseguire solo una istruzione per volta a meno che non sia micro multicore.
Il multitasking è usatissimo sulle mcu, esistono appositi sistemi operativi che lo implementano per noi, uno dei più famosi, e usati in ambito industriale, è Salvo che è un RTOS (Real Time Operating System).
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12678
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non cominciare a volare  smiley-eek già faccio fatica a correrti dietro quando cammini per terra  smiley-sweat
Ho sbagliato ad esprimere il concetto intendevo appunto dire che il software esegue le istruzioni una per volta sequenzialmente, quindi quando il mio sketch inizia a gestire i led per le indicazioni si ferma la frequenza generata dall'altro pin, e siccome a regime questa cosa potrebbe occuparmi anche 20-30 secondi la mia "barriera di sicurezza" diventa una barzelletta, visto che intanto non funziona; in parole povere quando è verde significa che non c'è passaggio, il problema è che a quel punto inizio un delay al termine del quale vado in sleep, durante questo delay la barriera non controlla il passaggio dei "mezzi" e rischio la strage, ovviamente è tutto simulato, però...
Logged


Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 335
Posts: 23123
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma tu non devi fare un delay. In questo modo blocchi la CPU a contare i secondi.
Devi fare con un ciclo e controllare contemporaneamente lo scorrere del tempo e la barriera.
Se al termine del tempo preimpostato non è passato nessuno, metti a nanna il micro.
Logged


Pages: 1 [2] 3 4 ... 12   Go Up
Jump to: