Отговори на тема  [ 47 мнения ]  Отиди на страница 1, 2, 3, 4  Следваща
PIC12F509 - написах код ама работи само на симулация 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Дек 17, 2019 5:51 pm
Мнения: 13
Мнение 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 | Прегледано 5442 пъти ]
Коментар на файл: Проект
12F509.zip [1.4 MiB]
177 пъти
Коментар на файл: Схемата
F509_B_rot.jpg
F509_B_rot.jpg [ 104.67 KiB | Прегледано 5448 пъти ]
Вто Дек 17, 2019 9:33 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 27949
Местоположение: София
Мнение Re: PIC12F509 - написах код ама работи само на симулация
Ами той C509 е еднократно програмируем, ако преди това си качвал и друго на него няма как да работи, освен ако не е развоен с прозорче.


Сря Дек 18, 2019 3:18 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 11:02 am
Мнения: 8873
Местоположение: Разград
Мнение Re: PIC12F509 - написах код ама работи само на симулация
Точка първа - PIC12F509 не е компютър. Пълно глупост на тая въшка да ползваш индексно адресиране - само там генерираш тон код. Не знам как точно се справя хайтек Ц с банкирането на програмната памет, щото тая плюнка и там има "банкиране". Ако програмата ти е по-голяма от 128 думи, почти сигурно е че там се осира. Протеуса това нещо не го симулира правилно.

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


Сря Дек 18, 2019 9:20 am
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Дек 17, 2019 5:51 pm
Мнения: 13
Мнение 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
};


Сря Дек 18, 2019 2:01 pm
Профил
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Съб Май 21, 2016 8:47 pm
Мнения: 472
Местоположение: Бургас
Мнение Re: PIC12F509 - написах код ама работи само на симулация
От конфигурационната дума забрани WDT и виж пак там дали е избран вътрешния генератор. От OPTION register може да изключиш pull-up-a, и без това ползваш външни резистори.
ПП: Всъщност, сега видях, че ако GP3 e конфигуриран за MCLR, pull-up са винаги включени.


Сря Дек 18, 2019 3:05 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Дек 17, 2019 5:51 pm
Мнения: 13
Мнение Re: PIC12F509 - написах код ама работи само на симулация
Благодаря за отговора.
ig_ivanov WDT е изключен, осцилатора е вътрешен (IntOSC), Резета (GP3) е включен да (в първия пост съм дал бушоните)... явно съм пропуснал момента където е описано, че резето автоматично включва вътрешните повдигащи резистори (макар, че не би трябвало да ми пречат ... май :) ), ще го спра, но в OPTION регистъра съм ги спрял да не ми се пречкат и там аномалията с GP2/T0CKI също съм я настроил уж, даже го сложих изход.


Прикачени файлове:
Коментар на файл: Даташиита
PIC12F509_505.pdf [1.45 MiB]
192 пъти
Сря Дек 18, 2019 4:08 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 10:22 pm
Мнения: 3074
Мнение Re: PIC12F509 - написах код ама работи само на симулация
Имаше някакъв екран в ИДЕ-то - оттам да зададеш конфиг.дума , не в сорса....
Ама кога кое беше валидно, не помня.


Сря Дек 18, 2019 4:10 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

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


Сря Дек 18, 2019 4:13 pm
Профил
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Съб Май 21, 2016 8:47 pm
Мнения: 472
Местоположение: Бургас
Мнение Re: PIC12F509 - написах код ама работи само на симулация
Ванко написа:
Благодаря за отговора.
ig_ivanov WDT е изключен, осцилатора е вътрешен (IntOSC), Резета (GP3) е включен да (в първия пост съм дал бушоните)...

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


Сря Дек 18, 2019 5:11 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пет Юни 25, 2010 2:18 pm
Мнения: 338
Местоположение: Varna
Мнение Re: PIC12F509 - написах код ама работи само на симулация
Имам далечен спомен за проблем с HIGH-TECH и дефиницията на TRIS.
При PIC12F509 TRIS регистъра не е мапнат на адрес. Достъпен е само с инструкцията TRIS.
По спомен HIGH-TECH компилатора генерираше код за писане в SFR адреса на TRIS от .h файла, а не използваше инструкцията TRIS.
Можеш да провериш в .lst файла.


Сря Дек 18, 2019 7:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 10:22 pm
Мнения: 3074
Мнение Re: PIC12F509 - написах код ама работи само на симулация
В листинга има това:
line 44
114 ;509quad.c: 44: TRIS = 0b001011;
115 14C C0B movlw (0Bh)
116 14D 006 tris 0x6


Сря Дек 18, 2019 7:33 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4671
Мнение Re: PIC12F509 - написах код ама работи само на симулация
Ванко, вземи си 12F1822 или 12F1840 и потренирай малко с MPLAB-а

_________________
main[-1u]={1};


Сря Дек 18, 2019 7:47 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 10:22 pm
Мнения: 3074
Мнение Re: PIC12F509 - написах код ама работи само на симулация
Що бре , 509 си е ок за задачата.
Мотиката е малка, може да му помогне за в бъдеще.

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


Сря Дек 18, 2019 8:49 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Дек 17, 2019 5:51 pm
Мнения: 13
Мнение 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
};


Сря Дек 18, 2019 9:18 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 10:22 pm
Мнения: 3074
Мнение 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


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


Сря Дек 18, 2019 9:38 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 47 мнения ]  Отиди на страница 1, 2, 3, 4  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 5 госта


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

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