пылесос на attiny13

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

Всем привет))
Решил попробовать собрать платку для пылесоса,когда собрал возникло кучу проблем((
хотелось бы :
1.чтобы при нажатии на кнопку включался пылесос при повторном выключался--
впринципе это еще как то работает если ставить прерывание по низкому уровню ,но если ставить по изменению фронта с 0 на 1 или с 1 на 0,почему то происходят ложные срабатывания.
2. ПЯТЬ стадии когда мигают оба светодиода пылесос полностью заряжен от сети,когда не мигают то просто стоит не работающий- напряжение чуть упало после зарядки, дальше горение 1 светодиода мигание 1 светодиода когда напряжение чуть упало,также с красным светодиодом когда напряжение на аккумуляторе еще ниже.
Когда напряжение падает ниже определенного уровня пылесос должен выключиться,тут то и пошли проблемы:

если напряжение ниже 4 вольт почему то светодиод мигает хотя в программе он должен гореть PORTB.0=1;
и МОЖНО ЗАПУСКАТЬ ПЫЛЕСОС((( хотя PORTB.3=0 -выключен

Код: Выделить всё

 if((adc_data[0]>0)&(adc_data[0]<=54)) {PORTB.0=1;PORTB.3=0;} else PORTB.0=0; 
ГДЕ Я ОШИБСЯ ПОДСКАЖИТЕ ПОЖАЛУСТА

Код: Выделить всё

#include <tiny13.h>
#include <delay.h>
#define FIRST_ADC_INPUT 1 
#define LAST_ADC_INPUT 1
interrupt [EXT_INT0] void ext_int0_isr(void)
{
delay_ms(100);
PINB.3=1;

}
unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1]; 
#define ADC_VREF_TYPE 0x20 
interrupt [ADC_INT] void adc_isr(void) //стандартное прерывание по ADC от CVAVR 
{ 
static unsigned char input_index=0; 
adc_data[input_index]=ADCH; 
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT)) 
input_index=0; 
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index; 
delay_us(10); 
ADCSRA|=0x40; 
} 

void main (void)

{

PORTB=0xA;
DDRB=0x19;
ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff); 
ADCSRA=0xCC; 
MCUCR=0x00;
GICR=0x40;
#asm("sei") 




while(1)

{
   
 if((adc_data[0]>0)&(adc_data[0]<=54)) {PORTB.0=1;PORTB.3=0;} else PORTB.0=0; 
 if((adc_data[0]>54)&(adc_data[0]<=72)) {PORTB.0=1;delay_ms(10);PORTB.0=0;delay_ms(10);} 
   if((adc_data[0]>72)&(adc_data[0]<=75)) {PORTB.4=1;delay_ms(10);PORTB.4=0;delay_ms(10);}
  if((adc_data[0]>75)&(adc_data[0]<=80)) PORTB.4=1;else PORTB.4=0;
   if (adc_data[0]>=90) {PORTB.0=1;delay_ms(1);PORTB.0=0;delay_ms(1);PORTB.4=1;delay_ms(1);PORTB.4=0;delay_ms(1);} 
   
  
}

}
Вложения
пылесос.JPG
(175.06 КБ) 196 скачиваний
Последний раз редактировалось sirha Вс окт 19, 2014 19:57:53, всего редактировалось 3 раза.
Реклама
Вымогатель припоя
Сообщения: 601
Зарегистрирован: Ср янв 06, 2010 10:01:46

Сообщение metan »

Яростно читать применение оператора &
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

metan писал(а):Яростно читать применение оператора
разве побитовое "И" чем то отличается от логического???

поправил на токо ничего не изменилось
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Можете проверить, (0x01 & 0x02) != (0x01 && 0x02).
А измеряет-то оно правильно? Попробуйте просто вывести измеренное значение по UART например, или просто в порт.
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

COKPOWEHEU писал(а):Можете проверить, (0x01 & 0x02) != (0x01 && 0x02).




как посчитать тогда правильно??

Побитовое И — это бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов. Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

А логическое И - операция, результат которой равен нулю если хотя бы один из аргументов равен нулю, и отлична от нуля, когда оба аргумента отличны от нуля. Тип аргументов при этом может быть любым, хоть 1 бит, хоть 4 байта.
Тут уж зависит от задачи: если нужно соответствие нескольким условиям - логическое, если, скажем, сброс бита - побитовое.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

COKPOWEHEU писал(а):А логическое И - операция, результат которой равен нулю если хотя бы один из аргументов равен нулю
я не понимаю в чем разница),не вижу разницы,приведите что ли какие-нибудь примеры

про логическое и я и так знаю дак чем же отличается побитовое и?????
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1315
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

Сообщение НАПАЛМ »

На счет вашей первой промлемы: смотрите вот это видео с 10:30
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

sirha писал(а):дак чем же отличается побитовое и?????
Попробуйте все-таки разобраться с примером 0x01 & 0x02 и 0x01 && 0x02.
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

sirha писал(а):я не понимаю в чем разница),не вижу разницы,приведите что ли какие-нибудь примеры
про логическое и я и так знаю дак чем же отличается побитовое и?????
Вот допустим два числа в бинарной записи
0b0001
0b0010
В десятичной это 1 и 2. При побитовом "И" каждый бит перемножается, получаем:
0b0000
Понятно почему? В итоги при выполнении операции (1 & 2) получается 0
А при (1 && 2) получается не ноль, т.к. оба операнда не ноль.
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Код: Выделить всё

PORTB.0=1;delay_ms(10);PORTB.0=0;delay_ms(10);
При таких задержках мигать-то будет, но глазом этого не заметишь, потому как очень быстро переключения происходят. Поставьте побольше.
Docendo discimus
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

ks0 писал(а):
sirha писал(а):я не понимаю в чем разница),не вижу разницы,приведите что ли какие-нибудь примеры
про логическое и я и так знаю дак чем же отличается побитовое и?????
Вот допустим два числа в бинарной записи
0b0001
0b0010
обьясните пошагово тогда как траблотает этот код я не понимаю((

Код: Выделить всё

unsigned char dataF[]= {0,1,2,4,8,0x10,0x20,0x40,0x80};

if(OldButton && !Button) // нажатие кнопки
	{
	 // тот самый счетчик
      ++data;
	dataC=data; // во временную переменную  
        
	for(i= 0; i<9; ++i) // восемь циклов (передача в 595-ю)
		{
		     
         if(++data > 8) data= 0; // тот самый счетчик считает от 0 до 7
          dataC= dataF[data];
	      PORTB.1=dataC&0x01; // импульс записи 
            PORTB.0=1;
	        PORTB.0= 0;
           
	        // сдвинули переменную
		}
	PORTB.2= 1; // защелкивание данных в 595-ой
	PORTB.2= 0;
	};
}
этот код для 74hc595

как тут импульс PORTB.1 - Смещается относительно ИМПУЛЬСА PORTB.0

ПРИ ПЕРВОМ НАЖАТИИ КНОПКИ ИМПУЛЬС1 СОВПАДАЕТ С 9 ИМПУЛЬСОМ
ПРИ ВТОРОМ НАЖАТИИ ИМПУЛЬС 1 СОВПАДАЕТ С 8 ИМПУЛЬСОМ

ТАК ПООЧЕРЕДНО ЗАЖИГАЮТСЯ СВЕТОДИОДЫ

не пойму

как тут работает эта система обьяснитье пожалуйста
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

как все-таки можно запутать и запутаться в простой задаче, если подходить к ее решению несистемно!

я настоятельно рекомендую применить принцип нисходящего программирования, о котором я специально написал небольшую статью для начинающих. в соответствии с этим принципом вы должны разделить ваш код на функции:
1. функция опроса кнопки (например, key_pressed() )
2. функция вывода во внешний 595-й регистр байта (например, write_to_595(char data))

тогда ваш код выльется в простейший вариант:

Код: Выделить всё

unsigned char led_num = 1; // номер светящегося светодиода
while(1){
   write_to_595(led_num); // выводим в регистр
   while(!key_pressed()); // ждем нажатия кнопки
   led_num <<= 1; // сдвигаем светодиод
   if(led_num == 0) led_num = 1; // если вышла за 8-й, ставим снова 1-й
   while(key_pressed()); // ждем отпускания кнопки
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

ks0 писал(а): Вот допустим два числа в бинарной записи
0b0001
0b0010
В десятичной это 1 и 2. При побитовом "И" каждый бит перемножается, получаем:
0b0000
СПС

вообщем я уже понил как работает код, спс :),а с пылесосом то кто-нибудь поможет?
Ответить

Вернуться в «AVR»