Отговори на тема  [ 22 мнения ]  Отиди на страница 1, 2  Следваща
ïîìîù 
Автор Съобщение
Мнение ïîìîù
Íàïèñàõ òàçè ïðîãðàìêà è ÿ èçïðîáâàõ íà protåus ( ðàáîòè íîðìàëíî), íî êîãàòî ÿ ïðîáâàõ ñ èñòèíñêè ÏÈÊ, íåùàòà íå ñòîÿõà òî÷íî òàêà. Îòíà÷àëî òðúãíà êàêòî òðÿáâà, íî êîãàòî çàïî÷íàõ äà èçïúëíÿâàì îòäåëíèòå îïåðàöèè ãè èçïúëíè âåäíúæ è ñÿêàø ÇÀÁÈ (íèùî íå ùå äà ïðàâè). Íåçàâèñèìî äàëè ìó ñïèðàì çàõðàíâàíåòî íåùå äà îòëåïè? Ïîìèñëèõ ñè ÷å íåùî íå å íàðåä ÏÈÊÀ, íî ãî ïðîáâàõ è ñ äðóãè ïðîãðàìè è ñè ðàáîòè! :cry:

#include <16F84A.H>
#fuses XT,NOWDT,PUT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
main(){
int i;
set_tris_a(0b11110);
set_tris_b(0b00001110);
ON_OFF:
i=1;
while(i){
delay_ms(10);
if(input(PIN_A1)==0x1){
i--;}}
i=25;
while(i){
delay_ms(1000);
i--;
if(input(PIN_A1)==0x0){
goto ON_OFF;}}
D:
i=1;
while(i){
if(input(PIN_B1)==0x1){
i--;}
else if(input(PIN_B2)==0x1){
i--;}
else if(input(PIN_B3)==0x1){
i--;}}
i=15;
if(input(PIN_A2)==0x1){
while(i){
delay_ms(1000);
i--;
if(input(PIN_A1)==0x0){
goto ON_OFF;}}}
i=20;
if(input(PIN_A3)==0x1){
while(i){
delay_ms(1000);
i--;
if(input(PIN_A1)==0x0){
goto ON_OFF;}}}
i=25;
if(input(PIN_A4)==0x1){
while(i){
delay_ms(1000);
i--;
if(input(PIN_A1)==0x0){
goto ON_OFF;}}}
{
output_high(PIN_B4);
delay_ms(10);
output_high(PIN_B5);
delay_ms(10);
output_high(PIN_B6);}
i=180;
while(i){
delay_ms(1000);
i--;
if(input(PIN_A1)==0x0){
output_low(PIN_B4);
delay_ms(10);
output_low(PIN_B5);
delay_ms(10);
output_low(PIN_B6);
goto ON_OFF;}}
{
output_low(PIN_B4);
delay_ms(10);
output_low(PIN_B5);
delay_ms(10);
output_low(PIN_B6);}
goto D;
}


Сря Май 18, 2005 11:38 am
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Дек 14, 2004 1:31 pm
Мнения: 3849
Мнение 
8O тези while(i) са много интересно писани. Аз ли съм пропуснал нещо или... Каква е логиката от
int i=1;
while(i)
{ bla bla bla...
i--;
}
и въобще за първи път виждам такава реализация. Ще изкоментират ли напредналите, има ли някакъв трик тук...


Сря Май 18, 2005 1:33 pm
Профил WWW
Мнение 
Ìîæå ðåàëèçàöèÿòà äà å ñòðàííà, íî ïðîãðàìàòà ñå å ïðàâèëíà è ñïîðåä ñèìóëàòîðà íàèñòèíà ðàáîòè, íî íàïðàêòèêà ñ ðåàëåí ïèê íåùî íå å íàðåä. Ëîãè÷åñêè ïîãëåäíàòî íå âèæäàì ïðîáëåìè!!! :roll:


Сря Май 18, 2005 2:11 pm
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Има логика в това while(i) само ако някакъв фонов процес ( ISR ) промени i. Иначе while(1) е къде къде по-разбираемо написано.


Сря Май 18, 2005 2:26 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Тоя спагети код си изглежда работещ....кажи кво имаш по портовете? Аз това мога да си го обясня единствено с хардуерна грешка....преди време ми се наложи заради точно такъв проблем да добавям по 4.7V ценери на едни 40 входа :lol: Искам да кажа, че ако подадеш отрицателно напрежение, или нещо по-високо от 5V става такова нещо, PIC-a отива незнайно къде...


Сря Май 18, 2005 3:00 pm
Профил
Мнение 
Àìè öÿëàòà ìè ñõåìà å çàõðàíåíà ñ òî÷íî 5V è ïî ïîðòîâåòå îñâåí 0V èëè 5V äðóãî íÿìà! 8O


Сря Май 18, 2005 6:24 pm
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Дек 14, 2004 1:31 pm
Мнения: 3849
Мнение 
Като споменаваш портовете, да не взимаш захранване от ПЦ-то. Защото ако е така, мисля че няма да навреди да измериш колко точно.


Сря Май 18, 2005 6:30 pm
Профил WWW
Мнение 
Çíà÷è ....... ñõåìàòà íà óñòðîéñòâîòî â ìîìåíòà ñå çàõðàíâà îò ðåãîëðóåì ñòàáèëèçàòîð è òàì ïðîáëåìè ñ íàïðåæåíèåòî íå ìîæå äà èìà. Ùî ñå îòíàñÿ äî ïðîãðàìàòîðà, àç ñúì JDM è çàõðàíâàíåòî ìè ñå ïîäàâà îò ÏÖ-òî. Íî íå ìèñëÿ ÷å òîâà å ïðîáëåìà çàùîòî ñúùîòî ÏÈÊ×Å ñúì ïîäêàðâàë äðóãè ïðîãðàìè íà ñúùèÿ ïðîãðàìàòîð. Ñîôòóåðà ìè å IC-Prog.


Сря Май 18, 2005 6:46 pm
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Абе я обясни какво прави тази програма...на мен на цветомузика ми прилича :wink:


Сря Май 18, 2005 7:37 pm
Профил
Мнение 
Îò êîäà ìè ñå âèæäà, ÷å ñúì íà÷èíàåù. Òà ñè ïðàâÿ åäíà äîìàøíà àëàðìè÷êà è òÿ èçãëåæäà òàêà:


Сря Май 18, 2005 8:08 pm
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Хе, къде живееш...такоз де, ако очакваш тая алармичка да те опази...Ако и платаката си сглобил както схемата... :lol: Майтапа настрани, ето ти мое решение...понеже не мога по друг начин да ти обясня колко е разхвърляно при тебе :D


Чет Май 19, 2005 2:13 am
Профил
Мнение 
Õèùíèê, áëàãîäàðÿ çà ñõåìàòà! Íå ñå îáèæäàé, íî íå âèæäàì çàùî ìîÿò ïðîåêò äà íå òå ïàçè, àêî ñîðñà ðàáîòåøå òîëêàâà äîáðå êîëêîòî íà ñèìóëàòîðà, âñå ïàê àç ñúì íà÷èíàåù ñ ìèêðîêîíòðîëåðèòå è êîãàòî òè âèäÿõ ñîðñ êîäà ðàçáðàõ êîëêî ìíîãî èìàì äà ó÷à, çà äà ìîãà äà ãè ïðîãðàìèðàì êàòî õîðàòà. Íåâèæäàì ïðîáëåì ïî ñõåìàòà ìè, âñå ïàê òîâà å ñàìî íàõâúðëÿíî è íå å öÿëàòà (äà íå ñè ñè ïîìèñëèë äðóãî 8O ), ñìåÿ äà òâúðäÿ ÷å ðàçáèðàì äîñòà îò åëåêòðîíèêà è äà òè êàæà êúäå æèâåÿ òîâà íÿìà äà òè ïîìîãíå :lol: . Ïðîáëåìúò ìè å ñàìî ïðîãðàìèðàíåòî :cry: .
Ïàê áëàãîäàðÿ!


Чет Май 19, 2005 12:21 pm
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Аз нали затова ти написах това (не че и то не е разхвърляно), исках да видиш как като подредиш малко по-лесно се ориентираш къде може да възникне проблем. Схвана ли как работи схемата?


Чет Май 19, 2005 12:23 pm
Профил
Мнение 
Äà, â îáùè ëèíèè ãî ñõâàíàõ, íî ìèñëÿ ÷å è íÿêîå äðóãî îáÿñíåíèå ùå ìè äîéäå äîáðå. Ìàé å âðåìå äà ñå ðåãàñòðèðàì :lol:


Чет Май 19, 2005 12:41 pm
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
void init_ports(); // Стандартна за моите програми
int1 sensors_scan(); // Функция, която връща 1 ако някой бутон (датчик) е активиран
void Flash_GREEN(int8 count); // Мигане на зелено за 500мс count пъти
void Flash_RED(int8 count); // Мигане на червено за 500мс count пъти
int8 Get_Option_Time(); // Четене на трите ключа за настройка на време
Код:
// Тук се получава прекъсване от RB7:RB4 входовете (датчиците ти) и се вдига флага за задействане на алармата.
#int_RB
RB_isr()
{ alarm_triggered |= sensors_scan();
}

// Сканира на всеки 250us (май толкова го направих) за натискане на POWER_Key-a. Ако е натиснат, трябва да се задържи еди си колко сканирания след което превключва състоянието на алармата. По надол ако е вкл. алармата премигва червения светодиод.
#int_TIMER0
TIMER0_isr()
{ if (~POWER_Key) {counter++;POWER_LED = 1;}
    else counter = 0;
   if (counter == 20) Alarm_ON = ~Alarm_ON;
    If ((~Alarm_ON) & Alarm_Triggered)
      Alarm_Triggered = 0;
   If (Alarm_ON)
   {
   counter2++;
   If (counter2 > 5) {Alarm_LED = ~Alarm_LED;
                       If (Alarm_LED)
                         counter2 = 0;
                       else
                         counter2 = 220;}
                        }

}

void init_ports()
{ set_tris_a(0b11111000);
  set_tris_b(0xFF);
}


//сканира датчиците
int1 sensors_scan()
{ if ((PORTB & 0xF0) < 0xF0)
    return 1;
   else
    return 0;
}

void Flash_RED(int8 count)
{int8 i;
  for (i=0;i<count;i++){
  Alarm_LED = ~Alarm_LED;
  delay_ms(250);
  Alarm_LED = ~Alarm_LED;
  delay_ms(250);
  }
}

void Flash_GREEN(int8 count)
{int8 i;
  for (i=0;i<count;i++){
  Power_LED = ~Power_LED;
  delay_ms(250);
  Power_LED = ~Power_LED;
  delay_ms(250);
  }
}

int8 Get_Option_Time()
{ return ((~PORTB) & 0x07);}

//Включва сканирането на датчиците.
void Enable_Alarm()
{  enable_interrupts(INT_RB);
//   sleep();
}

// При включване на захранване се инициализират портовете и няколко променливи. Червения светодиод премигва 3 пъти (за гъзария), след което светва зелено. Оттам алармата чака вдигането на Alarm_ON флага (натискане на Power_Keу за определено време)...след което примигва 3 пъти червения светодиод. Тук следва трик за закъсненията...много елементарен: червения ти светодиод мига 1 път за 500 мс. За да получиш 1 секунда ти трябват 2 мигания, за 5 секунди - 10.
void main()
{int8 i;
   port_b_pullups(TRUE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   init_ports();
   counter = 0;
MAIN_LOOP:
   Relay = 0;
   Alarm_LED = 0;
   POWER_LED = 0;
   Alarm_Triggered = 0;
   Flash_RED(3);
   delay_ms(1000);
   Power_LED = 1;
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   do {;} while (~Alarm_ON);
   Disable_Interrupts(INT_Timer0);
   Flash_RED(Get_Option_Time()*2);
   do {;} while (~POWER_Key);
   Enable_Alarm();
   Enable_Interrupts(INT_TIMER0);
   while(1)
   { if (Alarm_Triggered)
       {    Flash_RED(Get_Option_Time()*2);
            Relay = 1;
            do { FLASH_GREEN(1);
                } while (Alarm_Triggered);
        };
   }
   goto MAIN_LOOP;
}


Може да има няколко бъга, все пак е писано за 15-ина минути. За подобрения може да сложиш функция, която да сканира дали са прекъснати кабелите на четерите датчика. Зареждаш кондензаторите (те стоят от страната на датчиците а не на платката с алармата) , проверяваш дали са 1....ако не са 1 значи някой им е отрязал саксиите. Може и да запаметяваш в EEPROM-а състоянието на алармата...аве ти си решаваш...за мен това си е една тренировка, колкото да не забравям какво е PIC16F84...


Чет Май 19, 2005 4:44 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 22 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: jordan-bg и 7 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни