Вопрос по PIC16F877
|
|
tolyan249 |
Дата: Чт, 03.04.2014, 18:25 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
189
Замечания:
±
На сайте с 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
|
|
|
|
ADMIN |
Дата: Чт, 03.04.2014, 20:47 | Сообщение # 2 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Может, код немного подправить, чтобы понятней было?
|
|
|
|
mikhail09p |
Дата: Чт, 03.04.2014, 21:47 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
tolyan, Вы же не первый день на форуме. Неужели не знаете, что намного иформативней скинуть в архиве программу и проект протеуса? А то как увидеть, что куда у Вас подключено? Сейчас человек бросит свою работу и начнёт сначала приводить в порядок программу, которую Вы выложили, а потом, возможно, начнёт по ней делать проект в протеусе, чтобы понять, что же Вы имели ввиду - странно работает...
|
|
|
|
MiXaS |
Дата: Чт, 03.04.2014, 23:10 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Что это вообще за набор символов?! Что означает PORTA Я вообще удивлен, что оно как—то мограло
|
|
|
|
tolyan249 |
Дата: Пт, 04.04.2014, 05:27 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
189
Замечания:
±
На сайте с 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 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
я бы добавил строчку в начале cmcon = 7, если не используются компараторы. а дебуг, если не используется, то и включать незачем
|
|
|
|
anatol |
Дата: Пт, 04.04.2014, 11:06 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
tolyan249, я понимаю что читать мануал на контроллер нет желания -много страниц. Но запомнить самое главное - сконфигурировать контроллер в положение отличающееся от положения после сброса (начального включения) - вы обязаны. Не стоит забывать что в случае если вы не объявляете некоторые настройки - компилятор берет их из исходных и добавляет вместо вас. А вы предупреждения компилятора выключили. Только зачем? Не забывайте что порты у вас мультипликативные (на одну ножку назначены разные входы-выходы) и необходимо правильно подключить нужное.
|
|
|
|
MiXaS |
Дата: Пт, 04.04.2014, 11:10 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 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 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
189
Замечания:
±
На сайте с 11.10.2007
Статус:
Offline
|
Спасибо за совет ,мануал нашел по этому контролеру на русском сиджу читаю. может что найду.
Спасибо всем огромное за советы, самое главное за ответы и пожелания,.
Сообщение отредактировал
tolyan249 - Пт, 04.04.2014, 11:14
|
|
|
|
MiXaS |
Дата: Пт, 04.04.2014, 11:18 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Цитата anatol ( ) Не забывайте что порты у вас мультипликативные (на одну ножку назначены разные входы-выходы) и необходимо правильно подключить нужное
для этого опять нужно читать шит :-)
|
|
|
|
tolyan249 |
Дата: Пт, 04.04.2014, 11:24 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
189
Замечания:
±
На сайте с 11.10.2007
Статус:
Offline
|
Подскажите где я отказался что не хочу хранить контекст.
|
|
|
|
MiXaS |
Дата: Пт, 04.04.2014, 11:25 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Цитата tolyan249 ( ) Declare FSR_CONTEXT_SAVE = OFF ' Не заботиться о сохранении содержимого регистра FSR
|
|
|
|
tolyan249 |
Дата: Пт, 04.04.2014, 11:28 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
189
Замечания:
±
На сайте с 11.10.2007
Статус:
Offline
|
Ясно Спасибоо.
|
|
|
|
anatol |
Дата: Пт, 04.04.2014, 11:30 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
tolyan249, Если здесь еще - посмотри главу 4 - порты ввода вывода. там есть таблички с указанием какие регистры влияют на порты. в частности Порт В - PORTB, TRISB, OPTION_REG. Как последний - см. сам.
|
|
|
|
tolyan249 |
Дата: Пт, 04.04.2014, 11:34 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
189
Замечания:
±
На сайте с 11.10.2007
Статус:
Offline
|
Спасибо что подсказали, не внимательность
|
|
|
|