Перейти к содержанию

Простые вопросы новичка.


Рекомендуемые сообщения

Этот flag совсем не нужен, нет в нём никакого смысла. Он всегда будет равен 1 после выполнения  data_submit(dat);

Что нужно в программе-то сделать? Вы так и не объяснили.

Нужно вывести на индикатор цифры от 0 до 9 через промежутки 0.5 секунды?

Ссылка на комментарий
Поделиться на другие сайты

да программа вывести на семисегментный индикатор должна от 0 до 9 

 

 

Но как увязать передачу последнего бита последовательного кода через 74hc595 ,с переключением параллельного от 0 до 9.Понял что предыдущий путь и направление мысли не то-))

 

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Ну, тогда нужно просто всё сделать по порядку - в цикле сначала преобразуем j в сегментный код, затем отправляем на 74НС595, потом пауза 500мс


        for (int j=0;j<10;j++)
        {
           segchar(j);
           data_submit(dat);
           __delay_ms(500);
        }

 

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Я думаю такая запись тоже не верна при последовательном коде,ведь порту не может быть присвоено такое значение

case 1 : PORTC =0x9F;break;

 

используется же только одна нога MCU

 

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Вы бы хоть схему, что ли, показали. Как у Вас там и что подключено - остаётся только догадываться.

1 минуту назад, Wawchuk сказал:

код  не мой конечно

Блин, там кода - 3.5 строки. Не пробовали свой написать ? В чужом г...е ковыряться всегда противнее.

Ссылка на комментарий
Поделиться на другие сайты

Собрана макетная плата с 16f676 и подключена к семисегментному индикатору с общим анодом 74HC595 (15 нога-А, 1-В, 2-С.....7 нога H)

#define DATA_595 PORTCbits.RC3
#define STROBE_595 PORTCbits.RC4
#define CLK_595 PORTCbits.RC5 

а дальше шью в железе, вариант снизу работает четко

void main(void) {
    system_init();  
    while(1)
    {
         {
        data_submit(0b10011111);    //1
        __delay_ms(200);
        data_submit(0b00100101);    //2
        __delay_ms(200);
        data_submit(0b00001101);    //3 ......

 

а со switch(seg) завис

 

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Wawchuk сказал:

ведь порту не может быть присвоено такое значение

На колу мочало - начинай с начала? Где Вы были всё это время? Выходили покурить? Мы уже 23 часа назад обсудили порт С и осудили его использование в switch(seg)

Изменено пользователем Yurkin2015
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Wawchuk сказал:

вариант снизу работает четко

Ну, ещё чуть-чуть осталось. В функции segchar() кладите в переменную dat свои нолики-единички и затем посылайте data_submit(dat).

Кстати, на всякий случай, для единички число 0b10011111 равно 0x9F, для двойки число 0b00100101 равно 0x25, для тройки число 0b00001101 =  0x0D и т.д. Это просто разные формы записи одних и тех же чисел: двоичная запись и шестнадцатеричная запись.

У Вас в коде эти числа уже записаны в segchar(). Правда немного другие, для двойки и тройки по крайней мере. Надо бы проверить.

Ссылка на комментарий
Поделиться на другие сайты

такая конструкция тоже работает

//--------------------------------------------
unsigned char dat,j;
unsigned char T0_count = 0;
//--------------------------------------------
void interrupt timer0(){
  switch (T0_count%10){
    case 1 : dat =0x9F;break;
    case 2 : dat =0x25;break;
    case 3 : dat =0x0D;break;
    case 4 : dat =0x99;break;
    case 5 : dat =0x49;break;
    case 6 : dat =0x41;break;
    case 7 : dat =0x1F;break;
    case 8 : dat =0x01;break;
    case 9 : dat =0x09;break;
    case 0 : dat =0x03;break;
    }
    data_submit(dat);
    T0_count++;
    if(T0_count>10){
      T0_count=0;
  }
  T0IF=0;
}

но это все статическая индикация ,а что почитать для перехода в динамическую индикацию ,пусть даже для 2-х разрядов-?

Ссылка на комментарий
Поделиться на другие сайты

То же самое, только дополнительно ко всему быстро-быстро переключать разряды, так чтобы все перебрать за 10мс и меньше.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Нашел для себя narodstream.ru ,доходчиво-)).

Программа  под динамическую индикацию (без утверждения, по крайней мере для меня)не совсем тоже самое,даже с учетом того что разряды подключены к анодам 7-сегментного  индикатора мимо 74hc595, т.е.:

#define R1_595 PORTCbits.RC1
#define R2_595 PORTCbits.RC2

мигание разрядов вижу(похоже на правду), так  цифры (dat) не читаются,скорость большая,

 

Ссылка на комментарий
Поделиться на другие сайты

алгоритм прост: 1) выключаешь разряд, 2) загружаешь следующую цифру в регистр и 3) включаешь следующий разряд. Делаешь это всё безостановочно и быстро для каждого разряда и в этой последовательности. Иначе будет "след" на сегментах. Иногда даже требуется дождаться когда силовые транзисторы переключающие разряды выключатся прежде чем выставлять следующую цифру, десятки микросекунд... но контроллер быстрее и могут появится артефакты.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, Wawchuk сказал:

Нашел для себя narodstream.ru ,доходчиво-)). Программа  под динамическую индикацию

как по мне бред укуренной мечты или настольное руководство, как не надо писать код , символы отображаемые на индикаторе это тупо таблица кодов и формировать ее кейсом вместо массива констант тупость и бездарно растрачиваемое время в прерывании. как собственно и использование лесницы if..elseif вместо кайса при переключении индикаторов.

динамическая индикация на выводы порта

Скрытый текст

#include <htc.h>
#include <pic.h>


__CONFIG(INTIO & MCLRDIS & WDTDIS & LVPDIS & PWRTDIS & UNPROTECT);


#define dig1 RA3 //индикатор 1
#define dig2 RA2 //индикатор 2
#define dig3 RA7 //индикатор 3
#define dig4 RA6 //индикатор 3
//#define tochka RB2
//#define warning RA1
//#define _XTAL_FREQ 4000000

#define LED PORTB
#define SEG_A  (1<<0) // назначение сегментов индикатора
#define SEG_B  (1<<1) // соответствующим битам порта LED
#define SEG_C  (1<<2) //      A
#define SEG_D  (1<<3) //   F     B
#define SEG_E  (1<<4) //      G
#define SEG_F  (1<<5) //   E     C
#define SEG_G  (1<<6) //      D     H
#define SEG_H  (1<<7) //

const unsigned char digits [13] = {
   (SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F), //           ; zero 
   (SEG_B + SEG_C)                                , //           ; one 
   (SEG_A + SEG_B + SEG_D + SEG_E + SEG_G ),        //           ; two 
   (SEG_A + SEG_B + SEG_C + SEG_D + SEG_G),         //           ; three 
   (SEG_B + SEG_C + SEG_F + SEG_G),                 //           ; four 
   (SEG_A + SEG_C + SEG_D + SEG_F + SEG_G),         //           ; five 
   (SEG_A + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G), //           ; six 
   (SEG_A + SEG_B + SEG_C),                         //           ; seven 
   (SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G),//    ; eight 
   (SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_G), //           ; nine 
  ~(SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G),//    ; пусто
   (SEG_A + SEG_F + SEG_E),                         //           ; R
   (SEG_A + SEG_D + SEG_E + SEG_F + SEG_G)};        //           ; E 


               unsigned char 	i                ; // 
volatile       unsigned char    a                ;//
volatile       unsigned char   	LEDS[4]          ; // 


volatile struct flag_type {
unsigned ON      : 1;
unsigned                 : 1;
unsigned                 : 1;
unsigned                 : 1;
unsigned                 : 1;
unsigned                 : 1;
unsigned                 : 1;
unsigned                 : 1;
} flag;

 

 
//***********************************************************************
//* ИНИЦИАЛИЗАЦИЯ МК
//***********************************************************************
void init(void)
 {
   INTCON =0x00; // запрет всех прерываний 
   OSCCON = 0b01100100; //с 4 по 6 бит значение 110 означает 4mhz 
// настройка портов
   PORTA = 0; //обнуляем порт а
   PORTB = 0;
   TRISA = 0b00110011; //порты RA2, RA3, RA7, RA1 на выход а остальные на вход
   TRISB = 0b00000000; // все порты RB на выход  
   PORTA = 0; //обнуляем порт а
   PORTB = 0;
// настройка АЦП
   ADCON0=0b01000001; //тактирование АЦП Fosc/8, выбран канал AN0, модуль АЦП включен
   ADCON1=0b10001110; //правое выравнивание, включен аналоговый вход RA0/AN0, остальные входы цифровые   
// настройка таймера TMR0   
   TMR0 = 0; //сбрасываем таймер в 0
   OPTION = 0b00000011; // настройки таймера 1:16 и установка Set timer TMR0 даташит page 54:
// разрешение прерываний   
   TMR0IE = 1;
   GIE = 1;
 };

void interrupt Timer (void)
   { //прерывание по таймеру для динамической индикации

    if(TMR0IF)
      {
         TMR0IF=0;
         dig1=0; NOP(); dig2=0;NOP(); dig3=0; dig4=0; LED=~(digits [10]); // гасим все разряды
         a++;
         switch(a)
        {     // Динамическая индикация.
              case 1: dig4=1; LED=~(LEDS[3]); break; // Первый разряд
              case 2: dig3=1; LED=~(LEDS[2]); break; // второй разряд
              case 3: dig2=1; LED=~(LEDS[1]);  break; // третий
              case 4: dig1=1; LED=~(LEDS[0]); a=0; break; // четвертый

        }

    }
  }

void convert (void)
{ // функция преобразования 1024 в 5.00в
    unsigned int tmp;
    static unsigned long old_adc;
    static unsigned int mass_adc[16];
    static     unsigned char ii;

    unsigned int 	adc,volt        ; //
    unsigned char DS,j;
    unsigned char   	tempLEDS[4]          ; // 
        GODONE=1;
        while (GODONE){NOP();};
          tmp= (ADRESH<<8)+ADRESL; //помещаем значение ацп в переменную adc чтобы могли с ним работать ниже
         ii++;
      ii=ii&0b00001111;
        mass_adc[ii]=tmp;
           adc=0;
        for (j=0;j<16;j++)
           {
            adc=adc+mass_adc[j];  
           }
            
          adc=adc>>4;
          
        
//          adc  = tmp;
//         adc= (((old_adc)<<8)- old_adc + tmp )>>8;
//         old_adc=adc  ;

        adc  = (adc*5000L)/1024;
        volt = adc;
   if ( volt==4999) 
       {
        tempLEDS[3]= digits [10];
        tempLEDS[2]= digits [12];
        tempLEDS[1]= digits [11];
        tempLEDS[0]= digits [11];
       }
   else
       {
       for (j=0;j<4;j++)
         {
           DS=volt%10;
           volt=volt/10;
          if(j==3)
             { tempLEDS[j]= digits [DS] + SEG_H;}
          else
             { tempLEDS[j]= digits [DS];}  
         } 
       }
    GIE = 0;
      LEDS[3]= tempLEDS[3];
      LEDS[2]= tempLEDS[2];
      LEDS[1]= tempLEDS[1];
      LEDS[0]= tempLEDS[0];
    GIE = 1;      
   
}
//***********************************************************************
//* ОСНОВНАЯ ПРОГРАММА
//***********************************************************************
void main (void)
{
     init();
     for(i=255;i>0;i--);
     //******** ГЛАВНЫЙ ЦИКЛ *****************
     while (1)
          {
          convert ();  


          };
}

 

динамическая индикация на 74HC595

Скрытый текст

#include <htc.h>
#include <pic.h>


__CONFIG(INTIO & MCLRDIS & WDTDIS  & PWRTDIS & UNPROTECT);



//#define tochka RB2
//#define warning RA1
//#define _XTAL_FREQ 4000000


#define  PIN_ST GPIO4
#define  PIN_SH GPIO5
#define  PIN_DS GPIO0
#define  TRIS_DS TRIS0



#define SEG_A  (1<<0) // назначение сегментов индикатора
#define SEG_B  (1<<1) // соответствующим битам порта LED
#define SEG_C  (1<<2) //      A
#define SEG_D  (1<<3) //   F     B
#define SEG_E  (1<<4) //      G
#define SEG_F  (1<<5) //   E     C
#define SEG_G  (1<<6) //      D     H
#define SEG_H  (1<<7) //
#define dig3   (1<<8) //индикатор 1
#define dig2   (1<<9) //индикатор 2
#define dig1   (1<<10)//индикатор 3
#define dig0   (1<<11)//индикатор 3
#define LED_V  (1<<12)//индикатор 1
#define LED_A1 (1<<13)//индикатор 2
#define LED_A2 (1<<14)//индикатор 3
// общий анод :
const unsigned int digits [15] = {
   (SEG_G + SEG_H),                                                 //; zero 
   (SEG_A  + SEG_D + SEG_E + SEG_F + SEG_G + SEG_H ),               //; one 
   (SEG_C + SEG_F+ SEG_H ),                                         // ; two 
   (SEG_E + SEG_F+ SEG_H ),                                         // ; three 
   (SEG_A + SEG_D + SEG_E + SEG_H ),                                // ; four 
   (SEG_B + SEG_E + SEG_H ),                                        // ; five 
   (SEG_B + SEG_H ),                                                // ; six 
   (SEG_D + SEG_E + SEG_F + SEG_G + SEG_H ),                        // ; seven 
   (SEG_H ),                                                        //; eight 
   (SEG_E + SEG_H ),                                                //; nine 
   (SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G + SEG_H ),//; пусто
   (SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_H ),                //; R
   (SEG_B + SEG_C + SEG_H ),                //; E 
   (SEG_A + SEG_G + SEG_H ),                                        //; U
   (SEG_D + SEG_H ),                                                //; A
   };
// общий катод :   
/*
const unsigned int digits [15] = {
   (SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F), //           ; zero 
   (SEG_B + SEG_C)                                , //           ; one 
   (SEG_A + SEG_B + SEG_D + SEG_E + SEG_G ),        //           ; two 
   (SEG_A + SEG_B + SEG_C + SEG_D + SEG_G),         //           ; three 
   (SEG_B + SEG_C + SEG_F + SEG_G),                 //           ; four 
   (SEG_A + SEG_C + SEG_D + SEG_F + SEG_G),         //           ; five 
   (SEG_A + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G), //           ; six 
   (SEG_A + SEG_B + SEG_C),                         //           ; seven 
   (SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G),//    ; eight 
   (SEG_A + SEG_B + SEG_C + SEG_D + SEG_F + SEG_G), //           ; nine 
  ~(SEG_A + SEG_B + SEG_C + SEG_D + SEG_E + SEG_F + SEG_G),//    ; пусто
   (SEG_A + SEG_F + SEG_E),                         //           ; R
   (SEG_A + SEG_D + SEG_E + SEG_F + SEG_G),                 //     ; E 
   ( SEG_B + SEG_C + SEG_D + SEG_E + SEG_F),    //           ; U
   (SEG_A + SEG_B + SEG_C + SEG_E + SEG_F + SEG_G) //           ; A
   };
*/
               unsigned char 	i                ; // 
volatile       unsigned char    a=0                ;//
volatile       unsigned int   	LEDS[4]          ; // 
//volatile       unsigned int   	tempLEDS[4]          ; // 

volatile struct flag_type {
unsigned ON      : 1;
unsigned                 : 1;
unsigned                 : 1;
unsigned                 : 1;
unsigned                 : 1;
unsigned                 : 1;
unsigned                 : 1;
unsigned                 : 1;
} flag;

 
unsigned int read_ADC (unsigned char chanel);
 
//***********************************************************************
//* ИНИЦИАЛИЗАЦИЯ МК
//***********************************************************************
void init(void)
 {
   INTCON =0x00; // запрет всех прерываний 
   CMCON = 0x07; // компаратор выключен
// настройка портов
   GPIO = 0; //обнуляем порт а

   TRISIO = 0b00000111; //порты RA2, RA3, RA7, RA1 на выход а остальные на вход

   GPIO = 0; //обнуляем порт а

// настройка АЦП
   ANSEL=0b00010111; //тактирование АЦП Fosc/8, включен аналоговый вход RA0/AN0, остальные входы цифровые   
   ADCON0=0b10000001; //правое выравнивание, выбран канал AN0, модуль АЦП включен

// настройка таймера TMR0   
   TMR0 = 0; //сбрасываем таймер в 0
   OPTION = 0b00000011; // настройки таймера 1:16 и установка Set timer TMR0 даташит page 54:
// разрешение прерываний   
   T0IE = 1;
   GIE = 1;
 };

void interrupt Timer (void)
   { //прерывание по таймеру для динамической индикации

    unsigned char i;   
    unsigned int registr ;

    if(T0IF)
      {
         T0IF=0;

         switch(a)
        {     // Динамическая индикация.
              case 0: // Первый разряд
                    registr= LEDS[0] ;
                    a=2;
                     break; 
              case 1: // второй разряд
                    registr= LEDS[1] ;
                    a=3;                    
                     break; 
              case 2: // третий
                    registr= LEDS[2] ;
                    a=1;                    
                    break; 
              case 3: // четвертый
                    registr= LEDS[3] ;
                    a=0;                   
                    break; 
        }
        ANS0=0;
        TRIS_DS=0;
        for(i=0;i<16;i++)
        {
        if(registr&(1<<15)) {PIN_DS = 1;} else {PIN_DS = 0;}
        registr = registr<<1;
        PIN_SH = 1;
        NOP();
        PIN_SH = 0; 
        PIN_DS = 0;
        }
      NOP();
      PIN_ST = 1;
      NOP();
      PIN_ST = 0; 
      TRIS_DS=1; 
      ANS0=1;

    }
  }

void convertU (void)
{ // функция преобразования 1024 в 5.00в



    unsigned int 	volt        ; //
    unsigned char DS;
    unsigned char j;
    unsigned int   	tempLEDS[4] ;


        volt  = read_ADC (0);        
   if ( volt>=4999) 
       {
        tempLEDS[3]= digits [10]; // выводим Err 
        tempLEDS[2]= digits [12];
        tempLEDS[1]= digits [11];
        tempLEDS[0]= digits [11];
       }
   else
       {
       for (j=0;j<4;j++)
         {
           DS=volt%10;
           volt=volt/10;
           tempLEDS[j]= digits [DS];  
         } 
         tempLEDS[3]&= (~ SEG_H);
       }
        tempLEDS[3]|= dig3;
        tempLEDS[2]|= dig2;
        tempLEDS[1]|= dig1;
        tempLEDS[0]|= dig0;

    GIE = 0; 
      LEDS[3]= tempLEDS[3];
      LEDS[2]= tempLEDS[2];
      LEDS[1]= tempLEDS[1];
      LEDS[0]= tempLEDS[0];
    GIE = 1;      
   
}
void convertA (void)
{ // функция преобразования 1024 в 5.00в



    unsigned int 	volt        ; //
    unsigned char DS;
    unsigned char j;
    unsigned int   	tempLEDS[4] ;


        volt  = read_ADC (1);
        
   if ( volt>=4999) 
       {
        tempLEDS[3]= digits [10];
        tempLEDS[2]= digits [12];
        tempLEDS[1]= digits [11];
        tempLEDS[0]= digits [11];
       }
   else
       {
       for (j=0;j<4;j++)
         {
           DS=volt%10;
           volt=volt/10;
           tempLEDS[j]= digits [DS];  
         } 
         tempLEDS[3]&= (~ SEG_H);
       }

        tempLEDS[3]|= dig3;
        tempLEDS[2]|= dig2;
        tempLEDS[1]|= dig1;
        tempLEDS[0]|= dig0;

    GIE = 0;
      LEDS[3]= tempLEDS[3];
      LEDS[2]= tempLEDS[2];
      LEDS[1]= tempLEDS[1];
      LEDS[0]= tempLEDS[0];
    GIE = 1;      
   
}
//***********************************************************************
//* ОСНОВНАЯ ПРОГРАММА
//***********************************************************************
void main (void)
{
     init();
     for(i=255;i>0;i--);
     //******** ГЛАВНЫЙ ЦИКЛ *****************
     while (1)
          {
           if(GPIO3)
           {
            convertU ();  
           }
           else
           {
            convertA ();  
           }            
//      while (!CMIF || !TMR1IF);
//      while (!CMIF | !TMR1IF);
//      while (!CMIF || !PIR1bits.TMR1IF);
      NOP();
      NOP();
          };
}
//************************************************************************
//*
//************************************************************************
unsigned int read_ADC (unsigned char chanel)
{ // функция преобразования 1024 в 5.000в

    static unsigned int old_adc,adc;
    static unsigned char caunt;

    unsigned char j=200;
       ADFM=1;
      ADCON0 = (ADCON0&0b11000011)|(chanel<<2);        ; // 
        while (j--);
        GODONE=1;
        while (GODONE){NOP();};
          old_adc +=  (ADRESH<<8)+ADRESL; //помещаем значение ацп в переменную adc чтобы могли с ним работать ниже
        caunt++; 
        caunt&=0b00111111; 

        if(caunt == 0) {
            adc = old_adc>>6; old_adc = 0;}

        return (adc*5000L)/1023;
} // end "read_ADC"

 

 

Ссылка на комментарий
Поделиться на другие сайты

в main  остается только счет на 2 разряда:

 while(1)
    {
        for(i=0;i<100;i++){
            segchar(i);
            data_submit(dat);
            __delay_ms(500);
        }
    }

в вот внутри  разрядов segchar(R2) не различает единицы и десятки:

void interrupt timer0()
{
  T0_discharge();
  T0IF=0;
}

 void T0_ledprint(unsigned int number)
{
  R1 = number%10;
  R2 = number%100/10;
}
//--------------------------------------------
void T0_discharge(void)
{
  if(n_count==0)
  {
    PORTCbits.RC2 = 0;
//    segchar(R2);
    PORTCbits.RC1 = 1;
  }
  else if(n_count==1)
  {
    PORTCbits.RC1 = 0;
//    segchar(R1);
    PORTCbits.RC2 = 1;
  }
  n_count++;
  if (n_count>1) n_count=0;
}

 

сорри не увидел

 

Ссылка на комментарий
Поделиться на другие сайты

в прерывании должна быть только динамическая индикация,

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

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...