Ultrasonic и attiny13 вмещение скетча

Rimidalw
Offline
Зарегистрирован: 04.04.2012

В общем суть такая. Нужно воткнуть скетч в тиньку. При определеннорасстоянии от объекта на несколько милисекунд зажеч светодиод.

void setup() {
 
 DDRB = 0b10111;
}

void loop()
{
  PORTB|=1<<PINB3;
  delayMicroseconds(10);
  PORTB&=~(1<<PINB3);  
  uint8_t D1 = pulseIn(2, HIGH, 20000)/29.0/2;
  
  if (D1<40&&D1>1){
    PORTB|=1<<PINB4;
    delay(50);
  }
  else{
  PORTB&=~(1<<PINB4); 
  } 
}

Код конечно не рабочий, набрасал на скорую руку. Но суть в том, что функция pulseIn занимает огромное место и скетчик вроде очень примитивный получается больше 1024 Бт. Чем заменить?

maksim
Offline
Зарегистрирован: 12.02.2012
long Ultrasound()
{
  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(4);
  digitalWrite(Trig_pin, LOW);
  uint32_t micros_old_Ult = micros();
  while(!digitalRead(Echo_pin) && micros()-micros_old_Ult < 500);
  micros_old_Ult = micros();
  while(digitalRead(Echo_pin) && micros()-micros_old_Ult < 20000);
  return (micros() - micros_old_Ult)/29.0/2;
}

Ну естественно digitalRead'ы и digitalWrite'ы замените. 

if(digitalRead(2))   =   if(PINB&(1<<PINB2))

Rimidalw
Offline
Зарегистрирован: 04.04.2012
void setup() {
 
 DDRB = 0b10111;
}

void loop()
{  
  PORTB|=1<<PINB3;
  delayMicroseconds(4);
  PORTB&=~(1<<PINB3); 
  uint32_t micros_old_Ult = micros();
  while(!(PINB&(1<<PINB2)) && micros()-micros_old_Ult < 500);
  micros_old_Ult = micros();
  while((PINB&(1<<PINB2)) && micros()-micros_old_Ult < 20000);
  uint8_t D1 = (micros() - micros_old_Ult)/29.0/2;
  if (D1<40&&D1>1){
    PORTB|=1<<PINB4;
    delay(50);
  }
  else{
  PORTB&=~(1<<PINB4); 
  } 
}

1430 Бт не влазиет(

void setup() {
 
 DDRB = 0b10111;
}

void loop()
{  
  
  int D1 = Ultrasonics();  
  if (D1<40&&D1>1){
    PORTB|=1<<PINB4;
    delay(50);
  }
  else{
  PORTB&=~(1<<PINB4); 
  } 
}
long Ultrasonics()
{
  PORTB|=1<<PINB3;
  delayMicroseconds(4);
  PORTB&=~(1<<PINB3); 
  uint32_t micros_old_Ult = micros();
  while(!(PINB&(1<<PINB2)) && micros()-micros_old_Ult < 500);
  micros_old_Ult = micros();
  while((PINB&(1<<PINB2)) && micros()-micros_old_Ult < 20000);
  return (micros() - micros_old_Ult)/29.0/2; //Вот это деление все решает убираем его и скетч становиться 624 Бт
}

Но без этой математической операции не катит :(

tsostik
Offline
Зарегистрирован: 28.02.2013

Как это не обойтись без деления?

Поменяйте

if (D1<40&&D1>1){

на

if( ((micros() - micros_old_Ult) < 232) && ( (micros() - micros_old_Ult) > 58)

И, кстати, вообще уберите D1

Rimidalw
Offline
Зарегистрирован: 04.04.2012

tsostik пишет:

Как это не обойтись без деления?

Поменяйте

if (D1<40&&D1>1){

на

if( ((micros() - micros_old_Ult) < 232) && ( (micros() - micros_old_Ult) > 58)

И, кстати, вообще уберите D1

Вопрос решился очень просто. Заменил 29.0 на просто 29 и скетчик похудел в более чем 2 раза. Все работает. Всем спасибо!

Ramzess04
Offline
Зарегистрирован: 31.10.2015

Извините, а можно для начинающих обозначить что куда подключать? Или указать на литературу, что поможет разобраться с данным обозначением портов?)

KrokGord
Offline
Зарегистрирован: 01.03.2015

Выяснил непонятное явление. Если написать данный алгоритм с оптимизацией, т.е. без void loop(), а с int main() и while (1), то ultrasonic почему-то не работает! 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

KrokGord, дык немудрено. Не цепляется в данном случае весь ардуиновский обвес.