Помогите пожалуйста, бьюсь уже две недели, толка 0. В pic 12f510 есть 3 входа ацп, и все они мне нужны. Проблема в том, что в одной программе они не работают. То есть я беру кусок 1
Код
DECLARE SHOW_SYSTEM_VARIABLES = OFF ' При симуляции в Proteus не показывать внутренние переменные DECLARE FSR_CONTEXT_SAVE = OFF ' Не заботиться о сохранении содержимого регистра FSR DECLARE REMINDERS = OFF ' Выключить напоминания компилятора DECLARE WARNINGS = OFF ' Выключить предупреждения компилятора DECLARE BOOTLOADER = OFF ' Выключить загрузчик
'-------------------------- Регистры специального назначения-------------------
DIM C AS BYTE DIM I AS BYTE DIM LUX AS BYTE DIM MIC1 AS BYTE DIM MIC2 AS BYTE DIM MIC AS BYTE
SYMBOL OUT = GPIO.4 'tiristor SYMBOL CLK = GPIO.5 'power pulse sens SYMBOL LEV = GPIO.0 'non trimmed sound SYMBOL SND = GPIO.1 'trimmed sound SYMBOL SUN = GPIO.2 'sun input
'-------------------------- Начало ------------------------------------------- '-------------------------- Главная программа -------------------------
Reader: CLEAR ADCON0 = %11110011 ASM loop0 BTFSC ADCON0, 1;wait for ‘DONE’ GOTO loop0 MOVF ADRES, W ;read result MOVWF MIC1 ;save result ENDASM ADCON0 = %11110111 ASM loop1 BTFSC ADCON0, 1;wait for ‘DONE’ GOTO loop1 MOVF ADRES, W ;read result MOVWF MIC2 ;save result ENDASM MIC = MIC2 - MIC1 IF MIC > 3 THEN out = 1 delayms 50 OUT = 0 ENDIF GOTO Reader
END
Он работает.
Беру кусок 2
Код
DECLARE SHOW_SYSTEM_VARIABLES = OFF ' При симуляции в Proteus не показывать внутренние переменные DECLARE FSR_CONTEXT_SAVE = OFF ' Не заботиться о сохранении содержимого регистра FSR DECLARE REMINDERS = ON ' Выключить напоминания компилятора DECLARE WARNINGS = ON ' Выключить предупреждения компилятора DECLARE BOOTLOADER = OFF ' Выключить загрузчик
DECLARE ALL_DIGITAL = OFF ' Каждый порт выполняет свою функцию по умолчанию DECLARE PortB_Pullups = Off ' Disable PortB pull-up resistors DECLARE ADIN_RES 8 ' Разрядность результата преобразования АЦП DECLARE ADIN_TAD FRC ' Источник тактирования АЦП DECLARE ADIN_STIME 50 ' Время на подготовку АЦП к новому измерению '-------------------------- Регистры специального назначения-------------------
DIM C AS BYTE DIM I AS BYTE DIM LUX AS BYTE DIM MIC1 AS BYTE DIM MIC2 AS BYTE DIM MIC AS BYTE
SYMBOL OUT = GPIO.4 'tiristor SYMBOL CLK = GPIO.5 'power pulse sens SYMBOL LEV = GPIO.0 'non trimmed sound SYMBOL SND = GPIO.1 'trimmed sound SYMBOL SUN = GPIO.2 'sun input
'-------------------------- Начало ------------------------------------------- '-------------------------- Главная программа ------------------------- LOW OUT DELAYMS 100
Main:
ISOFF: ADCON0 = %11001011 ASM loop2 BTFSC ADCON0, 1;wait for ‘DONE’ GOTO loop2 MOVF ADRES, W ;read result MOVWF LUX ;save result ENDASM OUT = 0 DELAYMS LUX OUT = 1 DELAYMS LUX
GOTO Main
END
Он тоже работает.
Добавлено (23.02.2014, 12:16) --------------------------------------------- Но если это все сложить
Код
DECLARE SHOW_SYSTEM_VARIABLES = OFF' При симуляции в Proteus не показывать внутренние переменные DECLARE FSR_CONTEXT_SAVE = OFF' Не заботиться о сохранении содержимого регистра FSR DECLARE REMINDERS = OFF ' Выключить напоминания компилятора DECLARE WARNINGS = OFF' Выключить предупреждения компилятора DECLARE BOOTLOADER = OFF ' Выключить загрузчик
'-------------------------- Регистры специального назначения-------------------
DIM C AS BYTE DIM I AS BYTE DIM LUX AS BYTE DIM MIC1 AS BYTE DIM MIC2 AS BYTE DIM MIC AS BYTE
SYMBOL OUT = GPIO.4 'tiristor SYMBOL CLK = GPIO.5 'power pulse sens SYMBOL LEV = GPIO.0 'non trimmed sound SYMBOL SND = GPIO.1 'trimmed sound SYMBOL SUN = GPIO.2 'sun input
'-------------------------- Начало ------------------------------------------- '-------------------------- Главная программа -------------------------
Reader: CLEAR ADCON0 = %11110011 ASM loop0 BTFSC ADCON0, 1;wait for ‘DONE’ GOTO loop0 MOVF ADRES, W ;read result MOVWF MIC1 ;save result ENDASM ADCON0 = %11110111 ASM loop1 BTFSC ADCON0, 1;wait for ‘DONE’ GOTO loop1 MOVF ADRES, W ;read result MOVWF MIC2 ;save result ENDASM MIC = MIC2 - MIC1 IF MIC > 3 THEN GOTO Light ELSE OUT = 0 ENDIF GOTO Reader
Light: ADCON0 = %11001011 ASM loop2 BTFSC ADCON0, 1;wait for ‘DONE’ GOTO loop2 MOVF ADRES, W ;read result MOVWF LUX ;save result ENDASM IF LUX > 50 THEN OUT = 1 DELAYMS 1000 OUT = 0 ELSE GOTO Reader ENDIF
Вобщем, все 3 ацп в одной программе зависают намертво, после одной итерации.
Если что, то это акустический датчик с электретным микрофоном и датчиком освещенности.
Добавлено (23.02.2014, 22:44) --------------------------------------------- Все, отбой. Решил проблему. Goto недописал.
Найденное на халяву, исчезает мгновенно, лишь сто раз заработанное всегда будет твоим.
DAY, Команда ADIn предназначена для преобразования аналоговой величины в цифровой код. Эта команда делает процесс аналогово-цифрового преобразования очень простым. По команде ADIn считываются значения аналоговой величины в выбранном канале (channel number) АЦП, а затем аналоговая величина преобразуется в цифровой код и результат сохраняется в переменной Variable.
VAR1 = ADIn 0 ' Поместить результат преобразования из канала AN0 в переменную VAR1
Анатолий Медведев. Владимир Хилинский.
Сообщение отредактировал
dimitriy-bc - Пн, 24.02.2014, 00:15
Команда ADIn не работает на 12 битных камнях. А насчет выхода, я уже нашел, спасибо Найденное на халяву, исчезает мгновенно, лишь сто раз заработанное всегда будет твоим.