начал писать так If CommandOut = %0000111 Then, но 1. с простыми числами как-то удобней как как это сделать ни где не нашел. 2. 7 должно быть = %0000111, но почему-то именно это число не "схватывает" = %111 то же пробовал не получается
Ваше видео посмотрел, но не понял как там поймать результат, например конечный должен быть =7. Видимо в том излучателе нужно написать какой-то код (но как его потрошить)? Я новичок. За помощь стараюсь плюсовать репутацию (пока других способов сказать спасибо не знаю).
Anatoliy1000, вот, прикрепляю, то что у меня работает. Прицепил передачу кода с контроллера 18f1320 (взял с проекта DAlexV) Там посылается команда $16. По ней Вы увидите, что светодиод загорается. Proteus у меня 8.6!
ЦитатаAnatoliy1000 ()
Ваше видео посмотрел, но не понял как там поймать результат, например конечный должен быть =7.
Там Вы результата не увидите, это только для отладки.
И снова здравствуйте! Почему-то у меня по разному работает на пик 16ф628а и 12ф629 На первом делал отладку через (с помощью) ЛСД, а на втором только скопировал код из первого. В результате на первом работает как часы, а на втором через раз иногда через десять раз. Раньше думал батарейка садится. Сейчас когда вернулся к 16ф628а, понял, что дело в программе или железе. Пока нет возможности выложить код (так как дома). Буду на работе скину для сравнения. Но есть ещё подозрение на железо, так как коды практически одинаковые.
Symbol RBIF = INTCON.0 ' RB Port Interrupt Flag Symbol INTF = INTCON.1 ' RB0 External Interrupt Flag Symbol T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag Symbol RBIE = INTCON.3 ' RB Port Change Interrupt Enable Symbol INTE = INTCON.4 ' RB0 External Interrupt Enable Symbol T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable Symbol PEIE = INTCON.6 ' Peripheral Interrupt Enable Symbol GIE = INTCON.7 ' Global Interrupt Enable
Dim tik As Word ; количество прерываний таймера Dim Start_flag As Byte ; флаг старта Dim Repeat_flag As Byte ; флаг повтора Dim Command1 As Byte ; не инверсная команда Dim Command2 As Byte ; инверсная команда Dim CommandOut As Byte ; готовый результат команды Dim BitN As Byte ; счетчик битов посилки (0..31) ; ------------------------ инициализация-----------------------
INTE = 1 ; RB0 External Interrupt Enable PEIE = 1 ' Peripheral Interrupt Enable GIE = 1 ' Gobal Interrupt Enable ;T0IE = 1 ; вкл. прерывание от таймера 0
TMR0 = 0;
tik = 0 BitN = 0
GoTo main: ;========== Прерывание ============= Label: Context Save
If INTF = 1 Then ; если произошло внешнее прерывание по входу PORTB.0 INTF = 0 ; Сбросить флаг прерывания TMR0 = 0 ; обнулить таймер 0 T0IE = 1 ; вкл. прерывание от таймера 0
If tik >= 26 And tik < 30 Then ; если таймер натикал ~ 13.5мс, то значит пришла стартовая последовательность Start_flag = 1 ; ставим флаг старта Repeat_flag = 0 ; повтор сбрасываем ''' Adress1 = 0 ; обнуляем все ''' Adress2 = 0 ; регистры Command1 = 0 ; адресов и Command2 = 0 ; команд
EndIf ;tik >= 131 And tik < 141
If tik >= 20 And tik < 25 Then ; если таймер натикал ~ 11.25мс, то значит пришел повтор Repeat_flag = 1 ; ставим флаг повтора Start_flag = 0 ; стартовый снимаем, чтобы уже не писать в регистры адресов и команд EndIf ;tik >= 111 And tik < 131
;******************** прием еденицы ************ If tik >= 4 And tik < 19 Then ; если натикало ~2.25мс значит еденица If Start_flag = 1 Then ; и был старт ; === пишем еденицы (0..7 биты) в adress1 ''' If BitN < 8 Then ; ''' Adress1 = Adress1 >> 1 ; сдвигаем регистр вправо на 1 ''' Adress1.7 = 1 ; в 7 бит пишем еденицу ''' EndIf ;BitN < 8
; === пишем еденицы (8..15 биты) в adress2
''' If BitN >= 8 And BitN < 16 Then ; ''' Adress2 = Adress2 >> 1 ; ''' Adress2.7 = 1 ; ''' EndIf ;BitN >= 8 And BitN < 16
; === пишем еденицы (16..23 биты) в command1
If BitN >= 16 And BitN < 24 Then ; Command1 = Command1 >> 1 ; Command1.7 = 1 ; EndIf ; BitN >= 16 And BitN < 24
; === пишем еденицы (24..31 биты) в command2
If BitN >= 24 And BitN < 32 Then ; Command2 = Command2 >> 1 ; Command2.7 = 1 ; EndIf ;BitN >= 24 And BitN < 32
Inc BitN ; инкремент счетчика битов EndIf ;Start_flag = 1 EndIf ;tik >= 20 And tik < 100
; ******************* прием ноля ***************
If tik >= 2 And tik < 3 Then ; если натикало ~1.12мс значит еденица If Start_flag = 1 Then ; и был старт
; === пишем нули (0..7 биты) в adress1
''' If BitN < 8 Then ''' Adress1 = Adress1 >> 1 ''' Adress1.7 = 0 ''' EndIf
; === пишем нули (8..15 биты) в adress2
''' If BitN >= 8 And BitN < 16 Then ''' Adress2 = Adress2 >> 1 ''' Adress2.7 = 0 ''' EndIf
; === пишем нули (16..23 биты) в command1
If BitN >= 16 And BitN < 24 Then Command1 = Command1 >> 1 Command1.7 = 0 EndIf
; === пишем нули (24..31 биты) в command2
If BitN >= 24 And BitN < 32 Then Command2 = Command2 >> 1 Command2.7 = 0 EndIf
Inc BitN EndIf
EndIf If BitN = 32 Then ; если прошли все 32 биты, то ''' AdressOut = Adress1 ; записываем окончательный CommandOut = Command1 ; результат в регистры BitN = 0 ; обнуляем счетчик битов Start_flag = 0 ; обнуляем стартовый флаг T0IE = 0 ; выкл. прерывание от таймера 0 EndIf
tik = 0
EndIf ;INTF = 1 ;============================================================= If T0IF = 1 Then ; если произошло прерывание от таймера 0 T0IF = 0 ; Сбросить флаг Inc tik ; инкремент регистра tik
If tik >=1150 Then ; если прошло ~ 115 мсек T0IE = 0 ; выкл. прерывание от таймера 0 Start_flag = 0 ; обнуляем все регистры Repeat_flag = 0 ; === ''' Adress1 = 0 ; === ''' Adress2 = 0 ; === Command1 = 0 ; ==== Command2 = 0 ; == tik = 0 ; === EndIf ;tik >=1150
EndIf ;T0IF = 1
Context Restore main:
DelayMS 50
' Print At 1,1, "=", Dec CommandOut , "======" If CommandOut = 69 Then If GPIO.0=1 Then GPIO.0=0 Else GPIO.0=1 End If CommandOut=0 End If
If CommandOut = 70 Then If GPIO.1=1 Then GPIO.1=0 Else GPIO.1=1 End If CommandOut=0 End If If CommandOut = 71 Then If GPIO.5=1 Then GPIO.5=0 Else GPIO.5=1 End If CommandOut=0 End If
If CommandOut = 12 Then If GPIO.4=1 Then GPIO.4=0 Else GPIO.4=1 End If CommandOut=0 End If If CommandOut = 24 Then If GPIO.3=1 Then GPIO.3=0 Else GPIO.3=1 End If CommandOut=0 End If GoTo main
Device 16F628A
Declare Xtal 4 ' --------------------------------------------Конфигурация микроконтроллера-------------------------------------------- Config BODEN_OFF, PWRTE_ON, WDT_OFF, LVP_OFF, MCLRE_OFF, INTRC_OSC_NOCLKOUT, CP_OFF, DATA_CP_OFF ' INTRC_OSC-NOCLKOUT - включить внутренний генератор на 4 мГц ' MCLRE_OFF - Включить режим работы RA5/MCLR как цифрового порта ввода/вывода ' и использовать внутренний сброс MCLR ' PWRTE_ON - Включить бит разрешения работы таймера включения питания для лучшего запуска ' CP_ON - Включить защиту памяти программ от несанкционированного считывания ' DATA_CP_ON - Включить защиту EEPROM памяти данных от несанкционированного считывания '------------------------------------Главная программа---------------------------------------
CMCON = 7 'отключение компаратора '--------------------------------Настройки подключения ЖКИ---------------------------------- 'Declare LCD_Type ALPHA ' Тип ЖКИ - буквенно-цифровой 'Declare LCD_DTPin PORTB.4 ' Порт данных ЖКИ 'Declare LCD_ENPin PORTA.7 ' Управление линией E 'Declare LCD_RSPin PORTA.0 ' Управление линией RS 'Declare LCD_Interface 4 ' 4-х битная разрядность шины данных 'Declare LCD_CommandUs 2000 ' Задержка перед посылкой команды 'Declare LCD_DataUs 50 ' Задержка перед посылкой данных 'Declare LCD_Lines 2 ' Количество строк ЖКИ '------------------------------------------------------------------------------------ Declare All_Digital On Declare Create_Coff = 1 '---------------------------- Intcon --------------------------------------
Symbol RBIF = INTCON.0 ' RB Port Interrupt Flag Symbol INTF = INTCON.1 ' RB0 External Interrupt Flag Symbol T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag Symbol RBIE = INTCON.3 ' RB Port Change Interrupt Enable Symbol INTE = INTCON.4 ' RB0 External Interrupt Enable Symbol T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable Symbol PEIE = INTCON.6 ' Peripheral Interrupt Enable Symbol GIE = INTCON.7 ' Global Interrupt Enable
Dim tik As Word ; количество прерываний таймера Dim Start_flag As Byte ; флаг старта Dim Repeat_flag As Byte ; флаг повтора ''' Dim Adress1 As Byte ; не инверсный адрес ''' Dim Adress2 As Byte ; инверсный адрес Dim Command1 As Byte ; не инверсная команда Dim Command2 As Byte ; инверсная команда ''' Dim AdressOut As Byte ; готовый результат адреса Dim CommandOut As Byte ; готовый результат команды Dim BitN As Byte ; счетчик битов посилки (0..31) Dim rezultat As Word ; количество прерываний таймера ; ------------------------ инициализация-----------------------
TRISB = %00000001 ' RB0 als input PORTB = %00000000
TRISA = %00000000 ' RB0 als input PORTA = %00000000
INTE = 1 ; RB0 External Interrupt Enable PEIE = 1 ' Peripheral Interrupt Enable GIE = 1 ' Gobal Interrupt Enable ;T0IE = 1 ; вкл. прерывание от таймера 0
TMR0 = 0;
tik = 0 BitN = 0
GoTo main: ;========== Прерывание ============= Label: тот же текст что и выше main:
DelayMS 50
' 1 ряд кнопок: RA1 If CommandOut = %1000101 Or CommandOut = %1000110 Or CommandOut = %1000111 Then If PORTA.1=0 Then PORTA.1=1 Else PORTA.1=0 End If CommandOut=0 End If ' 4 ряд кнопок: Rb7 If CommandOut = %1100 Or CommandOut = %11000 Or CommandOut = %1011110 Then If PORTB.7=0 Then PORTB.7=1 Else PORTB.7=0 End If CommandOut=0 End If ' 5 ряд кнопок: Rb6 If CommandOut = %10110 Or CommandOut = %11001 Or CommandOut = %1101 Then If PORTB.6=0 Then PORTB.6=1 Else PORTB.6=0 End If CommandOut=0 End If
' 6 ряд кнопок: Rb5 If CommandOut = %1000 Or CommandOut = %11100 Or CommandOut = %1011010 Then If PORTB.5=0 Then PORTB.5=1 Else PORTB.5=0 End If CommandOut=0 End If
' 7 ряд кнопок: Ra0 If CommandOut = $42 Or CommandOut = $52 Or CommandOut = 74 Then If PORTA.0=0 Then PORTA.0=1 Else PORTA.0=0 End If CommandOut=0 End If
GoTo main
Добавлено (01.10.2018, 08:32) --------------------------------------------- Может есть какие-то способу "повесить" на 12ф629 ЛСД?
Я новичок. За помощь стараюсь плюсовать репутацию (пока других способов сказать спасибо не знаю).
Сообщение отредактировал
Anatoliy1000 - Пн, 01.10.2018, 08:31
Всем здравствуйте! Подскажите почему не получается "завести" отладку. Все делаю как на видео: - добавляю файл *.bas; - нажимаю паузу; - нажимаю F11 , а окна отладочные не появляются. Я новичок. За помощь стараюсь плюсовать репутацию (пока других способов сказать спасибо не знаю).
Сообщение отредактировал
Anatoliy1000 - Пт, 09.11.2018, 10:45
Выложите, то что у вас не получается (файлы). Посмотрим.Или снимите видео, что Вы делаете.
Цитатаxvovanx ()
а перед этим свою прогу скомпилировали? С голым просто файлом *.bas работать не будет, нужна вся "куча файлов" после компиляции.
Для того что бы выложить нужно скачать прогу записи с экрана. Пока не успеваю. На видео снять это вообще целое дело. Нужно же потом где-то это разместить. Прогу компилировал...
Решил тем, что открыл другой - ранее созданный проект. Вставил в него элементы. Все пошло. Всем спасибо за ответы. Я новичок. За помощь стараюсь плюсовать репутацию (пока других способов сказать спасибо не знаю).