Чем именно AVR лучше? Vadim1369 хочет сделать "крякалку" на контроллере, у которого нет ни DAC ни PWM. SRAM 64 байта и Program Memory 1024 words. Обычно, контроллер подбирают под задачу...
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Доброго времени суток. Необходимо организовать подсчет нескольких интервалов времени между событиями. По событию время должно фиксироваться, и записываться в EEPROM. Интервалы между событиями - до нескольких часов. Получается по 3 байта (часы, минуты, секунды) на время каждого события. Ввиду ограниченного объема EEPROM в целевом МК, решил распихать часы-минуты-секунды в ячейки этаким "жлобским" вариантом: 6 младших байт 1-й ячейки - секунды, 2 старших байта этой же ячейки - младшая часть минут, 4 младших байта 2-й ячейки старшая часть минут, 4 старших байта 2-й ячейки - часы. Написал следующий алгоритм, в симуляторе вроде работает: Спойлер
Код:
Main incf psevdosec ; Инкремент секунд movfw psevdosec movwf temp ; Делаем дубликат, чтобы не портить оригинал movlw b'00111111' ; Зануляем разряды минут andwf temp movlw b'00111100' ; Вычитаем 60 subwf temp btfsc STATUS,Z goto Inc_Min_Low ; Если насчитали 60 секунд, инкремент младшей части минут goto Main
Inc_Min_Low movlw b'00111111' ; Обнуляем секунды iorwf psevdosec incf psevdosec ; Инкремент младшей части минут btfsc STATUS,Z goto Inc_Min_Hi ; Если насчитали больше 3 минут, инкремент старшей части минут goto Main
Inc_Min_Hi incf psevdomin ; Инкремент старшей части минут, и в случае переполнения автоматически инкремент часов goto Main
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
А обязательно двоично-десятичное представление? Я чащи в счетной части использую двоичные значения для минут и часов с последующим преобразованием для индикации.
6 младших байт 1-й ячейки - секунды, 2 старших байта этой же ячейки - младшая часть минут, 4 младших байта 2-й ячейки старшая часть минут, 4 старших байта 2-й ячейки - часы.
Сколько же, все таки, байт. Или въ путаете битъ и байтъ.
Albert_V писал(а):
18 часов ..... двухбайтовым счётчиком
_________________ Лом - ето город в Болгарии, а не инструмент юстировки електроники.
Да не путаю, банальная опечатка, просто писАл поздно ночью. Во всем сообщении надо слова "байт" заменить на "бит" Так получается экономлю приличную часть EEPROM, вместо каждых 3-х байт для события, использую только 2. Но вот идея Albert_V действительно гениально проста, скорее всего так и сделаю. У меня все равно значения потом будут передаваться в ПК, там уже можно сделать преобразование в часы-минуты-секунды. Спасибо, Господа
Доброго времени суток. PIC12F629. Каким образом можно получить на базе Таймера 1 и кварцевого резонатора 32768 Гц (в качестве внешнего источника тактирования Таймера 1) период в 1 секунду. Я пользуясь предделителем 1:1 получаю ровно 2 секунды. Книжка пишет "этот таймер часто используется для формирования односекундной временной базы". Примера именно "односекундной" временной базы в книжке нет Настраиваю так:
Всё просто (как всегда).... После получения прерывания TMR1IF, поднимаете 7-ой бит в TMR1H.
Добавлено after 8 minutes 38 seconds: А как вы хотели? TMR1 считает до 65535, а вам нужно до 32767. Вот "поднятием" в TMR1H бита "7" вы и пропишите в него значение 32768+
Доброго времени суток. Требуется из ASCII кода сделать hex-представление. Может быть неправильно выразился, вот пример: из '0' получить 0h, из '1' получить 1h, из 'А' получить 0Аh, из 'F' получить 0Fh. Для этого написал следующую подпрограмму: Спойлер
Код:
Hex_2_ASCII ; Переводим ASCII-код в HEX представление ('0'-0h,'1'-1h,...,'E'-0Eh,'F'-0Fh) movfw rx_byte ; Копируем принятый байт sublw 39h ; Вычитаем наш код из ASCII-кода '9' btfss STATUS,C goto Label_1 ; Если > '9', надо вычитать 37h movlw 30h ; Если <= '9', надо вычитать 30h subwf rx_byte,w goto Label_2 Label_1 movlw 37h subwf rx_byte,w Label_2 return
Кладем в рабочий регистр ASCII код и на выходе получаем его hex-представление. Но после написания потянуло меня в интернеты, чужие варианты решения поискать. Решения своего вопроса я не нашел, а вот для обратного преобразования hex-ASCII нашлось очень компактное решение: Спойлер
Код:
bin2hex andlw 0x0f ; Isolate the low 4 bits addlw -.10 ; Value greater than 10? skpnc ; Skip if not addlw 'A'-'0' ; Else adjust for 'A'..'F' addlw '0'+.10 ; Convert to ASCII return
Никак не приложу ума, как и свою задачу реализовать таким способом, подскажите пожалуйста.
Если полноценный преобразователь делать - еще та головная боль. Если для ряда 0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F (аналогия того, что в биосе котуинки download/file.php?id=285080 ) то гораздо проще алгоритм (под MCS51 - но весьма легко и в ПИК перевести):
Код:
asc_bin: mov a,tmp_rx ; читаем принятый полубайт jnb ACC.6,asc_h0 ; проверяем бит, соответствующий 4 ; в старшей тетраде add a,#0x09 ; добавка для A-F asc_h0: anl a,#0x0F ; выделяем младшую тетраду старшего символа ret
Что кстати у Вас и приведено в конце сообщения за исключением того, что бит можно и непосредственно в регистре проверить - без передачи оного в W. А в акумуляторе держать маску-константу для выделения тетрады.
Последний раз редактировалось BOB51 Ср июн 28, 2017 13:00:30, всего редактировалось 2 раз(а).
Заголовок сообщения: Re: Вопросы начинающих PIC ASM
Добавлено: Чт июл 20, 2017 16:02:29
Встал на лапы
Карма: 3
Рейтинг сообщений: 49
Зарегистрирован: Вс сен 01, 2013 19:21:15 Сообщений: 102 Откуда: город К
Рейтинг сообщения:0
Здравствуйте. Микроконтроллер PIC16F876A и MAX232, пытаюсь заставить принимать байты с СОМ порта через аппаратный USART (скорость 9600 бод при частоте кварца 6,144 МГц, один стоповый бит). RTS заведён на порт С4, CTS на порт А5. Порт А4 служит для индикации RTS.Принятые байты отправляются в порт В и отображаются на светодиодных индикаторах. Приём байта организован как подпрограмма, встроена проверка буфера на переполнение. Суть проблемы. После правильного приёма последнего байта (любого числа), МК не видит сброса сигнала RTS (программа на ПК реально его сбрасывает, проверял с помощью мультиметра) и продолжает ждать передачи ложного байта. Как побороть данное явление ? Спойлер;---------- ; Подпрограмма приёма байта ;---------- Receive btfsc RCSTA, OERR ; Проверяем бит ошибки переполнения буфера call Rec_err bsf RCSTA,CREN ; Включаем приемник. bcf PORTA,5 ; Разрешаем передачу сигналом CTS Byte btfss PIR1,RCIF ; Проверяем наличие данных goto Byte movf RCREG,0 ; Сохраняем в W принятый байт bsf PORTA,5 ; Останавливаем передачу с помощью CTS bcf RCSTA,CREN ; Выключаем приемник. movwf PORTB ; Загружаем данные в порт В return ;---------- ; Подпрограмма обработки ошибки переполнения буфера приёмника ;---------- ; Переполнение буфера FIFO, буфер мал, нужно следить ; за переполнением Rec_err bcf RCSTA,CREN ; выключаем приемник bsf PORTA,5 ; Запрещаем передачу сигналом CTS movf RCREG,0 ; в буфере находятся 2 байта, их нужно прочитать movf RCREG,0 ; 3-ий переполняющий байт потерян навсегда,RSR его не принял bsf RCSTA,CREN ; Включаем приемник. OERR = 0 bcf PORTA,5 ; Разрешаем передачу сигналом CTS return ;---------- ; Основная часть ;---------- bcf STATUS,RP0; Выбрать банк 0 bsf PORTA,5 ; Запрещаем сигналом CTS передачу компьютеру call Time bsf PORTA,4 ; Отключаем светодиод-индикатор RTS call Clear ; Вызываем подпрограмму очистки буфера Ra btfsc PORTC,4 ; Ждём сигнала RTS goto Ra bcf PORTA,4 ; Зажигаем светодиод-индикатор сигнала RTS Re call Receive ; Вызываем подпрограмму приём байта call Time ; Задержка btfss PORTC,4 goto Re call Clear ; Очистить буфер приёмника bsf PORTA,4 ; Компьютер отключился, ждём новый RTS bsf PORTA,5 ; Отключаем индикаторы RTS и CTS call Time goto Ra ; Новый цикл end
_________________ Пушистый ? Ага... чёрный, чешуйчатый и крылатый ! --- Consulовед второго уровня.
Заголовок сообщения: Re: Вопросы начинающих PIC ASM
Добавлено: Чт июл 20, 2017 16:52:29
Встал на лапы
Карма: 3
Рейтинг сообщений: 49
Зарегистрирован: Вс сен 01, 2013 19:21:15 Сообщений: 102 Откуда: город К
Рейтинг сообщения:0
Инициализация как раз выполнена, но не показана. Иначе как бы порты работали Спойлерbsf STATUS, RP0 ; Выбрать банк 1 movlw 0x06 movwf ADCON1 movlw b'00110111' ; Отключаем от портов компараторы movwf CMCON bcf STATUS, RP0 clrf T1CON ; выключаем TMR1. clrf T2CON ; ----"---- TMR2. clrf CCP1CON ; ----"---- CCP1. clrf CCP2CON ; ----"---- CCP2. clrf ADCON0 ; ----"---- АЦП. movlw b'00000101' movwf SSPCON clrf SSPCON2 bsf STATUS,RP0 ; Выбрать банк 1 movlw b'11000000' ; направления портов А на вход movwf TRISA movlw b'00000000' ;порты В настроены на выход movwf TRISB movlw b'11111111' ; порт С только на вход movwf TRISC ; Вопрос в том, как заставить программу не начать приём ложного байта, после сброса сигнала RTS со стороны ПК.
_________________ Пушистый ? Ага... чёрный, чешуйчатый и крылатый ! --- Consulовед второго уровня.
Проверьте времена: Сколько ждёте до проверки PORTC,4 и через какое время после передачи последнего байта реально выставляется RTS. ---- P.S. Я, обычно, считаю что пакет принят, если с момента приёма последнего байта прошло более двух времён передачи байта и не пользуюсь аппаратным разрешением/запретом приёма/передачи данных.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения