Например TDA7294

Форум РадиоКот :: Просмотр темы - Вопросы начинающих PIC ASM
Форум РадиоКот
https://radiokot.ru/forum/

Вопросы начинающих PIC ASM
https://radiokot.ru/forum/viewtopic.php?f=58&t=125684
Страница 12 из 22

Автор:  Albert_V [ Пн май 15, 2017 22:55:06 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Чем именно AVR лучше?
Vadim1369 хочет сделать "крякалку" на контроллере, у которого нет ни DAC ни PWM. SRAM 64 байта и Program Memory 1024 words.
Обычно, контроллер подбирают под задачу...

Автор:  Vadim1369 [ Вт май 16, 2017 08:45:53 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Привет на сигналку чтоб были разные мелодии

Автор:  abc [ Вт май 16, 2017 09:51:24 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Было время, и на PIC16F84 делались голосовые информаторы.
На PORTB вешалась матрица R-2R, на пару ножек PORTA - 24C512.

Автор:  Vadim1369 [ Вт май 16, 2017 10:56:06 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

У меня есть схема на PIC12F675 но нет самой прошивки

Автор:  Пока_без_кота [ Сб июн 10, 2017 03:28:22 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Доброго времени суток. Необходимо организовать подсчет нескольких интервалов времени между событиями. По событию время должно фиксироваться, и записываться в 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

Просьба покритиковать, предложить получше :)))

Автор:  BOB51 [ Сб июн 10, 2017 07:05:47 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

А обязательно двоично-десятичное представление?
Я чащи в счетной части использую двоичные значения для минут и часов с последующим преобразованием для индикации.
:roll:

Автор:  Albert_V [ Сб июн 10, 2017 11:17:21 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Пока_без_кота писал(а):
Просьба покритиковать, предложить получше
Если максимум 18 часов достаточно - просто, считайте секунды двухбайтовым счётчиком.

Автор:  botchin [ Сб июн 10, 2017 11:26:51 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Пока_без_кота писал(а):
3 байта (часы, минуты, секунды)

Пока_без_кота писал(а):
6 младших байт 1-й ячейки - секунды, 2 старших байта этой же ячейки - младшая часть минут, 4 младших байта 2-й ячейки старшая часть минут, 4 старших байта 2-й ячейки - часы.

Сколько же, все таки, байт. Или въ путаете битъ и байтъ.
Albert_V писал(а):
18 часов ..... двухбайтовым счётчиком
:beer:

Автор:  Пока_без_кота [ Сб июн 10, 2017 12:35:52 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Да не путаю, банальная опечатка, просто писАл поздно ночью. Во всем сообщении надо слова "байт" заменить на "бит" :))) Так получается экономлю приличную часть EEPROM, вместо каждых 3-х байт для события, использую только 2. Но вот идея Albert_V действительно гениально проста, скорее всего так и сделаю. У меня все равно значения потом будут передаваться в ПК, там уже можно сделать преобразование в часы-минуты-секунды. Спасибо, Господа :beer:

Автор:  Albert_V [ Сб июн 10, 2017 12:39:03 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Только, сделайте проверку на 0хFFFF перед inc-ом, чтоб после 65535 секунд не "перескочить на ноль".

Автор:  Пока_без_кота [ Вс июн 11, 2017 13:45:46 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Доброго времени суток. PIC12F629. Каким образом можно получить на базе Таймера 1 и кварцевого резонатора 32768 Гц (в качестве внешнего источника тактирования Таймера 1) период в 1 секунду. Я пользуясь предделителем 1:1 получаю ровно 2 секунды. Книжка пишет "этот таймер часто используется для формирования односекундной временной базы". Примера именно "односекундной" временной базы в книжке нет :)))
Настраиваю так:
Код:
   movlw   (0<<T1CKPS1)|(0<<T1CKPS0)|(1<<T1OSCEN)|(1<<NOT_T1SYNC)|(1<<TMR1CS)|(1<<TMR1ON)
;   Предделитель 1:1, генератор включен, синхронизация внешнего сигнала выключена, внешний источник тактового сигнала, таймер включен
   movwf   T1CON


P.S. Хотелось без корректировки содержимого регистра. Кварц ведь выбран соответствующий. Но раз нельзя, так нельзя. Спасибо, Albert_V :beer:

Автор:  Albert_V [ Вс июн 11, 2017 14:00:19 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Всё просто (как всегда)....
После получения прерывания TMR1IF, поднимаете 7-ой бит в TMR1H. :)

Добавлено after 8 minutes 38 seconds:
А как вы хотели?
TMR1 считает до 65535, а вам нужно до 32767.
Вот "поднятием" в TMR1H бита "7" вы и пропишите в него значение 32768+

Автор:  Пока_без_кота [ Ср июн 28, 2017 12:06:51 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Доброго времени суток. Требуется из 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

Никак не приложу ума, как и свою задачу реализовать таким способом, подскажите пожалуйста.

P.S. Эврика !!! Что скажете ?
Спойлер
Код:
hex2bin
   movwf   temp
   btfsc   temp,6
   addlw   9h
   andlw   0Fh
   return   

Автор:  BOB51 [ Ср июн 28, 2017 12:53:45 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Если полноценный преобразователь делать - еще та головная боль.
Если для ряда 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

8)
Что кстати у Вас и приведено в конце сообщения за исключением того, что бит можно и непосредственно в регистре проверить - без передачи оного в W. А в акумуляторе держать маску-константу для выделения тетрады.
:tea:

Автор:  Albert_V [ Ср июн 28, 2017 12:54:03 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Код:
   movlw   'F'   ; Число в ASCII (TEST)
   movwf   TEMP
;----------
   movlw   30   ; Hex
   btfsc   TEMP,6
   movlw   37   ; Hex
   subwf   TEMP,F   ; В TEMP результат в HEX
;----------

Автор:  Пока_без_кота [ Ср июн 28, 2017 13:21:42 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Спасибо, как перевел из hex в bin, и когда увидел закономерность для каждого диапазона, сразу стало ясно, как сделать.

Автор:  1Ж24Б [ Чт июл 20, 2017 16:02:29 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Здравствуйте.
Микроконтроллер 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

Автор:  Albert_V [ Чт июл 20, 2017 16:34:42 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

При Init-е контроллера, ничего не записали в регистр ADCON1....
Что ж за напасть то такая в последнее время???

Автор:  1Ж24Б [ Чт июл 20, 2017 16:52:29 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Инициализация как раз выполнена, но не показана. Иначе как бы порты работали :facepalm:
Спойлер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 со стороны ПК.

Автор:  Albert_V [ Чт июл 20, 2017 17:13:01 ]
Заголовок сообщения:  Re: Вопросы начинающих PIC ASM

Проверьте времена: Сколько ждёте до проверки PORTC,4 и через какое время после передачи последнего байта реально выставляется RTS.
----
P.S.
Я, обычно, считаю что пакет принят, если с момента приёма последнего байта прошло более двух времён передачи байта и не пользуюсь аппаратным разрешением/запретом приёма/передачи данных.

Страница 12 из 22 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/