Програмирование pic на СИ.

Поклонники продукции Microchip Technology Inc тусуются тут.
RuLim
Родился
Сообщения: 2
Зарегистрирован: Вт май 10, 2022 19:26:55

Re: Програмирование pic на СИ.

Сообщение RuLim »

Здравствуйте.
Ситуация такая, написал простенькую программу для PIC12F675. Программа компилируется без ошибок в MPLAB X там же в отладчике она работает как и должна. Далее загружаю полученный hex в proteus и там... она работает неправильно. В чем дело не понял, ту же самую программу адаптировал для microC и получил такой же результат - в отладчике microC работает как и должна, а в proteus - опять неправильно. Попробовал загрузил в контроллер - результат как в proteus работает неправильно. Где искать причину. Не ругайте сильно я только начал программировать.

СпойлерMPlabX v6.0

Код: Выделить всё

/* 
 * File:   main.c
 * Author: Roo
 *
 * Created on 8 ??? 2022 ?., 11:29
 */

#include <stdio.h>
#include <stdlib.h>

/*
 *
 */
// CONFIG
#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-Up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = ON       // GP3/MCLR pin function select (GP3/MCLR pin function is MCLR)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)

#define _XTAL_FREQ 4000000                  // Fosc  frequency for _delay()  library

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>

int main(int argc, char** argv) {
    ANSEL = 0b00000000;
    ADCON0 = 0b00000000;
    nGPPU = 0b00000000;
    WPU = 0b00000000;
    TRISIO = 0b00001111;
    GPIO = 0b00000000;
    GIE = 0;
    unsigned char Q = 0; //start status
while (1)
        {
        if (GPIO2) {
            GPIO4 = 0;
            GPIO5 = 1;
            __delay_ms(500);
            GPIO5 = 0;
            __delay_ms(500); }
       else if (!GPIO0 && GPIO1) {
            GPIO4 = 0;
            GPIO5 = 1; }
      else if (GPIO0 && GPIO1) {
            GPIO4 = 0;
            GPIO5 = 0;
            Q = 1; }       
      else if ((!GPIO0 && !GPIO1) || (GPIO0 && !GPIO1 && !Q)) {
            GPIO4 = 1;
            GPIO5 = 0;
            Q = 0; }
    }
    return (EXIT_SUCCESS);
}

СпойлерMicroC 6.2.1.0

Код: Выделить всё

 void main()
 {
    unsigned char  Q=0; /*start status  */
    ANSEL = 0b00000000;
    ADCON0 = 0b00000000;
 /*   GPPU = 0b00000000; */
    WPU = 0b00000000;
    TRISIO = 0b00001111;
    GPIO = 0b00000000;
 /*   GIE = 0;             */

while (1)
        {
        if (GPIO.GP2) {
//            GPIO.GP4 = 0;
            GPIO.GP4 = 0;
            GPIO.GP5 = 1;
            Delay_ms(500);
            GPIO.GP5 = 0;
            Delay_ms(500); }
       else if (!GPIO.GP0 && GPIO.GP1) {
            GPIO.GP4 = 0;
            GPIO.GP5 = 1; }
      else if (GPIO.GP0 && GPIO.GP1) {
            GPIO.GP4 = 0;
            GPIO.GP5 = 0;
            Q = 1; }
      else if ((!GPIO.GP0 && !GPIO.GP1) || (GPIO.GP0 && !GPIO.GP1 && !Q)) {
            GPIO.GP4 = 1;
            GPIO.GP5 = 0;
            Q = 0; }
    }
//    return ();
}
RuLim
Родился
Сообщения: 2
Зарегистрирован: Вт май 10, 2022 19:26:55

Re: Програмирование pic на СИ.

Сообщение RuLim »

Вопрос решен, надо было отключить компаратор

Код: Выделить всё

CMCON = 0b00000111;
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение spongebob »

Подскажите, пожалуйста, возможно ли на pic16f628 (или 648) реализовать следующую задачу:
На входе сигнал стандартный для сервомашинок (частота 50 Гц, продолжительность импульса от 1 до 2 мс (0-100%)).
На выходе нужно получить ШИМ с максимально возможной для МК частотой со скважностью от 0 до 100% соответственно сигналу на входе.
Вроде как в этих пиках 2 таймера.
Выбор МК обусловлен их наличием (выкинуть жалко)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

spongebob, возможно.
Одним таймером измеряем длину импульса (с помощью внешнего прерывания), а вторым - ШИМим.
Аватара пользователя
Asmodey
Друг Кота
Сообщения: 6125
Зарегистрирован: Сб янв 28, 2006 22:47:24

Re: Програмирование pic на СИ.

Сообщение Asmodey »

На выходе нужно получить ШИМ с максимально возможной для МК частотой со скважностью от 0 до 100% соответственно сигналу на входе.

Есть зависимость минимального шага изменения скважности от необходимой частоты.
Астролябия-сама меряет, было бы что мерять!!!
veso74
Поставщик валерьянки для Кота
Сообщения: 1902
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение veso74 »

Дайте краткое описание устройства, для которого предназначен этот узел. Какое разрешение сервомашинки? 125 шагов за 180 градусов ОК? Дайте примерные данные и для "ШИМ с максимально возможной для МК частотой". У PIC16F628A есть три таймера.
phalanx
Нашел транзистор. Понюхал.
Сообщения: 158
Зарегистрирован: Сб апр 24, 2021 18:42:11

Re: Програмирование pic на СИ.

Сообщение phalanx »

У этих PIC имеется аппаратный модуль PWM, частота известна, нужно знать период. Таймеров 3, на все должно хватить. Во вложении переводной даташит, там все есть.

P.S. Данный документ для PIC16F648 тоже должен подойти. Отличаются от 627/628 только увеличенным объемом FLASH/RAM/EEPROM вроде.
Вложения
pic16f62x.pdf
(2.64 МБ) 127 скачиваний
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение spongebob »

а не подскажете по коду на С?
а то я с пиками давно дел не имел, позабыл всё.

что-то типа такого:

Код: Выделить всё

void main()
{
...
  INTCON=0b11001000;
  // инициализация таймеров (0 и 2)
...
}

void interrupt isr(void)
{
if(RBIF) {
  if(RB7==1) // вход сигнала на B7 (например)
      //запуск таймера
  if(RB7==0)
      // остановка таймера, запись значения счётчика в регистр таймера ШИМ (не напрямую конечно, а после вычислений, учёта "мёртвых зон" и т.д.), сброс таймера
}
RBIF=0; // сброс флага прерывания
}


а вот инициализация таймеров для меня пока вопрос...
Последний раз редактировалось spongebob Чт дек 15, 2022 11:05:35, всего редактировалось 1 раз.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25121
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Програмирование pic на СИ.

Сообщение КРАМ »

Какая связь между Си и моделью МК?
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение spongebob »

Какая связь между Си и моделью МК?

Си я знаю. Ассемблер нет.
МК валяется куча. Выбросить жалко.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25121
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Програмирование pic на СИ.

Сообщение КРАМ »

Вы же спросили о Си. Причем тут ассемблер?
Нюансы компилятора XC8 изложены в мануале на этот компилятор. Си применяется как есть.
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение spongebob »

причём тут вообще всё?
причём тут нюансы?
я спросил что в какие регистры писать.
просто я привык к CMSIS и, возможно, изъясняюсь на непонятном вам языке, когда прошу "подсказать по коду на С"
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25121
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Програмирование pic на СИ.

Сообщение КРАМ »

Регистры никакого отношения к Си не имеют. Что куда писать изложено в даташите на контроллер. И это зависит от поставленной задачи.
diplodok
Мудрый кот
Сообщения: 1760
Зарегистрирован: Чт авг 10, 2017 20:57:51

Re: Програмирование pic на СИ.

Сообщение diplodok »

spongebob, даю Вам алгоритм так как я его вижу.
Изображение

spongebob писал(а):я спросил что в какие регистры писать.

Читайте документацию

Я на алгоритме написал
CCP1 - capture, rise mode - в какие регистры писать сказано в док.
Как и From PPM-pulse calc value from
TMR2, PR2 and start PWM
- тоже

Вы также должны сообразить какая ножка является вход, выход. Про компараторов не забывай. И т.д. Также и Loop Ваше дело.
Все написано в PDF. Вам его дали выше.

Удачи.
Yurrrch
Родился
Сообщения: 1
Зарегистрирован: Вс май 07, 2023 17:27:42

Re: Програмирование pic на СИ.

Сообщение Yurrrch »

Привет, ребят. Засиделся на xc8 версии 1.4 в PRO оптимизации
1) Есть ли существенная функциональная разница современных версий си компилятора и тех прошлых? Сейчас меня ничего не ограничивает от использования 1.4, однако, возможно, есть какие-то существенные автоматизации, улучшения и проч.
2) Раздают ли где кряк на современные версии хс8?
Спасибо
SolderCat
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Вс янв 03, 2021 21:35:39
Откуда: Южный Урал

Re: Програмирование pic на СИ.

Сообщение SolderCat »

Привет всем кто в теме. Набрал код часов на ГРИ ИН-14 и мк PIC16F628, часики тикают от TMR1 в асинхронном режиме с внешнего кварца на 32768. TMR0 работает совместно с ШИМ для динамики ГРИ. В принципе, схема часов стандартная, наверное не раз рассмотренная на этом сайте. Но я не ищу легких путей, поэтому код на СИ пишу сам. Часы работают. Проблема моя в той части кода, которая связана с настройкой-установкой часов и минуты, никак не могу разобраться. В режиме установки (корректировки) часов при нажатии на кнопку PLUS показания часов инкрементируются до 23 и потом сброс на 0 и далее по возрастанию, т.е. все как надо. А вот при нажатии на кнопку MINUS идет декримент до 0 и все на этом стопорится, а надо чтобы дошло до 0 и потом произошел переход на 23 и снова по нисходящей. Тоже самое при настройке минут, при нажатии на MINUS доходит до 0 и счет останавливатся, а надо что бы был переход на 59 и далее счет вниз по кругу. При нажатии на плюс все нормально.

Прошу помощи - в чем может быть ошибка в коде, куда копать чтобы все работало как надо? Код main.c прикладываю, там где Установка Часов и Установка Минут в комментариях указал, где код не работает. Код пишу в MPLAB IDE v4.01., компилятор XC8.

Спойлер

Код: Выделить всё

/*
 * File:   Clock_IN14_test
 * Author: SolderCat
 * v.1.01
 * Created on 24 Jule 2023, 22:45
 * MCU PIC16F628A
 */

#include "main.h"

//----------
unsigned char secs=0; 

char hour=12, min=30;
unsigned char a[4];
volatile unsigned char bt;
unsigned char pwm_val;

//----------
#define OK   (bt==1)   //(buttons==1)
#define PLUS (bt==2)   //(buttons==2)
#define MINUS (bt==3)  //(buttons==3)
#define CLOCKMODE0   0
#define CLOCKMODEHOUR 1
#define CLOCKMODEMIN 2
#define CLOCKMODESEC 3
#define CLOCKMODEPWM 4
//----------
unsigned char button1state=0;     
unsigned char clockmode=CLOCKMODE0;
//----------
void interrupt isr(void){
    if(T0IF){
     TIM0_Callback();
     T0IF=0;
    }
    if(TMR1IF){
//      TMR1L=0x00;
      TMR1H=0x80;
      TMR1IF=0;
      secs++;
     
      if (secs >= 60){
      min++;
      secs=0;
      }
      if (min >= 60){
       min =0;
       hour++;
      }
      if (hour >= 24){
       hour =0;
      }   
    }
}
//----------
void main(void){
    PCONbits.OSCF = 1; // set Internal 4MHz
    TRISB = 0x00; 
    PORTB = 0x00;
    PORTA = 0x00;
    TRISA = 0b00100010; // RA1 & RA5 to input
    OPTION_REG=0b00000011; //Prescaler_16 4astota dynamiki
    CMCON = 0x07;
    T1CKPS0=0; //Prescaler 1 (32768/(corr)/1 = 1Hz)
    T1CKPS1=0;
    T1OSCEN=1;  // enable clock
    T1CONbits.nT1SYNC=1;   //asynchron mode
    TMR1CS=1;   //External clock
    TMR1L=0x00;
    TMR1H=0x80;
    T0IE=1;
    PR2=0x3A;
    pwm_val=eeprom_read(0x00);
    __delay_ms(100);

    CCP1CON=0x2F;  //set 20 lvl   
    CCPR1L = 0x31;  //set 20 lvl

    T2CKPS1 = 0;    //TIMER2 prescaler 1:1
    T2CKPS0 = 0;
    GIE=1;
    PEIE=1;
    TMR1IE=1;
    TMR1ON=1;
    TMR2ON=1; //TIMER2 ON
    TMR0=0;

while(1){

//----------       
    if(OK){
       if (clockmode==CLOCKMODE0)
        {
           clockmode=CLOCKMODEHOUR;       
           button1state=1;
           bt=0;
        }
    } 
//--Установка Часов------
   if(clockmode==CLOCKMODEHOUR){
       
   if(PLUS) {hour++;bt=0;}
   if(MINUS) {hour--;bt=0;}   //здесь не переходит с 0 на 23
   if(hour>23) {hour=0;}         
   if(hour<0) {hour=23;}     
           
   RB2 = 1;              //dot vklu4en
   a[0]=0; 
   a[1]=0;             
   a[2]=hour%10;       
   a[3]=hour/10;     
               
   if(OK){
              if(button1state==0)   
                {
                    clockmode=CLOCKMODEMIN;
                    button1state=1;
                    bt=0;
                                         
                }
            }
   if (clockmode==CLOCKMODEHOUR) button1state=0;     
    }
//--Установка Минут-----------
   if(clockmode==CLOCKMODEMIN){
   
   if(PLUS) {min++;bt=0;}
   if(MINUS) {min--;bt=0;}     //здесь не переходит с 0 на 59
   if(min>59) {min=0;}             
   if(min<0) {min=59;}
               
   RB2 = 1;
   a[0]=min%10; 
   a[1]=min/10;
   a[2]=0; 
   a[3]=0;
       
        if(OK){
              if(button1state==0)       
                {
                    clockmode=CLOCKMODESEC;
                    button1state=1;
                    bt=0;
                       
                }
            }
        if (clockmode==CLOCKMODEMIN) button1state=0;
    }
//--Уст Sec---------
    if(clockmode==CLOCKMODESEC)
    {
       
     if(PLUS) {secs=0;}             
     if(MINUS) {secs=30;}             
                 
     RB2 = 1;
     a[0]=secs%10; 
     a[1]=secs/10;               
     a[2] = 0;
     a[3] = 1;
               
     if(OK){
             if(button1state==0)
                {
                    clockmode=CLOCKMODEPWM;     
                    button1state=1;
                    bt=0;
                     
                }
            }
     if (clockmode==CLOCKMODESEC) button1state=0;   
    }
//--Уст PWM------
    if(clockmode==CLOCKMODEPWM){
   
    if(PLUS)  {pwm_val=pwm_val+10;}           
    if(MINUS) {pwm_val=pwm_val-10;}
    if(pwm_val<100) {pwm_val=230;}
    else if(pwm_val>230) {pwm_val=100;}
               
    CCPR1L = pwm_val>>2;
    CCP1CON |= 0x30&(pwm_val<<4);
       
       
    RB2 = 1;
    a[0]=pwm_val/10%10;               
    a[1]=pwm_val/100%10;
    a[2]=0; 
    a[3]=2;             

    eeprom_write(0x00,pwm_val);
         
    if(OK){
            if(button1state==0)
                {
                    clockmode=CLOCKMODE0;           
                    button1state=1;
                    bt=0;
                   
                }
            }
    if (clockmode==CLOCKMODEPWM) button1state=0;   
    }
   
//---Time------   
    if(clockmode==CLOCKMODE0){
     
    if(secs&1)
        {
            RB2 = 0; 
        }
    else
        {
            RB2 = 1;
        }
 
    a[0]=min%10;
    a[1]=min/10%10;
    a[2]=hour%10; 
    a[3]=hour/10%10;
     

    }
//----------
    }
  }
}

Последний раз редактировалось Аlex Пн июл 24, 2023 22:22:10, всего редактировалось 1 раз.
Причина: Спойлер
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7356
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Програмирование pic на СИ.

Сообщение uldemir »

Возможно, у вашего компилятора char беззнаковый, поэтому при декременте нуля получается 255, что "больше, чем 59" и никак не "меньше нуля". попробуйте объявить min как signed char
SolderCat
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Вс янв 03, 2021 21:35:39
Откуда: Южный Урал

Re: Програмирование pic на СИ.

Сообщение SolderCat »

попробуйте объявить min как signed char

И да, действительно помогло, заменил char на signed char hour, min; все заработало, благодарю за подсказку!
a_ndrea_s
Родился
Сообщения: 2
Зарегистрирован: Чт авг 17, 2023 16:22:25

Re: Програмирование pic на СИ.

Сообщение a_ndrea_s »

Я не знаю кто вам сказал об ограничении в 8 байт, но это полный бред.

У меня вопрос у вас получилось отправить в блок более 8 байт? А про это я сам прочитал к примеру в ELM327L_DSA.pdf на 14 странице. Столкнулся что на рено Espace 4 надо было скогнфигурировать блок ручника новый и сменить вин, но елм327 не может отправить 8 байт, приходит в ответ знак вопроса. Пробовал даже через elm327chat отсылать вручную команды, если 8 байт отправить то отправляет, но мне надо больше 8, и приходит ? в овет
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25121
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Програмирование pic на СИ.

Сообщение КРАМ »

У меня вопрос у вас получилось отправить в блок более 8 байт?

Вы точно умеете читать русский текст? :facepalm:
В блок вы можете отправить любое количество байт. МК тут вообще не причем.
Изучите протокол связи с блоком и сделайте обмен в соответствии с ним.
Ответить

Вернуться в «PIC»