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

Поредната Глупава Идея :)
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=10888
Страница 1 от 3

Автор:  hacker4eto1 [ Сря Дек 12, 2012 8:32 pm ]
Заглавие:  Поредната Глупава Идея :)

Здравейте , пак се допитвам до вас с надеждата да одарите едно рамо :)
Започнах да си правя един проект за умна стая в която да контролирам разни работи през компа и от тук идват леките ми ядове..
Снабдих се със Промишлен контролер с който да си играя а именно ето този .
Изображение
Снимах го до Кодовата брава за която ми помогнахте доста със сорса :)..та и нея контролирам с този контролер. както се вижда на снимката
си има 16 изходи и входове.
Направих си и моя програма с която да го управлявам това нещо посредством ком порта: с помоща на доста четене ..накратко това е програмата.Изображение
Та както се вижда опитвам се да пускам разни работи през компа .Това успях да го направя и тествам.. Работата е сега ,че искам да направя обратна връзка на това което виждате примерно вкл. ми е плейсташана и аз да получавам информация от самият обект към виртуалната ми среда. Пробвах с микроконтролера и Входовете директно през изхода пуснах една обратна връзка и се получава работата .. но аз не искам да е така искам да се опитам да го направя с микроконтролер.
Измислих ето това:
Изображение
Бутоните заместват примерно релета или някакъв друг вид контакт нарисувал съм ги така просто с цел експеримента.
Та схемата ще я направя нямам проблем с това комуникацията ми ще е по Rs232 или ще увелича броят терминали като сложа Rs485(незнам все още)...
С 2 думи на този виртуален терминал искам да ми пише инфото от съответният бутон примерно.
00000000 (8 нули ) когато не са натиснати (важно е да чета и 0 лите като състояние)
10000000 първи бутон натиснат...
101 ...... първи и 3 ти бутон натиснат..
Надявам се да ме разбирате..
Искам този микроконтролер само да праща информация. а не и да обработва.. за това изход RC6/Tx съм го вързал към RX на терминала..
проца ще го движа на 20мгх.
с хиляди търсения из гоогле стигнах само до това:
Код:
#include <16F877A.h>
#fuses HS, NOWDT, NOPUT, NODEBUG, NOLVP, NOBROWNOUT, NOCPD, NOPROTECT, NOWRT
#use delay(clock = 20000000)

#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7, ERRORS)

Знам ,че трябва да опиша в програмата кой изходи на проца ще използвам като входове..
и че да съставя 2 функции според зависи състоянието на бутона...,но малко съм бос даже доста в програмирането
Повярвайте ми изровил съм страшно много информация ..и не можах да намеря нещо според моя интерес.
И ви моля да няма коментари от сорта глупав си и прочие.. ако можете да ми помогнете или да ми давате насоки аз ще пробвам ще мъча но да сътвориме едно просто софтче :)

Автор:  CarBeta [ Сря Дек 12, 2012 10:31 pm ]
Заглавие:  Re: Поредната Глупава Идея :)

Не са две функции а две команди. На определено време взимаш PORTA и го слагаш в ТХREG.
Код:
MOVF   PORTA, W
MOVWF  TXREG

Автор:  Cekins [ Чет Дек 13, 2012 11:53 am ]
Заглавие:  Re: Поредната Глупава Идея :)

Не казвам че не ти е правилна схемата ама по удачно би било : 1. бутоните да са на порт Б и 2. бутоните да са към маса а резисторите към +5V(дето му се вика още пулъп). Всъщност такива пулъпи има и вградени на порт Б.
УАРТ-а по принцип след инициализация автоматично взема контрол върху пиновете (RC6 и RC7). Този процесор няма аналогови функции там, така че не ти трябва никаква конфигурация на порт С. В твоя случай трябва да настроиш единствено регистрите TXSTA и BAUDCON. След което, както колегата каза, четеш порта (инвертираш го ако искаш при натиснат бутон да ти дава 1 ако си ги вързал както казвам) и го записваш в TXREG. Цялото това нещо са 20-тина инструкции на асемблер, че дали не и по-малко.

Автор:  hacker4eto1 [ Пет Дек 14, 2012 12:14 am ]
Заглавие:  Re: Поредната Глупава Идея :)

Направих така както ми казахте и смених входовете и инветирах масата със захранванетона пуллуп резисторите Само се чудя като ги има вградени в микроконтролера дали е необходимо да ги слагам и от вън .. или от имане глава не боли :)
Ето схеми4ката утре ще почета малко уроци по софтуерната част. и ще ви покажа какво съм скопосал..
Изображение
Момчета каква е разликата между 877 и 877А 2 рият има нещо + но какво не можах да разбера..

Автор:  CarBeta [ Пет Дек 14, 2012 12:34 am ]
Заглавие:  Re: Поредната Глупава Идея :)

Ползвай си вътрешните пулъпи, освен ако не искаш да имаш повече чаркаляци по платката.

877 няма компаратори, 877А има два компаратора и има малко повече варианти на клока на АЦП'то.

Автор:  Cekins [ Пет Дек 14, 2012 12:56 pm ]
Заглавие:  Re: Поредната Глупава Идея :)

Имах предвид че няма анлогии на RC6 и RC7 където е уарт-а. Честно казано, препоръчвам външни пулъпи независимо че има вградени. Освен това за да ги ползваш трябва да ги включиш - на тоя процесор мисле че беше от OPTIONREG. Сега не ме питай що препоръчвам външни...

Автор:  hacker4eto1 [ Съб Дек 15, 2012 5:59 pm ]
Заглавие:  Re: Поредната Глупава Идея :)

Мисля ,че имам известен напредък с доста мъки разбира се :) ето какво сътворих.
Идеята е Тези бутони когато ги натисна да ми пише на терминала примерно кой бутон е натиснат..
Написах този код:
Код:
#include <16f877.h>
#use delay(clock=20M)
#use RS232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)




Void main() {
while (true){

if (input (pin_b0)) {
printf ("1");
delay_ms (1000);
}
if (input (pin_b1)){
printf ("2");
delay_ms (1000);
}
if (input (pin_b2)){
printf ("3");
delay_ms (1000);
}
if (input (pin_b3)){
printf ("4");
delay_ms (1000);
}
if (input (pin_b4)){
printf ("5");
delay_ms (1000);
}
if (input (pin_b5)){
printf ("6");
delay_ms (1000);
}
if (input (pin_b6)){
printf ("7");
delay_ms (1000);
}
if (input (pin_b7)){
printf ("8");
delay_ms (1000);
}
}
}

и ефекта стана но става само когато съм вързал схемата така:
Изображение
Натиснал съм произволни бутони а не поредни и се получи но проблема е ,че не мога да инвертирам нивата . ако ги вържа като пуллуп схемата постоянно праща на терминала високи нива..
Та как мога да ги инвертирам смисъл проца да ги чете обратно :)
Когато схемата е вързана така просто ги изрежда през 1 сек. всичките бутони... без да съм натиснал аз нещо.. Къде бъркам :?: :?:
Изображение

Автор:  raven_feather [ Съб Дек 15, 2012 7:04 pm ]
Заглавие:  Re: Поредната Глупава Идея :)

Не, че разбирам ама пробвай така да видим :)

if ((!input(pin...)))

Автор:  CarBeta [ Нед Дек 16, 2012 1:25 pm ]
Заглавие:  Re: Поредната Глупава Идея :)

Процесора прави каквото му казваш да прави, т.е. да изпраща байт, когато конкретния извод е с високо ниво. Накарай го да праща когато нивото е ниско. И 1 секунда прекалено голямо изчакване да се сканират всички бутони.

Автор:  amdatlon [ Нед Дек 16, 2012 2:31 pm ]
Заглавие:  Re: Поредната Глупава Идея :)

CarBeta написа:
Процесора прави каквото му казваш да прави, т.е. да изпраща байт, когато конкретния извод е с високо ниво. Накарай го да праща когато нивото е ниско. И 1 секунда прекалено голямо изчакване да се сканират всички бутони.


Да прав е колегата!

Нещо такова :
Код:
#include <16f877.h>
#use delay(clock=20M)
#use RS232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)




Void main() {
while (true){

if ( !input (pin_b0)) {
printf ("1");

}

if (!input (pin_b1)){
printf ("2");

}
if (!input (pin_b2)){
printf ("3");

}
if (!input (pin_b3)){
printf ("4");

}
if (!input (pin_b4)){
printf ("5");

}
if (!input (pin_b5)){
printf ("6");

}
if (!input (pin_b6)){

}
if (!input (pin_b7)){

}

delay_ms (20);

}
}


if (input (pin_b7)) - Ако пинБ7 е = 1
if (!input (pin_b7)) -Ако пинБ7 НЕ Е = 1

Автор:  hacker4eto1 [ Нед Дек 16, 2012 4:23 pm ]
Заглавие:  Re: Поредната Глупава Идея :)

Да получи се благодаря :) , сега като го вързах терминала след МАКС232 ми показва не числа а други неща това е нормално нали ,като закачих осцилоскопа ми дава различни сигнали значи всичко е точно така ли е :) и другият ми въпрос така както съм написал програмата ако натисна примерно 3 бутона едновременно според вас ще получа ли цялата информация .. понеже на симулацията ми забива програмата и ... не мога да разбера. какво ще стане ако ги натисна 3 едновременно :)

Автор:  valioman [ Пон Дек 17, 2012 9:12 am ]
Заглавие:  Re: Поредната Глупава Идея :)

Ако ги натиснеш едновременно ще получиш поредицата на тези числа/бутони според реда им на сканиране в while цикъла :)

Автор:  Cekins [ Пон Дек 17, 2012 10:16 am ]
Заглавие:  Re: Поредната Глупава Идея :)

Такааа... Принципа ти е следния - четеш си постоянно целия порт Б, инвертираш го - ако нямаш натиснат бутон, резулатат ще ти е 0, изчакваш 5-10 милисекунди, пак го прочиташ и го сравняваш с предния резултат, ако съвпадат, приемаш че имаш валидно събитие. Иначе ще получаваш десетки отчитания на един и същ бутон/и. Аз си имам готов модул бутони който се държи точно като нормална клавиатура - подава си еднократно натиснатия бутон, след което изчаква известно време и ако е задържан пак го подава, пак чака ама по малко и ако все още е натиснат го подава само че с по малко изчакване и така нататък. Извеждането към терминала не е задължително да е ASCII - може да си е просто прочетения байт от порта, а после вече от него си вадиш битовете и т.н.

Автор:  hacker4eto1 [ Вто Дек 18, 2012 12:18 am ]
Заглавие:  Re: Поредната Глупава Идея :)

Здравейте :) имах малко проблеми със този код който използвах понеже когато пиша програмата след това на Визуал басик.. която дефакто да ми визуализира състоянието на даден обект.. срещнах доста голяма трудност.. както каза "Carbeta" напиши по сложен код тук а във ВБ по лесен.. не го послушах и усетих какво е имал предвид. Малко пипнах кода с 300 та мъки и го направих така ,че да ми праща 2 състояния за отделен бутон за да може после по лесно да настроя програмата на ВБ.
Та ето кода:
Код:
#include <16f877.h>
#use delay(clock=20M)
#use RS232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
int Button1;
int Button2;
int Button3;
int Button4;
int Button5;
int Button6;
int Button7;
int Button8;




Void main() {
while (true){

       
        switch( Button1 )
        {
          case 1:
          if (!input(PIN_B0))
          {
            putc('2');
            Button1 = 0;
          }
          break;
     
          case 0:
          if (input(PIN_B0))
          {
            putc('3');
           Button1 = 1;
          }
          break;
        }
         
          switch( Button2 )
        {
          case 1:
          if (!input(PIN_B1))
          {
            putc('4');
            Button2 = 0;
          }
          break;
     
          case 0:
          if (input(PIN_B1))
          {
            putc('5');
           Button2 = 1;
          }
          break;
      }
        switch( Button3 )
        {
          case 1:
          if (!input(PIN_B2))
          {
            putc('6');
            Button3 = 0;
          }
          break;
     
          case 0:
          if (input(PIN_B2))
          {
            putc('7');
           Button3 = 1;
          }
          break;
          }
switch( Button4 )
        {
          case 1:
          if (!input(PIN_B3))
          {
            putc('8');
            Button4 = 0;
          }
          break;
     
          case 0:
          if (input(PIN_B3))
          {
            putc('9');
           Button4 = 1;
          }
          break;
          }
           switch( Button5 )
        {
          case 1:
          if (!input(PIN_B4))
          {
            putc('A');
            Button5 = 0;
          }
          break;
     
          case 0:
          if (input(PIN_B4))
          {
            putc('B');
           Button5 = 1;
          }
          break;
          }
           switch( Button6 )
        {
          case 1:
          if (!input(PIN_B5))
          {
            putc('C');
            Button6 = 0;
          }
          break;
     
          case 0:
          if (input(PIN_B5))
          {
            putc('D');
           Button6 = 1;
          }
          break;
          }
           switch( Button7 )
        {
          case 1:
          if (!input(PIN_B6))
          {
            putc('E');
            Button7 = 0;
          }
          break;
     
          case 0:
          if (input(PIN_B6))
          {
            putc('F');
           Button7 = 1;
          }
          break;
          }
           switch( Button8 )
        {
          case 1:
          if (!input(PIN_B7))
          {
            putc('J');
            Button8 = 0;
          }
          break;
     
          case 0:
          if (input(PIN_B7))
          {
            putc('H');
           Button8 = 1;
          }
          break;
          }
}
}
   

Обаче... Винаги има едно главно НО :)
Изображение
Забелязах ,че когато пусна програмата получавам веднага някакви битове примерно съм натиснал 3 бутона едновременно..
Според вас мога ли да го оправя това или да го прежаля :) като тези битове се пращат за по малко от сек .. само леко трепти праща и се оправя...

Автор:  hacker4eto1 [ Сря Дек 19, 2012 11:57 pm ]
Заглавие:  Re: Поредната Глупава Идея :)

Момчета най-накрая постигнах успеха който искам :) Направих и клипче да видите и 2 те програми как се държат.
ако имате забележки споделете да ги отстраня . Както и мнения по въпроса :)
http://www.vbox7.com/play:90930052c2

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