Перейти к содержанию

Ребят предлагаю САБЖ!


Mr.47

Рекомендуемые сообщения

delay.h

#define F_CPU 16000000 /* CPU Clock Frequency */

#define CYCLES_PER_US ((F_CPU+500000)/1000000)

 

void delayu(unsigned short us);

void delaym(unsigned short ms);

 

delay.c

#include "delay.h"

 

void delayu(unsigned short us)

{

unsigned short delay_loops;

register unsigned short i;

 

delay_loops = (us+3)/5*CYCLES_PER_US; // +3 for rounding up (dirty)

 

// one loop takes 5 cpu cycles

for (i=0; i < delay_loops; i++) {};

}

 

void delaym(unsigned short ms)

{

unsigned short mdelay_loops;

register unsigned short mi;

 

mdelay_loops = (ms+3)/5;

for (mi=0; mi < mdelay_loops; mi++) delayu(1000);

}

Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 1.2k
  • Created
  • Последний ответ

Программные часы.

Написл быстро.

Вроде тикают правильно.

Полностью еще не проверял.

Выкладываю сырым.

 

clock.h

void init_calendar(void);

unsigned char get_time(unsigned char tind);

unsigned char get_date(unsigned char tind);

void set_time(unsigned char thour,unsigned char tmin,unsigned char tsec);

void set_date(unsigned char tday,unsigned char tmon,unsigned char tyear);

 

clock.c

#include <iom128v.h>

#include <macros.h>

 

#pragma interrupt_handler ovf_timer0:17

unsigned char second=0,minets=0,hour=0,day=1,month=1,year=0;

 

void init_calendar(void)

{

CLI(); //disable all interrupts

ASSR=ASSR | 0b00001000;//

TCCR0=0b00000101;// clk/128=256gz

TCNT0=0;//data

OCR0=0;//sravnen

TIMSK=TIMSK | 0b00000001;//int po perepoln

SEI(); //re-enable interrupts

}

 

void ovf_timer0(void)

{

second++;

if(second>=60)

{

second=0;

minets++;

if(minets>=60)

{

minets=0;

hour++;

if(hour>=24)

{

hour=0;

day++;

if((month==1 || month==3 || month==5 || month==7 ||

month==8 || month==10 || month==12)&&(day>=32))

{

day=1;month++;

}

if((month==4 || month==6 || month==9 || month==11)&&(day>=31))

{

day=1;month++;

}

if((month==2)&&(day>=29))

{

day=1;month++;

}

if(month>=13)

{

month=1;

year++;

if(year>=100)year=0;

}

}

}

}

//UDR0=hour;

//while(!(UCSR0A & 0b00100000));

//UDR0=minets;

//while(!(UCSR0A & 0b00100000));

//UDR0=second;

//while(!(UCSR0A & 0b00100000));

}

 

unsigned char get_time(unsigned char tind)

{

if(tind==2)return second;

if(tind==1)return minets;

if(tind==0)return hour;

}

 

unsigned char get_date(unsigned char tind)

{

if(tind==2)return year;

if(tind==1)return month;

if(tind==0)return day;

}

 

void set_time(unsigned char thour,unsigned char tmin,unsigned char tsec)

{

TIMSK=TIMSK & 0b11111110;//int po perepoln

hour=thour,minets=tmin,second=tsec;

TIMSK=TIMSK | 0b00000001;//int po perepoln

}

 

void set_date(unsigned char tday,unsigned char tmon,unsigned char tyear)

{

TIMSK=TIMSK & 0b11111110;//int po perepoln

day=tday,month=tmon,year=tyear;

TIMSK=TIMSK | 0b00000001;//int po perepoln

}

Можно еще кучу всего добавить, и оптимизировать.

Исользуется дополнительный внешний кварц 32768Гц.

Ссылка на комментарий
Поделиться на другие сайты

Товарищи, помогите плз. Есть такой трехполосный кросс:

0_cf05_f27d1593_L.jpg

Посмотреть на Яндекс.Фотках

0_cf06_5ae4f4e5_L.jpg

Посмотреть на Яндекс.Фотках

На первой фотке внизу две неиспользованных дырочки и где-то в интернетах промелькнуло, что туда можно допаять защиту от перегруза ВЧ динамика. Можно ли это сделать, а то ВЧ уже 1 раз сгорели.

Ссылка на комментарий
Поделиться на другие сайты

to KitMan

Хз,для защиты целая схема нужна.

 

Перелопатил 'button'

Думаю причина ясна.

Достаточно взглянуть на while(1)...

 

button.h

#define PORT_BUT PINA //порт где кнопки

#define ALL_BUT 0b00011111 //на каких пинах кнопки

 

#define B_LEFT 29

#define B_RIGHT 23

#define B_UP 30

#define B_DOWN 15

#define B_ENTER 27

 

unsigned char button(void);

 

button.c

#include <iom128v.h>

#include "button.h"

 

unsigned char flagbut=0,butcode=0;

 

unsigned char button(void)

{

unsigned char bcode;

bcode=PORT_BUT & ALL_BUT;

 

if((bcode != ALL_BUT)&&(flagbut==0))

{

butcode=bcode;

flagbut=1;

delaym(10);//задержка от дребзга при нажатии

}

 

if((bcode==ALL_BUT)&&(flagbut==1))

{

flagbut=0;

beep(100,1500);//or delaym(10); задержка от дребзга при отжатии

return butcode;

}

return 0;

}

 

Пример:

#include "button.h"

 

unsigned char cbut=0;

...

main()

{

while(1)

{

cbut=button();

if(cbut)

{

if(cbut==B_LEFT)PORTB=0b11110000;

if(cbut==B_RIGHT)PORTB=0b00001111;

cbut=0;

}

}

}

Ссылка на комментарий
Поделиться на другие сайты

АЦП

 

Сегодня сделал модуль АЦП.

 

adc.h

#define OP_OFF 0

#define OP_INT 0b11000000

#define OP_EXT 0b01000000

 

#define ADC_DEL2 0b00000001

#define ADC_DEL4 0b00000010

#define ADC_DEL8 0b00000011

#define ADC_DEL16 0b00000100

#define ADC_DEL32 0b00000101

#define ADC_DEL64 0b00000110

#define ADC_DEL128 0b00000111

 

void adc_Mux(unsigned char a_chan);//0-7

void adc_start(void);

unsigned char adc_end(void);

void adc_init(unsigned char a_opornoe,//V opornoe OP_OFF,OP_INT or OP_EXT

unsigned char a_tip_res,//tip preobrazovania 1-Left,0-Right

unsigned char a_avto, //1-avto perezapusk

unsigned char a_interrupt,//1-enable,0-disable

unsigned char a_delitel); //delenie freq

unsigned char adc_8bit(unsigned char a_chan);

 

adc.c

#include "adc.h"

#include <iom128v.h>

#include <macros.h>

 

void adc_Mux(unsigned char a_chan)

{

if(a_chan>7)a_chan=7;

ADMUX=ADMUX | a_chan;

}

 

void adc_start(void)

{

ADCSRA=ADCSRA | 0b01000000;

}

 

unsigned char adc_end(void)

{

if(ADCSRA & 0b01000000)return 1;

return 0;

}

 

void adc_init(unsigned char a_opornoe,unsigned char a_tip_res,unsigned char a_avto,

unsigned char a_interrupt,unsigned char a_delitel)

{

unsigned char ftemp=0;

 

CLI();

ftemp=a_opornoe;

if(a_tip_res)ftemp=ftemp | 0b00100000;

ADMUX=ftemp;

 

ftemp=0b10000000;

if(a_avto)ftemp=ftemp | 0b00100000;

if(a_interrupt)ftemp=ftemp | 0b00001000;

ftemp=ftemp | a_delitel;

ADCSRA=ftemp;

SEI();

}

 

unsigned char adc_8bit(unsigned char a_chan)

{

if(adc_end()==0)

{

adc_Mux(a_chan);

adc_start();

while(adc_end());

return ADCH;

}

}

 

 

//#pragma interrupt_handler adc_interrupt:22

 

//void adc_interrupt(void)

//{

//cadcl=ADCL;

// cadch=ADCH;

//}

 

Пример:

#include "adc.h"

...

 

main()

{

adc_init(OP_EXT,1,0,0,ADC_DEL64);

 

while(1)

{

PORTB=adc_8bit(0);

}

}

С прерыванием то-же все просто.

 

Если есть вопросы или предложения, не стесняйтесь...

Ссылка на комментарий
Поделиться на другие сайты

Inel

Идея нереализуема, потому что это извращение.

Вообще-то она там реализована. И первый компьютер тоже по началу собирались делать на реле, но не хватило качества релюшек.

 

Алсо, с прошедшим праздником нас=)

Ссылка на комментарий
Поделиться на другие сайты

Mpako6ec.

Изврат извратный. Чуваку точно нехрен было делать. :)

Но зато прикольно. И сильные электромагнитные помехи не страшны.

Спасибо, Мракобес, за инфу! Весело.

Ссылка на комментарий
Поделиться на другие сайты

Может, конечно, уже были такие идеи и статьи, но я хочу представить Вашему вниманию одну вещь.

Мне приходится работать с контроллерами и различными устройствами, которые питаются от 220В.

Но кабель питания соединяется с ними, что называется "под винт". Для отладки таких устройств я использую один

разветвлитель розеток. Присоединил кабель питания, скажем к контроллеру "под винт", возможность его выключить

или перезагрузить, в момент отладки программы, реализуется только вытаскиванием вилки из розетки,

не откручивать же каждый раз винты.

Очень сложно это делать если вилка "евро".

Они большие и трудно вытаскиваются из розетки. Приходится придерживать рукой "пилот" или выключать "пилот",

отключая все устройства подключённые к нему.

Можно сделать выключатель на проводе, но иной раз провод западает между столами или столом и стеной.

И тут мне пришла в голову идея, а, что если сделать выключатель прямо в вилке?

Следущий раз, когда я делал очередной провод питания для контроллера, решил врезать туда выключатель.

Под рукой у меня оказался выключатель кнопочного типа,его я и использовал. На фото, на мой взгляд,всё доступно показано.

Думаю в вилку можно установить и любой другой вид выключателей.

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

Теперь если мне надо "ресетнуть" или выключить какой-нибудь девайс, не обязательно его вытаскивать

из розетки или выключать весь пилот.

post-12792-1242064410_thumb.jpg

post-12792-1242064420_thumb.jpg

post-12792-1242064428_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

  • 2 weeks later...
  • 2 weeks later...
  • 3 weeks later...

Так, ребята-знатоки - есть вопрос! :)

Имеется вольтметр на 250 Вольт. Что-то мне подсказыват (что осталось от знаний физики из школы и универеа), что если я приделаю к нему вилку и включу в розетку - то ничего замкнуть не должно и он должен показывать сколько Вольт в сети.

Я прав?

Ссылка на комментарий
Поделиться на другие сайты

Чернокнижник

Прав!

Только не забудь поставить вольтметр на режим переменного тока. И соблюдай диапазон.

 

Зачем тебе это надо?

Ссылка на комментарий
Поделиться на другие сайты

Зачем, зачем... Притащили мне вольтметр - чё он без дела будет валятся? А ща в летнее время оченна актуально знать сколько вольтов по проводам бегает, ибо если меньше нижней планки ИБП - то и смысла включать комп - нет. А то включишь - увидишь что тока на 10 минут работы и выключишь.

Ссылка на комментарий
Поделиться на другие сайты

Ещё тема!

 

Охранная сигнализация для квартиры или ГАРАЖА!!!!!!

 

Конечно звонит на сотовый! И вы видите звонит: "Гараж открыт! Грабят!"

)))) удивил))) милионы схем подобного оборудования. я когдато собирал даже на инфракрасных датчиках и датчиков движения + вибро

Ссылка на комментарий
Поделиться на другие сайты

  • 2 months later...

Заархивировано

Эта тема находится в архиве и закрыта для дальнейших ответов.




×
×
  • Создать...