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

Индикатор За скорости (сорс код проблем)
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=11489
Страница 1 от 4

Автор:  hacker4eto1 [ Чет Юни 27, 2013 8:40 pm ]
Заглавие:  Индикатор За скорости (сорс код проблем)

ЗДравейте, днес цял ден се лутам с една глупост.. Правя си индикатор за скорости..
Та ето с 2 думи до къде съм стигнал..
Изображение
Идеята е проста когато съм на задна да ми пише "R" на таблото а на скоростният ми лост да свети нея буква..
когато съм на 1 ва да свети на таблото 1 ца а на лоста 1..
Така.. Почнах да пиша сорса и стигнах до това положение.
Код:
#include <16F873A.H>
#fuses XT, NOPROTECT, NOWDT, BROWNOUT, PUT, NOLVP
#use delay(clock=20000000)

#define BUTTONR  PIN_A0
#define BUTTON1  PIN_A1

#define LEDR     PIN_C2
#define LED1     PIN_C3
#define LEDA     PIN_B0
#define LEDB     PIN_B1
#define LEDC     PIN_B2
#define LEDD     PIN_B3
#define LEDE     PIN_B4
#define LEDF     PIN_B5
#define LEDG     PIN_B6
#define ON      0
#define OFF     1

void main()
{

set_tris_a(0x01);
set_tris_c(0x00); 
  int  LedStatus = OFF;
 
   while (TRUE)
   {   
      if (input(BUTTONR) == 1)
      {
          output_high(LEDR);
          output_low(LEDA);
          output_low(LEDB);
          output_low(LEDC);
          output_low(LEDE);
          output_low(LEDF);
          output_low(LEDG);
          LedStatus = ON;
            delay_ms(200);
           
      }
      else if (input(BUTTONR) == 0)
      {
           output_low(LEDR);
           output_high(LEDA);
           output_high(LEDB);
           output_high(LEDC);
           output_high(LEDE);
           output_high(LEDF);
           output_high(LEDG);
           LedStatus = OFF;
            delay_ms(200);   
      }
      if (input(BUTTON1) == 1)
      {
          output_high(LED1);
         
          output_low(LEDB);
          output_low(LEDC);
         
          LedStatus = ON;
            delay_ms(200);
           
      }
      else if (input(BUTTON1) == 0)
      {
           output_low(LED1);
       
           output_high(LEDB);
           output_high(LEDC);
           
           LedStatus = OFF;
            delay_ms(200);
           
      }
  }

}

обаче кода работи само до задната скорост "R" и става ето това.
Изображение
когато добавя и 2 рата част за 2 рият бутон а именно "1" както се вижда в сорса по-горе,цялата работа се бъгва...
Като натисна бутон 1 Си свети диод 1 но на 7 сегментният индикацията която описва цифрата 1 започва да мига...
Изображение
а като натисна бутон за задната скорост. 7 сегментният свети "R" но мига часта която описва 1...
Дано ме разбрахте правилно...
П.П не съм много в час с програмирането да си призная (то си и личи де :finga: ) чета и се уча..Та Момчета къде бъркам ?
Мислех да движа 7 сегментният със 7447 но като му видях таблицата за истиннос няма индикация за "H"-неутрална и "R"- задна... за това реших да ги "паля" отделно всеки диод на дисплея..

Автор:  relsys [ Чет Юни 27, 2013 9:48 pm ]
Заглавие:  Re: Индикатор За скорости (сорс код проблем)

Направи една таблица (масив) със 7 стойности със съответната стойност за цифрата/буквата на индикатора (0 - Н, 1 - 1, ... 6 - r). Добави още един диод на RC0 за неутрал, премести 1 на RC1.... r на RC6 (за да ти е по-лесно със сорса). Бутоните ги сложи с активна '0'. После четеш PORTA , инвертираш, и стойността директно я изкарваш на PORTC, а с определяне на кой бит е сетнат ще ти е офсет за таблицата кой знак да изкараш на PORTB (може и switch - case ако така ти е трудно).

Постни схемата за Proteus и ще ти я драсна....

Автор:  hacker4eto1 [ Чет Юни 27, 2013 9:58 pm ]
Заглавие:  Re: Индикатор За скорости (сорс код проблем)

http://www.speedyshare.com/UaNJV/skorosti.DSN
искаш да кажиш да направя една таблиза за истинност на възможните комбинации от 1 до 5 и Н И Р :) добре това ще го направя.. и ще пробвам да видя какво ще стане

Автор:  sparkybg [ Чет Юни 27, 2013 10:11 pm ]
Заглавие:  Re: Индикатор За скорости (сорс код проблем)

И сложи един 4.7 килоомов резистор от MCLR към 5v.

Автор:  Koleto [ Пет Юни 28, 2013 12:52 am ]
Заглавие:  Re: Индикатор За скорости (сорс код проблем)

И не че е много фатално в случая ама ако кварца е 24МХз оправи и това:

#use delay(clock=20000000)

Автор:  didofen [ Пет Юни 28, 2013 9:30 am ]
Заглавие:  Re: Индикатор За скорости (сорс код проблем)

даже за 24 трявва да е HS, да не говорим че са до 20
п.с. това реализирал ли си го физически или караш само на протеус?

Автор:  hacker4eto1 [ Пет Юни 28, 2013 9:55 am ]
Заглавие:  Re: Индикатор За скорости (сорс код проблем)

Карам за сега само на протеус.. проблем ли е ,че съм ги дал на 20МГХ? и какво имаш предвид трябва да е HS малко по подробно го убеснявайте :)

Автор:  itso.t [ Пет Юни 28, 2013 11:15 am ]
Заглавие:  Re: Индикатор За скорости (сорс код проблем)

Конфигурацията на осцилатора трябва да е "HS".

И не се пише "убеснявайте". Правилното е "убисневуйти".

Автор:  hacker4eto1 [ Пет Юни 28, 2013 1:43 pm ]
Заглавие:  Re: Индикатор За скорости (сорс код проблем)

Извинявам се за правописните грешки.. :oops:
Малко раздвижих проекта.. ще оправя и забележките които изказахте.
Ето как се държи сега програмата на симулация:
Клип:
http://img853.imageshack.us/img853/2563/gghxozeebmeweyexlcqgye.mp4
Справих се с проблема който имах по-горе ,но се появи този проблем който накрая се вижда а именно какво става ако се натиснат 2 бутона примерно..
Има ли някаква фунцкия или пример да ми дадете с който да изкл. "опцията" да бъдат натиснати 2 бутона смисъл да чете само един който е натиснат. (или много филми съм гледал :oops: )
Ето сорса кода както е сега. не съм променил само колегата както каза по горе това за кварца.
Код:
#include <16F873.h>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=20000000)

#define LEDA     PIN_B0
#define LEDB     PIN_B1
#define LEDC     PIN_B2
#define LEDD     PIN_B3
#define LEDE     PIN_B4
#define LEDF     PIN_B5
#define LEDG     PIN_B6
#define ON      0
#define OFF     1
int ButtonR;
int Button1;
int Button2;
int Button3;
int Button4;
int Button5;
void main()
{
 
   ButtonR=1;
   Button1=1;
   Button2=1;
   Button3=1;
   Button4=1;
   Button5=1;

    while(true)
    {
   
   
        switch( ButtonR )
        {
          case 1:
          if (!input(PIN_A0))
          {
           output_high(PIN_C0);
           output_low(LEDA);
         output_low(LEDB);
          output_low(LEDC);
          output_low(LEDE);
          output_low(LEDF);
          output_low(LEDG);
         
         
           delay_ms(200);
            ButtonR = 0;
          }
          break;
     
          case 0:
          if (input(PIN_A0))
          {
           output_low(PIN_C0);
           output_high(LEDA);
           output_high(LEDB);
           output_high(LEDC);
           output_high(LEDE);
           output_high(LEDF);
           output_high(LEDG);
         
         
            delay_ms(200);   
           ButtonR = 1;
          }
          break;
        }
         
          switch( Button1 )
        {
          case 1:
          if (!input(PIN_a1))
          {
            output_high(PIN_C1);
            output_low(PIN_B1);
            output_low(PIN_B2);
            delay_ms(200);
            Button1 = 0;
          }
          break;
     
          case 0:
          if (input(PIN_a1))
          {
            output_low(PIN_C1);
            output_high(PIN_B1);
            output_high(PIN_B2);
            delay_ms(200);
            Button1 = 1;
          }
          break;
      }
       switch( Button2 )
        {
          case 1:
          if (!input(PIN_A2))
            {
            output_high(PIN_C2);
          output_low(LEDA);
          output_low(LEDB);
          output_low(LEDG);
          output_low(LEDE);
          output_low(LEDD);
           delay_ms(200);
           
            Button2 = 0;
          }
          break;
     
          case 0:
          if (input(PIN_A2))
            {
            output_low(PIN_C2);
           output_high(LEDA);
          output_high(LEDB);
          output_high(LEDG);
          output_high(LEDE);
          output_high(LEDD);
          delay_ms(200);
           
           Button2 = 1;
          }
          break;
          }
          switch( Button3 )
        {
          case 1:
          if (!input(PIN_A3))
          {
          output_high(PIN_C3);
          output_low(LEDA);
          output_low(LEDB);
          output_low(LEDG);
          output_low(LEDC);
          output_low(LEDD);
          delay_ms(200);
            Button3 = 0;
          }
          break;
     
          case 0:
          if (input(PIN_A3))
          {
          output_low(PIN_C3);
          output_high(LEDA);
          output_high(LEDB);
          output_high(LEDG);
          output_high(LEDC);
          output_high(LEDD);
          delay_ms(200);
           Button3 = 1;
          }
          break;
          }
         switch( Button4 )
        {
          case 1:
          if (!input(PIN_A4))
          {
          output_high(PIN_C4);
          output_low(LEDF);
          output_low(LEDG);
          output_low(LEDB);
          output_low(LEDC);
          delay_ms(200);
            Button4 = 0;
          }
          break;
     
          case 0:
          if (input(PIN_A4))
          {
          output_low(PIN_C4);
          output_high(LEDF);
          output_high(LEDG);
          output_high(LEDB);
          output_high(LEDC);
          delay_ms(200);
           Button4 = 1;
          }
          break;
          }
          switch( Button5 )
        {
          case 1:
          if (!input(PIN_A5))
          {
          output_high(PIN_C5);
          output_low(LEDA);
          output_low(LEDF);
          output_low(LEDG);
          output_low(LEDC);
          output_low(LEDD);
          delay_ms(200);
            Button5 = 0;
          }
          break;
     
          case 0:
          if (input(PIN_A5))
          {
            output_low(PIN_C5);
            output_high(LEDA);
            output_high(LEDF);
            output_high(LEDG);
            output_high(LEDC);
            output_high(LEDD);
            delay_ms(200);
           Button5 = 1;
          }
          break;
          }
    }
}


П.П измислих Когато колата не е на скорост. и никой от бутоните не е натиснат всичките диоди да мигат ,а на дисплея да свети постоянно "Н" Според вас възможно ли е и ако да каква фунцкия да използвам и ако може пример?
Благодаря предварително на отзовалите се. :mrgreen:

Автор:  CarBeta [ Пет Юни 28, 2013 2:39 pm ]
Заглавие:  Re: Индикатор За скорости (сорс код проблем)

При така написана програма е нормално това поведение. При натискане на бутон просто светваш нужните сегменти, приемайки на доверие, че останалите не светят, а при отпускане гасиш тия, които си светнал, пак приемайки на доверие, че останалите не светят. Задавай ниво на всички сегменти! Ако искаш да не реагира на повече от един бутон или каквото там искаш, трябва да си поиграеш още малко със софтуера!

Автор:  relsys [ Пет Юни 28, 2013 2:54 pm ]
Заглавие:  Re: Индикатор За скорости (сорс код проблем)

Е аз малко понагоре поописах алгоритъма... Чети целия PORTA и го вкарай него в един switch-case, така ще отфилтрираш повече от един натиснат бутон и програмата ще стане 5-10 реда.

Автор:  raven_feather [ Пет Юни 28, 2013 7:50 pm ]
Заглавие:  Re: Индикатор За скорости (сорс код проблем)

За LED, които са на порт B не е ли по-лесно с една команда да ги сменяш ,за да спестиш писане :)
output_b(0xFF) - HIGH
output_b(0x0) - LOW

Автор:  ToHu [ Съб Юни 29, 2013 12:18 am ]
Заглавие:  Re: Индикатор За скорости (сорс код проблем)

Ами то по горе са му писали как да го направи най-лесно и ефективно и като код и като производителност. Варианта с аблица е най-оптималния,става ленсо, бързо и гъвкаво.

Автор:  itso.t [ Съб Юни 29, 2013 12:31 am ]
Заглавие:  Re: Индикатор За скорости (сорс код проблем)

hacker4eto1 написа:
...Малко раздвижих проекта.. ще оправя и забележките които изказахте...


Според мен, ще е по-добре да дефинираш числата които искаш да се изписват на дисплея като състояние на порта. Например, 1 е съставено от сегменти "B" и "C", което при активно състояние на порта 0, съответства на 0xF9, 2 от A, B, D, E, G, което е 0xA4...

#define GEAR_1 0xF9
#define GEAR_2 0xA4

output = GEAR_1;

Автор:  hacker4eto1 [ Съб Юни 29, 2013 5:29 pm ]
Заглавие:  Re: Индикатор За скорости (сорс код проблем)

Нещо не ми се получава искам сега да направя часта със това когато никой бутон не е натиснат диодите да мигат успявам да го постигна това но когато натисна някой от бутоните всички светят 8O 8O а не трябва да е така трябва да остане да свети само този диод на който му е натиснат бутона..
Код:
if (input(PIN_A0))
    if (input(PIN_A1))
    if (input(PIN_A2))
    if (input(PIN_A3))
    if (input(PIN_A4))
    if (input(PIN_A5))
      delay_ms(200); 
      output_high(Pin_c0);
      output_high(Pin_c1);
      output_high(Pin_c2);
      output_high(Pin_c3);
      output_high(Pin_c4);
      output_high(Pin_c5);
      delay_ms(200);   
      output_low(pin_c0);
      output_low(pin_c1);
      output_low(Pin_c2);
      output_low(Pin_c3);
      output_low(Pin_c4);
      output_low(Pin_c5);

вече все повече се убеждавам ,че програмирането не е з амен :) а ако е за мен то едни романи се пишат....
itso.t написа:
hacker4eto1 написа:
...Малко раздвижих проекта.. ще оправя и забележките които изказахте...


Според мен, ще е по-добре да дефинираш числата които искаш да се изписват на дисплея като състояние на порта. Например, 1 е съставено от сегменти "B" и "C", което при активно състояние на порта 0, съответства на 0xF9, 2 от A, B, D, E, G, което е 0xA4...

#define GEAR_1 0xF9
#define GEAR_2 0xA4

output = GEAR_1;

Колега как ли не го въртях това ... все ми дава грешка в реда output = GEAR_1; и по конкретно грешка
Expecting LVALUE such as a variable name or *expresion...
П.П знам ,че ми казвате кое как да стане ама явно не мога да ви разбера опитвам го но не се получава.. уценям ,че ме траете :)

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