18.11.2013, 21:41
|
|
Прописка
Регистрация: 13.09.2011
Адрес: Уфа
Сообщений: 253
Сказал спасибо: 20
Сказали Спасибо 19 раз(а) в 14 сообщении(ях)
|
PIC16f676
Здравствуйте, уважаемые! Не могу разобраться, где я ощибся...Делаю вольтметр(чтобы научиться работать с АЦП), вроде все в норме, не могу найти ошибку, вощем когда залил код в микруху, но показывает не цифры, а какието иероглифы. Потом пробывал в протеусе, но там показывает ошибку(см. фото) Помогите разобраться.
|
|
|
|
18.11.2013, 21:51
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: PIC16f676
Alpout, Давайте погадаем , без проекта .
Кстати это не тот ли вольтметр на 3 цифры с мрачным быдлокодом ,
кочующий по сети уже хрен знает сколько времени?
Код:
|
#include ‹16F676.h›
#device adc=10
#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,BROWNOUT,NOMCLR
#use delay (clock=4000000) // 4MHz clock
#rom 0x3ff={0x3444}
#byte PORTA = 0x05
#byte PORTC = 0x07
#byte TRISA = 0x85
#byte TRISC = 0x87
#define SPORTA PORTA
#define SPORTC PORTC
#define TICKS_BETWEEN_INTERRUPTS 5000 //5000
#define INTERRUPT_OVERHEAD 35
#define TMR1RESET (0xFFFF-(TICKS_BETWEEN_INTERRUPTS-INTERRUPT_OVERHEAD))
const char SegCode[11] = {0x40,0x57,0x22,0x06,0x15,0x0C,0x08,0x56,0x00,0x04 ,0xFF};
// 0 1 2 3 4 5 6 7 8 9
const char Column[3] = {0x02,0x01,0x04};
static char Segment[3] = {0x7f,0x7f,0x7f};
static unsigned char ColCount=0x00;
void CPU_SETUP(void);
void Display(void);
void HTO7S(unsigned int32 Num);
byte i;
unsigned int32 result;
#INT_TIMER1
void Timer1(void)
{
set_timer1(TMR1RESET);
Display();
}
void main()
{
unsigned char i;
CPU_SETUP();
while(true)
{
result=0;
for (i=0;i‹20;i++)
{
set_adc_channel(3);
delay_ms(1);
result=result+read_adc();
}
//result = 0x3fe;
HTO7S(result/20);
delay_ms(200);
}
}
void CPU_SETUP()
{
setup_comparator(NC_NC_NC_NC); // not use comparator module
setup_adc_ports( sAN3 | VSS_VDD);
setup_adc(ADC_CLOCK_DIV_64);
TRISA=0b00011000;
PORTA=0x27;
TRISC=0b00000000;
PORTC=0x37;
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
set_timer1(TMR1RESET);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER1);
}
//-------------------------------------
// Display routine
//-------------------------------------
void Display()
{
PORTA = 0b00100111; // off all digits column and Segment G
PORTC = 0b00111111; // off segment a-f
delay_cycles(2);
if (ColCount›=3)
ColCount=0;
SPORTC = Segment[ColCount];
SPORTA = ((Segment[ColCount] & 0b01000000)››1) | (Column[ColCount]^0x07);
ColCount++;
}
//--------------------------------------
// Convet HEX 2 byte to 7-Segment code
//--------------------------------------
void HTO7S(unsigned int32 Num)
{
unsigned int32 res;
Segment[0]=SegCode[30*Num/10230];
if (Segment[0]==0x40)
Segment[0]=0xFF;
res = 30*Num%10230;
Segment[1]=SegCode[10*res/10230];
res=10*res%10230;
Segment[2]=SegCode[10*res/10230];
} |
__________________
Осторожно , злой кот
|
|
|
|
18.11.2013, 22:27
|
|
Прописка
Регистрация: 13.09.2011
Адрес: Уфа
Сообщений: 253
Сказал спасибо: 20
Сказали Спасибо 19 раз(а) в 14 сообщении(ях)
|
Re: PIC16f676
dosikus, нет. прогу сам пишу, тем более не умею на С программировать.
|
|
|
|
18.11.2013, 22:29
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: PIC16f676
Где хотя бы проект?
|
|
|
|
18.11.2013, 22:37
|
|
Прописка
Регистрация: 13.09.2011
Адрес: Уфа
Сообщений: 253
Сказал спасибо: 20
Сказали Спасибо 19 раз(а) в 14 сообщении(ях)
|
Re: PIC16f676
Код:
|
list p=16f676 ; list directive to define processor
#include ‹p16F676.inc› ; processor specific variable definitions
errorlevel -302 ; suppress message 302 from list file
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
;***** VARIABLE DEFINITIONS
PAUSE1 EQU 0x20
DIGITH EQU 0x21
DIGITL EQU 0X22
PORT EQU 0X23
TEMP EQU 0X24
FIRST EQU 0X25 ; FIRST DIGIT
SECOND EQU 0X26 ; SECOND DIGIT
THIRD EQU 0X27 ; THIRD DIGIT
CYCLE EQU 0X28 ; NUMBER OF CYCLES
REG1 EQU 0X29
REG2 EQU 0X2A
REG3 EQU 0X2B
RADIX DECIMAL
;************************************************* *********************
ORG 0x000 ; processor reset vector
GOTO INTER_OSC ; go to beginning of program
;------------------------------------------------------------------------------
; OSCCAL RESTORE
;------------------------------------------------------------------------------
INTER_OSC
errorlevel -302
BSF STATUS,RP0 ; set file register bank to 1
CALL 0x3FF ; retrieve factory calibration value
MOVWF OSCCAL ; update register with factory cal value
BCF STATUS,RP0 ; set file register bank to 0
errorlevel +302
INITIALIZE
MOVLW 0X07
MOVWF CMCON ;make digital ports
BSF STATUS,RP0 ;SELECT BANK1
MOVLW B'00010000'
MOVWF ADCON1 ;SELECT CONVERSION CLOCK Tad=8/Fosc=2 microS
CLRF TRISC ;MAKE ALL PORTC AS OUTPUT
MOVLW B'00010000' ;MAKE RA4 AS INPUT, THE OTHERS ARE OUTPUT
MOVWF TRISA
MOVLW 0X78
MOVWF OPTION_REG
;BCF OPTION_REG, NOT_GPPU ;TURN ON INTERNAL PULL UP.
MOVLW B'00001000'
MOVWF ANSEL
MOVLW 0XFF
MOVWF WPUA
BCF STATUS, RP0 ;SELECT BANK0
CLRF PORTA ;NO INFORMATION ON DIGITS
CLRF PORTC ;NO INFORMATION ON DIGITS
GOTO START
START
;CLEAR REGISTERS
CLRF ADRESH
BSF STATUS, RP0
CLRF ADRESL
BCF STATUS, RP0
CLRF PAUSE1
CLRF DIGITH
CLRF DIGITL
CLRF FIRST
CLRF SECOND
CLRF THIRD
MOVLW 8
MOVWF CYCLE
;MEASURE
MEASURE
MOVLW B'10001101' ;(1)RIGHT JUSTIFIED, (0)VDD VOLTAGE REFERENCE, (0)N/A, (011)AN3, (1)DONE CONVERSION, (1) ADC ON
MOVWF ADCON0
CALL WAIT
BSF ADCON0,1
BTFSC ADCON0,1
GOTO $-1
MOVFW ADRESH
MOVWF DIGITH
BSF STATUS,RP0 ; 1 BANK
MOVFW ADRESL
BCF STATUS,RP0
MOVWF DIGITL
GOTO BCD
;--------------------------------------------------------------------------
LEDS
ADDWF PCL,F
RETLW B'00000000' ; 0
RETLW B'00011101' ; 1
RETLW B'00000110' ; 2
RETLW B'00000100' ; 3
RETLW B'00000001' ; 4
RETLW B'00000000' ; 5
RETLW B'00000000' ; 6
RETLW B'00011100' ; 7
RETLW B'00000000' ; 8
RETLW B'00000000' ; 9
LEDS2 ADDWF PCL,F
RETLW B'00000010' ; 0
RETLW B'00001110' ; 1
RETLW B'00000000' ; 2
RETLW B'00000100' ; 3
RETLW B'00001100' ; 4
RETLW B'00000101' ; 5
RETLW B'00000001' ; 6
RETLW B'00001110' ; 7
RETLW B'00000000' ; 8
RETLW B'00000100' ; 9
;--------------------------------------------------------------------------
;BINARY TO BINARY CODED DECIMAL FORM
BCD
BCF STATUS, C
RLF THIRD
RLF DIGITH, F
BTFSC STATUS, C
CALL ADDC2
RLF DIGITL, F
BTFSC STATUS, C
CALL ADDC1
GOTO COPY
ADDC1 BSF DIGITH, 0
RETURN
ADDC2 BSF THIRD, 0
RETURN
COPY MOVFW DIGITH ; DIGITH--›W, W*(00001111)--›FIRST
ANDLW B'00001111'
MOVWF TEMP
CALL CHECK
MOVFW TEMP
MOVWF FIRST
MOVFW DIGITH ; DIGITH--›W, W*(11110000)--›SECOND--›SWAP(SECOND)
ANDLW B'11110000'
MOVWF TEMP
SWAPF TEMP
CALL CHECK
MOVFW TEMP
MOVWF SECOND
MOVFW THIRD
ANDLW B'00001111'
MOVWF TEMP
CALL CHECK
MOVFW TEMP
MOVWF THIRD
PUSH MOVFW SECOND ; COPY CORRECTED DIGITS
MOVWF DIGITH
SWAPF DIGITH
MOVFW FIRST
ADDWF DIGITH, F
DECFSZ CYCLE
GOTO BCD
GOTO DISPLAY
CHECK MOVFW CYCLE
SUBLW 1
BTFSC STATUS, Z
RETURN
MOVFW TEMP ; CHECK. IF DIGIT‹5, THEN GOTO ELSE ADD 3
SUBLW 4
BTFSC STATUS, C
RETURN
MOVFW TEMP
ADDLW 3
MOVWF TEMP
RETURN
;END ENCODING TO BCD
;----------------------------------------------------------------------
DISPLAY
;FIRST DIGIT
MOVFW FIRST
CALL LEDS
MOVWF PORTA
MOVFW FIRST
CALL LEDS2
MOVWF PORTC
BSF PORTC, 5
CALL WAIT;2
CLRF PORTC
;SECOND DIGIT
MOVFW SECOND
CALL LEDS
MOVWF PORTA
MOVFW FIRST
CALL LEDS2
MOVWF PORTC
BSF PORTC, 4
CALL WAIT;2
CLRF PORTC
;THIRD DIGIT
MOVFW THIRD
CALL LEDS
MOVWF PORTA
MOVFW FIRST
CALL LEDS2
MOVWF PORTC
BSF PORTA, 5
CALL WAIT;2
CLRF PORTA
GOTO START
WAIT
MOVLW 200
MOVWF PAUSE1
DECFSZ PAUSE1
GOTO $-1
RETURN
WAIT2 MOVLW 10
MOVWF REG1
MOVLW 7
MOVWF REG2
DECFSZ REG1, F
GOTO $-1
DECFSZ REG2, F
GOTO $-3
RETURN
;----------------------------------------------------------------------------------
END
Я стер некоторые части, так как они не относятся к данной теме. |
Последний раз редактировалось Alpout; 18.11.2013 в 23:48.
|
|
|
|
18.11.2013, 22:44
|
|
Гражданин KAZUS.RU
Регистрация: 13.04.2012
Адрес: Королёв МО
Сообщений: 786
Сказал спасибо: 621
Сказали Спасибо 364 раз(а) в 200 сообщении(ях)
|
Re: PIC16f676
Что мешает в MPLAB запустить Debugger, проставить Breakpoint's (если надо) и по шагам проверить работу программы, "подставив" значение "как бы полученное" с ADC???
|
|
|
|
18.11.2013, 22:44
|
|
Прописка
Регистрация: 13.09.2011
Адрес: Уфа
Сообщений: 253
Сказал спасибо: 20
Сказали Спасибо 19 раз(а) в 14 сообщении(ях)
|
Re: PIC16f676
добавлю схему
|
|
|
|
18.11.2013, 22:46
|
|
Прописка
Регистрация: 13.09.2011
Адрес: Уфа
Сообщений: 253
Сказал спасибо: 20
Сказали Спасибо 19 раз(а) в 14 сообщении(ях)
|
Re: PIC16f676
Albert_V, подставил. с цифрами все в норме. с АЦП что то не так. то есть заношу преварительно в регистры ADRESH и ADRESL. BCD все в норме вычисляет. а вот в реале чтото нето не цифры а непонятно что...Когда на землю замыкаешь 000 покахывает, а когда на любое напругу подключаешь, тут то и непонятно что хочет показать мне))
Последний раз редактировалось Alpout; 18.11.2013 в 22:48.
|
|
|
|
18.11.2013, 22:51
|
|
Гражданин KAZUS.RU
Регистрация: 13.04.2012
Адрес: Королёв МО
Сообщений: 786
Сказал спасибо: 621
Сказали Спасибо 364 раз(а) в 200 сообщении(ях)
|
Re: PIC16f676
Сообщение от Alpout
|
Albert_V, подставил. с цифрами все в норме. с АЦП что то не так. то есть заношу преварительно в регистры ADRESH и ADRESL. BCD все в норме вычисляет. а вот в реале чтото нето не цифры а непонятно что...Когда на землю замыкаешь 000 покахывает, а когда на любое напругу подключаешь, тут то и непонятно что хочет показать мне))
|
Выложите Disassembly Listing.
|
|
|
|
18.11.2013, 22:52
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: PIC16f676
Alpout, оформите код как положено- тэг code .
Нет ни какого желания подобные простыни изучать...
__________________
Осторожно , злой кот
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:07.
|
|