Jump to content
NebsteR

Pic. Общие Вопросы

Recommended Posts

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

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

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

Share this post


Link to post
Share on other sites

а че за фигня с уровнем сигнала дата? почему амплитуда 0,5в????

 

Share this post


Link to post
Share on other sites

Руководство для разработчика приложений на базе STM32WB55

Представив двухъядерные беспроводные микроконтроллеры STM32WB для IoT-приложений, компания STMicroelectronics предлагает разработчикам экосистему, включающую в себя отладочные платы, примеры кода для микроконтроллера, готовое ПО всех уровней и большой массив документации.

Читать статью

И я так понимаю - проверить микру часов просто так не получится?

Share this post


Link to post
Share on other sites
                     

DC/DC-преобразователи: принципы работы и уникальные решения Maxim Integrated

Что нового можно сказать про DC/DC? Написаны десятки статей, а самостоятельное изготовление преобразователя мощностью от единиц Вт до нескольких кВт даже в домашних условиях не составляет большого труда. Тем не менее, когда речь идет о микро-, или даже нано-ваттах, проектировщик может столкнуться с рядом трудностей. Разработка устройства с батарейным питанием весьма малой мощности – одна из наиболее актуальных и интересных задач во время всепроникающего интернета вещей. А грамотная схемотехника системы питания не возможна без знания основ работы DC/DC преобразователей. Освежить базовые знания и узнать об особенностях проектирования узлов питания мобильного устройства с оптимальным энергопотреблением можно из следующей статьи

Подробнее

еще раз пересмотрел код, так и не понял накой делите на 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 );

 

Share this post


Link to post
Share on other sites

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

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

SDS00005.png.9960d36e24dee956f90dedcad200601b.png

Share this post


Link to post
Share on other sites
20 часов назад, vksam сказал:

Тактирующий и дата

считай кол-во тактов , у тебя несоответствие при чтении...

 

 

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

с количеством тактов разобрался? у тебя их при чтении первого байта 10 вместо девяти...

 

 

Share this post


Link to post
Share on other sites

да вроде как 9. На последней картинке осциллограмма не сначала. Но больше пока не считал

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

ну если светить в коде 1-3-2-4 , то 10мс вполне достаточно

а так лучше 1-5мс,

Share this post


Link to post
Share on other sites

а можно подробней? почему именно такой порядок?

Почему не 1-2-3-4?

Share this post


Link to post
Share on other sites

потому что получается бегущие огни и глаз на 25Гц воспринимает их как мерцание

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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;
             }

     }

}

 

 

Share this post


Link to post
Share on other sites
2 часа назад, vksam сказал:

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

элементарно

unsigned short incDEC(unsigned short caunt)
{
 caunt+=7;
if(!DC)caunt-=6;
return caunt;
}

 

Share this post


Link to post
Share on other sites

как что? DC - флаг десятичного переноса/займа, 1-й бит регистра STATUS .

Share this post


Link to post
Share on other sites

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

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

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

SAM_2635.JPG

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Edited by ALEKS1102X

Share this post


Link to post
Share on other sites
В 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       ;  и чем закончится. Короче - веселуха, других нематных словей я не найду...

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

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

 

 

 

Share this post


Link to post
Share on other sites

 

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

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

 

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

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

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

Edited by koms45

Share this post


Link to post
Share on other sites

ну и раз уже коснулось динамической индикации - я объявляю  ножки вот таким образом..
   #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)), знаючи кишки камня, вставляя асмовские вставки (оч хороший вариант(постоянно пользуюсь).  

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Николай кол
      Привет, у меня есть вопрос, как передать данных с микроконтроллера pic через блютуз модуль HC-05 на телефон в виде графика.Не могли бы вы показать скрипт или статю.Про Arduino много а про pic не (нужно передать данные с микроконтроллера на телефон а не на оборот).У же есть приложение на app inventor 2.Нужно примерно как тут https://www.youtube.com/watch?v=WzoCQ2fRsRQ
    • By duty
      Привет, участникам форума! Подскажите, пожалуйста, как можно реализовать связь микроконтроллера pic с адресным ключом (ds2405 или ds2408) по 1-wire (на шине будут висеть несколько ключей)  для считывания pio ключа, во входном режиме, т.е на pio поступает сигнал  с магнитоконтактного датчика о срабатывание его или нет.    Datasheet читал, но мало чего понял.  Тестирование произвожу в proteus 8.6
    • By Максим123456789
      делаю диплом, в схеме у меня микроконтроллер PIC16F688 и мне нужно его заменить на ATmega. Не могу найти похожий
    • By Reptile
      Доброго времени суток. Пытаюсь восстановить работоспособность колонок Top Device TDE 261/2.1. Колонки не раз ремонтировалась по части УНЧ, при очередном ремонте по ошибке (одинаковые разъемы) с трансформатора было подано переменное питающее напряжение на входы (разъем AUX/MP3) аудиопроцессора PT2313L  (3,10,14 ноги - AGND, R_IN2 L_IN2). В результате чего выгорел сам аудиопроцессор PT2313L. PT2313L был заменен. Но колонка по прежнему не запускается. Как я понял, не запускается сам PT2313L, на его аудиовыходах (ноги 24, 25) сигнала нет. Передняя панель работает: индикация, кнопки, енкодер. Имеется подозрение, что вместе с процессором выгорели линии DATA и/или CLK на MCU, так как MCU и PT2313L соединены по этим линиям напрямую друг с другом. В МК и всей этой цифровой штуке не очень шарю, не знаю, как грамотно проверить работоспособность этой цифровой части, поэтому прошу помощи - Возможно ли какими-либо способами восстановить колонку или уже всё... 
      Из приборов, к сожалению, только мультиметр, осциллограф отсутствует.
      Ниже немного измерений.
      Напряжения на линиях: STD-BY-ждущий режим (в скобках рабочий режим):
      DATA - 2.31В (1.9В).
      CLK - 0.125В (0.135В).
      Сопротивление между выводами:
      CLK_MCU-DATA_MCU - 47 Ом. 
      CLK_MCU/DATA_MCU-GND - около 0.22 Ом и там и там. Звонится в обе стороны.
      Питание MCU 5В, (4.6В STD-BY-ждущий режим, 4.0В рабочий режим и со временем также почему-то может падать до 3.6В)
      MCU - не известен, нет маркировки. 18 Выводов, DIP.
      Ноги MCU, которые удалось опознать:
      1 - DATA
      18 - CLK
      3 - GND (?)
      5 - GND (?)
      ? - они соединены вместе
      14 - VCC
      17 - not used (n/a)
      15, 16 - OSC
      ET6202 - управление индикатором, Control LED drive circuit
      Фото плат (под сполером) и даташиты прилагаются.
      Схемы данных колонок не имеется. Все что удалось найти это схема чуть более старшей модели TDE280/2.1, с данными колонками она мало что общего имеет, лишь общий принцип, узлы довольно сильно отличаются, но прикреплю на всякий, для общей информации.
      PT2313L
      ET6202
      TDE280
       
    • By Илья Говжеев
      Поделитесь опытом , кто уже пробывал из arduino сделать программатор pic? 

  • Сообщения

    • Это вряд ли. Посмотрите, какой максимально-допустимый ток через контакты "галетника". В 86-м году вышло 12 номеров. Читая книжки, обратите внимание, что в электронике ещё нужна точность до педантизма, в том числе в изложении мыслей.
    • Вот такие попались переключателя с ЧПУ, куда можно их применить?   Еще фото Еще фото  Еще фото 
    • В этой схеме - можно. Источник питания - источник тока, всего на 30 мА.   По-моему, что-то на этой схеме не так. Через цепь R7 - ЭКQ2 - R4 - БЭQ1 при разомкнутой кнопке течёт ток примерно 0,5 мА. При замкнутой - порядка 2 мА. В обоих случаях транзистор Q1 открыт...
    • По паре конденсаторов К50-18 4700мкФх80В и 10000х50В, демонтаж: Мне больше нравятся крепления  ... Первые по 50р., вторые по 100р.. На одном 10000мкФ небольшая вмятина: Демонтаж аппарата с консервации, без износа: 1. СР-50-165ФВ: 2.СР-75-166ФВ: 3.СРГ-50-260ФВ: СР-50 и СР-75 по 50р., СРГ по 80р.. Тороидальное железо для намотки трансформаторов... 1. Был сетевой трансформатор от промышленной установки. При отмотке вторичек повредили и первичку, пришлось убрать и её ... Габаритная мощность где-то 270Вт (когда-то считал, но призабыл, можно посмотреть по сечению). Пусть будет 300р.. 2.Железо от ДН-3 генераторов Г3-33, сталь Э330: Если что, по РФ перешлю...  
    • тогда замени транзисторы и включи. ЗЫ перед этим проверь сопротивление между 3 и 25 выводом микры и включай в первый раз на пол секунды, потом пощупай как нагрелись транзисторы, если не нагрелись включишь на секунду, повторишь контроль нагрева... хотя шансы мелкие, скорее всего микра сдохла.
    • Плата разрабатывается с учётом расположения 4 -5 электролитов по 2200мкф,которые соединены между собой и ключом на полевике толстыми (широкими дорожками.Это обеспечивает больший ток в импульсе при открытии ключа и как следствие большую глубину обнаружения предметов.
×
×
  • Create New...