Форум по микроконтроллерам: Любителям часов и счета - Форум по микроконтроллерам

Перейти к содержимому

  • 2 Страниц +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Любителям часов и счета

#21 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 895
  • Регистрация: 15 Февраль 11

Отправлено 22 Август 2011 - 19:48

Цитата

Если я в INTCON запрещаю - можно уже не париться насчет PIE1?
Конечно. Если своими словами, то тут получается лог."И". Т.е. и там и там должно быть разрешено.

Цитата

А ПП сложения - спасибо, компактно и быстро.
На здоровье.
Хочу извениться за свои предыдущие слова. Я немного ввёл Вас в заблуждение.
Я писал

Просмотр сообщенияAlex (21 Август 2011 - 18:34) писал:

Сначала младший сложить, если переполнение - инкремент среднего.
. Тут немного не правильно. Нужно не инкрементировать следующий байт, а прибавлять еденичку к следующей сумме. Т.е. если к среднему байту прибавляется 0x42, то при переполнении младшего необходимо к среднему прибавлять уже 0x43. Если делать сначала инкремент, а потом сложение, то можно потерять переполнение при инкременте. Т.е. при сложении бит C уже не установится.

Цитата

А можно быть уверенным, что в PIE1 по сбросу - всегда нули ?
Впринципе да. Но перестраховаться никогда не помешает. Это правильный подход ! :ph34r:

PS: Увидел у Вас в программе отсутствие переключения банков (конкретно, при работе с регистром PIE1). Не забывайте о них !
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#22 Пользователь офлайн   fox 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 42
  • Регистрация: 19 Март 11

Отправлено 22 Август 2011 - 21:05

Чета поломал-поломал голову над ПП сложения Алекса - не получается у меня:
 
    movlw   0x40            ; Здесь понятно - прибавляем 40 к TimerL
    addwf   TimerL, F       ; 
    movlw   0x42            ; Загружаем в акк число для TimerM
    bcf     STATUS, Z       ; Здесь флаг сбросили
    btfsc   STATUS, C       ; Проверяем результат сложения в TimerL на переполнение
    addlw   0x01            ; Перенос если - прибавляем к будущему TimerM 1
    btfss   STATUS, Z       ; Если в результате в W не 0,
    addwf   TimerM, F       ; тогда спокойно складываеи и получаем TimerM
    movlw   0x0F            ; сразу сюда, если в W результат сложения =0 ---> вот тут запнулся: а когда же 
    bcf     STATUS, Z       ; складывать TimerM? Никак не могу сообразить :( 
    btfsc   STATUS, C       ;
    addlw   0x01            ;
    btfss   STATUS, Z       ;
    addwf   TimerH, F 

Сообщение отредактировал fox: 22 Август 2011 - 21:44

0

#23 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 895
  • Регистрация: 15 Февраль 11

Отправлено 22 Август 2011 - 21:13

Цитата

не получается у меня:
Что не получается ? :)
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#24 Пользователь офлайн   fox 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 42
  • Регистрация: 19 Март 11

Отправлено 22 Август 2011 - 21:26

При каком-то раскладе мы вообще обходим процедуру сложения среднего байта?
Или я там что-то неправильно понял (см. мои комментарии к программе)

Сообщение отредактировал fox: 22 Август 2011 - 21:43

0

#25 Пользователь офлайн   fox 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 42
  • Регистрация: 19 Март 11

Отправлено 22 Август 2011 - 21:37

    addlw   0x01            ; 
    btfss   STATUS, Z       ; 
    addwf   TimerM, F       ; 
    movlw   0x0F  


Вот этот кусочек меня интересует - здесь мы на ноль какую операцию проверяем, если предварительно сбросили флаг Z? addlw 0x01? А там в принципе может быть 0?

Сообщение отредактировал fox: 22 Август 2011 - 21:42

0

#26 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 895
  • Регистрация: 15 Февраль 11

Отправлено 22 Август 2011 - 21:40

Цитата

если в результате сложения в младшем байте образуется 0, мы что - обходим процедуру сложения среднего байта?
Нет. Мы обходим если только результатом команды "addlw 0x01" будет - не 0. Т.е. если было 0xFF (в аккумуляторе), потом сложили с еденицей и если получилось 0, то складываем значение аккума (там уже константа + 1) со средним байтом. Но предварительно сбрасываем флаг Z, что-бы не было ложных вычислений.

Цитата

addlw 0x01?
Да

Цитата

А там в принципе может быть 0?
Конечно может. Было 0xFF, прибавили 1-цу, получился 0x00 и переполнение.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#27 Пользователь офлайн   fox 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 42
  • Регистрация: 19 Март 11

Отправлено 22 Август 2011 - 22:15

ОК! Теперь врубился. :rolleyes: Ну, при наших константах эту проверку на 0 можно, наверное, безболезненно выкинуть Хотя, для других кварцев (констант) - пускай остаются, места немного занимают :rolleyes:
0

#28 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 895
  • Регистрация: 15 Февраль 11

Отправлено 22 Август 2011 - 22:24

Лучше уж да, пусть останутся :) Мало-ли, другое значение понядобится записать, или вообще переменную.
Кстати, я бы это число (которое 1000000) вывел вначало программы в define, что-бы легче было менять.
Т.е. написал вначале проги, что-то типа:
#define VAR_SUMM     1000000
и программа уже сама вставляет нужные значения.
Попробуйте это сделать самостоятельно. Это Вам ДЗ :)
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#29 Пользователь офлайн   fox 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 42
  • Регистрация: 19 Март 11

Отправлено 22 Август 2011 - 22:26

Хорошо! Попробую! :rolleyes: Давно не занимался - мозги пока поскрипывают еще :rolleyes:
0

#30 Пользователь офлайн   fox 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 42
  • Регистрация: 19 Март 11

Отправлено 23 Август 2011 - 18:13

Не, ну просто написать #define ConstL=0x40, #define ConstM=0x42, #define ConstH=0x0F, а потом подставить переменные в прогу вместо голых чисел - это не штука. А вот в том виде, как Вы написали - ума не приложу, как в программе ввести и разложить 1 000 000 в 3 регистра. Во-первых, конечно, как его ввести. :) Если это вообще возможно.
0

#31 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 895
  • Регистрация: 15 Февраль 11

Отправлено 23 Август 2011 - 22:21

Возможно :) Хоть на 10 байт :)
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#32 Пользователь офлайн   Titmon 

  • Прибывший
  • Группа: Пользователи
  • Сообщений: 3
  • Регистрация: 19 Март 11

Отправлено 02 Сентябрь 2011 - 19:13

Здрасвуйте, есть небольшой вопрос касаемый программы десятичного инкремента.
Как значение накопленное в регистрах sek,minyt,has(или любых других подобных) выводить на индикацию.
Если есть у кого проект в Протеусе выложите пожайлуста для визуального ознакомления.
Заранее спасибо.
0

#33 Пользователь офлайн   MAZ 

  • Консерватор - до мозга костей и суставов
  • Группа: Администраторы
  • Сообщений: 1 419
  • Регистрация: 15 Февраль 11
  • ГородРоссия

Отправлено 03 Сентябрь 2011 - 20:29

У меня в Протеусе проекта нет. И не знаю на какой индикатор Вы хотите выводить.
Числа в данных регистрах уже десятичные. Их надо распределить по регистрам индикации каждой десятичной цифры. Закодировать для вывода на семисегментный. Если ЖКИ, прибавить после распределения 30h к каждой десятичной цифре.
Если бы Бог не был консерватором, вместо десяти заповедей мы имели бы десять предложений
0

#34 Пользователь офлайн   Titmon 

  • Прибывший
  • Группа: Пользователи
  • Сообщений: 3
  • Регистрация: 19 Март 11

Отправлено 03 Сентябрь 2011 - 21:14

Просмотр сообщенияMAZ (03 Сентябрь 2011 - 20:29) писал:

У меня в Протеусе проекта нет. И не знаю на какой индикатор Вы хотите выводить.
Числа в данных регистрах уже десятичные. Их надо распределить по регистрам индикации каждой десятичной цифры. Закодировать для вывода на семисегментный. Если ЖКИ, прибавить после распределения 30h к каждой десятичной цифре.

Допустим индикатор обычный семисегментный. Если можно для наглядности кусочек программы, от распределения по регистрам индикации и далее...
0

#35 Пользователь офлайн   MAZ 

  • Консерватор - до мозга костей и суставов
  • Группа: Администраторы
  • Сообщений: 1 419
  • Регистрация: 15 Февраль 11
  • ГородРоссия

Отправлено 03 Сентябрь 2011 - 22:28

      
   CBLOCK      0x20          

sek                                  ; регистр секунд
minyt                                ; минут
has                                  ; часа
ledc_L                               ; инд. младший сек ( в10 один разряд индикатора)                         
ledс_H                               ; инд. старший сек  
ledm_L
ledm_H
ledh_L
ledh_H

;=====================================================================================================
TABLE; таблица Знаки индикатора
;=====================================================================================================
           addwf       PCL
           retlw       b'11000000'   ; Символ "0". 
           retlw       b'11111001'   ; Символ "1". 
           retlw       b'10100100'   ; Символ "2". 
           retlw       b'10110000'   ; Символ "3". 
           retlw       b'10011001'   ; Символ "4". 
           retlw       b'10010010'   ; Символ "5". 
           retlw       b'10000010'   ; Символ "6". 
           retlw       b'11111000'   ; Символ "7". 
           retlw       b'10000000'   ; Символ "8". 
           retlw       b'10010000'   ; Символ "9".        

;---------------------------------------------------------------------------------
ind_taim  ; индикация времени
;---------------------------------------------------------------------------------
          call         pd_ind     ; заполнение pегистров для индикации
          movlw        0x06
          movwf        count      
          movlw        ledc_L
          call         kod_led    ; преобразования для семисегментного индикатора 
       ; здесь вывод на порты или еще куда, не посредственно на индикатор. ( у меня было по I2C)
           return
;---------------------------------------------------------------------------------
pd_ind     ; заполнение pегистров для индикации
;---------------------------------------------------------------------------------
           movfw       sek
           movwf       ledc_L
           andlw       0x0F
           movwf       ledc_L
           swapf       sek,W 
           andlw       0x0F   
           movwf       ledс_H
           movfw       minyt   
           movwf       ledm_L       
           andlw       0x0F         
           movwf       ledm_L 
           swapf       minyt,W 
           andlw       0x0F   
           movwf       ledm_H
           movfw       has   
           movwf       ledh_L       
           andlw       0x0F         
           movwf       ledh_L 
           swapf       has,W 
           andlw       0x0F   
           movwf       ledh_H
           return
;--------------------------------------------------------
kod_led; преобразования для семисегментного индикатора 
;-------------------------------------------------------
         
          movwf        FSR
kl_0      movf         INDF,W
          call         TABLE
          movwf        INDF
          incf         FSR
          decfsz       count
          goto         kl_0
          
          return 

Если бы Бог не был консерватором, вместо десяти заповедей мы имели бы десять предложений
0

#36 Пользователь офлайн   Titmon 

  • Прибывший
  • Группа: Пользователи
  • Сообщений: 3
  • Регистрация: 19 Март 11

Отправлено 03 Сентябрь 2011 - 23:33

MAZ спасибо
call         pd_ind
то что мне и нужно было для разъяснения
0

#37 Пользователь офлайн   pictele 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 15
  • Регистрация: 05 Март 13
  • ГородОМСК

Отправлено 08 Ноябрь 2016 - 10:15

Срубил часики на этом алгоритме.
Весьма...
http://pictele.radioliga.com/7_seg.htm

Сообщение отредактировал pictele: 08 Ноябрь 2016 - 10:17

0

Поделиться темой:


  • 2 Страниц +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей