Отговори на тема  [ 23 мнения ]  Отиди на страница 1, 2  Следваща
pic 12F509 реализиране импулс със закъснение 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Съб Май 06, 2006 7:16 pm
Мнения: 21
Местоположение: Златоград
Мнение 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);
      }
    }
  }
}

_________________
ПРОСТО И ЛЕСНО !


Чет Окт 26, 2023 10:29 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение Re: pic 12F509 реализиране импулс със закъснение
sheki написа:
...error: use of undeclared identifier 'TRISGbits'...
Пробвай с GPIObits.GPx


Пет Окт 27, 2023 9:03 am
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Съб Май 06, 2006 7:16 pm
Мнения: 21
Местоположение: Златоград
Мнение 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

_________________
ПРОСТО И ЛЕСНО !


Нед Окт 29, 2023 7:06 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение 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 сек ... но за начало си оправи дефинициите и декларациите после може да коментираме алгоритъма.


Нед Окт 29, 2023 8:21 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение 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();
        }
    }
}


Пон Окт 30, 2023 5:36 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: pic 12F509 реализиране импулс със закъснение
Еее що така .. това на задачка ми прилича, като го дадеш наготово няма много ефект, а човека се опитваше сам да го направи, всеки тук можеше да му напише кода.


Пон Окт 30, 2023 5:58 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: pic 12F509 реализиране импулс със закъснение
ToHu написа:
Еее що така .. това на задачка ми прилича, като го дадеш наготово няма много ефект, а човека се опитваше сам да го направи, всеки тук можеше да му напише кода.

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


Пон Окт 30, 2023 6:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: pic 12F509 реализиране импулс със закъснение
ОК, създаваш му лоши практики с тоя delay_ms(3000) :) то и онези 10 ms са малко безмислени, но за него да речем е приемливо зло с цел опростяване, но като ще му покаваме на човека, и това не е лошо да му се покажем как се прави по друг начин. Да видим до къде ще го докара.


Пон Окт 30, 2023 6:11 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение 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;
        }
    }
}


Вто Окт 31, 2023 3:47 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Съб Май 06, 2006 7:16 pm
Мнения: 21
Местоположение: Златоград
Мнение 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?

_________________
ПРОСТО И ЛЕСНО !


Сря Ное 01, 2023 7:18 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: pic 12F509 реализиране импулс със закъснение
Код:
#include <xc.h> 
void main(void)
{   
     ANSELA = 0x00; // <----------
     TRISGPIO = бла бла
     ConfigureOscillator();

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

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


Сря Ное 01, 2023 7:43 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: pic 12F509 реализиране импулс със закъснение
Задължително при стартиране трябва да си инициализираш всички портове, регистри които могат да влияят на приложението ти, както и променливи, приеми че всичко това е рандом, въпреки, че някои от тях имат дефаултни стойности.
П.с. не съжалявай, това е голяма стъпка и ще ти даде свобода която иначе нямаш.


Сря Ное 01, 2023 9:11 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение 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)


Сря Ное 01, 2023 9:53 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: pic 12F509 реализиране импулс със закъснение
според мен не само при пик, но и при всичко със що годе обозрими регистри, не е никак лоша идея да се сетнат, дори да имат ясно дефаултно състояние, ако не всички то поне тия свързани с всичко използвано.


Чет Ное 02, 2023 4:11 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 03, 2005 2:21 am
Мнения: 12764
Местоположение: София
Мнение Re: pic 12F509 реализиране импулс със закъснение
Идеята е добра, но не винаги е приложима. Преди време, може би на пик10ф200 при подобна заигравка и няколко реда код компилотора се размрънка, че бил свършил флаша...


Чет Ное 02, 2023 11:10 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 23 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

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


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

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