Страница 1 из 1

пылесос на attiny13

Добавлено: Вс окт 19, 2014 19:44:21
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);} 
   
  
}

}

Re: АЦП attiny13

Добавлено: Вс окт 19, 2014 19:53:56
metan
Яростно читать применение оператора &

Re: АЦП attiny13

Добавлено: Вс окт 19, 2014 19:56:01
sirha
metan писал(а):Яростно читать применение оператора
разве побитовое "И" чем то отличается от логического???

поправил на токо ничего не изменилось

Re: пылесос на attiny13

Добавлено: Вс окт 19, 2014 20:47:55
COKPOWEHEU
Можете проверить, (0x01 & 0x02) != (0x01 && 0x02).
А измеряет-то оно правильно? Попробуйте просто вывести измеренное значение по UART например, или просто в порт.

Re: пылесос на attiny13

Добавлено: Вс окт 19, 2014 21:01:35
sirha
COKPOWEHEU писал(а):Можете проверить, (0x01 & 0x02) != (0x01 && 0x02).




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

Побитовое И — это бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов. Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0.

Re: пылесос на attiny13

Добавлено: Вс окт 19, 2014 22:36:02
COKPOWEHEU
А логическое И - операция, результат которой равен нулю если хотя бы один из аргументов равен нулю, и отлична от нуля, когда оба аргумента отличны от нуля. Тип аргументов при этом может быть любым, хоть 1 бит, хоть 4 байта.
Тут уж зависит от задачи: если нужно соответствие нескольким условиям - логическое, если, скажем, сброс бита - побитовое.

Re: пылесос на attiny13

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

про логическое и я и так знаю дак чем же отличается побитовое и?????

Re: пылесос на attiny13

Добавлено: Вс окт 19, 2014 23:28:06
НАПАЛМ
На счет вашей первой промлемы: смотрите вот это видео с 10:30

Re: пылесос на attiny13

Добавлено: Пн окт 20, 2014 06:39:27
COKPOWEHEU
sirha писал(а):дак чем же отличается побитовое и?????
Попробуйте все-таки разобраться с примером 0x01 & 0x02 и 0x01 && 0x02.

Re: пылесос на attiny13

Добавлено: Пн окт 20, 2014 06:59:03
ks0
sirha писал(а):я не понимаю в чем разница),не вижу разницы,приведите что ли какие-нибудь примеры
про логическое и я и так знаю дак чем же отличается побитовое и?????
Вот допустим два числа в бинарной записи
0b0001
0b0010
В десятичной это 1 и 2. При побитовом "И" каждый бит перемножается, получаем:
0b0000
Понятно почему? В итоги при выполнении операции (1 & 2) получается 0
А при (1 && 2) получается не ноль, т.к. оба операнда не ноль.

Re: пылесос на attiny13

Добавлено: Пн окт 20, 2014 08:22:40
pyzhman

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

PORTB.0=1;delay_ms(10);PORTB.0=0;delay_ms(10);
При таких задержках мигать-то будет, но глазом этого не заметишь, потому как очень быстро переключения происходят. Поставьте побольше.

Re: пылесос на attiny13

Добавлено: Пн окт 20, 2014 09:55:08
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 ИМПУЛЬСОМ

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

не пойму

как тут работает эта система обьяснитье пожалуйста

Re: пылесос на attiny13

Добавлено: Пн окт 20, 2014 10:26:04
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()); // ждем отпускания кнопки
}

Re: пылесос на attiny13

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

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