[RISOLTO]Problema Attiny85 e pulseIn()

Ciao a tutti!
Sto provando a configurare un sensore ultrasuoni (HC-SR04) con un Attiny 85...il problema è che non funziona...ho provato quanto scritto a questo link http://www.instructables.com/id/Ultrasonic-Range-Finder-with-an-ATtiny85/step5/The-Code/ però non funziona..cioè il led si accende da solo..e non si spegne più.
Allora ho provato a vedere se il sensore funziona...semplicemente collegando in parallelo ai segnali di trig ed echo dei led che ne mostrino il funzionamento. A quel punto mando il segnale di trig...e tutto funziona bene: cioè il led del trig si accende tot volte al secondo, e il led echo risponde rimanendo acceso un tempo variabile a seconda della distanza dell'oggetto davanti al sensore.
ora però se inserisco nello sketch il semplice comando di pulseIn(), l'intervallo di accensione dei led passa da qualche volta al secondo a una volta ogni 4 secondi! è come se il microcontrollore si incantasse all'esecuzione di pulseIn()

Che dite? cosa sbaglio?

cicca_lo:
.....
ora però se inserisco nello sketch il semplice comando di pulseIn(), l'intervallo di accensione dei led passa da qualche volta al secondo a una volta ogni 4 secondi! è come se il microcontrollore si incantasse all'esecuzione di pulseIn()

Non è che il microcontrollore si incanta, è che la pulseIn() ferma effettivamente l'esecusione del tuo programma sino a quando non ha terminato la lettura (... o va in time out). E' chiaramente scritto della descrizione :

"Reads a pulse (either HIGH or LOW) on a pin. For example, if value is HIGH, pulseIn() waits for the pin to go HIGH, starts timing, then waits for the pin to go LOW and stops timing. Returns the length of the pulse in microseconds. Gives up and returns 0 if no pulse starts within a specified time out."

Guglielmo

Allora non capisco, non può bloccarsi per 4 secondi...visto che il ritorno echo del sensore fornisce un valore alto di al massimo 10 ms...

Che core stai utilizzando per il tiny?

In "Tipo di Arduino" ho selezionato AtTiny85 @ 1MHz (internal oscillator, BOD disabled)...o intendi qualcos'altro?

L'IDE liscio, quello scaricato dal sito, in tutte le sue versioni, non ha il codice necessario per compilare per i microcontrollori della serie Tiny.
Quindi, tra le varie operazioni che hai fatto, una di queste e stata sicuramente quella di scaricare un core per i tiny e integrarlo nell'IDE che stai usando.
Siccome ce ne sono diversi su internet, volevo sapere quale hai scaricato. Perché, volendoti aiutare, ho necessita di sapere quale codice stai usando.
Potrebbe essere che la pulse() sia stata implementata in modo diverso a seconda del core scaricato. Magari manca il timeout.

Ah...ok..l'ho scaricato da questo sito
https://code.google.com/p/arduino-tiny/downloads/list

Se hai seguito i vari link della guida dovresti essere approdato qui --> http://blog.iteadstudio.com/arduino-library-for-ultrasonic-ranging-module-hc-sr04/
Questa libreria non funziona con l'IDE 1.x e sucessivi, ma forse tu stai usando un'IDE versione precedente, ed inoltre non setta il timeout del pulsein

Infatti questo è il codice:

long Ultrasonic::Timing()
{
  digitalWrite(Trig_pin, LOW);
  delayMicroseconds(2);
  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_pin, LOW);
  duration = pulseIn(Echo_pin,HIGH);
  return duration;
}

come vedi nel richiamo alla pulsein() cha accetta

pulseIn(pin, value, timeout)

non c'è il timeout.
Quindi aspetta anche 10 secondi.

Se vuoi utilizzare la libreria con le versioni recenti dell'IDE la devi aggiornare ed inoltre potresti aggiungere un timeout.

@cicca_lo:
per favore pubblica il codice completo.

Non so come, ma il problema era solo la frequenza di clock dell'attiny....praticamente l'ho impostato a 16 Mhz PLL ed ha funzionato tutto alla meraviglia!
Se vi interessa ecco il codice per comandare un led con il solo passaggio della mano sul sensore ad ultrasuoni...programmato per attiny e funziona alla grande! Grazie a tutti!

#define trig 3
#define echo 4
#define led 1
int temp=0;
int dist=0;
int pwm=0;
int prec=0;
int massimo=60;
int caso=0;
boolean acceso=false;

void setup(){
  pinMode(trig,OUTPUT);
  pinMode(echo,INPUT);
  pinMode(led,OUTPUT);
}

void loop(){
  digitalWrite(trig,HIGH);
  delay(10);
  digitalWrite(trig,LOW);
  temp=pulseIn(echo,HIGH);
  dist=temp/58;
  
 
if(dist!=0){
  if (dist<massimo){
    if(acceso){
      if(prec==0){
        prec=1;
        delay(300);
      }
      else{
        pwm=(dist*255)/massimo;
        analogWrite(led,pwm);
        prec=2;
      }
    }
    else{
    analogWrite(led,128);
    acceso=true;
    delay(500);
    }
  }
  else{
    if(prec==1){
      analogWrite(led,0);
      prec=0;
      acceso=false;
    }
    else {
      if(prec==2){
        prec=0;
        delay(500);
      }
    }
  }
}
  
  
  
  delay(100);
  
  
  
}

Il problema non può essere solo la frequenza a 16 MHz. Il tuo codice non contiene nulla di "strano", dovrebbe poter lavorare anche a clock inferiori.
Sicuro di aver impostato il micro (i suoi fuse) correttamente prima di flasharci lo sketch?