Вопрос по PIC16F877 - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Вопрос по PIC16F877 (странно работает)
Вопрос по PIC16F877
tolyan249 Дата: Чт, 03.04.2014, 18:25  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 166
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Declare SHOW_SYSTEM_VARIABLES SHOW_SYSTEM_VARIABLES = OFF
Declare FSR_CONTEXT_SAVE FSR_CONTEXT_SAVE= OFF
Declare Reminders Reminders= OFF
Declare Warnings Warnings= OFF Declare Optimiser_LevelOptimiser_Level 4
Declare Bootloader Bootloader= OFF

;-------------------------- Общие настройки------------------------------------
Device= 16F877 Xtal= 20

'-------------------------- Конфигурация программирования --------------------

Config WDT_OFF, PWRTE_ON, CP_OFF, DEBUG_OFF, WRT_OFF, CPD_OFF, LVP_OFF, BODEN_OFF, HS_OSC

'-------------------------- Настройки портов --------------------------------
-Declare PortB_Pullups PortB_Pullups= OFF

Declare All_DigitalAll_Digital= On'--Определение назначения каналов портов--

TRISA = %00000000
TRISB = %00000001
TRISC = %00000000
TRISD = %00000000
TRISE = %00000000

'---------------------Основной цикл программы-----------------------------

main:
PORTA.0=1
PORTB.5=1
PORTB.6=1
PORTB.7=1

DelayMS 100

PORTA.0=0
PORTB.5=0
PORTB.6=0
PORTB.7=0
DelayMS 100

GoTo main

Не моргают 2 порта B6 и B7 , хотя B5 моргает и  A0 тоже моргает, не понятно то ли контроллер не работает то ли конфигурация не та . Помогите что не могу понять Спасибо.

Сообщение отредактировал tolyan249 - Пт, 04.04.2014, 05:21
ЯНДЕКС Дата: 03.04.2014
ADMIN Дата: Чт, 03.04.2014, 20:47  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1109
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Может, код немного подправить, чтобы понятней было?
mikhail09p Дата: Чт, 03.04.2014, 21:47  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 504
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

tolyan, Вы же не первый день на форуме. Неужели не знаете, что намного иформативней скинуть в архиве программу и проект протеуса? А то как увидеть, что куда у Вас подключено?
Сейчас человек бросит свою работу и начнёт сначала приводить в порядок программу, которую Вы выложили, а потом, возможно, начнёт по ней делать проект в протеусе, чтобы понять, что же Вы имели ввиду - странно работает...
MiXaS Дата: Чт, 03.04.2014, 23:10  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 615
Репутация: 26   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Что это вообще за набор символов?!
Что означает PORTA
Я вообще удивлен, что оно как—то мограло
tolyan249 Дата: Пт, 04.04.2014, 05:27  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 166
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Здравствуйте всем. Да я с протона текст вставил и видать редактор так отформатировал текст.
нашел как заставить эти 2 порта работать PORTB.6   и PORTB.7 в конфиге  поставил флаг DEBUG в ON и эти 2 порта заработали за то перестали работать другие 2 порта.   Как правильно прописать конфиг, если все ноги контроллера на выходе кроме PORTB.0

И имено не работает в железе в proteuse работает.

вот старая ссылка на мой пооект его делаю.
http://www.picbasic.ru/forum/5-1240-2

исходник приложен

Declare SHOW_SYSTEM_VARIABLES = OFF ' При симуляции в Proteus не показывать внутренние переменные
Declare FSR_CONTEXT_SAVE = OFF ' Не заботиться о сохранении содержимого регистра FSR
Declare Reminders = OFF ' Выключить напоминания компилятора
Declare Warnings = OFF ' Выключить предупреждения компилятора
Declare Optimiser_Level 4 ' Включить оптимизацию программы
Declare Bootloader = OFF ' Выключить загрузчик

;-------------------------- Общие настройки------------------------------------

Device = 16F877A ' Используемый микроконтроллер
Xtal = 20 ' Частота осциллятора 20 МГц

'-------------------------- Конфигурация программирования --------------------

Config CP_OFF, DEBUG_OFF, WRT_OFF, CPD_OFF, LVP_OFF, BODEN_OFF, PWRTE_OFF, WDT_OFF, XT_OSC

'-------------------------- Настройки портов ---------------------------------

PortB_Pullups = OFF ' Выключить подтягивающие резисторы на PORTB
Declare All_Digital = On ' Установить все порты цифровыми входами/выходами

'--Определение назначения каналов портов--

TRISA = %00000000 ' Сделать канал PORTA.0 выходом
TRISB = %00000001 ' Сделать каналы PORTВ.0 входом , остальные выходом
TRISC = %00000000 ' PORTC выходом
TRISD = %00000000 ' Сделать каналы PORTD выходом
TRISE = %00000000 ' Сделать канал PORT E  выходом

'-------------------------- OPTION_REG ----------------------------------------

OPTION_REG.0=0 ' Бит установки предделителя TMR0
OPTION_REG.1=0 ' Бит установки предделителя TMR0
OPTION_REG.2=0 ' Бит установки предделителя TMR0
OPTION_REG.3=0 ' Выбор включения предделителя ,предделитель выключен
OPTION_REG.4=1 '1- Выбор фронта приращения TMR0 при внешнем тактовом сигнале -выключен
OPTION_REG.5=0 ' Выбор тактового сигнала для TMR0-приращение таймера от внутреннего генератора -включен
OPTION_REG.6=0 ' Выбор активного фронта сигнала на входе внешнего прерывания INT, PORTB.0
OPTION_REG.7=1 ' Включение подтягивающих резисторов на PORTB -включен

'-------------------------- INTCON --------------------------------------------

INTCON.0=0 ' Флаг внешнего прерывания по PORTB.4-PORTB.7 -выключен
INTCON.1=1 ' Флаг внешнего прерывания по PORTB.0(INT) -включен
INTCON.2=1 ' Флаг переполнения TMR0 -включен
INTCON.3=0 ' Бит разрешения прерывания по PORTB.4-PORTB.7 -выключен
INTCON.4=1 ' Бит разрешения прерывания по PORTB.0(INT) -включен
INTCON.5=1 ' Бит разрешения прерывания по переполнению TMR0 -включен пока
INTCON.6=1 ' Бит разрешения прерывания от периферийных устройств -включен
INTCON.7=1 'Бит глобального разрешения прерываний -включен

TMR0=0 'считать таймер будет до 255

'переменные каналов мощности до 100(100-полная мощность в процентах)
Dim FESTOON_1 As Byte '
Dim FESTOON_2 As Byte '
Dim FESTOON_3 As Byte '
Dim FESTOON_4 As Byte '
Dim FESTOON_5 As Byte '
Dim FESTOON_6 As Byte '
Dim FESTOON_7 As Byte '
Dim FESTOON_8 As Byte '
Dim FESTOON_9 As Byte '
Dim FESTOON_10 As Byte '
Dim FESTOON_11 As Byte '
Dim FESTOON_12 As Byte '
Dim FESTOON_13 As Byte '
Dim FESTOON_14 As Byte '
Dim FESTOON_15 As Byte '
Dim FESTOON_16 As Byte '
Dim FESTOON_17 As Byte '
Dim FESTOON_18 As Byte '
Dim FESTOON_19 As Byte '
Dim FESTOON_20 As Byte '
Dim FESTOON_21 As Byte '
Dim FESTOON_22 As Byte '
Dim FESTOON_23 As Byte '
Dim FESTOON_24 As Byte '
Dim FESTOON_25 As Byte '
Dim FESTOON_26 As Byte '

'флаги разрешения работы каналов(1-разрешено 0-запрещено)
Dim ON_1 As Bit '
Dim ON_2 As Bit '
Dim ON_3 As Bit '
Dim ON_4 As Bit '
Dim ON_5 As Bit '
Dim ON_6 As Bit '
Dim ON_7 As Bit '
Dim ON_8 As Bit '
Dim ON_9 As Bit '
Dim ON_10 As Bit '
Dim ON_11 As Bit '
Dim ON_12 As Bit '
Dim ON_13 As Bit '
Dim ON_14 As Bit '
Dim ON_15 As Bit '
Dim ON_16 As Bit '
Dim ON_17 As Bit '
Dim ON_18 As Bit '
Dim ON_19 As Bit '
Dim ON_20 As Bit '
Dim ON_21 As Bit '
Dim ON_22 As Bit '
Dim ON_23 As Bit '
Dim ON_24 As Bit '
Dim ON_25 As Bit '
Dim ON_26 As Bit '

'просто переменные
Dim s As Byte
Dim i As Byte

Clear

PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

On_Interrupt GoTo te
GoTo main

te:
Context Save

If INTCON.1=1 Then 'произошло прерывание по PORTB.0
If OPTION_REG.6=0 Then 'если это фронт то делать сдедующие
s=0
TMR0=255
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
OPTION_REG.6=1'переключаем для прерывания по спаду что бы мерить имульс а не период весь
Else
OPTION_REG.6=0 'возращаем на место что бы прерывание было опять по фронту
s=0
TMR0=255
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
EndIf
INTCON.1=0
EndIf
If INTCON.2=1 Then 'пришло прерывание от таймера TMR0-что он переполнился
Inc s 'переполнение происходит каждые 256мкс-микросекунд
INTCON.2=0 'считываем эти переполнения и увеличеваем переменную на 1
EndIf 'что бы знать сколько переполнений было

'---------------------------------------
If ON_1=1 Then
If s=1 Then PORTB.1=1
If s=FESTOON_1 Then PORTB.1=0
Else
PORTB.1=0
EndIf

If ON_2=1 Then
If s=1 Then PORTB.2=1
If s=FESTOON_2 Then PORTB.2=0
Else
PORTB.2=0
EndIf

If ON_3=1 Then
If s=1 Then PORTB.3=1
If s=FESTOON_3 Then PORTB.3=0
Else
PORTB.3=0
EndIf

If ON_4=1 Then
If s=1 Then PORTB.4=1
If s=FESTOON_4 Then PORTB.4=0
Else
PORTB.4=0
EndIf

If ON_5=1 Then
If s=1 Then PORTB.5=1
If s=FESTOON_5 Then PORTB.5=0
Else
PORTB.5=0
EndIf

If ON_6=1 Then
If s=1 Then PORTB.6=1
If s=FESTOON_6 Then PORTB.6=0
Else
PORTB.6=0
EndIf

If ON_7=1 Then
If s=1 Then PORTB.7=1
If s=FESTOON_7 Then PORTB.7=0
Else
PORTB.7=0
EndIf
'---------------------------------------

If ON_8=1 Then
If s=1 Then PORTC.0=1
If s=FESTOON_8 Then PORTC.0=0
Else
PORTC.0=0
EndIf

If ON_9=1 Then
If s=1 Then PORTC.1=1
If s=FESTOON_9 Then PORTC.1=0
Else
PORTC.1=0
EndIf

If ON_10=1 Then
If s=1 Then PORTC.2=1
If s=FESTOON_10 Then PORTC.2=0
Else
PORTC.2=0
EndIf

If ON_11=1 Then
If s=1 Then PORTC.3=1
If s=FESTOON_11 Then PORTC.3=0
Else
PORTC.3=0
EndIf

If ON_6=12 Then
If s=1 Then PORTC.4=1
If s=FESTOON_12 Then PORTC.4=0
Else
PORTC.4=0
EndIf

If ON_6=13 Then
If s=1 Then PORTC.5=1
If s=FESTOON_13 Then PORTB.5=0
Else
PORTC.5=0
EndIf

If ON_14=1 Then
If s=1 Then PORTC.6=1
If s=FESTOON_15 Then PORTC.6=0
Else
PORTC.6=0
EndIf

If ON_15=1 Then
If s=1 Then PORTC.7=1
If s=FESTOON_15 Then PORTC.7=0
Else
PORTC.7=0
EndIf
'-----------------------------------------------------------------

If ON_16=1 Then
If s=1 Then PORTD.0=1
If s=FESTOON_16 Then PORTD.0=0
Else
PORTD.0=0
EndIf

If ON_17=1 Then
If s=1 Then PORTD.1=1
If s=FESTOON_17 Then PORTD.1=0
Else
PORTD.1=0
EndIf

If ON_18=1 Then
If s=1 Then PORTD.2=1
If s=FESTOON_18 Then PORTD.2=0
Else
PORTD.2=0
EndIf

If ON_19=1 Then
If s=1 Then PORTD.3=1
If s=FESTOON_19 Then PORTD.3=0
Else
PORTD.3=0
EndIf

If ON_20=1 Then
If s=1 Then PORTD.4=1
If s=FESTOON_20 Then PORTD.4=0
Else
PORTD.4=0
EndIf

If ON_21=1 Then
If s=1 Then PORTD.5=1
If s=FESTOON_21 Then PORTD.5=0
Else
PORTD.5=0
EndIf

If ON_22=1 Then
If s=1 Then PORTD.6=1
If s=FESTOON_22 Then PORTD.6=0
Else
PORTD.6=0
EndIf

If ON_23=1 Then
If s=1 Then PORTD.7=1
If s=FESTOON_23 Then PORTD.7=0
Else
PORTD.7=0
EndIf

Context Restore

main:
ON_1=1'включить 1-канал
ON_2=1'включить 2-канал
ON_3=1'включить 3-канал
GoSub ustr
GoTo main

'режимы программ с разной мощностиью каждого канала
'сделать разные режимы сколько хватит фантазии
' FESTOON_-отвечает за мощность в канале в процентах
' FESTOON_1=25 это соответствует 25-процентов мощности ну и так далее
ustr:

If ON_1=1 Then

For i=0 To 90
DelayMS 5
Inc FESTOON_1
Next

For i=0 To 90
DelayMS 5
Dec FESTOON_1
Next

EndIf

If ON_2=1 Then
For i=0 To 50
DelayMS 5
Inc FESTOON_2
Next
EndIf

If ON_3=1 Then
For i=0 To 75
DelayMS 5
Inc FESTOON_3
Next
EndIf

If ON_2=1 Then
For i=0 To 50
DelayMS 5
Dec FESTOON_2
Next
EndIf

If ON_3=1 Then
For i=0 To 75
DelayMS 5
Dec FESTOON_3
Next
EndIf

If ON_1=1 And ON_2=1 And ON_3=1 Then
For i=0 To 95
DelayMS 5
Inc FESTOON_1
Inc FESTOON_2
Inc FESTOON_3
Next
EndIf

If ON_1=1 And ON_2=1 And ON_3=1 Then
For i=0 To 95
DelayMS 5
Dec FESTOON_1
Dec FESTOON_2
Dec FESTOON_3
Next
EndIf

Return
End

Что то мне кажется с конфигурацией проблемка.

Спасибо всем огромное за помощь.

Сообщение отредактировал tolyan249 - Пт, 04.04.2014, 07:44
ADMIN Дата: Пт, 04.04.2014, 10:06  |                                                                                                                Сообщение # 6
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1109
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

я бы добавил строчку в начале cmcon = 7, если не используются компараторы. а дебуг, если не используется, то и включать незачем
anatol Дата: Пт, 04.04.2014, 11:06  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 547
Репутация: 14   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

tolyan249, я понимаю что читать мануал на контроллер нет желания -много страниц. Но запомнить самое главное - сконфигурировать контроллер в положение отличающееся от положения после сброса (начального включения) - вы обязаны.
Не стоит забывать что в случае если вы не объявляете некоторые настройки - компилятор берет их из исходных и добавляет вместо вас. А вы предупреждения компилятора выключили. Только зачем? Не забывайте что порты у вас мультипликативные (на одну ножку назначены разные входы-выходы) и необходимо правильно подключить нужное.
MiXaS Дата: Пт, 04.04.2014, 11:10  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 615
Репутация: 26   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата tolyan249 ()
Declare Optimiser_Level 4 ' Включить оптимизацию программы


Если Вы читали мануал, то скорее всего знаете, что эта Директива нормально работает только с 18f и выше. Если мне не изменяет память, то максимальный уровень оптимизации это 3. Из опыта с этим контроллером могу сказать, что когда код занимает примерно 97% памяти и не хватает несколько процентов для еще чего–то, приходит мысль оптимизировать программу с помощью этой директивы, после чего код работает отвратительно, багов много появляется.
Цитата tolyan249 ()
PortB_Pullups = OFF ' Выключить подтягивающие резисторы на PORTB Declare All_Digital = On ' Установить все порты цифровыми входами/выходами '--Определение назначения каналов портов-- TRISA = %00000000 ' Сделать канал PORTA.0 выходом TRISB = %00000001 ' Сделать каналы PORTВ.0 входом , остальные выходом TRISC = %00000000 ' PORTC выходом TRISD = %00000000 ' Сделать каналы PORTD выходом TRISE = %00000000 ' Сделать канал PORT E  выходом '-------------------------- OPTION_REG ---------------------------------------- OPTION_REG.0=0 ' Бит установки предделителя TMR0 OPTION_REG.1=0 ' Бит установки предделителя TMR0 OPTION_REG.2=0 ' Бит установки предделителя TMR0 OPTION_REG.3=0 ' Выбор включения предделителя ,предделитель выключен OPTION_REG.4=1 '1- Выбор фронта приращения TMR0 при внешнем тактовом сигнале -выключен OPTION_REG.5=0 ' Выбор тактового сигнала для TMR0-приращение таймера от внутреннего генератора -включен OPTION_REG.6=0 ' Выбор активного фронта сигнала на входе внешнего прерывания INT, PORTB.0 OPTION_REG.7=1 ' Включение подтягивающих резисторов на PORTB -включен

Цитата tolyan249 ()
PortB_Pullups = OFF ' Выключить подтягивающие резисторы на PORTB Declare All_Digital = On ' Установить все порты цифровыми входами/выходами '--Определение назначения каналов портов-- TRISA = %00000000 ' Сделать канал PORTA.0 выходом TRISB = %00000001 ' Сделать каналы PORTВ.0 входом , остальные выходом TRISC = %00000000 ' PORTC выходом TRISD = %00000000 ' Сделать каналы PORTD выходом TRISE = %00000000 ' Сделать канал PORT E  выходом '-------------------------- OPTION_REG ---------------------------------------- OPTION_REG.0=0 ' Бит установки предделителя TMR0 OPTION_REG.1=0 ' Бит установки предделителя TMR0 OPTION_REG.2=0 ' Бит установки предделителя TMR0 OPTION_REG.3=0 ' Выбор включения предделителя ,предделитель выключен OPTION_REG.4=1 '1- Выбор фронта приращения TMR0 при внешнем тактовом сигнале -выключен OPTION_REG.5=0 ' Выбор тактового сигнала для TMR0-приращение таймера от внутреннего генератора -включен OPTION_REG.6=0 ' Выбор активного фронта сигнала на входе внешнего прерывания INT, PORTB.0 OPTION_REG.7=1 ' Включение подтягивающих резисторов на PORTB -включен


Вот этот момент тоже не понятен. Вы сначало выключаете подтяжки, потом снова включаете.

Информация: флаги не включаюстя и не выключаются, они просто есть. Их можно сбросить.

Цитата tolyan249 ()
Declare FSR_CONTEXT_SAVE = OFF ' Не заботиться о сохранении содержимого регистра FSR


Интересно, вы сначало объявляете, что не хочу хранить контекст, а в прерывании пишите сохранить контекст, так не пойдет, работать не будет.
tolyan249 Дата: Пт, 04.04.2014, 11:10  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 166
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

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

Спасибо всем огромное за советы, самое главное за ответы и пожелания,.

Сообщение отредактировал tolyan249 - Пт, 04.04.2014, 11:14
MiXaS Дата: Пт, 04.04.2014, 11:18  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 615
Репутация: 26   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата anatol ()
Не забывайте что порты у вас мультипликативные (на одну ножку назначены разные входы-выходы) и необходимо правильно подключить нужное


для этого опять нужно читать шит :-)
tolyan249 Дата: Пт, 04.04.2014, 11:24  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 166
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Подскажите где я отказался  что не хочу хранить контекст.
MiXaS Дата: Пт, 04.04.2014, 11:25  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 615
Репутация: 26   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата tolyan249 ()
Declare FSR_CONTEXT_SAVE = OFF ' Не заботиться о сохранении содержимого регистра FSR
tolyan249 Дата: Пт, 04.04.2014, 11:28  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 166
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Ясно Спасибоо.
anatol Дата: Пт, 04.04.2014, 11:30  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 547
Репутация: 14   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

tolyan249, Если здесь еще - посмотри главу 4 - порты ввода вывода. там есть таблички с указанием какие регистры влияют на порты. в частности Порт В  - PORTB, TRISB, OPTION_REG. Как последний - см. сам.
tolyan249 Дата: Пт, 04.04.2014, 11:34  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 166
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Спасибо что подсказали, не внимательность
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Вопрос по PIC16F877 (странно работает)
Страница 1 из 212»
Поиск: