vv7 Опубликовано 6 июля, 2016 Поделиться Опубликовано 6 июля, 2016 Всем привет ! Да, вот так вот. Опять светодиод и опять не запускается. В чём косяк ? Питание - от автозарядки для мобилки ( 12В -> 5В ). Среда разработки ( IDE ): MPLAB X v3.35 Linux, компилятор C18. Программатор: PICKit3 Прошивка, по-моему - нормальная. Сконфигурирован - нормально. ( Или нет ? ) Элементы все рабочие. В наличие есть кварц: 4, 8, 10 МГц. Фотка со схемкой - в атаче. Осциллографа под рукой - нет . Исходник прошивки: #include "config_bits.h" #include <stdio.h> #include <stdlib.h> void main (void) { int i = 0; TRISA = 0x00; PORTA = 0x00; TRISB = 0x00; PORTB = 0xFF; TRISC = 0x00; PORTC = 0x00; TRISD = 0x00; PORTD = 0x00; TRISE = 0x00; PORTE = 0x00; while (1) { for ( i = 0; i < 1000000; i++) { PORTB = !PORTB; } } } Файл "config_bits.h": // PIC18F452 Configuration Bit Settings // 'C' source line config statements #include <p18f452.h> // CONFIG1H #pragma config OSC = HS // Oscillator Selection bits (HS oscillator) #pragma config OSCS = OFF // Oscillator System Clock Switch Enable bit (Oscillator system clock switch option is disabled (main oscillator is source)) // CONFIG2L #pragma config PWRT = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOR = ON // Brown-out Reset Enable bit (Brown-out Reset enabled) #pragma config BORV = 20 // Brown-out Reset Voltage bits (VBOR set to 2.0V) // CONFIG2H #pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit)) #pragma config WDTPS = 128 // Watchdog Timer Postscale Select bits (1:128) // CONFIG3H #pragma config CCP2MUX = ON // CCP2 Mux bit (CCP2 input/output is multiplexed with RC1) // CONFIG4L #pragma config STVR = ON // Stack Full/Underflow Reset Enable bit (Stack Full/Underflow will cause RESET) #pragma config LVP = OFF // Low Voltage ICSP Enable bit (Low Voltage ICSP disabled) // CONFIG5L #pragma config CP0 = OFF // Code Protection bit (Block 0 (000200-001FFFh) not code protected) #pragma config CP1 = OFF // Code Protection bit (Block 1 (002000-003FFFh) not code protected) #pragma config CP2 = OFF // Code Protection bit (Block 2 (004000-005FFFh) not code protected) #pragma config CP3 = OFF // Code Protection bit (Block 3 (006000-007FFFh) not code protected) // CONFIG5H #pragma config CPB = OFF // Boot Block Code Protection bit (Boot Block (000000-0001FFh) not code protected) #pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code protected) // CONFIG6L #pragma config WRT0 = OFF // Write Protection bit (Block 0 (000200-001FFFh) not write protected) #pragma config WRT1 = OFF // Write Protection bit (Block 1 (002000-003FFFh) not write protected) #pragma config WRT2 = OFF // Write Protection bit (Block 2 (004000-005FFFh) not write protected) #pragma config WRT3 = OFF // Write Protection bit (Block 3 (006000-007FFFh) not write protected) // CONFIG6H #pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write protected) #pragma config WRTB = OFF // Boot Block Write Protection bit (Boot Block (000000-0001FFh) not write protected) #pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write protected) // CONFIG7L #pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000200-001FFFh) not protected from Table Reads executed in other blocks) #pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (002000-003FFFh) not protected from Table Reads executed in other blocks) #pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (004000-005FFFh) not protected from Table Reads executed in other blocks) #pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (006000-007FFFh) not protected from Table Reads executed in other blocks) // CONFIG7H #pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot Block (000000-0001FFh) not protected from Table Reads executed in other blocks) Проблема: Он то ли не запускается, то ли ещё что-то. Светодиод на 30 ножке ( PORTBbits.RB0 ( B0 ) ) просто горит. А ведь в программе я прописал, чтоб весь блок B периодически переключался на противоположенное значение, но этого не происходит. Менял значения цикла от 1000000 до 10 - 0 по цельсию. Вопрос, что может быть. Может минус плохой и на монтажных схемках такого рода ( как на фотке ) собирать схемы на МК - плохая идея ? Аля нужно паять ?! Спасибо !!! 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 6 июля, 2016 Поделиться Опубликовано 6 июля, 2016 while (1) { for ( i = 0; i < 1000000; i++) { PORTB = !PORTB; } } Может так : while (1) { for ( i = 0; i < 1000000; i++) continue; PORTB = !PORTB; } 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Yurkin2015 Опубликовано 6 июля, 2016 Поделиться Опубликовано 6 июля, 2016 (изменено) Ну, во-первых, светодиод стоит на 28 ноге, RD5 Во-вторый, знак "!" - это логическая инверсия: даёт результат 1 или 0, а не полный байт для всех ног. Для инверсии всех битов надо использовать PORTB = ~PORTB. Изменено 6 июля, 2016 пользователем Yurkin2015 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
vv7 Опубликовано 6 июля, 2016 Автор Поделиться Опубликовано 6 июля, 2016 Спасибо вам, но всё также. Просто горит ... :help: На 28 ? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Фосген Опубликовано 6 июля, 2016 Поделиться Опубликовано 6 июля, 2016 w7, ты на ассемблере пробовал выполнить эту задачу? Смотрел, какие команды фактически прошиваются в память программ? Или сразу на высокий уровень залез? 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
vv7 Опубликовано 6 июля, 2016 Автор Поделиться Опубликовано 6 июля, 2016 (изменено) Сразу писал в C. Я как-то давно знаком с C, вот и взялся. Просто ... щяс вот пытаюсь разобраться как с ним писать под мк. Вот только как-то всё так, а не пашет Щяс в Proteus проверю, просто только скачал WinXP для VM для этой задачки, ибо он на лине - не пашет Изменено 6 июля, 2016 пользователем vv7 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 6 июля, 2016 Поделиться Опубликовано 6 июля, 2016 Код покажите, который сейчас не пашет. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Фосген Опубликовано 6 июля, 2016 Поделиться Опубликовано 6 июля, 2016 Проблема в том, что МК и так, сам по себе не из простых устройство, так ещё и многие начинающие сразу лезут на высокий уровень, вообще не понимая, что и как происходит. Я не о тебе сейчас, а в целом. Посмотри, во что скомпилировался твой код. Потом выясняй в доках к компилятору, как организовать цикл, как происходит работа с портами. А так - МК сам по себе, повторяюсь, очень сложен, да еще "правила игры" компилятора добавляются. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 6 июля, 2016 Поделиться Опубликовано 6 июля, 2016 И ещё. Может я слепой, но схемы я никакой не вижу 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Vitemk Опубликовано 6 июля, 2016 Поделиться Опубликовано 6 июля, 2016 (изменено) Спасибо вам, но всё также. Просто горит ... :help: Сомневаюсь, что он просто горит. 99% на то, что он просто переключается с ох***ной скоростью. P.S. Извиняюсь, не заметил код с continue. Не является ли int 16-битным? P.S.S Посмотрел User's Guide на C18. Точно, int 16-битный. Замените на short long - 24 бита или на long - 32 бита. Изменено 6 июля, 2016 пользователем Vitemk 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 6 июля, 2016 Поделиться Опубликовано 6 июля, 2016 (изменено) Ещё раз проверьте, куда подключён светодиод. На Вашей фотографии - это нога 28, это не порт В. Для порта В надо выбрать другую ногу, из таблицы. Ноги считаются по кругу. Изменено 6 июля, 2016 пользователем Yurkin2015 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
vv7 Опубликовано 6 июля, 2016 Автор Поделиться Опубликовано 6 июля, 2016 (изменено) Ура-а !!! Заработало. ( Почти ) Проблема была в том, что светодиод стоял на 28 ножке. Я не с той стороны считал их. Но, появилась другая проблема.Светодиод моргает хаотично. Иногда через 5 секунд, иногда через 0.5, а бывает и просто мерцает. И всё это в промежутке 10 секунд. То есть определённого какого-то промежутка - нема. Из-а чего такое может быть ?! + В Протеусе всё работает Всем огромное спасибо ! Код на данный момент: #include "config_bits.h" #include <stdio.h> #include <stdlib.h> void main (void) { int i = 0; TRISA = 0x00; PORTA = 0x00; TRISB = 0x00; PORTB = 0xFF; TRISC = 0x00; PORTC = 0x00; TRISD = 0x00; PORTD = 0x00; TRISE = 0x00; PORTE = 0x00; while (1) { for ( i = 0; i < 10000; i++) continue; PORTB = ~PORTB; } } Файл "config_bits.h": // PIC18F452 Configuration Bit Settings // 'C' source line config statements #include <p18f452.h> // CONFIG1H #pragma config OSC = HS // Oscillator Selection bits (HS oscillator) #pragma config OSCS = OFF // Oscillator System Clock Switch Enable bit (Oscillator system clock switch option is disabled (main oscillator is source)) // CONFIG2L #pragma config PWRT = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOR = ON // Brown-out Reset Enable bit (Brown-out Reset enabled) #pragma config BORV = 20 // Brown-out Reset Voltage bits (VBOR set to 2.0V) // CONFIG2H #pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit)) #pragma config WDTPS = 128 // Watchdog Timer Postscale Select bits (1:128) // CONFIG3H #pragma config CCP2MUX = ON // CCP2 Mux bit (CCP2 input/output is multiplexed with RC1) // CONFIG4L #pragma config STVR = ON // Stack Full/Underflow Reset Enable bit (Stack Full/Underflow will cause RESET) #pragma config LVP = OFF // Low Voltage ICSP Enable bit (Low Voltage ICSP disabled) // CONFIG5L #pragma config CP0 = OFF // Code Protection bit (Block 0 (000200-001FFFh) not code protected) #pragma config CP1 = OFF // Code Protection bit (Block 1 (002000-003FFFh) not code protected) #pragma config CP2 = OFF // Code Protection bit (Block 2 (004000-005FFFh) not code protected) #pragma config CP3 = OFF // Code Protection bit (Block 3 (006000-007FFFh) not code protected) // CONFIG5H #pragma config CPB = OFF // Boot Block Code Protection bit (Boot Block (000000-0001FFh) not code protected) #pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code protected) // CONFIG6L #pragma config WRT0 = OFF // Write Protection bit (Block 0 (000200-001FFFh) not write protected) #pragma config WRT1 = OFF // Write Protection bit (Block 1 (002000-003FFFh) not write protected) #pragma config WRT2 = OFF // Write Protection bit (Block 2 (004000-005FFFh) not write protected) #pragma config WRT3 = OFF // Write Protection bit (Block 3 (006000-007FFFh) not write protected) // CONFIG6H #pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write protected) #pragma config WRTB = OFF // Boot Block Write Protection bit (Boot Block (000000-0001FFh) not write protected) #pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write protected) // CONFIG7L #pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000200-001FFFh) not protected from Table Reads executed in other blocks) #pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (002000-003FFFh) not protected from Table Reads executed in other blocks) #pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (004000-005FFFh) not protected from Table Reads executed in other blocks) #pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (006000-007FFFh) not protected from Table Reads executed in other blocks) // CONFIG7H #pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot Block (000000-0001FFh) not protected from Table Reads executed in other blocks) #pragma target clock 4_000_000 Изменено 6 июля, 2016 пользователем vv7 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Vitemk Опубликовано 6 июля, 2016 Поделиться Опубликовано 6 июля, 2016 Контакт плохой? 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
vv7 Опубликовано 6 июля, 2016 Автор Поделиться Опубликовано 6 июля, 2016 (изменено) Контакт плохой? Контакт в первую очередь проверил ! Может с питанием ? Хотя Мультиметр стабильно показывает 5.05В. Хоть и подключен с аккумулятора на 12В через автозарядку для телефона. Изменено 6 июля, 2016 пользователем vv7 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Vitemk Опубликовано 6 июля, 2016 Поделиться Опубликовано 6 июля, 2016 (изменено) Не только контакт питания. Контакт ножки МК, резистора, светодиода, кварца, конденсаторов кварца. Они не должны болтаться, а жестко сидеть. Для надежности, лучше всё это спаять (хотя бы навесом), а не использовать макетку. Корпус кварца лучше посадить на землю. Но только не припаивать, а прикрутить жесткую проволочку. Изменено 6 июля, 2016 пользователем Vitemk 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
vv7 Опубликовано 6 июля, 2016 Автор Поделиться Опубликовано 6 июля, 2016 (изменено) Последний вопрос. Из-за чего он может быть такая ситуёвина: Включаю питание, работает, работает ( мигает светодиод ) и через какое-то время перестаёт и без перезагрузки не пашет до след. раза. Больше склоняюсь, что из-за питания. Вот вы, как питаете ваши устройства ? От аккумуляторов или с генераторов ?! Изменено 6 июля, 2016 пользователем vv7 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 6 июля, 2016 Поделиться Опубликовано 6 июля, 2016 питание на 31, 32 подай как положено... и и керамику по 0,1мкф 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
vv7 Опубликовано 6 июля, 2016 Автор Поделиться Опубликовано 6 июля, 2016 (изменено) Спасибо за совет !! Керамика, я так понимаю - конденсатор на 0.1мкф ? Вы советуете поставить его между + и - ? Как тут ? http://forum.cxem.ne...showtopic=10698 Пока нет в наличии, но обязательно поставлю ! Изменено 6 июля, 2016 пользователем vv7 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 6 июля, 2016 Поделиться Опубликовано 6 июля, 2016 void main (void) { PORTB = 0xFF; // правильная инициализация порта.... LATB=0xFF; TRISB = 0x00; while (1) { for ( i = 0; i < 1000000; i++) { LATB^=0b11111111; // правильная инверсия , бит требующий инверсии устанавливается в лог.1 } } } 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
vv7 Опубликовано 6 июля, 2016 Автор Поделиться Опубликовано 6 июля, 2016 (изменено) Исправил. Теперь всё работает так как надо ! Не знаю почему, но если ставить PORTB = ~PORTB в main while for цикл, то светодиод мигает хаотично, но если воспользоваться таймером, то всё - почти как часики !!! Пока вот только интересно рассчитать и запрограммировать всё это дело ровно на 1 секунду, но это уже попробую сам ! Вам всем огромнейшое спасибо !!! config_bits.h не изменялся. Вот код на 4 светодиода. #include "config_bits.h" #include <stdio.h> #include <stdlib.h> #include <timers.h> void high_isr (void); #pragma code high_vector=0x08 void interrupt_at_high_vector(void) { _asm GOTO high_isr _endasm } int o = 0; #pragma interrupt high_isr void high_isr (void) { if (INTCONbits.TMR0IF){ INTCONbits.TMR0IF = 0; TMR0H = 0x85; TMR0L = 0xEE; if ( o == 0 ) { PORTB = 0x0E; o = 1; } else // -+++ RB0 if ( o == 1 ) { PORTB = 0x0D; o = 2; } else // +-++ RB1 if ( o == 2 ) { PORTB = 0x0B; o = 3; } else // ++-+ RB2 if ( o == 3 ) { PORTB = 0x07; o = 4; } else // +++- RB3 if ( o == 4 ) { PORTB = 0x0B; o = 5; } else if ( o == 5 ) { PORTB = 0x0D; o = 0; } } } void main (void) { TRISA = 0x00; PORTA = 0x00; TRISB = 0xF0; PORTB = 0x0F; TRISC = 0x00; PORTC = 0x00; TRISD = 0x00; PORTD = 0x00; TRISE = 0x00; PORTE = 0x00; ADCON1=0x0F; T0CON = 0x85; TMR0H = 0x85; TMR0L = 0xEE; INTCON = 0x20; INTCON2 = 0x04; RCONbits.IPEN = 1; T0CON = 0x85; TMR0H = 0x85; TMR0L = 0xEE; INTCONbits.GIEH = 1; while (1) { } } На 4 МГц мигает почти в секунду. Всем доброго вечера !!! Изменено 6 июля, 2016 пользователем vv7 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 6 июля, 2016 Поделиться Опубликовано 6 июля, 2016 Поздравляю Небольшие советы. Переменная o используется только в функции high_isr, значит излишне выносить её в глобальную область. Занесите её в саму функцию и объявите с квалификатором static, чтобы при выходе из функции она не уничтожалась. Далее, все if'ы с проверкой переменной и присваиванием ей значений, можно заменить на : o++; if(o>=5) o=0; и блок switch-case. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.