Ultrasonic и attiny13 вмещение скетча
- Войдите на сайт для отправки комментариев
Сб, 25/05/2013 - 00:16
В общем суть такая. Нужно воткнуть скетч в тиньку. При определеннорасстоянии от объекта на несколько милисекунд зажеч светодиод.
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 Бт. Чем заменить?
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))
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 Бт }Но без этой математической операции не катит :(
Как это не обойтись без деления?
Поменяйте
if (D1<40&&D1>1){на
И, кстати, вообще уберите D1
Как это не обойтись без деления?
Поменяйте
if (D1<40&&D1>1){на
И, кстати, вообще уберите D1
Вопрос решился очень просто. Заменил 29.0 на просто 29 и скетчик похудел в более чем 2 раза. Все работает. Всем спасибо!
Извините, а можно для начинающих обозначить что куда подключать? Или указать на литературу, что поможет разобраться с данным обозначением портов?)
Выяснил непонятное явление. Если написать данный алгоритм с оптимизацией, т.е. без
voidloop(), а с int main() и while (1), то ultrasonic почему-то не работает!KrokGord, дык немудрено. Не цепляется в данном случае весь ардуиновский обвес.