Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 14.10.2019, 11:07   #1
bereg_ok
Member
 
Регистрация: 20.08.2007
Возраст: 58
Сообщений: 90
Вес репутации: 106/46
bereg_ok will become famous soon enoughbereg_ok will become famous soon enough
Отправить сообщение для bereg_ok с помощью ICQ
По умолчанию Миграция прошивки

Здравствуйте!
Разбирая на работе всякий хлам наткнулся на старый заброшенный проект, первую попытку написания на Си. До этого писал на Ассемблере (не часто).
Дружбы с виртуальными симуляторами типа Протеус и ему подобным у меня не получилось, то отладку вел на макете с кристаллом PIC16F876, а конечное должно было быть на PIC16F628. Программа на макете работала правильно (ну почти ), а на конечном не работает совсем, вернее совсем не правильно.
Собственно вопрос в чем: почему не работает? компиляция производилась с соответствующими корректировками под разные кристаллы. Компилятор не учитывает страничную адресацию? И что нужно для нормального переноса программы?
Компилятор Си - XC8 ver. 1.45
bereg_ok вне форума   Ответить с цитированием
Старый 14.10.2019, 17:09   #2
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 834
Вес репутации: 1473/58
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: Миграция прошивки

Цитата:
Сообщение от bereg_ok Посмотреть сообщение
Собственно вопрос в чем: почему не работает?
может магнитные бури на Марсе, пятна на Солнце, Луна не в той фазе

ЗЫ инициализацию МК проводить правильна нуна.
DmitrijVDN на форуме   Ответить с цитированием
Старый 15.10.2019, 08:12   #3
varostov
Senior Member
 
Аватар для varostov
 
Регистрация: 14.11.2007
Адрес: Ростов-на-Дону
Возраст: 54
Сообщений: 154
Вес репутации: 535/50
varostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of light
По умолчанию Re: Миграция прошивки

Самая популярная ошибка при миграции на 628-й PIC - незнание того, что выводы аналогового компаратора по умолчанию включены (пины МК в аналоговом режиме, не digital). При инициализации необходимо вставить блок:
Код:
; По включению - нет компараторных входов
		LD	CMCON,7
		BSF	RP0
		CLRF	VRCON
		BCF	RP0
В более поздних процессорах аналогично нужно отключать входы АЦП.
varostov вне форума   Ответить с цитированием
Старый 15.10.2019, 08:45   #4
varostov
Senior Member
 
Аватар для varostov
 
Регистрация: 14.11.2007
Адрес: Ростов-на-Дону
Возраст: 54
Сообщений: 154
Вес репутации: 535/50
varostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of light
По умолчанию Re: Миграция прошивки

Для тех, кого смутит первая строка кода :
Код:
LD		macro	reg,const
		MOVLW	const
		MOVWF	reg
		endm
А вообще-то для правильного переноса программы надо "скурить" даташиты на исходный и целевой процессор с анализом отличий. Или как минимум поискать вспомогательные документы: migration PIC16F628

Последний раз редактировалось varostov; 15.10.2019 в 08:57.
varostov вне форума   Ответить с цитированием
Старый 15.10.2019, 14:58   #5
bereg_ok
Member
 
Регистрация: 20.08.2007
Возраст: 58
Сообщений: 90
Вес репутации: 106/46
bereg_ok will become famous soon enoughbereg_ok will become famous soon enough
Отправить сообщение для bereg_ok с помощью ICQ
По умолчанию Re: Миграция прошивки

Цитата:
Сообщение от DmitrijVDN Посмотреть сообщение
может магнитные бури на Марсе, пятна на Солнце, Луна не в той фазе

ЗЫ инициализацию МК проводить правильна нуна.
Спасибо за ответ. Докладаю: магитных бурь не наблюдалось, пятна а Солнце стер собственноручно, Луну подстроил по фазе.
bereg_ok вне форума   Ответить с цитированием
Старый 15.10.2019, 15:08   #6
bereg_ok
Member
 
Регистрация: 20.08.2007
Возраст: 58
Сообщений: 90
Вес репутации: 106/46
bereg_ok will become famous soon enoughbereg_ok will become famous soon enough
Отправить сообщение для bereg_ok с помощью ICQ
По умолчанию Re: Миграция прошивки

Цитата:
Сообщение от varostov Посмотреть сообщение
Самая популярная ошибка при миграции на 628-й PIC - незнание того, что выводы аналогового компаратора по умолчанию включены (пины МК в аналоговом режиме, не digital). При инициализации необходимо вставить блок:
Код:
; По включению - нет компараторных входов
		LD	CMCON,7
		BSF	RP0
		CLRF	VRCON
		BCF	RP0
В более поздних процессорах аналогично нужно отключать входы АЦП.
Вроде настроил на цифру.
Код:
/*
 * File:   newmain.c
 * Author: Alexander S.
 * Created on 24 июня 2018 г., 9:19
 * 350Гц - 800 об/мин
 * стартер ~50Гц
 * провода замка зажигания
 * черный (2шт.) - + АКБ
 * 1 положение замка - L (синий) (АСС), отключается в положении стартер
 * 2 положение замка - B/W, B/R (откл. при старте), L (синий) откл. при старте
 * 3 положение (стартер) - B/Y, B/W
 */

// CONFIG
#include <xc.h>
//#include <pic16f628a.h>   //процессор для платы
//#include <pic16f876.h>      // процессор для отладки

//***************************************************
// конфигурация процессора 628а
#define _XTAL_FREQ  4000000    // частота кварца

//#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
//#pragma config WDTE = ON        // Watchdog Timer Enable bit (WDT enabled)
//#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
//#pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
//#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
//#pragma config LVP = ON         // Low-Voltage Programming Enable bit (RB4/PGM pin has PGM function, low-voltage programming enabled)
//#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
//#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

//***************************************************
// конфигурация процессора PIC16F876A
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF        // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config CP = OFF         // FLASH Program Memory Code Protection bits (Code protection off)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF         // Low Voltage In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF        // Data EE Memory Code Protection (Code Protection off)
#pragma config WRT = ON         // FLASH Program Memory Write Enable (Unprotected program memory may be written to by EECON control)
                


//***************************************************
//конфигурация портов
#define park    PORTAbits.RA0   //вход с датчика парковки
#define acc     PORTAbits.RA1   //выход включения АСС
#define glow    PORTAbits.RA2   //вход с лампы свечи накала
#define led     PORTAbits.RA3   //выход на светодиод в кнопке, вкл. 0
#define tacho   PORTAbits.RA4   //вход с тахометра TMR0(350Гц при 800 об/мин)

#define btn     PORTBbits.RB0   //вход с кнопки пуска
#define ign1    PORTBbits.RB1   //выход на IG1
#define st      PORTBbits.RB2   //выход на стартер
#define ign2    PORTBbits.RB3   //выход на IG2
#define brake   PORTBbits.RB4   //вход с педали тормоза
#define secure  PORTBbits.RB5   //вход с сигнализации (вход с прерыванием)




//**************************************************
//определения переменных
unsigned int trisa_cfg = 0b00010101;        //конфигурация порта А    
unsigned int trisb_cfg = 0b00110001;        //конфигурация порта В
unsigned int porta_set = 0b00001000;    //предустановка порта
unsigned int portb_set = 0b00000000;

unsigned long time_cnt =0;   //счетчик времени
unsigned int tled_on = 5; //время вкл. светодиода
unsigned int tled_off = 70; //время паузы светодиода
unsigned long tcnt_st = 0;   //счетчик времени работы стартера
unsigned long tcnt_st_max = 200;   //максимальное время работы стартера
unsigned int tacho_cnt =0;  //счетчик тахометра
unsigned int tacho_min = 4;   //минимальный порог для определения работающего двигателя
unsigned int key_cnt=0;     //счетчик нажатий на кнопку

static bit engwrk_flag; //флаг работы двигателя
static bit start_flag;  //флаг запуска
static bit starter_flag;    //флаг работы стартера
static bit brake_flag;  //флаг педали тормоза
static bit blink_flag;  //флаг мигания светодиода

//****** предописания
void tacho_chk (void);
void eng_work (void);
void start_auto (void);
void eng_stop (void);
void starter (void);


//*********************************************************************
//обработка прерываний
      void  interrupt  isr (void)
      {
          CLRWDT ();    //сброс сторожевика
          INTF=0;
          //устанавливаем прерывания для выхода из сна 
          if (RBIF!=0)
          {
              if (brake == 0)
              {
                  brake_flag=1;
              }
              else
              {
                  brake_flag=0;
              }
              RBIE=0;
          RBIF = 0;   //сброс флага прерывания с порта В
          }
      //********* прерывание по таймеру 2
           if(TMR2IE && TMR2IF) //если разрешено и произошло прерывание по таймеру 2
              {
              time_cnt++;       //увеличиваем счетчик времени
              tcnt_st++;        //увеличиваем время работы стартера
              tacho_cnt=TMR0;   //считываем значение тахометра
              TMR0=0;   //
                TMR2IF=0;   //сброс прерывания по 2 таймеру
              }
      }

//****** считаем нажатия кнопки без тормоза      
void btn_press (void)      
{
  __delay_ms(50);
key_cnt++;
if (key_cnt >2)
{
    key_cnt=0;
}
switch (key_cnt)
{
    case 0:
        ign1=0;
        ign2=0;
        acc=0;
        st=0;
        __delay_ms(2000);
        break;
    case 1:
        ign1=0;
        ign2=0;
        acc=1;
        st=0;
        __delay_ms(2000);
        break;
    case 2:
        ign1=1;
        ign2=1;
        acc=1;
        st=0;
        __delay_ms(2000);
        break;
}
}
      
////***** автоматический пуск, в одно нажатие
void start_auto (void)
{
        ign1=1; //включаем зажигание 1
        ign2=0; //выключаем зажигание 2
        acc=0;  //выключаем АСС
        st=0;   //стартер выкл
        led=0;  //вкл. светодиод
        
                    while (glow == 0)
                        {
                        __delay_ms (50);    //ждем отключения лампы свечей
                        }
                    tcnt_st=0;  //обнуляем таймер стартера
                    st=1;   //включаем стартер
                    while (st==1)
                    {
                        
                        if  (engwrk_flag==0 && tcnt_st <= tcnt_st_max) //
                        {
                           st=1; //пока не мотор не заведется
                           tacho_chk ();
                        }
                        else
                        {
                            while (btn==1 && brake == 1 && park ==1 && engwrk_flag == 0) //пока нажата кнопка крутим стартер
                            {
                                st=1;
                            }
                            st=0;
                            ign1=0;
                            return;
                        }
                    }
                
        st=0;   //выключаем стартер
        ign1=1; //включаем зажигание 1
        ign2=1; //включаем зажигание 2
        acc=1;  //включаем АСС
        led=0;  //вкл. светодиод
}
      
      
      
      
//******* стоп двигателя на паркинге
void eng_stop (void)
    {
        ign1=0;    //выключаем зажигание
        ign2=0;     //
        acc=0;      //выключаем АСС
        st=0;
        blink_flag =0;  //запрещаем мигание светодиода
        led=1;  //гасим светодиод
        __delay_ms (3000);  //защитная пауза
        engwrk_flag =0;
    }
      
////******* включение стартера 
//void starter (void)
//    {
//        ign2=0; //на время работы стартера отключаем лишние потребители
//        acc=0;
//        ign1=1; //включаем зажигание
//        st=1;   //крутим стартер пока нажата кнопка
////***** проверяем завелся ли двигатель, если да, то отключаем стартер
//        tacho_chk ();
//
//    
//    if (engwrk_flag == 1)
//    {
//        st=0;
//        ign1=1;
//        ign2=1;
//        acc=1;
//        led=0;
//        __delay_ms (1000);  //!!
//        }
//    else 
//    {
//        ign1=0;
//        ign2=0;
//        acc=0;
//        led=1;
//    }
//    }
      
//****** проверка состояния двигателя
void tacho_chk (void)
    {
    tacho_cnt=0;
    __delay_ms (50);
    if (tacho_cnt >= tacho_min) // проверяем работу двигателя
        {
            engwrk_flag =1; // двигатель работает
        }
        else {
            engwrk_flag=0;  //двигатель не работает
        }
    }

// двигатель работает - включаем зажигание 
void eng_work (void){
        if (engwrk_flag == 1) //если двигатель работает
            {
            ign1=1; //включено зажигание, АСС и светодиод
            ign2=1;
            acc=1;
            blink_flag =0;  //запрещено мигание СД
            led=0;  //включен СД
            }
        else
            {
            ign1=0;
            ign2=0;
            acc=0;
            led=1;
            }
        }

//мигаем светодиодом по времени 
void blink_led  (void)
        {
    if (blink_flag == 1)
        {
            if ((time_cnt > 0) && (time_cnt<= tled_on)) //проверяем время вкл. светодиода
                {
                    led=0; //мигаем светодиодом
                }
            if ((time_cnt > tled_on) && (time_cnt < tled_off)) //проверяем время паузы светодиода
                {
                    led=1;
                }
            if (time_cnt>tled_off) //обнуляем счетчик времени
                    {
                    time_cnt=0;
                    }
        }
    }
//---------------------------------------------------------------------
void main(void)
{
        CLRWDT ();
        PORTA = porta_set;
        PORTB = portb_set;
        TRISA = trisa_cfg;       //порты РА2 и 4 на вход, остальные на выход
        TRISB = trisb_cfg;       //порт РВ0-4 на выход, РВ5-7 на вход
        nRBPU = 1;              //выключаем подтягивающие резисторы
//        CMCON=0x07;             // для 628 порт как цифровой
        ADON=0;                 //АЦП отключен
        ADCON1 = 0b00000110;    //порт A  как цифровой
        
//устанавливаем прерывания для таймера
        GIE = 1;    //общее разрешение прерываний
        PEIE=1;     //разрешено прерывание от периферийных модулей
        RBIE = 0;   //запрещаем прерывание с порта RB4-7 (secure RB5), не нужно
        RBIF = 0;   //сброс флага прерывания с порта В
//установки для TMR2 (счет времени)
        TOUTPS3=1;  //Prescaler Out 10
        TOUTPS2=0;
        TOUTPS1=0;
        TOUTPS0=1;
        T2CKPS0=1;  //Postcaler In 16
        T2CKPS1=1;
        
        PR2=0xF9;   // предустановка 249  (1000000/10/16/250 = 25Hz)
        TMR2IE=1;   // разрешено прерывание по переполнению
        TMR2IF=0;   //сброс флага прерывания
        TMR2ON=1;   //включаем таймер        
        
//***** установки для TMR0
        INTEDG=1;   //прерывание по переднему фронту
        T0CS = 1;   //внешний такт для TMR0
        T0SE = 0;   // приращение по переднему фронту (вообще-то без разницы)
        PSA = 0;    //включение пределителя перед TMR0
        PS0 = 0;    //
        PS1 = 0;    //установка коэффициента деления (1:2)
        PS2 = 0;    //
        time_cnt=0;

    while (1)
    {
        while (secure == 1) //если на входе 1, то уходим в сон на минимальное энергопотребление
            //вход статичен (вкл/выкл)
            {
        //устанавливаем прерывания для выхода из сна 
            GIE = 1;    //общее разрешение прерываний, 
            PEIE=1;     //разрешено прерывание от периферийных модулей
            RBIE = 1;   //разрешено прерывание с порта RB4-7 (secure RB5)
            RBIF = 0;   //сброс флага прерывания с порта В
            //установки для TMR2
            TMR2IF=0;    //сброс флага прерывания
            TMR2IE=0;    // запрещаем прерывание по переполнению
            PR2=0xF9;       // предустановка 249  (1000000/10/16/250 = 25Hz)
            T2CON= 0b01001011; //выключаем таймер, Postcaler 10,Prescaler 16
        //*****    
            nPD=0;
            TMR0=0;         //обнуляем счетчик 
            ign1=0;  //выключаем всё
            ign2=0;
            acc=0;
            st=0;
            led=1;
            SLEEP();        //отправляем в спячку
    //выход из сна        
            PORTA = porta_set;
            PORTB = portb_set;
            TRISA = trisa_cfg;       //порты РА2 и 4 на вход, остальные на выход
            TRISB = trisb_cfg;       //порт РВ0-4 на выход, РВ5-7 на вход
            nRBPU = 1;              //выключаем подтягивающие резисторы
 //        CMCON=0x07;             // для 628 порт как цифровой            
            ADON=0;                 //АЦП отключен
            ADCON1 = 0b00000110;    //порт A  как цифровой

    //устанавливаем прерывания для таймера
            GIE = 1;    //общее разрешение прерываний
            PEIE=1;     //разрешено прерывание от периферийных модулей
            RBIE = 0;   //запрещаем прерывание с порта RB4-7 (secure RB5), не нужно
            RBIF = 0;   //сброс флага прерывания с порта В
    //установки для TMR2 (счет времени)
            TOUTPS3=1;  //Prescaler Out 10
            TOUTPS2=0;
            TOUTPS1=0;
            TOUTPS0=1;
            T2CKPS0=1;  //Postcaler In 16
            T2CKPS1=1;

            PR2=0xF9;   // предустановка 249  (1000000/10/16/250 = 25Hz)
            TMR2IE=1;   // разрешено прерывание по переполнению
            TMR2IF=0;   //сброс флага прерывания
            TMR2ON=1;   //включаем таймер        

    //***** установки для TMR0
            INTEDG=1;   //прерывание по переднему фронту
            T0CS = 1;   //внешний такт для TMR0
            T0SE = 0;   // приращение по переднему фронту (вообще-то без разницы)
            PSA = 0;    //включение пределителя перед TMR0
            PS0 = 0;    //
            PS1 = 0;    //установка коэффициента деления (1:2)
            PS2 = 0;    //
            time_cnt=0;

            st=0;   //независимо от состояния двигателя
            ign1=0;  //выключаем всё. Если двиг работает, то это от сигналки
            ign2=0;  //Если нет, то все равно выключено 
            acc=0;
            led=1;
            }

        //******
        tacho_chk ();   //проверяем состояние двигателя
        eng_work ();    //двигатель работает
        blink_led ();   //мигаем светодиодом
        
        if (btn == 1 && brake == 0 && park == 0 && engwrk_flag ==0)
        { 
            start_auto ();  //
        }
        
            if (park == 0 && btn == 1 && engwrk_flag == 1 )
            {
                eng_stop ();    //стоп двигателя
            }
        
            if (park ==0 && brake == 1 && btn ==1 && engwrk_flag ==0) 
            {
                btn_press ();
            }
    }    
        
    return;
}   //конец main
буду благодарен за подсказки и исправлению неправильных решений
ПыСЫ: проект закрыт без реализации, больше как учебный
bereg_ok вне форума   Ответить с цитированием
Старый 15.10.2019, 15:29   #7
varostov
Senior Member
 
Аватар для varostov
 
Регистрация: 14.11.2007
Адрес: Ростов-на-Дону
Возраст: 54
Сообщений: 154
Вес репутации: 535/50
varostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of light
По умолчанию Re: Миграция прошивки

То, что видно навскидку из конфига 628-го:
1) Пин RA5 не задействован, но MCLR зачем-то деактивирован.
2) Разное состояние PWRTE, WDTE для 876-го и 628-го.
3) Зачем-то включено низковольтное программирование (LVP).

Последний пункт гарантированно не выводит PIC из Reset, если на нём "0".

Последний раз редактировалось varostov; 15.10.2019 в 15:36.
varostov вне форума   Ответить с цитированием
Старый 15.10.2019, 15:44   #8
bereg_ok
Member
 
Регистрация: 20.08.2007
Возраст: 58
Сообщений: 90
Вес репутации: 106/46
bereg_ok will become famous soon enoughbereg_ok will become famous soon enough
Отправить сообщение для bereg_ok с помощью ICQ
По умолчанию Re: Миграция прошивки

Цитата:
Сообщение от varostov Посмотреть сообщение
То, что видно навскидку из конфига:
1) Пин RA5 не задействован, но MCLR зачем-то деактивирован.
2) Разное состояние PWRTE, WDTE.
3) Зачем-то включено низковольтное программирование (LVP).
УПС. закинул старый неисправленный файл. Низковольтное программирование отключено, собака отключена на 876 кристалле при отладке, mclr отключен на 628, потому что задействован как вход.
Схему похерил уже, а на память не все помню
bereg_ok вне форума   Ответить с цитированием
Старый 15.10.2019, 15:55   #9
varostov
Senior Member
 
Аватар для varostov
 
Регистрация: 14.11.2007
Адрес: Ростов-на-Дону
Возраст: 54
Сообщений: 154
Вес репутации: 535/50
varostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of light
По умолчанию Re: Миграция прошивки

Семён Семёнович!!!
varostov вне форума   Ответить с цитированием
Старый 15.10.2019, 16:06   #10
bereg_ok
Member
 
Регистрация: 20.08.2007
Возраст: 58
Сообщений: 90
Вес репутации: 106/46
bereg_ok will become famous soon enoughbereg_ok will become famous soon enough
Отправить сообщение для bereg_ok с помощью ICQ
По умолчанию Re: Миграция прошивки

Цитата:
Сообщение от varostov Посмотреть сообщение

Попробую найти последний исправленный файл
bereg_ok вне форума   Ответить с цитированием
Старый 15.10.2019, 16:16   #11
varostov
Senior Member
 
Аватар для varostov
 
Регистрация: 14.11.2007
Адрес: Ростов-на-Дону
Возраст: 54
Сообщений: 154
Вес репутации: 535/50
varostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of light
По умолчанию Re: Миграция прошивки

Со схемой?
varostov вне форума   Ответить с цитированием
Старый 15.10.2019, 16:19   #12
bereg_ok
Member
 
Регистрация: 20.08.2007
Возраст: 58
Сообщений: 90
Вес репутации: 106/46
bereg_ok will become famous soon enoughbereg_ok will become famous soon enough
Отправить сообщение для bereg_ok с помощью ICQ
По умолчанию Re: Миграция прошивки

Цитата:
Сообщение от varostov Посмотреть сообщение
Со схемой?
Нужна? Не тайна. Если найду
bereg_ok вне форума   Ответить с цитированием
Старый 15.10.2019, 16:44   #13
bereg_ok
Member
 
Регистрация: 20.08.2007
Возраст: 58
Сообщений: 90
Вес репутации: 106/46
bereg_ok will become famous soon enoughbereg_ok will become famous soon enough
Отправить сообщение для bereg_ok с помощью ICQ
По умолчанию Re: Миграция прошивки

Цитата:
Сообщение от varostov Посмотреть сообщение
Со схемой?
схему нашел, номиналы от фонаря
корректировка MCLR используется для программирования и в работе не задействован
Миниатюры
Безымянный.png  
bereg_ok вне форума   Ответить с цитированием
Старый 15.10.2019, 17:38   #14
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 834
Вес репутации: 1473/58
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: Миграция прошивки

1.такая последовательность
ign1=0; //выключаем всё
ign2=0;
acc=0;
st=0;
led=1;
в 99% не работает из-за ЧМЗ, или разделять нопами или работать с портом через темповскую переменную



2. при инициализации состояние портов после установки направления желательно дублировать.
PORTA = porta_set;
PORTB = portb_set;
TRISA = trisa_cfg;
TRISB = trisb_cfg;
PORTA = porta_set;
PORTB = portb_set;
ну и объявить их как константы, ОЗУ у 628 не резиновая.



3.мейн желательно начинать с обнуления INTCON. хоть ДШ и утверждает что по дефолту там усё сброшено , в действительности это не так, особенно у 628го.

4.MCLR в независимости от использования притянуть +Vdd через подтяжку 5-10кОм.

ЗЫ не уверен , но по моему тип bit для 628 не поддерживается, биты нужно оформлять через структуру... хотя могу и ошибаться.
DmitrijVDN на форуме   Ответить с цитированием
Старый 16.10.2019, 14:50   #15
bereg_ok
Member
 
Регистрация: 20.08.2007
Возраст: 58
Сообщений: 90
Вес репутации: 106/46
bereg_ok will become famous soon enoughbereg_ok will become famous soon enough
Отправить сообщение для bereg_ok с помощью ICQ
По умолчанию Re: Миграция прошивки

Цитата:
Сообщение от DmitrijVDN Посмотреть сообщение
1.такая последовательность
ign1=0; //выключаем всё
ign2=0;
acc=0;
st=0;
led=1;
в 99% не работает из-за ЧМЗ, или разделять нопами или работать с портом через темповскую переменную



2. при инициализации состояние портов после установки направления желательно дублировать.
PORTA = porta_set;
PORTB = portb_set;
TRISA = trisa_cfg;
TRISB = trisb_cfg;
PORTA = porta_set;
PORTB = portb_set;
ну и объявить их как константы, ОЗУ у 628 не резиновая.



3.мейн желательно начинать с обнуления INTCON. хоть ДШ и утверждает что по дефолту там усё сброшено , в действительности это не так, особенно у 628го.

4.MCLR в независимости от использования притянуть +Vdd через подтяжку 5-10кОм.

ЗЫ не уверен , но по моему тип bit для 628 не поддерживается, биты нужно оформлять через структуру... хотя могу и ошибаться.
1. What is ЧМЗ?
2. Направления портов установлены один раз и в процессе не меняются. По крайней мере по опыту Ассемблера дублировать необходимости не было.
3. Принято.
4. MCLR никогда не подтягивал, у него своя подтяжка. Проблем ранее не наблюдалось. Но можно и притянуть
Битами активно пользовался на Ассемблере, в том числе и на 628-ом. Компилятор Си тоже не ругается
bereg_ok вне форума   Ответить с цитированием
Старый 16.10.2019, 15:02   #16
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,171
Вес репутации: 4017/88
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Миграция прошивки

What is ЧМЗ?
чтение-модификация-запись.
в младших пиках нет регистра latch, так или иначе его приходится эмулировать программно.

когда Вы выполняете операцию RMW, то у Вас считывается старое значение, модифицируется, пишется новое значение.

если Вы манипулируете ножками порта и выводите инструкции RMW одна за другой, то у Вас может возникнуть ситуация, когда написав одно значение в порт реальное значение ножки не изменится к следующей операции чтения, в итоге операция будет проигнорирована.

как упоминали, для решения это проблемы можно ставить между инструкция модификации порта несколько пустых операций, чтобы дать время состоянию порта поменяться.
besogon вне форума   Ответить с цитированием
Старый 16.10.2019, 15:23   #17
varostov
Senior Member
 
Аватар для varostov
 
Регистрация: 14.11.2007
Адрес: Ростов-на-Дону
Возраст: 54
Сообщений: 154
Вес репутации: 535/50
varostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of light
По умолчанию Re: Миграция прошивки

Цитата:
Сообщение от besogon Посмотреть сообщение
What is ЧМЗ?
как упоминали, для решения это проблемы можно ставить между инструкция модификации порта несколько пустых операций, чтобы дать время состоянию порта поменяться.
Увы, это не спасёт при кратковременной помехе или замыкании при считывании порта. Поэтому желательно использовать современные кристаллы.

P.S.Привычнее, конечно, аббревиатура RMW
varostov вне форума   Ответить с цитированием
Старый 16.10.2019, 15:44   #18
bereg_ok
Member
 
Регистрация: 20.08.2007
Возраст: 58
Сообщений: 90
Вес репутации: 106/46
bereg_ok will become famous soon enoughbereg_ok will become famous soon enough
Отправить сообщение для bereg_ok с помощью ICQ
По умолчанию Re: Миграция прошивки

Цитата:
Сообщение от besogon Посмотреть сообщение
What is ЧМЗ?
чтение-модификация-запись.
в младших пиках нет регистра latch, так или иначе его приходится эмулировать программно.

когда Вы выполняете операцию RMW, то у Вас считывается старое значение, модифицируется, пишется новое значение.

если Вы манипулируете ножками порта и выводите инструкции RMW одна за другой, то у Вас может возникнуть ситуация, когда написав одно значение в порт реальное значение ножки не изменится к следующей операции чтения, в итоге операция будет проигнорирована.

как упоминали, для решения это проблемы можно ставить между инструкция модификации порта несколько пустых операций, чтобы дать время состоянию порта поменяться.
таким методом я пользовался на Ассемблере, и ничего, пролазило.
как вставить кусок сообщения, чтобы не цитировать все?
bereg_ok вне форума   Ответить с цитированием
Старый 16.10.2019, 15:46   #19
varostov
Senior Member
 
Аватар для varostov
 
Регистрация: 14.11.2007
Адрес: Ростов-на-Дону
Возраст: 54
Сообщений: 154
Вес репутации: 535/50
varostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of light
По умолчанию Re: Миграция прошивки

Цитата:
Сообщение от bereg_ok Посмотреть сообщение
как вставить кусок сообщения, чтобы не цитировать все?
После нажатия кнопки "Цитата" удалить ненужное из текста
varostov вне форума   Ответить с цитированием
Старый 16.10.2019, 15:48   #20
bereg_ok
Member
 
Регистрация: 20.08.2007
Возраст: 58
Сообщений: 90
Вес репутации: 106/46
bereg_ok will become famous soon enoughbereg_ok will become famous soon enough
Отправить сообщение для bereg_ok с помощью ICQ
По умолчанию Re: Миграция прошивки

Цитата:
Сообщение от varostov Посмотреть сообщение
После нажатия кнопки "Цитата" удалить ненужное из текста
понял, спасибо
bereg_ok вне форума   Ответить с цитированием
Старый 16.10.2019, 15:54   #21
bereg_ok
Member
 
Регистрация: 20.08.2007
Возраст: 58
Сообщений: 90
Вес репутации: 106/46
bereg_ok will become famous soon enoughbereg_ok will become famous soon enough
Отправить сообщение для bereg_ok с помощью ICQ
По умолчанию Re: Миграция прошивки

Цитата:
Сообщение от besogon Посмотреть сообщение
What is ЧМЗ?
в младших пиках нет регистра latch, так или иначе его приходится эмулировать программно
Что за регистр?
bereg_ok вне форума   Ответить с цитированием
Старый 16.10.2019, 16:01   #22
bereg_ok
Member
 
Регистрация: 20.08.2007
Возраст: 58
Сообщений: 90
Вес репутации: 106/46
bereg_ok will become famous soon enoughbereg_ok will become famous soon enough
Отправить сообщение для bereg_ok с помощью ICQ
По умолчанию Re: Миграция прошивки

Еще вопросик. При обработке прерываний нужно в ХС8 прописывать сохранение аккумулятора и прочего? Как обзывается W в Си?
bereg_ok вне форума   Ответить с цитированием
Старый 16.10.2019, 16:37   #23
varostov
Senior Member
 
Аватар для varostov
 
Регистрация: 14.11.2007
Адрес: Ростов-на-Дону
Возраст: 54
Сообщений: 154
Вес репутации: 535/50
varostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of light
По умолчанию Re: Миграция прошивки

Цитата:
Сообщение от bereg_ok Посмотреть сообщение
Что за регистр?
Правильнее всего взять даташиты от старого и сравнительно свежего PIC16 и сравнить главу "I/O PORTS", особое внимание уделив блок-схемам битов портов.

Ну а если коротко - из-за постоянных проблем сбоя содержимого портов в процессе RMW (например, чтение для последующего изменения одного бита порта, совпавшее по времени с помехой или КЗ или плохой схемотехникой на другом бите этого же порта, вызывает изменение сразу двух битов, о чем программист, естественно, даже не подозревает) был "придуман" виртуальный регистр LATCH. Он не существует отдельно от регистра PORT, разница всего лишь в обращениях: запись в LATCH и PORT эквивалентна, чтение из PORT даёт, как и раньше, состояние бита порта, а вот чтение из LATCH даёт состояние защёлки порта (т.е. то, что реально записывал ранее туда программист). Теперь все команды, cвязанные с RMW, используют исключительно LATCH и все проблемы спонтанной порчи портов были решены.
varostov вне форума   Ответить с цитированием
Старый 16.10.2019, 16:55   #24
varostov
Senior Member
 
Аватар для varostov
 
Регистрация: 14.11.2007
Адрес: Ростов-на-Дону
Возраст: 54
Сообщений: 154
Вес репутации: 535/50
varostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of lightvarostov is a glorious beacon of light
По умолчанию Re: Миграция прошивки

Цитата:
Сообщение от bereg_ok Посмотреть сообщение
Еще вопросик. При обработке прерываний нужно в ХС8 прописывать сохранение аккумулятора и прочего? Как обзывается W в Си?
А изучить даташит, как советовал, слабо?

Вот выдержка из документации на 628-й:
Нажмите на изображение для увеличения
Название: 2019-10-16_16-47-12.png
Просмотров: 5
Размер:	55.0 Кб
ID:	11487
здесь сохранение контекста - дело рук самих утопающих.

Вот для сравнительно современного 12F1572:
Нажмите на изображение для увеличения
Название: 2019-10-16_16-47-40.png
Просмотров: 5
Размер:	38.2 Кб
ID:	11488
Здесь уже есть автосохранение самых важных регистров.

Аккумулятор в XC8 обозначается WREG.
varostov вне форума   Ответить с цитированием
Старый 16.10.2019, 17:24   #25
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 834
Вес репутации: 1473/58
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: Миграция прошивки

Цитата:
MCLR никогда не подтягивал, у него своя подтяжка.
нет у него никакой подтяжки. в условиях сильных помех легко и непринужденно натягивает на вывод >10в и переводит МК в режим программирования, в лучшем случае МК просто виснет, в худшем порча кода. здесь как-то выкладывали материалы мастер-конференции за 2010г где об этом говорено.
Цитата:
Битами активно пользовался на Ассемблере, в том числе и на 628-ом. Компилятор Си тоже не ругается
он и не будет ругатся... весь вопрос как восьмойхусым выделил память под эти биты и что там у него с оптимизацией , мог вполне выделить под флаг целый байт , а в Си все что не "ноль" это "единица" , а вы в условиях флаг не на логику проверяете, а с единицей сравниваете,

If(flag) // flag=0xFF условие выполняется
if(flag==1) // условие не выполняется.
поэтому и предложил битовые поля юзать через структуру.
Цитата:
Еще вопросик. При обработке прерываний нужно в ХС8 прописывать сохранение аккумулятора и прочего? Как обзывается W в Си?
в Си он не доступен. сохранение/востановление контекста хусым добавляет сам. ничего прописывать не требуется.
DmitrijVDN на форуме   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как затруднить дизассемблирование прошивки? Vovka Продукция MICROCHIP 34 08.09.2014 10:45
Объединить прошивки BootLoader-а с основной программой Vovka Продукция MICROCHIP 8 25.02.2013 09:46
ICSP-интерфейс для прошивки. Как лучше организовать выводы программирования (PIC16F***)? iMeat Продукция MICROCHIP 6 16.08.2012 10:47
Удаленная смена прошивки на dsPIC Newegor Продукция MICROCHIP 7 13.09.2009 09:32
Удаленное обновление прошивки МК. Mario Продукция MICROCHIP 36 30.10.2008 22:31


Часовой пояс GMT +3, время: 13:46.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot