Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
PIC контроллеры. Программаторы и первый проект на PIC |
Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио |
|
Опции темы |
02.10.2010, 19:18 | #574 |
Форумец
Сообщений: 5
Регистрация: 02.10.2010
Возраст: 50
Не в сети |
petrd, я возможно ухожу от темы ссори подскажешь может по пик 16ф628а я немного делетант. надо сделать так чтобы при нажатии на кнопочку на одном из портов появился высокий уровень и при нажатии на этуже кнопочку переходил в низкий уровень. вопррос глупый но может поможете.
|
02.10.2010, 22:31 | #576 |
Форумец
Сообщений: 4
Регистрация: 02.10.2010
Возраст: 57
Не в сети |
Здравствуйте, Петр.
Вот и я на старости лет решил Си для ПИКов заняться. В asm'е потихоньку пишу, раньше для связи МК с ПК использовал RS-232, но в последнее время вижу что пора переходить на USB. Решил заняться MikroC, так что принимайте в состав учеников. |
02.10.2010, 22:40 | #577 |
Форумец
Сообщений: 4
Регистрация: 02.10.2010
Возраст: 57
Не в сети |
Вы бы потрудились почитать первые две-три страницы, там это всё есть, расписано и разжевано, приложите хоть капельку своего труда.
|
03.10.2010, 09:18 | #578 | ||
Форумец
|
Цитата:
to Юрий20 Смотрите посты №42 и №45 в них есть то, что Вы хотите. to Electrik84 Цитата:
P.S. Вышла новая версия MikroC PRO 4.10 http://www.mikroe.com/forum/viewtopi...ca624e2f3e9fbf |
||
04.10.2010, 00:49 | #581 |
Форумец
Сообщений: 4
Регистрация: 02.10.2010
Возраст: 57
Не в сети |
|
04.10.2010, 15:25 | #583 |
Форумец
|
В архиве hex файл, который у меня работает на PIC16F628A (код также проверял на PIC16F887). Прошейте этим файлом.
|
04.10.2010, 22:25 | #584 |
Форумец
Сообщений: 4
Регистрация: 02.10.2010
Возраст: 57
Не в сети |
|
08.10.2010, 16:00 | #585 |
Форумец
|
MikroE выпустили интересную штуку Visual GLCD.
|
10.10.2010, 20:05 | #587 |
Форумец
|
|
12.10.2010, 12:29 | #593 |
Форумец
|
Да вроде ничего особенного не видно.
ADC2 - измерение напряжения ОС через развязку, этот же сигнал идет на компаратор AIN1; AIN0 - опорное напряжение для компаратора. AIN1 - вход компаратора, видимо какая-то пороговая защита. |
12.10.2010, 18:42 | #595 |
Форумец
|
А почему нет? Только как это работает по одной схеме, тем более по ее куску, тяжело сказать. Оно же все увязано, вон и ШИМ-контроллер виден, а внутри меги видимо что-то типа ПИД алгоритма лежит.
|
19.10.2010, 22:05 | #597 |
Форумец
Сообщений: 36
Регистрация: 19.10.2010
Возраст: 57
Не в сети |
Доброго времени суток Господа! Я тут новичок пока.. Но смотрю что тут собрались истинные любители и знатоки микроконтроллеров..
Я с микроконтроллерами знаком уже давненько- но в основном работал на ассемблере.. А тут вот возникла необходимость перевести на микроси некоторые программы... И вот столкнулся с трудностями.. Есть некоторая схема в которой простой PIC12F629 работает в роли как бы датчика- при изменении уровня на одном из входов он должен на других формировать импульсы(или последовательность импульсов) но не сразу а с некоторой задержкой определяемой временем переполнения и прерывания от таймера TMR0- при чем это время может меняться.При этом изменение уровня на входе происходит через время меньшее чем врнемя переполнения таймера и предделителя(ну скажем это импульсный сигнал..). И вот столкнулся с проблемой- mikroC не хочет принимать обработку двух прерываний- короче.. вот фрагмент программы- может кто подскажет в чем тут криминал??? При этом при компиляции ошибки нет.. а вот в симуляторе и протеусе ничего не работает... unsigned short reg1; void interrupt() { if(INTCON.GPIF){ reg1 =150; TMR0=reg1; INTCON.GPIF = 0 ; } if(INTCON.T0IF){ GPIO.F4=1; Delay_us(500); GPIO.F4=0; INTCON.T0IF = 0; } } void init() { CMCON = 0x07; TRISIO = 0b00001001; WPU =0x00; INTCON.GPIE = 1; INTCON.T0IE = 1; INTCON.PEIE = 1; IOCB =0x01; OPTION_REG = 0b10000101; INTCON.GIE = 1; } void main() { do { init(); } while(1); } |
20.10.2010, 07:41 | #598 | |
Форумец
|
Цитата:
1. Чтобы работало прерывание по изменению уровня на выводах надо в прерывании сначала прочитать порт, чтобы убрать несоответствие, а потом сбросить флаг GPIF, об этом в каждом DS написано. К тому же это прерывание Microchip не рекомендует использовать для всяких опросов, лучшее применение ему - выход из SLEEP. 2. В прерывании используете задержку 500 мкс, от этого теряется весь смысл прерываний, в контроллере для этого таймеры есть. 3. Зачем включать PEIE, если прерывание от периферийных модулей не используется? Это так для информации, в Вашем случае это просто лишнее. 4. Зачем в главном цикле постоянно производить инициализацию? Сделайте ее один раз перед циклом, а цикл пусть пустой крутится. 5. В битах конфигурации MCLR отключен? Последний раз редактировалось petrd; 21.10.2010 в 15:52. |
|
20.10.2010, 21:58 | #599 |
Форумец
Сообщений: 36
Регистрация: 19.10.2010
Возраст: 57
Не в сети |
Уважаемый коллега!На счет детских ошибок- всякое в жизни может быть.. и если Вы с контроллерами имеете дело скажем каждый день по 24 часа на протяжении там скажем 2-3 месяцев.. то у Вас могут быть свои ошибки.. А если кто либо имеет необходимость с конроллерами раз в месяц или в два на протяжении 10 лет то там могут быть свои ошибки..и не надо придираться к словам типа давненько и т.д. На то мы тут и собрались чтоб помогать друг другу исправлять ошибки... Ну да ладно дело не в этом...проехали...
Теперь конкретно по другим пунктам обвинения- ПУНКТ 1.-Я как раз и спрашиваю.. как мне написать чтоб прерывание работало... На счет рекомендации Microchip -Вот фрагмент программы на асемблере- работает без всяких sleep- при чем работает железобетонно!!!! проверено и в симуляторе и в железе вопреки всем рекомендациям! list p=12f629 ; list directive to define processor #include <p12f629.inc> ; processor specific variable definitions errorlevel -302 ; suppress message 302 from list file __CONFIG _CP_OFF & _CPD_OFF & _BODEN_ON & _MCLRE_OFF & _WDT_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT ;***** VARIABLE DEFINITIONS w_temp EQU 0x20 ; variable used for context saving status_temp EQU 0x21 ; variable used for context saving C1 EQU 0x22 C2 EQU 0x23 ;************************************************* ********************* ORG 0x000 ; processor reset vector goto main ; go to beginning of program ;************************************************* ********************* ORG 0x004 ; interrupt vector location movwf w_temp ; save off current W register contents movf STATUS,w ; move status register into W register movwf status_temp ; save off contents of STATUS register clrwdt call IMP bcf INTCON,GPIF clrwdt movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f swapf w_temp,w ; restore pre-isr W register contents retfie ; return from interrupt ;************************************************* ********************** main ;начальная инициализация movf GPIO,f clrwdt movlw 0x07 movwf CMCON ;выводы GPIO - цифровые bsf STATUS,RP0 ;выбрать банк1 movlw b'00000001';настройка вывода GPIO на ввод,остальные - на вывод movwf TRISIO movlw b'10000110' movwf OPTION_REG clrf INTCON clrf WPU movlw b'00000001' movwf IOCB ;Разрешение прерываний по изменению уровня на GPIO0 bcf STATUS,RP0 ;выбрать банк0 movlw b'00000000' movwf GPIO movlw b'00001000' movwf INTCON bsf INTCON,GIE ;глобальное разрешение прерываний clrwdt clrf TMR0 nop L1 nop clrwdt nop goto L1 ;------------------------------------------------------------ IMP movf GPIO,f movlw b'00010000' movwf GPIO clrwdt movlw 0x08 ; movwf C1 cyc1 clrwdt movlw 0x08 ; movwf C2 cyc2 clrwdt decfsz C2,f goto cyc2 decfsz C1,f goto cyc1 movf GPIO,f movlw b'00000000' movwf GPIO return ;------------------------------------------------------------ END ; directive 'end of program' Теперь в микроси - вот так РАБОТАЕТ!!!!! void interrupt() { if(INTCON.GPIF){ GPIO.F4=1; Delay_us(500); GPIO.F4=0; INTCON.GPIF = 0 ; } } void init() { CMCON = 0x07; TRISIO = 0b00001001; WPU =0x00; INTCON.GPIE = 1; INTCON.T0IE = 0; IOCB =0x01; OPTION_REG = 0b10000101; INTCON.GIE = 1; } void main() { do { init() ; } while(1); } а вот так- без init в основном цикле - НЕ РАБОТАЕТ!!! void interrupt() { if(INTCON.GPIF){ GPIO.F4=1; Delay_us(500); GPIO.F4=0; INTCON.GPIF = 0 ; } } void init() { CMCON = 0x07; TRISIO = 0b00001001; WPU =0x00; INTCON.GPIE = 1; INTCON.T0IE = 0; IOCB =0x01; OPTION_REG = 0b10000101; INTCON.GIE = 1; } void main() { do { } while(1); } ПУНКТ 2 - мне нужна не задержка а импульс(иногда с задержкой- но пока обойдемся без нее!!!) ПУНКТ 3 - полностью с Вами согласен ПУНКТ 4 - смотри подробней ПУНКТ 1 ПУНКТ 5 - В битах конфигурации MCLR отключен P.S. Я пока не подключаю тут прерывание от таймера! |