Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

ïîìîù
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=673
Страница 1 от 2

Автор:  ïîìîù [ Сря Май 18, 2005 11:38 am ]
Заглавие:  ïîìîù

Íàïèñàõ òàçè ïðîãðàìêà è ÿ èçïðîáâàõ íà 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;
}

Автор:  HCL [ Сря Май 18, 2005 1:33 pm ]
Заглавие: 

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

Автор:  ïîìîù [ Сря Май 18, 2005 2:11 pm ]
Заглавие: 

Ìîæå ðåàëèçàöèÿòà äà å ñòðàííà, íî ïðîãðàìàòà ñå å ïðàâèëíà è ñïîðåä ñèìóëàòîðà íàèñòèíà ðàáîòè, íî íàïðàêòèêà ñ ðåàëåí ïèê íåùî íå å íàðåä. Ëîãè÷åñêè ïîãëåäíàòî íå âèæäàì ïðîáëåìè!!! :roll:

Автор:  bateAz [ Сря Май 18, 2005 2:26 pm ]
Заглавие: 

Има логика в това while(i) само ако някакъв фонов процес ( ISR ) промени i. Иначе while(1) е къде къде по-разбираемо написано.

Автор:  Predator_MF [ Сря Май 18, 2005 3:00 pm ]
Заглавие: 

Тоя спагети код си изглежда работещ....кажи кво имаш по портовете? Аз това мога да си го обясня единствено с хардуерна грешка....преди време ми се наложи заради точно такъв проблем да добавям по 4.7V ценери на едни 40 входа :lol: Искам да кажа, че ако подадеш отрицателно напрежение, или нещо по-високо от 5V става такова нещо, PIC-a отива незнайно къде...

Автор:  ïîìîù [ Сря Май 18, 2005 6:24 pm ]
Заглавие: 

Àìè öÿëàòà ìè ñõåìà å çàõðàíåíà ñ òî÷íî 5V è ïî ïîðòîâåòå îñâåí 0V èëè 5V äðóãî íÿìà! 8O

Автор:  HCL [ Сря Май 18, 2005 6:30 pm ]
Заглавие: 

Като споменаваш портовете, да не взимаш захранване от ПЦ-то. Защото ако е така, мисля че няма да навреди да измериш колко точно.

Автор:  ïîìîù [ Сря Май 18, 2005 6:46 pm ]
Заглавие: 

Çíà÷è ....... ñõåìàòà íà óñòðîéñòâîòî â ìîìåíòà ñå çàõðàíâà îò ðåãîëðóåì ñòàáèëèçàòîð è òàì ïðîáëåìè ñ íàïðåæåíèåòî íå ìîæå äà èìà. Ùî ñå îòíàñÿ äî ïðîãðàìàòîðà, àç ñúì JDM è çàõðàíâàíåòî ìè ñå ïîäàâà îò ÏÖ-òî. Íî íå ìèñëÿ ÷å òîâà å ïðîáëåìà çàùîòî ñúùîòî ÏÈÊ×Å ñúì ïîäêàðâàë äðóãè ïðîãðàìè íà ñúùèÿ ïðîãðàìàòîð. Ñîôòóåðà ìè å IC-Prog.

Автор:  Predator_MF [ Сря Май 18, 2005 7:37 pm ]
Заглавие: 

Абе я обясни какво прави тази програма...на мен на цветомузика ми прилича :wink:

Автор:  ïîìîù [ Сря Май 18, 2005 8:08 pm ]
Заглавие: 

Îò êîäà ìè ñå âèæäà, ÷å ñúì íà÷èíàåù. Òà ñè ïðàâÿ åäíà äîìàøíà àëàðìè÷êà è òÿ èçãëåæäà òàêà:

Автор:  Predator_MF [ Чет Май 19, 2005 2:13 am ]
Заглавие: 

Хе, къде живееш...такоз де, ако очакваш тая алармичка да те опази...Ако и платаката си сглобил както схемата... :lol: Майтапа настрани, ето ти мое решение...понеже не мога по друг начин да ти обясня колко е разхвърляно при тебе :D

Автор:  ïîìîù [ Чет Май 19, 2005 12:21 pm ]
Заглавие: 

Õèùíèê, áëàãîäàðÿ çà ñõåìàòà! Íå ñå îáèæäàé, íî íå âèæäàì çàùî ìîÿò ïðîåêò äà íå òå ïàçè, àêî ñîðñà ðàáîòåøå òîëêàâà äîáðå êîëêîòî íà ñèìóëàòîðà, âñå ïàê àç ñúì íà÷èíàåù ñ ìèêðîêîíòðîëåðèòå è êîãàòî òè âèäÿõ ñîðñ êîäà ðàçáðàõ êîëêî ìíîãî èìàì äà ó÷à, çà äà ìîãà äà ãè ïðîãðàìèðàì êàòî õîðàòà. Íåâèæäàì ïðîáëåì ïî ñõåìàòà ìè, âñå ïàê òîâà å ñàìî íàõâúðëÿíî è íå å öÿëàòà (äà íå ñè ñè ïîìèñëèë äðóãî 8O ), ñìåÿ äà òâúðäÿ ÷å ðàçáèðàì äîñòà îò åëåêòðîíèêà è äà òè êàæà êúäå æèâåÿ òîâà íÿìà äà òè ïîìîãíå :lol: . Ïðîáëåìúò ìè å ñàìî ïðîãðàìèðàíåòî :cry: .
Ïàê áëàãîäàðÿ!

Автор:  Predator_MF [ Чет Май 19, 2005 12:23 pm ]
Заглавие: 

Аз нали затова ти написах това (не че и то не е разхвърляно), исках да видиш как като подредиш малко по-лесно се ориентираш къде може да възникне проблем. Схвана ли как работи схемата?

Автор:  ïîìîù [ Чет Май 19, 2005 12:41 pm ]
Заглавие: 

Äà, â îáùè ëèíèè ãî ñõâàíàõ, íî ìèñëÿ ÷å è íÿêîå äðóãî îáÿñíåíèå ùå ìè äîéäå äîáðå. Ìàé å âðåìå äà ñå ðåãàñòðèðàì :lol:

Автор:  Predator_MF [ Чет Май 19, 2005 4:44 pm ]
Заглавие: 

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...

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/