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

crazz

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

Хорошие вопросики, итак урок первый 1: Из чего состоит микроконтроллер. Опреативная память..........Может вам самому сначала почитать хотябы самоучитель корабельникова (гугл), а потом уже в ходе написания программы подскажут опытные програмисты как и что, я с их помощью свою первую программу переписал от корки до корки))

Удачи.

Не цитируите полностью предыдущее сообщение!!!

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

может есть какая-то литература?

Для начала посмотрите самоучитель Корабельникова, книжку Яценкова "Микроконтроллеры Microchip. Практическое руководство"

А в дополнение к этому книжки Тавернье или ещё лучше М.Предко и т.д. и т.п. В общем литературы, которая в инете есть в эл.виде, навалом. Дерзайте!

Опыт - это то, что получаешь, не получив того, что хотел

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

Так же тебе понадобится подпрограмма преобразования двоичного числа в двоично-десятичное(BCD) для удобного разделения на отдельные цифры чтобы затем эти цифры в отдельности вывести, преобразовав их в сегменты.

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

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

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

Так же тебе понадобится подпрограмма преобразования двоичного числа в двоично-десятичное(BCD) для удобного разделения на отдельные цифры чтобы затем эти цифры в отдельности вывести, преобразовав их в сегменты.

Что из себя представляет этот преобразователь? С чем его есть?

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

Я попробовал начать код....а именно попробовал создать ячейку памяти с значениями для контроллера.

Сколько Я понял, так это должно иметь такой вид: (поправьте - буду только рад)

//=============================================

#include <p18f452.h>

void main(void);

int j,A;

void main()

{

TRISC=0b00000000;

TRISD=0b00000000;

PORTC=0b00000000;

PORTD=0b00000000;

while(1) // таблица

{

switch (A)

{

case 0 :PORTC=0b00111111; //0

case 1 :PORTC=0b00000110; //1

case 2 :PORTC=0b01011011; //2

case 3 :PORTC=0b01001111; //3

case 4 :PORTC=0b01100110; //4

case 5 :PORTC=0b01101101; //5

case 6 :PORTC=0b01111101; //6

case 7 :PORTC=0b00000111; //7

case 8 :PORTC=0b01111111; //8

case 9 :PORTC=0b01101111; //9

case 10 :PORTC=0b10000000; //.

case 11 :PORTC=0b11111111; //all

case 12 :PORTC=0b00000000; //nothing

}

for (j=0;j<2;j++) //смена разряда индикатора

{

switch (j)

{

case 0 :PORTD=0b00000001;

case 1 :PORTD=0b00000010;

}

}

}

}

//================================================

подскажите что не так и что дальше должно быть?

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

преобразователь кода, должен выдавать например из 0x63h сделать код 0x99h который удобно разобрать на две цифры "9" и "9" простым сдвигом и вывести на индикаторы.

Выводить надо отдельно от переключения разрядов.

например, сначала надо сделать PORTC=0b00000000, а затем переключить разряд, и установить сегменты нужным образом, считав их из ячейки памяти.

Затем, занося в эти ячейки памяти нужное число - оно будет выведено при очередном обновлении индикатора.

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

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

преобразователь кода, должен выдавать например из 0x63h сделать код 0x99h который удобно разобрать на две цифры "9" и "9" простым сдвигом и вывести на индикаторы.

Всё бы конечно ничьё, да Я ровным счетом ничего не понял :unsure:

Каким образом преобразователь должен выдавать коды?

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

Это должна быть подпрограмма. На входе двоичное число, один байт 0-255 а на выходе двоично-десятичное число, тоже один байт но каждая половинка которого может принимать значение от 0 до 9. Такие алгоритмы называются преобразованием bin2BCD и на просторах есть во множестве вариаций в зависимости от необходимой оптимизации по быстродействию, размеру кода или количеству используемых регистров. насчет C не знаю, но на ассемблере таких полно.

Вот кстати ссылка на описание что такое BCD.

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

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

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

Наконец то дошло что такое двоично-десятичное число :rolleyes:

Запишу const digit[10]=(0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F)

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

Думаю для этого нужно будет опрашивать флажок переполнения таймера и при его срабатывании что-то делать :(

Подскажите каким образом заставить это работать?

Было бы неплохо краткий план действий....а то Я сам пока долго буду над этим сидеть

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

Для экономии пинов контроллера и соответственно количества проводов между ним и индикатором применяют ДИНАМИЧЕСКУЮ индикацию.

Для этого все одноименные сегменты разрядов объединяют - получается всего семь ( с точкой восемь) сегментов и выводы каждого разряда.

Например индикатор соединен по схеме с общим анодом. Т.е. сегменты катоды, а аноды всех сегментов одного разряда соединены.

Тогда при подаче на один из разрядов на общий анод напряжения близкого к питанию контроллера и соответственно соединению с НУЛЕМ тех сегментов, которые должны светится В ЭТОМ РАЗРЯДЕ, они и будут гореть. Быстро переключая разрядные напряжения и зажигая ту комбинацию сегментов, которая должна гореть именно в этом разряде, Вы получите эффект непрерывно горящих цифр - каждой в своем разряде.

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

戦う前に相手のベルトの色に注目

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

А я уже писал выше как это делается. для вывода используем две ячейки, в которых уже находятся готовые биты для 7-сегм. индикатора. Занесены туда они могут быть с любого места программы, путем табличного преобразования цифры в битовую маску. Разложить один байт на два - просто, с младшим разрядом просто делаем операцию AND $0F а со старшим, сначала сдвигаем вправо на 4 бита затем AND $0F ...

Вывод. Он осуществляется по прерыванию с таймера к примеру.

1) гасим индикатор записью $00 в порт сегментов (если 1 означает включенный сегмент)

2) переключаем разряд

3) выбираем из памяти битовую маску для нужного знакоместа

4) выводим в порт

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

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

как думаете правильно?
Не правильный подход.

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

В ОП проверяйте этот флаг , и если он установлен, делайте декремент счётчика. Как только счётчик отсчитал (SecH=0 и SecL=0), сбрасывайте флаг.

В основном теле выставляйте задержку (запись значений в SecH и SecL) и устанавливайте флаг. Причём именно в такой последовательности - сначала регистры, затем флаг! Далее просто смотрите за этим флагом (ждёте когда он сбросится) и всё, задержка готова.

В обработчике

btfss       Flag,0       ; Проверим флаг
goto        M            ; Если не установлен, то не считаем
decfsz      SecL         ; Декр. 50сек.
goto        M            ; Пропустим, если еще не ноль.
decfsz      SecH         ; SecL=0, то декр SecH
goto        M            ; Пропустим, если еще не ноль.
bcf         Flag,0       ; Сбросили флаг
M
nop
..................       ; дальнейший код

В основном теле

movlw      .1            ; такие данные мне дал калькулятор
movwf      SecL          ; Младший разряд 50 сек (769)
movlw      .4            ; Старший разряд 50 сек (+1!)
movwf      SecH
bsf        Flag,0        ; Установили флаг

btfsc      Flag,0        ; Ждём когда сбросится     
goto       $-1
nop

Немного довел вашу мысль, ведь когда в прерывании декрементируется первый регистр SecL, то исполняется декремент второго, в котором нечего декрементировать, но программа декрементирует его с 0 на 255, от того задержка получается несколько:) долговатои. Вот что я сделал в прерывании: ввел второи флаг, который если установлен, то декрементируем второи баит задержки, если нет, то нет. Ведь не во всех задержках у меня задеиствуются два баита переменных задержки. Моя идея мне понравилась, как вам?

INT      movwf       W_Temp       ; W в регистр W_Temp.
        movf        STATUS,W     ; Status в регистр W.
        movwf       St_Temp      ; в регистр Stat_Temp.

        btfss       Flag,0       ; Проверим флаг
        goto        M            ; Если не установлен, то не считаем
        decfsz      SecL         ; Декр. переменную
        goto        M            ; Пропустим, если еще не ноль.
        btfss       Flag,1       ; Этот флаг необходим, если надо декр. второи баит переменной
        goto        $+3          ; И если он опущен, то пропускаем декр. второго баита.
        decfsz      SecH         ; SecL=0, то декр SecH
        goto        M            ; Пропустим, если еще не ноль.
        bcf         Flag,0       ; Сбросили флаг
M

        ; исполняется далее

Не цитируите полностью предыдущее сообщение!!!

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

А там где не используется второй байт, почему бы не приравнять второй нулю, это будет всего лишь на 2-3 такта дольше. А если не хочется, то использовать подпрограмму задержки использующей один байт там где это нужно. А то получается слишком много кода, запутанного ... где экономия?

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

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

         btfss       Flag,1       ; Этот флаг необходим, если надо декр. второи баит переменной

Замените это лучше проверкой второго байта на ноль. Тогда можно этот кусок использовать и для 2-х и для 1-байтного счётчика. Записывайте просто в L-байт значение а в H ноль.

Или лучше сделайте по принципу как я писал в 838 посте

                       if(!cnt.L--)
  012         DECF 0x23, F
  013         INCFSZ 0x23, W
  014         GOTO 0x19
                       {
                               if(!cnt.H--)
  015         DECF 0x22, F
  016         INCFSZ 0x22, W
  017         GOTO 0x19
                               cnt.flag=1;     // Счётчик отсчитал. Ставим флаг.
  018         BSF 0x24, 0
                       }

  019         NOP

Тут проверка каждого байта на переполнение (00->FF). Думаю так будет правильнее.

Если не получится, могу придать етому всему нормальный АСМ-вид :)

goto        $+3  

Избавляйтесь от этой дурацкой привычки. Тем более что у Вас уже есть метка на том месте куда идёт переход.

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

Или лучше сделайте по принципу как я писал в 838 посте

Так я ж тогда так и сделал, а вот проверить второи баит на ноль, помоему хорошая идея.Попробую.

Не цитируите полностью предыдущее сообщение!!!

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

Только хотел внедрить свежую мысль, как меня осенило: Это хорошо, что у меня в два баита надо записать 769 00000011 00000001, а если 768 00000011 00000000 - второи баит равен нулю, получается счета не будет если его проверять на 0, с флагом второго баита все-таки лучше.

Не цитируите полностью предыдущее сообщение!!!

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

счета не будет если его проверять на 0
А его и не нужно считать. ЕСли второй байт равен нолю, значит число меньше 256 (00-FF). Второй - это старший байт, т.е. цена одного его значения = 256.

Сделайте проверку перехода с 00 к FF по приведённому выше примеру и не парьтесь :)

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

Возник такой вопрос. У меня есть PicKit2, и есть относительно новая марка микроконтроллера pic16F1827. В программе PicKit в начале микроконтроллер не распознавался. Я скачал с сайта Microchip последнюю версию файла описания микроконтроллеров:

http://ww1.microchip.com/downloads/en/DeviceDoc/PK2DFUpdate-1-62-03.zip

после этого микроконтроллер распознался, и, по идее можно с ним работать.

Вопрос касается MPLab. Скачал последнюю версию, в окне Configure -> select device при выборе pic16F1827 напротив PicKit2 красная точка, да и при выборе программатора, PicKit2 серый. Как заставить работать MPLab c PicKit2 ? Что можно предпринять? Ведь аппаратно они совместимы, что показывает сама программа-интерфейс к PicKit2.

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

Помогите............. :(

Хочу просто зажечь цифру 2

#include<p18f452.h>

void main(void);

void led(void);

// Сегменти (цифры) 0 1 2 3 4 5 6 7 8 9

unsigned char const digit[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

// Розряди индикотора

unsigned char const tet[1] = {0x01};

int i;

void main()

{

//PORTC, PORTD

TRISC=0b00000000;

PORTC=0xFF;

TRISD=0b00000000;

PORTD=0x00;

// TMR1

T1CONbits.RD16=0;

T1CONbits.T1CKPS0=1;

T1CONbits.T1CKPS1=1;

T1CONbits.T1OSCEN=0;

T1CONbits.T1SYNC=0;

T1CONbits.TMR1CS=0;

T1CONbits.TMR1ON=1;

PIE1bits.TMR1IE=1;

RCONbits.IPEN=0;

INTCONbits.GIE=1;

}

//---------------------------------

void led()

{

while (1)

{

if (INTCONbits.TMR0IF==1)

{

PORTD=tet[1];

PORTC=digit[2];

}

}

INTCONbits.TMR0IF=0;

}

Почему не работает?

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

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

Debug build of project `C:\bit\work01.mcp' started.

Preprocessor symbol `__DEBUG' is defined.

Sat Oct 23 01:48:50 2010

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

Clean: Deleting intermediary and output files.

Clean: Deleted file "C:\bit\work01.o".

Clean: Deleted file "C:\bit\work01.cof".

Clean: Deleted file "C:\bit\work01.hex".

Clean: Deleted file "C:\bit\work01.mcs".

Clean: Done.

Executing: "C:\Program Files\Microchip\MCC18\bin\mcc18.exe" -p=18F452 /i"C:\Program Files\Microchip\MCC18\h" "work01.c" -fo="work01.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-

Executing: "C:\Program Files\Microchip\MCC18\bin\mplink.exe" /p18F452 /l"C:\Program Files\Microchip\MCC18\lib" "work01.o" /u_CRUNTIME /u_DEBUG /z__MPLAB_BUILD=1 /z__MPLAB_DEBUG=1 /o"work01.cof" /M"work01.map" /W

MPLINK 4.34, Linker

Copyright © 2009 Microchip Technology Inc.

Errors : 0

MP2HEX 4.34, COFF to HEX File Converter

Copyright © 2009 Microchip Technology Inc.

Errors : 0

Loaded C:\bit\work01.cof.

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

Debug build of project `C:\bit\work01.mcp' succeeded.

Preprocessor symbol `__DEBUG' is defined.

Sat Oct 23 01:48:51 2010

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

BUILD SUCCEEDED

Я сделал в протеусе модель, а она под этот код не работает.

Я думаю что-то с прерыванием. А что именно не пойму

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

Не компилятор а отладчик. Например, MPLAB умеет прекрасно отлаживать программу пошагово. Заодно и узнаешь что не так.

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

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

Ну отладчик я уже нашел))))

От только что я здесь должен увидеть пока не понимаю.

Все команды в asm коде и по одной показывает как их обрабатывает((((((

Что дальше?!

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

в МПлабе? Лучше, если отладчик будет работать в том же языке на котором пишешь. А под отладчиком смотри - вызывается ли нужная часть алгоритма при переполнении таймера. Устанавливает ли он признак прерывания.

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

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

Откуда Вы этот кусок "выдрали" ? Если бы писали сами, то понимали что пишете.

Вы проинили таймер, разрешили прерывания от него и глобально. А дальше... ? Куда у Вас программа "уйдёт" при его переполнении ? Это раз.

Во вторых, у Вас программа не зацикливается, она заканчивается, чего не допустимо !

В третих, процедура led() вообще не вызывается...

И чего у Вас должно работать ?

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

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

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

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

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

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

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

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

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

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

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

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