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

pic 12F509 реализиране импулс със закъснение
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=19008
Страница 1 от 2

Автор:  sheki [ Чет Окт 26, 2023 10:29 pm ]
Заглавие:  pic 12F509 реализиране импулс със закъснение

Здравейте, трябва ми помощ за малко код, за следния казус
при входен сигнал на GP0 логическа единица и задържането му за 2 сек. да изработи изходен сигнал лог единица на GP1 с продължителност 3 секунди, след отпадане към логическа нула на GP0 и оставането на това ниво след 2 секунди, отново да се генерира изходен сигнал логическа единица за 3 секунди. Тоест след всяка смяна на сигнала на GP0 за повече от 2 сек. ,на изхода GP1 да се генерира положителен импулс 3 секунди.

имам следния код но не иска да се компилира в мплаб дава грешки от сорта на main.c:23:3: error: use of undeclared identifier 'TRISGbits' ,иначе мплаб работи и компилира други сорсове.

Код:
#include <xc.h>
#include <pic12f509.h>

#define _XTAL_FREQ 4000000

// Define input and output ports
#define IN_PORT PORTGbits.RG0
#define OUT_PORT PORTGbits.RG1

// Define input and output constants
#define INPUT 0
#define OUTPUT 1

// Define delay constant
#define DELAY_MS 2000

// Main function
void main(void) {
  // Initialize input port as input
  TRISGbits.RG0 = INPUT;

  // Initialize output port as output
  TRISGbits.RG1 = OUTPUT;

  // Main loop
  while (1) {
    // Check input signal
    if (IN_PORT) {
      // Turn on output for 2 seconds
      OUT_PORT = OUTPUT;
      for (int i = 0; i < 2; i++) {
        __delay_ms(DELAY_MS);
      }

      // Turn off output for 3 seconds
      OUT_PORT = INPUT;
      for (int i = 0; i < 3; i++) {
        __delay_ms(DELAY_MS);
      }
    }
  }
}

Автор:  Gogo [ Пет Окт 27, 2023 9:03 am ]
Заглавие:  Re: pic 12F509 реализиране импулс със закъснение

sheki написа:
...error: use of undeclared identifier 'TRISGbits'...
Пробвай с GPIObits.GPx

Автор:  sheki [ Нед Окт 29, 2023 7:06 pm ]
Заглавие:  Re: pic 12F509 реализиране импулс със закъснение

Gogo написа:
sheki написа:
...error: use of undeclared identifier 'TRISGbits'...
Пробвай с GPIObits.GPx


Здрасти Гого благодаря за отговора, вече не дава тази грешка но има други
Цитат:
main.c:28:9: error: use of undeclared identifier 'PORTGbits'
if (IN_PORT) {
^
main.c:7:17: note: expanded from macro 'IN_PORT'
#define IN_PORT PORTGbits.RG0
^
main.c:30:7: error: use of undeclared identifier 'PORTGbits'
OUT_PORT = OUTPUT;
^
main.c:8:18: note: expanded from macro 'OUT_PORT'
#define OUT_PORT PORTGbits.RG1
^
main.c:36:7: error: use of undeclared identifier 'PORTGbits'
OUT_PORT = INPUT;
^
main.c:8:18: note: expanded from macro 'OUT_PORT'
#define OUT_PORT PORTGbits.RG1
^
3 errors generated

Автор:  ToHu [ Нед Окт 29, 2023 8:21 pm ]
Заглавие:  Re: pic 12F509 реализиране импулс със закъснение

Това е MPLAB ли го пише ?
Погледнал ли си дали имаш дефиниции на PORTGbits. Не знам в мпла-ба какво са дефинирали, и дали операторите рабоитят с битови променливи, но и в CCS и в Keil това което правиш би трябвало да се дефинира като битова променлива :
#define RG0 0
#define PORTGbits 0x06 - тоя чип няма порт G, 0.06 е на порт B

bit IN_PORT PORTGbits.RG0

И тук вече работиш с битове, може да имаш if(IN_PORT), или директно да го манипулираш IN_PORT = 1.
Но освен всички друго алгоритъма на това което си написал не е ОК, така както си го написал в момента в който IN_PORT стане 1-ца ти ще вдигнеш изхода в 1, ще чакаш 2 сек, след това ще го свашил в 0 и ще чакаш още 3 сек ... но за начало си оправи дефинициите и декларациите после може да коментираме алгоритъма.

Автор:  tolstolob [ Пон Окт 30, 2023 5:36 pm ]
Заглавие:  Re: pic 12F509 реализиране импулс със закъснение

Код:
#include <xc.h>
#include <stdbool.h>
#include <stdint.h>

#define _XTAL_FREQ 4000000

#define PIN_IN    GPIObits.GP0
#define PIN_OUT   GPIObits.GP1


void Init(void)
{
    TRISGPIO = 0b111101;
}

bool  InputChanged(void)
{
    static uint8_t  timer = 0;
    static uint8_t  input_phase = 0;
   
    input_phase = (uint8_t)((input_phase << 1) | PIN_IN) & 3;

    switch (input_phase)
    {
        case 1:  // 0 -> 1
        case 2:  // 1 -> 0
        {
            timer = 201; // (2000ms / 10ms) + 1
            break;
        }
        default: // Input low or input high
        {
            if (timer > 0)
            {
                __delay_ms(10);
                timer--;
   
                if (timer == 1)
                {
                    timer = 0;
                    return true;
                }
            }
            break;
        }
    }
   
    return false;
}

void MakePulse_3s(void)
{
    PIN_OUT = 1;
    __delay_ms(3000);
    PIN_OUT = 0;
}

void main(void)
{
    Init();
   
    while (true)
    {
        if (InputChanged())
        {
            MakePulse_3s();
        }
    }
}

Автор:  ToHu [ Пон Окт 30, 2023 5:58 pm ]
Заглавие:  Re: pic 12F509 реализиране импулс със закъснение

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

Автор:  tolstolob [ Пон Окт 30, 2023 6:04 pm ]
Заглавие:  Re: pic 12F509 реализиране импулс със закъснение

ToHu написа:
Еее що така .. това на задачка ми прилича, като го дадеш наготово няма много ефект, а човека се опитваше сам да го направи, всеки тук можеше да му напише кода.

Абе не е съвсем на тепсия. Логиката не е коректна (умишлено), само се комилира.

Автор:  ToHu [ Пон Окт 30, 2023 6:11 pm ]
Заглавие:  Re: pic 12F509 реализиране импулс със закъснение

ОК, създаваш му лоши практики с тоя delay_ms(3000) :) то и онези 10 ms са малко безмислени, но за него да речем е приемливо зло с цел опростяване, но като ще му покаваме на човека, и това не е лошо да му се покажем как се прави по друг начин. Да видим до къде ще го докара.

Автор:  tolstolob [ Вто Окт 31, 2023 3:47 pm ]
Заглавие:  Re: pic 12F509 реализиране импулс със закъснение

Е то тук не е училище, че да да учим някого на практики :mrgreen: . Пък и питащия не прилича на студент; мисля че му трябва за реална дрънкулка.
Код:
#include <xc.h>
#include <stdbool.h>
#include <stdint.h>

#define _XTAL_FREQ 4000000

#define PIN_IN    GPIObits.GP0
#define PIN_OUT   GPIObits.GP1

void main(void)
{
    uint8_t  debounce_timer = 0;
    uint8_t  confirmed_input_state;
   
    // Initialize the IO pins
    TRISGPIO = 0b111101; // All pins are inputs, except for GP1, which is an output.
    confirmed_input_state = PIN_IN;
   
    while (true)
    {
        if (PIN_IN != confirmed_input_state)
        {
            debounce_timer++;

            if (debounce_timer >= 200) // 2000ms / 10ms
            {
                confirmed_input_state ^= 1;
                debounce_timer = 0;
               
                // Make а 3s pulse
                PIN_OUT = 1;
                __delay_ms(3000);
                PIN_OUT = 0;
            }
            __delay_ms(10);
        }
        else
        {
            debounce_timer = 0;
        }
    }
}

Автор:  sheki [ Сря Ное 01, 2023 7:18 pm ]
Заглавие:  Re: pic 12F509 реализиране импулс със закъснение

tolstolob написа:
Е то тук не е училище, че да да учим някого на практики :mrgreen: . Пък и питащия не прилича на студент; мисля че му трябва за реална дрънкулка.
Код:
#include <xc.h>
#include <stdbool.h>
#include <stdint.h>

#define _XTAL_FREQ 4000000

#define PIN_IN    GPIObits.GP0
#define PIN_OUT   GPIObits.GP1

void main(void)
{
    uint8_t  debounce_timer = 0;
    uint8_t  confirmed_input_state;
   
    // Initialize the IO pins
    TRISGPIO = 0b111101; // All pins are inputs, except for GP1, which is an output.
    confirmed_input_state = PIN_IN;
   
    while (true)
    {
        if (PIN_IN != confirmed_input_state)
        {
            debounce_timer++;

            if (debounce_timer >= 200) // 2000ms / 10ms
            {
                confirmed_input_state ^= 1;
                debounce_timer = 0;
               
                // Make а 3s pulse
                PIN_OUT = 1;
                __delay_ms(3000);
                PIN_OUT = 0;
            }
            __delay_ms(10);
        }
        else
        {
            debounce_timer = 0;
        }
    }
}


Здрасти, само да вметна че си прав за практическото приложение , ще взема да стана пишман че не си измислих схемата с 555 :) а реших да ползвам PIC , но вече е късно и платката съм налепил ама пустия код ме забави. Относно кода последния компилирах го , пуснах го за симулация на протеус и забелязах че още със стартирането GP1 е с лог. 1 , а не трябва , програмирах чипа пуснах и платката и там е същото , няма никаква реакция при промяна на GP0. Не че му вдявам ама къде в сорса е описано какво е началното състояние на изхода, ако по дефолт е 0 защо ми го вдига на 1?

Автор:  TheWizard [ Сря Ное 01, 2023 7:43 pm ]
Заглавие:  Re: pic 12F509 реализиране импулс със закъснение

Код:
#include <xc.h> 
void main(void)
{   
     ANSELA = 0x00; // <----------
     TRISGPIO = бла бла
     ConfigureOscillator();

     __delay_us( 500 ); // за xc.h

Автор:  ToHu [ Сря Ное 01, 2023 9:11 pm ]
Заглавие:  Re: pic 12F509 реализиране импулс със закъснение

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

Автор:  tolstolob [ Сря Ное 01, 2023 9:53 pm ]
Заглавие:  Re: pic 12F509 реализиране импулс със закъснение

Ми да, едно от неочевидните неща при 8-битовите пикове, които и аз почти всеки път забравям, са фюзовете (configuration bits). Никой не ги е сетнал, а по дефолт са сетнати на външен осцилатор и GP3 е външен ресет. Значи трябва да е нещо такова:
Код:
#include <xc.h>
#include <stdbool.h>
#include <stdint.h>

// Setting the configuration bits (fuses)
#pragma config OSC = IntRC   // Use internal RC oscillator
#pragma config WDT = OFF     // Disable the watchdog
#pragma config CP = OFF        // Code protection off
#pragma config MCLRE = OFF   // GP3 is GPIO instead of NRESET pin

#define _XTAL_FREQ 4000000

#define PIN_IN    GPIObits.GP0
#define PIN_OUT   GPIObits.GP1

void main(void)
{
    uint8_t  debounce_timer = 0;
    uint8_t  confirmed_input_state;
   
    // Initialize the IO pins
    GPIO = 0; // Make all outputs 0
    TRISGPIO = 0b111101; // Set all pins to inputs, except for GP1, which would be an output.
    confirmed_input_state = PIN_IN;
   
    while (true)
    {
        if (PIN_IN != confirmed_input_state)
        {
            debounce_timer++;

            if (debounce_timer >= 200) // 2000ms / 10ms
            {
                confirmed_input_state ^= 1;
                debounce_timer = 0;
               
                // Make а 3s pulse
                PIN_OUT = 1;
                __delay_ms(3000);
                PIN_OUT = 0;
            }
            __delay_ms(10);
        }
        else
        {
            debounce_timer = 0;
        }
    }
}

Ако по някаква причина фюзовете пак не са както трябва (въпреки че 'прагмите' в кода трябва да хванат дикиш), сетни ги на ръка от МПЛАБ-а преди да флашнеш (menu strip -> Window -> Target memory views -> Configuration bits)

Автор:  ToHu [ Чет Ное 02, 2023 4:11 am ]
Заглавие:  Re: pic 12F509 реализиране импулс със закъснение

според мен не само при пик, но и при всичко със що годе обозрими регистри, не е никак лоша идея да се сетнат, дори да имат ясно дефаултно състояние, ако не всички то поне тия свързани с всичко използвано.

Автор:  itso.t [ Чет Ное 02, 2023 11:10 am ]
Заглавие:  Re: pic 12F509 реализиране импулс със закъснение

Идеята е добра, но не винаги е приложима. Преди време, може би на пик10ф200 при подобна заигравка и няколко реда код компилотора се размрънка, че бил свършил флаша...

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