Pages: [1]   Go Down
Author Topic: [RISOLTO]Problema Attiny85 e pulseIn()  (Read 789 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
« Last Edit: March 20, 2013, 02:01:02 am by cicca_lo » Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 113
Posts: 5900
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Search is Your friend ... or I am Your enemy !

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6984
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Che core stai utilizzando per il tiny?
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6984
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6984
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
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
Code:
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.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@cicca_lo:
per favore pubblica il codice completo.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Code:
#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);
 
 
 
}
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged


Pages: [1]   Go Up
Jump to: