На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Вольтметр на PIC , Контрольная работа
    Люди кто может помогите с контрольной заочнику

    Задание такое есть PIC любой базового семейства
    схемка прилогаеться
    Нужно измерять напряжение от 0.6 до 1.1 вольта и держать включенным один светодиод при выходе напряжения за предел включить второй светодиод и выдать на динамик звук с частотой 200 Гц.

    Написал вот такое начало программы
    ExpandedWrap disabled
              list      p=16C71
              #include <P16C71.inc>
        __CONFIG _CP_OFF & _WDT_OFF & _RC_OSC
      ;***** Variable definitions  ******************************************
      ; Описание регистров, битов и переменных
      STATUS  EQU     03H ; Регистр STATUS
      PORTB         EQU       06H ; Регистр порта В
      ADCON0  EQU     08H ; Регистр управления АЦП
      ADRES         EQU       09H ; Регистр результата АЦП
                              ; преобразования
      INTCON  EQU     0BH ; Регистр управления прерыва
                      ; ниями
      OPTREG  EQU     81H ; Регистр OPTION
      TRISB         EQU       86H ; Регистр конфигурации порта В
      ADCON1  EQU     88H ; Регистр конфигурации АЦП
      RP0     EQU 5H  ; Бит переключения страниц в
                      ; регистре STATUS
      C         EQU       2H  ; Флаг переноса/заема в регистре
                      ; STATUS
      F0        EQU       0CH ; Просто флаг
      ;**********************************************************************
          ORG 0           ; Начальный адрес после сброса
      GOTO    BEG         ; Переход на начало программы
          ORG 100         ; Начальный адрес программы
                      ; (следующая команда будет
                      ; расположена по адресу 100H)
      BEG
                      ; Инициализация микроконтроллера
          BSF STATUS,RP0  ; Включить первую страницу ПД
          BCF OPTREG,7    ; Отключить активную нагрузку
                      ; от выводов порта В
          BCF TRISB,0     ; Установить бит 0 порта В на
                      ; вывод
          CLRF    ADCON1      ; Установить входы порта А как
                      ; аналоговые, опорное
                      ; напряжение для АЦП равно Vdd
          BCF STATUS,RP0  ; Включить нулевую страницу ПД
          MOVLW   B '11000000'    ; Разрешить прерывания только
          MOVWF   INTCON      ; от АЦП (все остальные прерыва-
                      ; ния запрещены !)
          MOVLW   0C1H        ; Синхронизация АЦП от
                      ; собственного генератора.
          MOVWF   ADCON0      ; Разрешить работу АЦП
                      ;
      ; Ввод и преобразование сигналов U1
          BCF ADCON0,3        ; Установить входной канал AIN4
          BCF ADCON0,4
          BSF ADCON0,2        ; Начать процесс преобразования
                          ; сигнала U1
          LOOP2   BTFSS    ADCON0,2   ; Ждать окончания преобразова-
                          ; ния сигнала U1
          GOTO    LOOP2
          MOVF    ADRES,0         ; Результат преобразования
                          ; сигнала U1 записать в W
          BCF ADCON0,1        ; Сбросить флаг окончания пре-
                          ; образования ADIFв регистре
                          ; ADCON0


    Если я прав и книжка не врет то в W у меня записанно значение полученное с АЦП
    еще вот такая подпрограммка преобразования числа в код для индикатора
    ExpandedWrap disabled
      bcd_table
          andlw 0x0F
          addwf PCL, А
          retlw b'00111111' ;0
          retlw b'00000110' ;1
          retlw b'01011011' ;2
          retlw b'01001111' ;3
          retlw b'01100110' ;4
          retlw b'01101101' ;5
          retlw b'01111101' ;6
          retlw b'00000111' ;7
          retlw b'01111111' ;8
          retlw b'01101111' ;9


    Вопрос как собственно разделить полученный результат преобразования в три переменных (единицы десатые и сотые доли вольта)что бы вывести их на индикаторы.

    Если кто может помогите сделать или дайте пример похожей программы разанее спасибо
    Прикреплённый файлПрикреплённый файл111.JPG (99.21 Кбайт, скачиваний: 679)
      Цитата Wer_wolf @
      Вопрос как собственно разделить полученный результат преобразования в три переменных (единицы десатые и сотые доли вольта)что бы вывести их на индикаторы.

      Wer_wolf про калибровку слышал??? Заводишь 1 таблицу - значения преобразования АЦП, 2 таблица - значения индикатора. После АЦП сравниваешь результат из первой таблицы со значением, полученным АЦП и по индексу выдергиваешь из второй таблицы наборы байт для отправки на индикатор. Далее соответственно проверяешь выход значения за пределы нормы. Сама калибровка: Подаешь нужное напряжение на вход АЦП и заносишь полученный после преобразования результат в таблицу, и так до тех пор пока не решишь, что полученных значений АЦП тебе достаточно. Сразу оговорюсь - дело индивидуальное для каждой конкретной микросхемы, поэтому пишут дополнительные программы (зашиваются в ПИК и имеют свой пользовательский интерфейс) чтобы можно было откалибровать новую микросхему взамен вышедшей из строя. :rolleyes:
        тоесть значение АЦП сравнивать со значением в таблице и тогда выбирать сколько собственно это вольт на входе
        а примерчик такого можеш показать
          Цитата Wer_wolf @
          тоесть значение АЦП сравнивать со значением в таблице и тогда выбирать сколько собственно это вольт на входе

          Да, и из второй таблицы выбирают цепочку байт соответствующее этому напряжению для показа на индикаторе.
          Цитата Wer_wolf @
          а примерчик такого можеш показать

          Могу. :rolleyes: ПИК какой??? В МРЛАБ подойдет???? :rolleyes:
            пик любой базового семейства 16с71 или 16с72
            MPlab полностью устроит сам в нем вояю

            И если моно подскажи как в нем сделать симуляцию работы АЦП что бы посмотреть прогу в действии.
              Цитата Wer_wolf @
              И если моно подскажи как в нем сделать симуляцию работы АЦП что бы посмотреть прогу в действии.

              Если в симуляторе то только записью в регистр АЦП числа и установкой флага окончания преобразования. Аппаратную часть (само преобразование) только внутрисхемной отладкой в процессе работы ПИК"а.(В IDE должен быть установлен внутрисхемный отладчик + подключена отладочная плата для ПИК"а, практически полностью идентичная рабочей).
              Цитата Wer_wolf @
              пик любой базового семейства 16с71 или 16с72

              Прицепи даташит на этот контроллер (если есть отличия) или на мыло medved_68@mail.ru у меня из 16 только 62х, 87х. Или там нет отличий по регистрам АЦП и сканает 16F87X????
                Деление на кусочки сделал
                А теперь вопрос как сделать такую штуку если у меня три переменные Z1,Z2,Z3 в них храниться число от 0 до 9 как мне сделать табличку что бы из нее в зависимости от значения ячейки выбрать в переменную код для индикатора что бы потом загрузить эту переменную в порт

                Вот сами коды
                ExpandedWrap disabled
                  '00111111' ;0
                  '00000110' ;1
                  '01011011' ;2
                  '01001111' ;3
                  '01100110' ;4
                  '01101101' ;5
                  '01111101' ;6
                  '00000111' ;7
                  '01111111' ;8
                  '01101111' ;9


                а вот как слелать их выбор получше я не предстовляю
                  Wer_wolf поглядел вчера твою посылку...не совсем то что надо, но да бог с ним. Вопрос: Пишешь для той схемы, что привел на рисунке??? Если да то учти что там необходима динамическая индикация т.к. три статических сегмента сидят на 1 ШД и выбираются дешифратором. Т.Е. в каждый момент времени гореть будет только 1 сегмент.Следовательно надо предусмотреть буфер экрана, куда записываются три байта, которые выводятся на индикатор, настроить встроенный таймер на интервал срабатывания с частотой > 80 Гц.(иначе будет заметно мерцание индикаторов) и в подпрограмме обработки прерывания от таймера поочередно выводить сначала байт данных в порт В затем три бита на дешифратор которые соответствуют выбору этого индикатора. Что бы посчитать частоту срабатывания таймера необходимо определиться с тактовой частотой ПИК, т.е. номинал кварцевого резонатора + определить по формуле частоту машинного цикла и время выполнения команд. :rolleyes:

                  Добавлено
                  Цитата Wer_wolf @
                  А теперь вопрос как сделать такую штуку если у меня три переменные Z1,Z2,Z3 в них храниться число от 0 до 9 как мне сделать табличку что бы из нее в зависимости от значения ячейки выбрать в переменную код для индикатора что бы потом загрузить эту переменную в порт

                  Используй память данных и команды извлечения из памяти данных в регистры ПИК"а
                    Спасибо тебе за помощь написал как мог вроде все пошет смущает только один момент вот тут кусочек
                    ExpandedWrap disabled
                      clrf  IntCon        ; Запрет всех прерываний.
                      movlw      b'11000001'   ; Синхронизация от RC генератора, канал RA0(AN1)
                      movwf      ADCON0
                      bsf        ADCON0,2      ; Включение начала преобразования.
                      btfsc      ADCON0,2      ; Проверка ( Преобразование закончилось или нет ).
                      Goto       $-1           ; Преобразование не закончено.
                      movfw      AdresH        ; Переписываем результат преобразования
                      movwf      TekH          ; в старший текущий регистр.
                      bsf        STATUS,RP0    ; Банк 1.
                      movlw      7Fh           ; 7Fh - адрес регистра TekL.
                      movwf      FSR           ; Запись мл. регистра АЦП по
                      movfw      AdresL        ; косвенной адресации
                      movwf      IndF          ; в регистр TekL.
                      bcf        STATUS,RP0    ; Банк 0.
                      MOVF       AdresL,0


                    писал не сам нащел в сети и не знаю насколько н правельный
                    по идеие тут в W должно оказаться значение преобразования АЦП
                    Если нет то подправь пожалуйста
                    вход подаеться на 0 ногу порта А

                    Контроллер PIC16c72
                      [quote=Wer_wolf,1175768923,1511713]movfw AdresH ; Переписываем результат преобразования
                      movwf TekH ; в старший текущий регистр.
                      bsf STATUS,RP0 ; Банк 1.
                      movlw 7Fh ; 7Fh - адрес регистра TekL.
                      movwf FSR ; Запись мл. регистра АЦП по
                      movfw AdresL ; косвенной адресации
                      movwf IndF ; в регистр TekL.
                      bcf STATUS,RP0 ; Банк 0.
                      MOVF AdresL,0[/quote]
                      :)
                      ExpandedWrap disabled
                        movf      AdresH,0        ; Переписываем результат преобразования [/quote]
                        movf      AdresL,0        ;Перекидываем в аккумулятор

                      По умолчанию MPLAB пробивает 1 = оставить данные в регистре (не зеркалить в аккумулятор.
                      После этого у тебя в регистре TekH = старший байт результата, в регистре 017F=младший байт=аккумулятор.
                        [QUOTE=medved_68,1175774869,1511916][quote=Wer_wolf,1175768923,1511713]movfw AdresH ; Переписываем результат преобразования
                        movwf TekH ; в старший текущий регистр.
                        bsf STATUS,RP0 ; Банк 1.
                        movlw 7Fh ; 7Fh - адрес регистра TekL.
                        movwf FSR ; Запись мл. регистра АЦП по
                        movfw AdresL ; косвенной адресации
                        movwf IndF ; в регистр TekL.
                        bcf STATUS,RP0 ; Банк 0.
                        MOVF AdresL,0[/quote]
                        :)
                        ExpandedWrap disabled
                          movf      AdresH,0        ; Переписываем результат преобразования [/quote]
                          movf      AdresL,0        ;Перекидываем в аккумулятор

                        По умолчанию MPLAB пробивает 1 = оставить данные в регистре (не зеркалить в аккумулятор.
                        После этого у тебя в регистре TekH = старший байт результата, в регистре 017F=младший байт=аккумулятор.[/QUOTE]
                        Ты не мог бы прривести полностью косочек кода от инициализации АЦП до получения результата в W
                        Я раньше никогда ничего не делал с АЦП
                        А с контроллерами работаю ;) только на урове MPLAB
                        Тоесть никогда ничего не собирал на нем по настоящему поэтому если с языком более мения разобрался то вот тут возникают большие проблеммы особенно если учесть что сэмулировать в MPLAB работу АЦП немогу
                          Цитата Wer_wolf @
                          Ты не мог бы прривести полностью косочек кода от инициализации АЦП до получения результата в W

                          :)
                          Сообщение отредактировано: medved_68 -

                          Прикреплённый файлПрикреплённый файлACP.zip (1.24 Кбайт, скачиваний: 264)
                            Цитата medved_68 @
                            Цитата Wer_wolf @
                            Ты не мог бы прривести полностью косочек кода от инициализации АЦП до получения результата в W

                            :)

                            Спасибо огромное вроде что то делал теперь только ждать резюме препода по этому всему
                            Сообщение отредактировано: Wer_wolf -
                              Цитата Wer_wolf @
                              Спасибо огромное вроде что то делал теперь только ждать резюме препода по этому всему

                              А динамическое обновление индикатора сделано??? :) Ведь только 1 сегмент будет без этого светиться. :)
                                Вот посмотри тут еще твоего кусочка не добавил потому что не совсем его понял
                                И схема немного другая
                                Сообщение отредактировано: Wer_wolf -

                                Прикреплённый файлПрикреплённый файлmain2.zip (7.41 Кбайт, скачиваний: 315)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0509 ]   [ 15 queries used ]   [ Generated: 27.04.24, 15:54 GMT ]