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

PIC12F509 - написах код ама работи само на симулация
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=16908
Страница 1 от 4

Автор:  Ванко [ Вто Дек 17, 2019 10:33 pm ]
Заглавие:  PIC12F509 - написах код ама работи само на симулация

Здравейте, написах код за PIC12F509 за 2 бутона към rotary encoder или двупосочен квадратурен генератор тоест да подменя rotary encoder с бутони
Флашнах го на PIC16F648 и работи, работи и в симулация на Proteus (естествено с промяна на командата за порт) на PIC12C509 (C509 беше най-близо до F509 което в същност имам).

Проблема идва от това, че когато го програмирам на реален PIC12F509 - чипа нищо не прави! Виждам, че е жив понеже като натисна Резет бутона двата светодиода премигват и толкова. Поставих 2 светодиода на изходите за да следя за реакция.
Схемата е следната:

GP0 = UP - Бутон с резистор 10к към маса
GP1 = DN - бутон с резистор 10 към маса
GP2 = не е свързан, зададен като изход
GP3 = RESET през 10k към Vcc и бутон към GND
GP4 = OUT B - Изход 2 - свързан през 220 ома резистор и светодиод към GND
GP5 = OUT A - Изход 1 - свързан през 220 ома резистор и светодиод към GND

Изходите си седят логически 1 без никаква реакция!
Къде бркам? 3-4 дена се мъча с какви ли не конфигурации на регистрии не ще, имам 2 нови чипа PIC12F509!

MPLAB IDE 8.30 с компилатор High-Tech C компилира без никакъв проблем за F509.
Бушоните са извън кода и са следните - IntOSC, CP - OFF, RESET - ON, WDT - OFF

програматора ми е PicKit3 и също флашва без никакви забележки!

Просто не ще и не ще да тръгне на истински чип.

Ей това е кода:
Код:
/*
PIC12F509 buttons to
rotary encoder truth table.
===========================
Count UP   OUTA  OUTB
===========================
<1.1> =     H  -  H
<1.2> =     L  -  H
<2.1> =     L  -  L
<2.2> =     H  -  L
===========================
Count DN   OUTA  OUTB
===========================
<1.1> =     H  -  H
<1.2> =     H  -  L
<2.1> =     L  -  L
<2.2> =     L  -  H
===========================
*/
#include

#if defined(_12F509)
  __CONFIG(0x31FA);
#endif

//define buttons
#define UP GP0
#define DN GP1
unsigned int j;
// 8  = number of loop iterations for 1 ms at 4 MHz
#define loop4_ms 8

//functions
void pause_ms(unsigned int given_ms);               // pause for given_ms milli seconds
//end functions
int REP;        //Repeat cycle 'n' times

unsigned char const STEPS_MAP[4] = {0b111000,0b011000,0b001000,0b100100};
int step=0;

//main code
void main(void) {   
#if defined(_12F509)
    TRIS = 0b001011;          // Set GP4,GP5 as outputs & GP3, GP0, GP1 as input (0 => Output, 1 => input)
#endif
    GPIO   = 0b001000;        // Set GPIO = 0 for all output but 1 for GP3/MCLR input
   OPTION = 0b11010000;   
do
     {
         if (UP)            //Check if switch  is closed
           {
             pause_ms(90);   //wait for 90ms  (switch debouncing)
             if (UP)         //Check if switch is still closed
                {
                 for(REP=0; REP<=1; REP++)        //Repeat steps until 'n'
               {
                GPIO = (STEPS_MAP[step]);     //Load current state
                pause_ms(250);                  //Pulse time
              step++;                        //Count +
              if (step>3)step=0;

               }
              REP;                //End REP

                }
           }

          else
             {
                 GPIO = (STEPS_MAP[step]);
             }
          if (DN)            //Check if switch  is closed
           {
             pause_ms(90);   //wait for 90ms  (switch debouncing)
             if (DN)         //Check if switch is still closed
                {
                  for(REP=0; REP<=1; REP++)
              {
               GPIO = (STEPS_MAP[step]);     //Load current state
               pause_ms(250);                  //Pulse time
                 step--;                        //Count -
                 if (step<0)step=3;
             }
                 REP;                //End REP
                }
           }
          else
             {
                 GPIO = (STEPS_MAP[step]);
             }
             
     }

   while(1);
}
//end main code

   void pause_ms( unsigned int given_ms ) {  // pause for given_ms milli seconds
   
   unsigned long j, max_time = given_ms * loop4_ms;
    for(j=0; j < max_time; j++);          // Make waiting for about given_ms msec
};

Това е функцията, която се опитвам да направя:
Код:
loop4_ms=8  -> имитира 1mS закъснение, за 4MHz вграден осцилатор идва 8 процесорни цикъла

STEPS_MAP таблицата отговаря на светодиодите както следва - AB -> 11 01 00 10
първи старт от step0 (т. е. 11)

Ако бутон UP = 1 за повече от 90mS и по-малко от 250mS -> брои две стъпки нагоре от текущата таблица STEPS_MAP
т.е. -> step0 изчаква 90mS step1 чака 250mS -> и остава на стъпка 2 или съответно 0

Ако задържа UP за повече от 250mS -> прави още 2 стъпки ли продължава да брои докато държа бутона
т.е. -> step0 -> чака 90mS step1 -> чака 250mS -> step2 -> чака 90mS -> step3 -> чака 250mS -> step0 ... и т.н. (0,1,2,3,0,1, ...)

като отпусна бутона остава на съответната стъпка 0 или 2
като натисна пак продължава от където е стигнало

Ако бутон DN = 1 за повече от 90mS и по-малко от 250mS -> брои две стъпки надолу от текущата таблица STEPS_MAP
т.е. -> step0 чака 90mS step1 чака 250mS -> и спира на съответната 0 или 2

Ако задържа DN за повече от 250mS -> прави още 2 стъпки ли продължава да брои докато държа бутона
т.е. -> step3 -> чака 90mS step2 -> чака 250mS -> step1 -> чака 90mS -> step0 -> чака 250mS -> step3 ... и т.н. (3,2,1,0,3,2, ...)

като отпусна бутона остава на съответната стъпка 0 или 2
като натисна пак продължава от където е стигнало

Всеки път като натисна някой от бутоните да продължава от съответната стъпка а не от началото на STEPS_MAP

Прикачам и целия проект на Proteus 7.10 и MPLAB IDE 8.30, в архива има и снимки от симулацията - работи отлично.
Вижда се как ТЕТРИС фигурката е огледална :lol:
Моля, ако някой знае как и може да ми помогне!

Прикачени файлове:
Коментар на файл: Експеримантално шаси
IMG_20191214_104625.jpg
IMG_20191214_104625.jpg [ 2.15 MiB | Прегледано 7755 пъти ]
Коментар на файл: Проект
12F509.zip [1.4 MiB]
238 пъти
Коментар на файл: Схемата
F509_B_rot.jpg
F509_B_rot.jpg [ 104.67 KiB | Прегледано 7761 пъти ]

Автор:  ToHu [ Сря Дек 18, 2019 4:18 am ]
Заглавие:  Re: PIC12F509 - написах код ама работи само на симулация

Ами той C509 е еднократно програмируем, ако преди това си качвал и друго на него няма как да работи, освен ако не е развоен с прозорче.

Автор:  Cekins [ Сря Дек 18, 2019 10:20 am ]
Заглавие:  Re: PIC12F509 - написах код ама работи само на симулация

Точка първа - PIC12F509 не е компютър. Пълно глупост на тая въшка да ползваш индексно адресиране - само там генерираш тон код. Не знам как точно се справя хайтек Ц с банкирането на програмната памет, щото тая плюнка и там има "банкиране". Ако програмата ти е по-голяма от 128 думи, почти сигурно е че там се осира. Протеуса това нещо не го симулира правилно.

Като искаш нещо 8 пиново има къде къде по смислени алтернативи - примерно 12F1822 - линейна програмна памет, фср регистри и още куп хардуер, дето това което го искаш май може и без програма да стане - само с периферия.

Автор:  Ванко [ Сря Дек 18, 2019 3:01 pm ]
Заглавие:  Re: PIC12F509 - написах код ама работи само на симулация

Благодаря за отговорите!

ToHu 12C509 ползвам само за симулацията, компилирам за F509 и флашвам на F509.

Cekins Аз го имам направено и работещо с CMOS логика, но исках да е по-компактно, освен това тези "въшки" вече ги имам купени и исках да ги използвам.
Пробвах и само мигалка за GP0 през 500mS но и това не тръгна (но всичко работи в симулацията), нещо не е наред с конфигурацията и немога да го изловя или даташиита има грешка, че там е и мешан с 16F505 което е 14 пиново подобие но с 11 IO мисля беше. Да, знам, че не е компютър ама то нищо не тръгва на яве!
Сякаш някаква второстепенна функция е задействана или пък не е задействана и нямам достъп до изводите, Как ли не го ръчках.
Нямам идея как да реша проблема, а информацията е оскъдна та реших да се допитам до по-знаещи и можещи.
Тука окастрих кода и размених GP0, GP1 c GP5, GP4 ама се тя, пак същия ефект:
Код:
/*
PIC12F509 buttons to
rotary encoder truth table.
===========================
Count UP   OUTA  OUTB
===========================
<1.1> =     H  -  H
<1.2> =     L  -  H
<2.1> =     L  -  L
<2.2> =     H  -  L
===========================
Count DN   OUTA  OUTB
===========================
<1.1> =     H  -  H
<1.2> =     H  -  L
<2.1> =     L  -  L
<2.2> =     L  -  H
===========================
*/
#include <pic.h>

#if defined(_12F509)
  __CONFIG(0x31FA);
#endif

//define buttons
#define _XTAL_FREQ 4000000
#define UP GP5
#define DN GP4
#define loop4_ms 8  // 8 is number of loop iterations for 1 ms at 4 MHz

//**********functions****************

unsigned int j;

void pause_ms(unsigned int given_ms);               // pause_ms(n); function same as delay_ms(n);

//**********mapping steps************

unsigned char const STEPS_MAP[4] = {0b1011,0b1010,0b1000,0b1001};
int step=0;

//main code
void main(void) {   
#if defined(_12F509)
    TRIS = 0b111000;          // Set GP0,GP1,GP2 as outputs & GP3, GP5, GP4 as input (0 => Output, 1 => input)
#endif
    GPIO   = 0b001000;        // Set GPIO = 0 for all output but 1 for GP3/MCLR input
   OPTION = 0b11000000;      //Set functions for MCU pins - 0xC0
       
do
     {
         if (UP)            //Check if switch  is closed
           {
             pause_ms(90);   //wait for 90ms  (switch debouncing)
             if (UP=1)         //Check if switch is still closed
                {
                GPIO = (STEPS_MAP[step]);     //Load current state
                pause_ms(250);                  //Pulse time
              step++;                        //Count +
              if (step>3)step=0;            
            }
           }

          else
             {
                 GPIO = (STEPS_MAP[step]);
             }
          if (DN=1)            //Check if switch  is closed
           {
             pause_ms(90);   //wait for 90ms  (switch debouncing)
             if (DN)         //Check if switch is still closed
                {
                GPIO = (STEPS_MAP[step]);     //Load current state
               pause_ms(250);                  //Pulse time
                 step--;                        //Count -
                 if (step<0)step=3;
               }
            }
          else
             {
                 GPIO = (STEPS_MAP[step]);
             }
     }

   while(1);
      }
//end main code

   void pause_ms( unsigned int given_ms ) {  // pause for given_ms milli seconds
   
   unsigned long j, max_time = given_ms * loop4_ms;
    for(j=0; j < max_time; j++);          // Make waiting for about given_ms msec
};

Автор:  ig_ivanov [ Сря Дек 18, 2019 4:05 pm ]
Заглавие:  Re: PIC12F509 - написах код ама работи само на симулация

От конфигурационната дума забрани WDT и виж пак там дали е избран вътрешния генератор. От OPTION register може да изключиш pull-up-a, и без това ползваш външни резистори.
ПП: Всъщност, сега видях, че ако GP3 e конфигуриран за MCLR, pull-up са винаги включени.

Автор:  Ванко [ Сря Дек 18, 2019 5:08 pm ]
Заглавие:  Re: PIC12F509 - написах код ама работи само на симулация

Благодаря за отговора.
ig_ivanov WDT е изключен, осцилатора е вътрешен (IntOSC), Резета (GP3) е включен да (в първия пост съм дал бушоните)... явно съм пропуснал момента където е описано, че резето автоматично включва вътрешните повдигащи резистори (макар, че не би трябвало да ми пречат ... май :) ), ще го спра, но в OPTION регистъра съм ги спрял да не ми се пречкат и там аномалията с GP2/T0CKI също съм я настроил уж, даже го сложих изход.

Прикачени файлове:
Коментар на файл: Даташиита
PIC12F509_505.pdf [1.45 MiB]
295 пъти

Автор:  stefan63 [ Сря Дек 18, 2019 5:10 pm ]
Заглавие:  Re: PIC12F509 - написах код ама работи само на симулация

Имаше някакъв екран в ИДЕ-то - оттам да зададеш конфиг.дума , не в сорса....
Ама кога кое беше валидно, не помня.

Автор:  ToHu [ Сря Дек 18, 2019 5:13 pm ]
Заглавие:  Re: PIC12F509 - написах код ама работи само на симулация

ами то не остава много, конфигурационна дума трябва да е тоя е по прост от бобена чорба. Виж дали си на вътрешен, виждаш ли си конфигурационната дума ? Гледам при тях се пише нещо ткаова :
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & BOREN_ON & LVP_OFF & CPD_OFF & CP_OFF);
Виждам че в твоят код е директно сетната конфигурационната дума, сега не ми се рови да видя дали е правилна, пробвай да изпозлваш тов апо-горе, по-разбираемо е.

Автор:  ig_ivanov [ Сря Дек 18, 2019 6:11 pm ]
Заглавие:  Re: PIC12F509 - написах код ама работи само на симулация

Ванко написа:
Благодаря за отговора.
ig_ivanov WDT е изключен, осцилатора е вътрешен (IntOSC), Резета (GP3) е включен да (в първия пост съм дал бушоните)...

Конфигурационната дума за този чип е 12 бита, от които се ползват само 5. Твоята е 14.

Автор:  Stoimen [ Сря Дек 18, 2019 8:07 pm ]
Заглавие:  Re: PIC12F509 - написах код ама работи само на симулация

Имам далечен спомен за проблем с HIGH-TECH и дефиницията на TRIS.
При PIC12F509 TRIS регистъра не е мапнат на адрес. Достъпен е само с инструкцията TRIS.
По спомен HIGH-TECH компилатора генерираше код за писане в SFR адреса на TRIS от .h файла, а не използваше инструкцията TRIS.
Можеш да провериш в .lst файла.

Автор:  stefan63 [ Сря Дек 18, 2019 8:33 pm ]
Заглавие:  Re: PIC12F509 - написах код ама работи само на симулация

В листинга има това:
line 44
114 ;509quad.c: 44: TRIS = 0b001011;
115 14C C0B movlw (0Bh)
116 14D 006 tris 0x6

Автор:  TheWizard [ Сря Дек 18, 2019 8:47 pm ]
Заглавие:  Re: PIC12F509 - написах код ама работи само на симулация

Ванко, вземи си 12F1822 или 12F1840 и потренирай малко с MPLAB-а

Автор:  stefan63 [ Сря Дек 18, 2019 9:49 pm ]
Заглавие:  Re: PIC12F509 - написах код ама работи само на симулация

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

От друга страна - ST пуснаха 8 краков АРМ. :D

Автор:  Ванко [ Сря Дек 18, 2019 10:18 pm ]
Заглавие:  Re: PIC12F509 - написах код ама работи само на симулация

Благодаря за отговорите!
ig_ivanov Мисля, че някъде в началото го сложих на 12 бита, но не виждам как да го наглася в момента.
Принципно съм малко по-запознат с MikroC но там този чип го няма и се чудих с какъв компилатор да го подхвана, а и в програмирането не съм силен - дет се вика новак съм :oops:
Пък асемблера е като тъмна Индия за мен!
stefan63 TRIS=0b111000 т.е. 5,4,3 са входове а 2,1,0 са ми изходи сега махам резето и става TRIS=0b110000 тоест GP5, GP4 стават входове а всичко останало изходи, предполагам за този чип не вървят на обратно или? Като променям ТRIS и в симулацията се променят посоките на изводите и мисля, че е ок така.
И да, сега и аз го виждам това в Program Memory Line 379 address 17A opcode 006 TRIS 0x6 там трябва да е 0x30 предполагам или?

ToHu да беше настроено но го махнах от кода иначе трябваше да е adress FFF value 0x31FA с пуснато резе, сега е 0x31EA без резе, извън кода са настроени.

stefan63 да задал съм ги от там - таба Configure -> Configuration Bits, но ако го няма в кода програматора мрънка, че не ги намира в HEX-a

Stoimen къде да го търся тва?

Порязах още кода, сега ми махна и резето (единственото живо нещо :P ) и пак ядец:
Код:
/*
PIC12F509 buttons to
rotary encoder truth table.
===========================
Count UP   OUTA  OUTB
===========================
<1.1> =     H  -  H
<1.2> =     L  -  H
<2.1> =     L  -  L
<2.2> =     H  -  L
===========================
Count DN   OUTA  OUTB
===========================
<1.1> =     H  -  H
<1.2> =     H  -  L
<2.1> =     L  -  L
<2.2> =     L  -  H
===========================
*/
#include <pic.h>
__CONFIG(0x31EA);
//define buttons
#define _XTAL_FREQ 4000000
#define UP GP5
#define DN GP4
#define loop4_ms 8  // 8 is number of loop iterations for 1 ms at 4 MHz

//**********functions****************

unsigned int j;

void pause_ms(unsigned int given_ms);               // pause_ms(n); function same as delay_ms(n);

//**********mapping steps************

unsigned char const STEPS_MAP[4] = {0b11,0b10,0b00,0b01};
int step=0;

//main code
void main(void) {   
    TRIS = 0b110000;          // Set GP0,GP1,GP2 as outputs & GP3, GP5, GP4 as input (0 => Output, 1 => input)
    GPIO   = 0b000000;        // Set GPIO = 0 for all outputs
   OPTION = 0b11000000;      //Set functions for MCU pins - 0xC0
       
do
     {
         if (UP)            //Check if switch  is closed
           {
             pause_ms(90);   //wait for 90ms  (switch debouncing)
             if (UP)         //Check if switch is still closed
                {
                GPIO = (STEPS_MAP[step]);     //Load current state
                pause_ms(250);                  //Pulse time
              step++;                        //Count +
              if (step>3)step=0;            
            }
           }

          else
             {
                 GPIO = (STEPS_MAP[step]);
             }
          if (DN)            //Check if switch  is closed
           {
             pause_ms(90);   //wait for 90ms  (switch debouncing)
             if (DN)         //Check if switch is still closed
                {
                GPIO = (STEPS_MAP[step]);     //Load current state
               pause_ms(250);                  //Pulse time
                 step--;                        //Count -
                 if (step<0)step=3;
               }
            }
          else
             {
                 GPIO = (STEPS_MAP[step]);
             }
     }

   while(1);
      }
//end main code

   void pause_ms( unsigned int given_ms ) {  // pause for given_ms milli seconds
   
   unsigned long j, max_time = given_ms * loop4_ms;
    for(j=0; j < max_time; j++);          // Make waiting for about given_ms msec
};

Автор:  stefan63 [ Сря Дек 18, 2019 10:38 pm ]
Заглавие:  Re: PIC12F509 - написах код ама работи само на симулация

На мен това
line 44
114 ;509quad.c: 44: TRIS = 0b001011;
115 14C C0B movlw (0Bh)
116 14D 006 tris 0x6

ми изглежда нормално за твоята схема.
TRIS 0X6
означава , че ще запише W=0b001011 в регистъра за управление на посоката(GPIO има адрес 0x6).
Поне така си мисля.


=====

Цитат:
да задал съм ги от там - таба Configure -> Configuration Bits, но ако го няма в кода програматора мрънка, че не ги намира в HEX-a


Това , че мрънка ...ок, ама отказва ли да програмира?
Ако не отказва - пробвай без конфиг в сорса.

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