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

Общие вопросы по PIC-микроконтроллерам


NebsteR

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

16 часов назад, vksam сказал:

Разве что добавлена керамика по питанию контроллера.

что показывает осциллограф по линии питания DS1307?  при Vcc <1.25*Vbat передача данных будет сброшена  вне зависимости от состояния линии.

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

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

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

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

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

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

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

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

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

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

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

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

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

еще раз пересмотрел код, так и не понял накой делите на 10??? зачем преобразовывать при чтении BDC в НЕХ , чтобы потом опять преобразовать BDC

              secCounter = ds_read( 0x00 );
              minCounter = ds_read( 0x01 );

              clock[0] = Hex( secCounter%10 );
              clock[1] = Hex( secCounter/10 );
              clock[2] = Hex( minCounter%10 );
              clock[3] = Hex( minCounter/10 );

должно быть

               secCounter = ds_read( 0x00 );
              minCounter = ds_read( 0x01 );

              clock[0] = Hex( secCounter&0x0f );
              clock[1] = Hex( (secCounter&0x70)>>4 );
              clock[2] = Hex( minCounter&0x0f );
              clock[3] = Hex( (minCounter&0xf0)>>4 );

 

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

С конвертацией понятно... действительно нет смысла.

На щупе есть делитель 1:1 и 1:10 (был включен), а осцил настроен на 1:1. Выставил и там и там 1:10

SDS00005.png.9960d36e24dee956f90dedcad200601b.png

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

Похоже разобрался!

Сегодня попробовал отладку в протеусе с cof-файлом - так тоже фигня была, а с hex-работает.

Как ты и говорил, действительно косяк был в двойном преобразовании при чтении.

Сейчас работает и в протеусе и в железе одинаково.

Буду доводить код до ума.

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

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

Я думаю, что интервал должен быть около 10мс (из расчета 4 разряда, 25 Гц )

Светить сегменты думаю в TMR0, а читать/писать часы и обрабатывать кнопки - в основной программе.

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

Спасибо за участие!

Все получилось. Правда есть один момент - сегменты периодически "дрожат". Похоже, что где-то сбивается частота.

Кстати, касательно перевода времени в десятичную систему... в ней проще манипулировать переменными.

Двоично-десятичные проблемно считать...

Код такой получился

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

int ms1;

unsigned int msCounter = 0;
//unsigned int secCounter = 88;
unsigned short minCounter = 0;
unsigned short hrCounter = 0;
unsigned short minCounterTmp = 0;
unsigned short hrCounterTmp = 0;

unsigned char dot = 0b00000000;
unsigned short digits[10] = { 65, 125, 196, 84, 120, 82, 66, 117, 64, 80 };
unsigned short segment = 0;

short needWrite = 0;

// Software I2C connections
sbit Soft_I2C_Scl           at RA6_bit;
sbit Soft_I2C_Sda           at RA7_bit;
sbit Soft_I2C_Scl_Direction at TRISA6_bit;
sbit Soft_I2C_Sda_Direction at TRISA7_bit;
// End Software I2C connections

unsigned short ds_read( unsigned short addr ){
         unsigned short tmp;

         Soft_I2C_Start();
         Soft_I2C_Write(0xD0);           //
         Soft_I2C_Write( addr );
         Soft_I2C_Start();
         Soft_I2C_Write(0xD1);           //
         tmp = Soft_I2C_Read(0);
         Soft_I2C_Stop();

         return tmp;
                                        
}

void ds_write( unsigned short addr,unsigned short dat ){
         unsigned char tmp;
         
         Soft_I2C_Start();
         Soft_I2C_Write( 0xD0 );           //
         Soft_I2C_Write( addr );
         Soft_I2C_Write( dat );           //
         Soft_I2C_Stop();

}

void ds_init(){
     unsigned char i;

     // óñòàíàâëèòâàåì ðåæèì 24 ÷àñà
     i = ds_read( 0x02 );
     if( (i&0x40)!=0 ){
         ds_write( 0x02, i&~0x40 );
     }
     
     // åñëè ÷àñû âûêëþ÷åíû - âêëþ÷àåì
     i = ds_read( 0x00 );
     if((i&0x80)!=0){ 
         ds_write( 0x00, i&~0x80 );
     }

}

void interrupt(){

     if( T0IF_bit ){
         TMR0IF_bit = 0;
         TMR0 = 100;
     
         ms1 += 5;
         msCounter +=5;

         PORTA = 0b00110000 ^ (0b00000001 << segment);

         switch( segment ){
                 case 0:
                      PORTB = digits[ minCounter&0x0f ];
                      segment = 2;
                 break;
                 case 1:
                      PORTB = digits[ (minCounter&0x70)>>4 ];
                      segment = 3;
                 break;
                 case 2:
                      PORTB = digits[ hrCounter&0x0f ]^ dot;
                      segment = 1;
                 break;
                 case 3:
                      PORTB = digits[ (hrCounter&0xf0)>>4 ];
                      segment = 0;
                 break;
         }

     }
}

void main() {
     CMCON = 7;
     PORTA = 0b00110000;
     TRISA = 0b00110000;

     PORTB = 0b00000000;
     TRISB = 0b00000000;

     OPTION_REG = 0x84;
     TMR0 = 100;
     INTCON = 0xA0;

     Soft_I2C_Init();
     ds_init();

     while(1){

             if( msCounter >= 1000 & needWrite == 0 ){
                 minCounter = ds_read( 0x01 );
                 hrCounter = ds_read( 0x02 );

                 minCounterTmp = Bcd2Dec( minCounter );
                 hrCounterTmp = Bcd2Dec( hrCounter );
                 
                 dot = (dot == 0)?0b01000000:0;
                 msCounter = 0;
             }
             
             if( needWrite == 1){
                 minCounter = Dec2Bcd( minCounterTmp);
                 hrCounter = Dec2Bcd( hrCounterTmp);
                 ds_write( 0x01, minCounter );
                 ds_write( 0x02, hrCounter );
                 needWrite = 0;
             }
             
             if( ms1 >= 250 ){
                 if( RA4_bit == 0 ){
                     minCounterTmp++;

                     if( minCounterTmp >= 60 ){
                         minCounterTmp = 0;
                     }
                     needWrite = 1;
                 }
                 
                 if( RA5_bit == 0 ){
                     hrCounterTmp++;
                     
                     if( hrCounterTmp >= 24 ){
                         hrCounterTmp = 0;
                     }
                     needWrite = 1;

                 }

                 ms1 = 0;
             }

     }

}

 

 

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

Добрый вечер форумчанам! Извините что может не в той теме пишу, просто даже не с кем мыслями поделиться. В общем заказал на Алиэкспресс десяток PIC18F46K22, сегодня пришли, нормально упакованы, всё смотрится ОК. Написал продавцу положительный отзыв, а потом чего-то дёрнуло меня проверить хоть одного контроллера, подключаю к Пиккиту3 и вижу что нужного мне нету, а определился как PIC18F46K20. Я и растворителем тёр, и под увеличилкой смотрел - всё чисто, нормальная надпись. Подпаиваю второго - та-же песня. Причём проц чем-то зашит, флеш залочена, а в EEPROM какой-то логотип из трёх букв, и дальше куча текста на английском языке. Пишу продавцу, а она такая: Да не может быть, мы вам отправили PIC18F46K22. Я ей отвечаю что надпись совпадает, но проц другой, просто надпись перемаркирована. В общем, она наверное обрадовалась что надпись в норме, и больше не отвечает... Потом посмотрел я на тех процах, которые у меня есть в наличии, и на этих которые пришли... Если внимательно присмотреться к логотипу Микрочип, то видно что оригинальная надпись как бы растянута в ширину, буква "М" широкая, а буквы "с" без скруглений на концах, а на тех процах, которые сегодня приехали надпись более сжата, и буква "с" скруглённая. Дополнительный отзыв я конечно отправлю с фотографиями, чтобы кто-нибудь не наступил на мои грабли, а вот самому чего делать - мне 3-ёх вольтовые как бы и не нужны, да и эррата там совсем не очень! А отправлять назад продавцу - так сейчас это платно, и не будет никакого смысла, проще тогда себе оставить.

Кто что скажет - были у кого такие случаи ?

Прикладываю фото, тот проц который из приехавшей партии справа снизу. Ещё раз извините что не в тему.

SAM_2635.JPG

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

Естественно, внешне они не будут похожи на оригинальные - сделаны же они в Китае ! Ну а о внутренностях остаётся только догадываться.
В общем, попали похоже Вы на несправедливого продавана. Ставьте ему "кол" в репутацию, пишите негативный отзыв и открывайте спор. На все его уговоры не ведитесь, пусть возвращает деньги.
 

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

Дело в том что я уже заказывал в Китае, и всё приходило нормальное, правда у других продавцов. Да и кто будет подделывать оригинальные процы - там даже ревизия совпадает для PIC18f46K20 "0D" по эррате как раз 8 месяц 16 года, и на проце промаркировано 22 неделя 16 года, такое ощущение что просто последнюю букву подправили. Но тогда надпись не такая... А продавец похоже и не знает что продаёт, да и 5 баллов я её уже поставил. А возврат сейчас платный - что вернуть назад чтобы деньги вернули,  что оставить себе - одно на одно выйдет... А по корпусу - что снизу, что сверху, кроме логотипа всё вроде в норме, и надпись лазерная...

Первый раз с таким встречаюсь... А Пики делаются в Тайланде, снизу в кружочке маркировка есть...

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

В 13.09.2017 в 22:20, vksam сказал:

 

Кстати, касательно перевода времени в десятичную систему... в ней проще манипулировать переменными.

Двоично-десятичные проблемно считать...

 

  Показать содержимое


int ms1;

unsigned int msCounter = 0;
//unsigned int secCounter = 88;
unsigned short minCounter = 0;
unsigned short hrCounter = 0;
unsigned short minCounterTmp = 0;
unsigned short hrCounterTmp = 0;

unsigned char dot = 0b00000000;
unsigned short digits[10] = { 65, 125, 196, 84, 120, 82, 66, 117, 64, 80 };
unsigned short segment = 0;

short needWrite = 0;

// Software I2C connections
sbit Soft_I2C_Scl           at RA6_bit;
sbit Soft_I2C_Sda           at RA7_bit;
sbit Soft_I2C_Scl_Direction at TRISA6_bit;
sbit Soft_I2C_Sda_Direction at TRISA7_bit;
// End Software I2C connections

unsigned short ds_read( unsigned short addr ){
         unsigned short tmp;

         Soft_I2C_Start();
         Soft_I2C_Write(0xD0);           //
         Soft_I2C_Write( addr );
         Soft_I2C_Start();
         Soft_I2C_Write(0xD1);           //
         tmp = Soft_I2C_Read(0);
         Soft_I2C_Stop();

         return tmp;
                                        
}

void ds_write( unsigned short addr,unsigned short dat ){
         unsigned char tmp;
         
         Soft_I2C_Start();
         Soft_I2C_Write( 0xD0 );           //
         Soft_I2C_Write( addr );
         Soft_I2C_Write( dat );           //
         Soft_I2C_Stop();

}

void ds_init(){
     unsigned char i;

     // óñòàíàâëèòâàåì ðåæèì 24 ÷àñà
     i = ds_read( 0x02 );
     if( (i&0x40)!=0 ){
         ds_write( 0x02, i&~0x40 );
     }
     
     // åñëè ÷àñû âûêëþ÷åíû - âêëþ÷àåì
     i = ds_read( 0x00 );
     if((i&0x80)!=0){ 
         ds_write( 0x00, i&~0x80 );
     }

}

void interrupt(){

     if( T0IF_bit ){
         TMR0IF_bit = 0;
         TMR0 = 100;
     
         ms1 += 5;
         msCounter +=5;

         PORTA = 0b00110000 ^ (0b00000001 << segment);

         switch( segment ){
                 case 0:
                      PORTB = digits[ minCounter&0x0f ];
                      segment = 2;
                 break;
                 case 1:
                      PORTB = digits[ (minCounter&0x70)>>4 ];
                      segment = 3;
                 break;
                 case 2:
                      PORTB = digits[ hrCounter&0x0f ]^ dot;
                      segment = 1;
                 break;
                 case 3:
                      PORTB = digits[ (hrCounter&0xf0)>>4 ];
                      segment = 0;
                 break;
         }

     }
}

void main() {
     CMCON = 7;
     PORTA = 0b00110000;
     TRISA = 0b00110000;

     PORTB = 0b00000000;
     TRISB = 0b00000000;

     OPTION_REG = 0x84;
     TMR0 = 100;
     INTCON = 0xA0;

     Soft_I2C_Init();
     ds_init();

     while(1){

             if( msCounter >= 1000 & needWrite == 0 ){
                 minCounter = ds_read( 0x01 );
                 hrCounter = ds_read( 0x02 );

                 minCounterTmp = Bcd2Dec( minCounter );
                 hrCounterTmp = Bcd2Dec( hrCounter );
                 
                 dot = (dot == 0)?0b01000000:0;
                 msCounter = 0;
             }
             
             if( needWrite == 1){
                 minCounter = Dec2Bcd( minCounterTmp);
                 hrCounter = Dec2Bcd( hrCounterTmp);
                 ds_write( 0x01, minCounter );
                 ds_write( 0x02, hrCounter );
                 needWrite = 0;
             }
             
             if( ms1 >= 250 ){
                 if( RA4_bit == 0 ){
                     minCounterTmp++;

                     if( minCounterTmp >= 60 ){
                         minCounterTmp = 0;
                     }
                     needWrite = 1;
                 }
                 
                 if( RA5_bit == 0 ){
                     hrCounterTmp++;
                     
                     if( hrCounterTmp >= 24 ){
                         hrCounterTmp = 0;
                     }
                     needWrite = 1;

                 }

                 ms1 = 0;
             }

     }

}

 

Не знаю как кому - я уже тысячу раз пытался перейти на СИ, но как гляну в дизАСМ, у меня волосы на жопе хуже чем у ёжика на голове. Кто этих написателей си компиляторов так учил из АСМ в СИ переводить - Корабельников видать, или как его там ?!?...

К примеру BCD преобразование - если сказать мягко  - то дурдом отдыхает. Мне не нужно тысячи триллионов из HEX в данные для 7SEG индикатора, мне нужно тупо 2 байта - а мне предлагают портянку из непонятного фуфла...

Я лично беру МкроСИ версии не выше 4.60 (выше есть проблемы с математикой) и пишу:

unsigned int data;
unsigned char  ds_tys, tys, ds, ed ;

 if (data >= 1000) {

 data = data - 1000;

 ds_tys ++; }

if (data >= 100) {

 data = data - 100;

 tys ++; }

 и так далее... поверьте - преобразование для PIC18 с 8 МИПС пару мкс., и вот у меня в руках функция "BCD" которая даже если написана для PIC18 - с лёгкостью проглатывается и для пик10 - 16, т.е код типа:

  BTFSC XX, 1                  ;  если бит 1 некоего регистра = 1, 

  BRA      METKA_1         ;  то переход на "METKA_1"

  или:

  ADDWF  XX,F                 ;  инкремент некоего регистра "ХХ",  с сохранением в самом регистре, потому что можно написать вот так:

  // ADDWF  XX, W               ;   инкремент некоего регистра "ХХ",  с сохранением в W/

 BC        METKA_1           ;  если переполнился - то переход на "METKA_1"

  Можно конечно и на СИ - типа красиво написать:

 XX++;

 if (C = 1)

 goto METKA_1   //

// а тута продолжение программы если бит Карри не установлен...

 Я ващще тащусь от Си, и особенно как оно может воплотиться в жизнь, пример:

MOVF XX,W           ;  типа берём регистр который будем инкрементировать, и...

MOVWF     R0        ;  ... помещаем на всяк случай во временный - а то вдруг некое прерывание... Как в анекдоте про военных: А вдруг война - а я не пожрамши !!!

INCF           R0,F     ;  ну дальше инкрементируем некий регистр, который программа считает неприкасаемым

MOVW        R0,W   ;  ну и после собственно с чего вся процедура увеличения регистра собственно должна была начаться, и ->

MOVWF      XX       ;  и чем закончится. Короче - веселуха, других нематных словей я не найду...

Понятно, что оптимизация где-то спасает. Но я не настолько туп, чтобы пользоваться тупыми СИ компилляторами...

 комменты писал по быструхе - кого не устроят - звыняйте...

 

 

 

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

 

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

 Я ващще тащусь от Си

 

А я тащусь два раза. Но это религиозные войны. Сями (и другими ЯВУ) можно заняться ТОЛЬКО хорошо знаючи Асм и даташит.

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

действиям. Вспомните детство своё золотое. Хоть кто-то пытался так сделать? Вряд-ли. Начали с АСМ и плавно переехали на ЯВУ (любое (кроме flowcode)), знаючи кишки камня, вставляя асмовские вставки (оч хороший вариант(постоянно пользуюсь).  

Изменено пользователем koms45

Так ку или не ку ?!

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

ну и раз уже коснулось динамической индикации - я объявляю  ножки вот таким образом..
   #Define    CATODE4        PORTB_DB,4          ;  выходы катодов индикатора
   #Define    CATODE1        PORTB_DB,5          ;  ---------- // -----------
   #Define    CATODE2        PORTB_DB,6          ;  ---------- // -----------
   #Define    CATODE3        PORTB_DB,7          ;  ---------- // -----------
   #Define    INDIKATOR_OUT  PORTC               ;  8 выходов анодов индикатора

Это я взял из программы, HEX которой выкладывал на общее потребление (там по катодам ставил доп. транзисторы), а если делаю для себя - то у меня и ЧМЗ нормально проходит - главное знать принцип этого ЧМЗ...
     ;--------------------------------------------------------------------------

Когда в другом устр-ве  захотите изменить пины анодов (катодов) индикатора - то просто ниже подкорректируете биты:
   ANOD_A              EQU        B'00000100'    ;   2
   ANOD_B              EQU        B'00001000'    ;   3
   ANOD_C              EQU        B'00010000'    ;   4
   ANOD_D              EQU        B'01000000'    ;   6
   ANOD_E              EQU        B'10000000'    ;   7
   ANOD_F              EQU        B'00000010'    ;   1
   ANOD_G              EQU        B'00000001'    ;   0
   ANOD_H              EQU        B'00100000'    ;   5
   TOCHKA              EQU        5              ;   
   MINUS               EQU        B'00000001'    ;   0

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

   #Define    _DEFIS         ANOD_G
   #Define    _0             ANOD_A + ANOD_B + ANOD_C + ANOD_D + ANOD_E + ANOD_F
   #Define    _0.            ANOD_A + ANOD_B + ANOD_C + ANOD_D + ANOD_E + ANOD_F + ANOD_H
   #Define    _1             ANOD_B + ANOD_C
   #Define    _1.            ANOD_B + ANOD_C + ANOD_H
   #Define    _2             ANOD_A + ANOD_B + ANOD_G + ANOD_E + ANOD_D
   #Define    _2.            ANOD_A + ANOD_B + ANOD_G + ANOD_E + ANOD_D + ANOD_H
   #Define    _3             ANOD_A + ANOD_B + ANOD_C + ANOD_D + ANOD_G
   #Define    _3.            ANOD_A + ANOD_B + ANOD_C + ANOD_D + ANOD_G + ANOD_H
   #Define    _4             ANOD_F + ANOD_G + ANOD_B + ANOD_C
   #Define    _4.            ANOD_F + ANOD_G + ANOD_B + ANOD_C + ANOD_H
   #Define    _5             ANOD_A + ANOD_F + ANOD_G + ANOD_C + ANOD_D
   #Define    _5.            ANOD_A + ANOD_F + ANOD_G + ANOD_C + ANOD_D + ANOD_H
   #Define    _6             ANOD_A + ANOD_F + ANOD_G + ANOD_C + ANOD_D + ANOD_E
   #Define    _6.            ANOD_A + ANOD_F + ANOD_G + ANOD_C + ANOD_D + ANOD_E + ANOD_H
   #Define    _7             ANOD_A + ANOD_B + ANOD_C
   #Define    _7.            ANOD_A + ANOD_B + ANOD_C + ANOD_H
   #Define    _8             ANOD_A + ANOD_B + ANOD_C + ANOD_D + ANOD_E + ANOD_F + ANOD_G
   #Define    _8.            ANOD_A + ANOD_B + ANOD_C + ANOD_D + ANOD_E + ANOD_F + ANOD_G + ANOD_H
   #Define    _9             ANOD_A + ANOD_B + ANOD_C + ANOD_D + ANOD_F + ANOD_G
   #Define    _9.            ANOD_A + ANOD_B + ANOD_C + ANOD_D + ANOD_F + ANOD_G + ANOD_H
       
   #Define    _A             ANOD_A + ANOD_B + ANOD_C + ANOD_E + ANOD_F + ANOD_G
   #Define    _A.            ANOD_A + ANOD_B + ANOD_C + ANOD_E + ANOD_F + ANOD_G + ANOD_H
   #Define    _a             ANOD_C + ANOD_E + ANOD_G
   #Define    _b             ANOD_C + ANOD_D + ANOD_E + ANOD_F + ANOD_G
   #Define    _b.            ANOD_C + ANOD_D + ANOD_E + ANOD_F + ANOD_G + ANOD_H
   #Define    _C             ANOD_A + ANOD_D + ANOD_E + ANOD_F
   #Define    _C.            ANOD_A + ANOD_D + ANOD_E + ANOD_F + ANOD_H
   #Define    _c             ANOD_D + ANOD_E + ANOD_G
   #Define    _c.            ANOD_D + ANOD_E + ANOD_G + ANOD_H
   #Define    _d             ANOD_B + ANOD_C + ANOD_D + ANOD_E + ANOD_G
   #Define    _d.            ANOD_B + ANOD_C + ANOD_D + ANOD_E + ANOD_G + ANOD_H
   #Define    _E             ANOD_A + ANOD_D + ANOD_E + ANOD_F + ANOD_G
   #Define    _E.            ANOD_A + ANOD_D + ANOD_E + ANOD_F + ANOD_G + ANOD_H
   #Define    _F             ANOD_A + ANOD_E + ANOD_F + ANOD_G
   #Define    _F.            ANOD_A + ANOD_E + ANOD_F + ANOD_G + ANOD_H
   #Define    _G             ANOD_A + ANOD_C + ANOD_D + ANOD_E + ANOD_F
   #Define    _G.            ANOD_A + ANOD_C + ANOD_D + ANOD_E + ANOD_F + ANOD_H
   #Define    _H             ANOD_B + ANOD_C + ANOD_E + ANOD_F + ANOD_G
   #Define    _H.            ANOD_B + ANOD_C + ANOD_E + ANOD_F + ANOD_G + ANOD_H
   #Define    _h             ANOD_C + ANOD_E + ANOD_F + ANOD_G
   #Define    _h.            ANOD_C + ANOD_E + ANOD_F + ANOD_G + ANOD_H
   #Define    _I             ANOD_B + ANOD_C
   #Define    _I.            ANOD_B + ANOD_C + ANOD_H
   #Define    _i             ANOD_C
   #Define    _i.            ANOD_C + ANOD_H
   #Define    _L             ANOD_D + ANOD_E + ANOD_F
   #Define    _L.            ANOD_D + ANOD_E + ANOD_F + ANOD_H
   #Define    _l             ANOD_D + ANOD_E
   #Define    _l.            ANOD_D + ANOD_E + ANOD_H
   #Define    _n             ANOD_C + ANOD_E + ANOD_G
   #Define    _n.            ANOD_C + ANOD_E + ANOD_G + ANOD_H
   #Define    _O             ANOD_A + ANOD_B + ANOD_C + ANOD_D + ANOD_E + ANOD_F
   #Define    _O.            ANOD_A + ANOD_B + ANOD_C + ANOD_D + ANOD_E + ANOD_F + ANOD_H
   #Define    _o             ANOD_C + ANOD_D + ANOD_E + ANOD_G
   #Define    _o.            ANOD_C + ANOD_D + ANOD_E + ANOD_G + ANOD_H
   #Define    _P             ANOD_A + ANOD_B + ANOD_E + ANOD_F + ANOD_G
   #Define    _P.            ANOD_A + ANOD_B + ANOD_E + ANOD_F + ANOD_G + ANOD_H
   #Define    _r             ANOD_E + ANOD_G
   #Define    _r.            ANOD_E + ANOD_G + ANOD_H
   #Define    _S             ANOD_A + ANOD_C + ANOD_D + ANOD_F + ANOD_G
   #Define    _S.            ANOD_A + ANOD_C + ANOD_D + ANOD_F + ANOD_G + ANOD_H
   #Define    _t             ANOD_D + ANOD_E + ANOD_F + ANOD_G
   #Define    _t.            ANOD_D + ANOD_E + ANOD_F + ANOD_G + ANOD_H
   #Define    _U             ANOD_B + ANOD_C + ANOD_D + ANOD_E + ANOD_F
   #Define    _U.            ANOD_B + ANOD_C + ANOD_D + ANOD_E + ANOD_F + ANOD_H
   #Define    _u             ANOD_C + ANOD_D + ANOD_E
   #Define    _u.            ANOD_C + ANOD_D + ANOD_E + ANOD_H
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Непосредственно таблица вывода информации на семисегментник...
         ANDLW     B'00001111'                ; маскировка 4 старших бит
         ADDWF     PCL,F                      ; переход
     ;--------------------------------------------------------------------------
         RETLW     ANOD_A + ANOD_B + ANOD_C + ANOD_D + ANOD_E + ANOD_F           ; 0  для общего катода...
         RETLW     ANOD_B + ANOD_C                                               ; 1
         RETLW     ANOD_A + ANOD_B + ANOD_G + ANOD_E + ANOD_D                    ; 2
         RETLW     ANOD_A + ANOD_B + ANOD_C + ANOD_D + ANOD_G                    ; 3
         RETLW     ANOD_F + ANOD_G + ANOD_B + ANOD_C                             ; 4
         RETLW     ANOD_A + ANOD_F + ANOD_G + ANOD_C + ANOD_D                    ; 5
         RETLW     ANOD_A + ANOD_F + ANOD_G + ANOD_C + ANOD_D + ANOD_E           ; 6
         RETLW     ANOD_A + ANOD_B + ANOD_C                                      ; 7
         RETLW     ANOD_A + ANOD_B + ANOD_C + ANOD_D + ANOD_E + ANOD_F + ANOD_G  ; 8
         RETLW     ANOD_A + ANOD_B + ANOD_C + ANOD_D + ANOD_F + ANOD_G           ; 9
         RETLW     0
         RETLW     0
         RETLW     0
         RETLW     0
         RETLW     0
         RETLW     0

Когда меня просят написать что-то  с динамической индикацией - для меня это вообще сказка - я трёх зайцев одним низкоприоритетным прерыванием убиваю...

Первый заис: я делаю 500 прерываний в секунду чтобы на каждый индикатор приходилось 125 высвечиваний так сказать... Тут человек сказал что делает индикацию через сегмент - вот это мысль, я такое не пробовал,. для меня может и поможет. Потому что я делаю динамику справа на лево, и боковым зрением (в автомобиле при движении) вижу смену элементов - моргание, или дребезг символов. А если делаю 400 (100 на каждый символ - так они вообще дрожат как у старых телевизоров). Частоту выше 500 делать смысла нету - не успевают полноценно зажечься светодиоды индикатора - в тёмной комнате это не важно, а на солнце не будет видно чего там на индикатор выводится.

Второй заис: приходшь в прерывание - и опрашиваешь ножку включенного на данный момент катода и через кнопку подключенного к данной ножке входа проца, который сам обозначил как вход клавиатуры. После четырёх прерываний - имеешь полный список так сказать нажатых кнопок - я обычно для простых устройств использую четыре кнопки "ESC, OK, Down, Up" - при использовании такой системы достаточно одного входа для клавы. Сбоев никогда не было.

Ну и наконец  -третий заис: в любом устройстве нужно подсчитывать некие тайминги - доли секунд, секунды, минуты, часы, и т.д. - если в этом низкоприоритетном прерывании это делать - то всё ГУД! Главное - рассчитать работу таймера чтобы в него не вносить коррекцию - а чтобы он сам считал и переполнялся - пусть даже это будет не 500 прерываний на индикацию, а к примеру 508...

Вы не успеете на низкоприоритетное прерывание - но флаг прерывания по таймеру установится - позже придёте на текущее прерывание - раньше придёте на следующее - время будет тикать всё равно как нужно...

Хотя я лично предпочитаю чтобы тикала какая-нить DS1307, а я просто буду 2 раза в секунду её просить чтобы она мне сказала точное время...

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

 

А я тащусь два раза. Но это религиозные войны. Сями (и другими ЯВУ) можно заняться ТОЛЬКО хорошо знаючи Асм и даташит.

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

действиям. Вспомните детство своё золотое. Хоть кто-то пытался так сделать? Вряд-ли. Начали с АСМ и плавно переехали на ЯВУ (любое (кроме flowcode)), знаючи кишки камня, вставляя асмовские вставки (оч хороший вариант(постоянно пользуюсь).  

Извините, прошу прощения у форумчан, забыл правила - больше этого не повториться. Прошу прощения у всех кто читает этот форум.

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

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

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

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

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

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

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

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

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

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

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

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