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

Pic18F452 Не Работает Мигание Светодиодом.


vv7

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

Всем привет !

Да, вот так вот. Опять светодиод и опять не запускается.

В чём косяк ?

Питание - от автозарядки для мобилки ( 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 по цельсию.

Вопрос, что может быть. Может минус плохой и на монтажных схемках такого рода ( как на фотке ) собирать схемы на МК - плохая идея ? Аля нужно паять ?!

Спасибо !!!

post-195350-0-36989300-1467795631_thumb.jpg

post-195350-0-51352400-1467795655_thumb.jpg

post-195350-0-05750600-1467795674_thumb.jpg

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

Ну, во-первых, светодиод стоит на 28 ноге, RD5

Во-вторый, знак "!" - это логическая инверсия: даёт результат 1 или 0, а не полный байт для всех ног.

Для инверсии всех битов надо использовать PORTB = ~PORTB.

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

Сравнительное тестирование аккумуляторов 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

w7, ты на ассемблере пробовал выполнить эту задачу? Смотрел, какие команды фактически прошиваются в память программ? Или сразу на высокий уровень залез?

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

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

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

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

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

Сразу писал в C. Я как-то давно знаком с C, вот и взялся. Просто ... щяс вот пытаюсь разобраться как с ним писать под мк. Вот только как-то всё так, а не пашет :D Щяс в Proteus проверю, просто только скачал WinXP для VM для этой задачки, ибо он на лине - не пашет :D

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

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

Я не о тебе сейчас, а в целом.

Посмотри, во что скомпилировался твой код. Потом выясняй в доках к компилятору, как организовать цикл, как происходит работа с портами.

А так - МК сам по себе, повторяюсь, очень сложен, да еще "правила игры" компилятора добавляются.

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

Спасибо вам, но всё также. Просто горит ... :help: :help: :help:

Сомневаюсь, что он просто горит. 99% на то, что он просто переключается с ох***ной скоростью.

P.S. Извиняюсь, не заметил код с continue.

Не является ли int 16-битным?

P.S.S Посмотрел User's Guide на C18. Точно, int 16-битный. Замените на short long - 24 бита или на long - 32 бита.

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

Ещё раз проверьте, куда подключён светодиод. На Вашей фотографии - это нога 28, это не порт В.

Для порта В надо выбрать другую ногу, из таблицы. Ноги считаются по кругу.

post-193952-0-49217400-1467809367_thumb.png

post-193952-0-77669300-1467809730.png

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

Ура-а !!! Заработало. ( Почти :clapping: )

Проблема была в том, что светодиод стоял на 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

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

Контакт плохой?

Контакт в первую очередь проверил ! Может с питанием ? Хотя Мультиметр стабильно показывает 5.05В. Хоть и подключен с аккумулятора на 12В через автозарядку для телефона.

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

Не только контакт питания. Контакт ножки МК, резистора, светодиода, кварца, конденсаторов кварца. Они не должны болтаться, а жестко сидеть. Для надежности, лучше всё это спаять (хотя бы навесом), а не использовать макетку. Корпус кварца лучше посадить на землю. Но только не припаивать, а прикрутить жесткую проволочку.

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

Последний вопрос. Из-за чего он может быть такая ситуёвина:

Включаю питание, работает, работает ( мигает светодиод ) и через какое-то время перестаёт и без перезагрузки не пашет до след. раза.

Больше склоняюсь, что из-за питания. Вот вы, как питаете ваши устройства ? От аккумуляторов или с генераторов ?!

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

Спасибо за совет !! Керамика, я так понимаю - конденсатор на 0.1мкф ? Вы советуете поставить его между + и - ?

Как тут ? http://forum.cxem.ne...showtopic=10698

Пока нет в наличии, но обязательно поставлю !

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

void main (void) {

PORTB = 0xFF; // правильная инициализация порта....
LATB=0xFF;
TRISB = 0x00;


while (1) {
 for ( i = 0; i < 1000000; i++) {
	 LATB^=0b11111111; // правильная инверсия , бит требующий инверсии устанавливается в лог.1
 }
}
}

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

Исправил. Теперь всё работает так как надо ! Не знаю почему, но если ставить PORTB = ~PORTB в main while for цикл, то светодиод мигает хаотично, но если воспользоваться таймером, то всё - почти как часики !!! :thank_you2: Пока вот только интересно рассчитать и запрограммировать всё это дело ровно на 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 МГц мигает почти в секунду. :buba:

Всем доброго вечера !!!

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

Поздравляю :i-m_so_happy:

Небольшие советы.

Переменная o используется только в функции high_isr, значит излишне выносить её в глобальную область. Занесите её в саму функцию и объявите с квалификатором static, чтобы при выходе из функции она не уничтожалась.

Далее, все if'ы с проверкой переменной и присваиванием ей значений, можно заменить на :

o++;
if(o>=5) o=0;

и блок switch-case.

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

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

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

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

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

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

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

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

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

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

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