M
mattycha
Guest
Привет.Я пытаюсь повторить лучший проект из-микроконтроллер на примере.
Это проект dectector ультразвуковой диапазон.Первоначально, она написана в 16F88
но я превращалась 18F2455.Кроме того, исходный код был написан в mikroC
но я переключения на C18.Проблема У меня в том, что хотя моя США диапазон детектора
О около 11см от стены, чтение ЖК 23641 ......
Я не знаю, почему ЖК проявляет такую большую ценность.Я изменил
бинарный в десятичную помощью функции "putdec".Я использую 20MHz кристалла и
Я подсчитал производить период 40kHz на RC1.RC2 является получение PIN-кода
пытаясь уловить сигнал, используя CCP1CON = 0b00000101.
Код:# включить <p18f2455.h>
# включить <delays.h>
# Pragma конфигурации FOSC = HS
# Pragma конфигурации WDT = OFF
# Pragma конфигурации PWRT = OFF
# Pragma конфигурации бор = OFF
# Pragma конфигурации LVP = OFF
# Pragma конфигурации MCLRE = ON# Pragma прервать MyHighInt
# Pragma Код high_vector = 0x08Пустота MyHighInt (VOID);
Пустота high_vector (VOID);
Пустота enable_interrupts (VOID);
Пустота disable_interrupts (VOID);
Пустота ультразвуковой (VOID);
Пустота дисплей (неподписанных Int стоимости);
Добро пожаловать Void ();
Пустота ClearLCD ();
Пустота writeData (неподписанные данные Char);
Пустота SendData (неподписанных данные Char);
Пустота WriteString (сопзЬ Char ROM * Str);
Пустота putdec (неподписанных Int N);неподписанных T1_O Int = 0; / / timer1 переполнение обновлен в прерывания
неподписанных t_capL Int = 0; / / низкое timer1
неподписанных t_capH Int = 0; / / timer1 высокой
неподписанных t_capO Int = 0; / / timer1 переполнение
неподписанных CapVal Int = 0; / / Capture
неподписанных краткий CapInt = 0; / / захватил что-то в прерывания
неподписанных краткий Capon = 1; / / захват только 1 Значение# DEFINE отправить PORTCbits.RC1
# DEFINE LCDData PORTB
# DEFINE RS PORTAbits.RA3
# DEFINE RW PORTAbits.RA2
# DEFINE EN PORTAbits.RA5high_vector Void (Пустота)
(
_asm GOTO MyHighInt _endasm
)# Pragma кодаMyHighInt Void (Пустота)
(
если (PIR1bits.TMR1IF == 1)
(
PIR1bits.TMR1IF = 0 / / четкое разрядные timer1 переполнение
T1_O ;
)если (PIR1bits.CCP1IF == 1)
(
PIR1bits.CCP1IF = 0 / / четкое захват флагаесли (Capon == 1)
(
Capon = 0;
t_capL = CCPR1L;
t_capH = CCPR1H;
t_capO = T1_O;
CapInt = 1;
)
)
)Основными Void (Пустота)
(
неподписанных Int Валя, S1, S2, TH, TL, с;
неподписанных долгое выч = 0;CCP1CON = 0b00000101 / / КПК, чтобы захватить всякий подъем края
T1CONbits.TMR1ON = 1; / / timer1 на
ADCON0 = 0;
ADCON1 = 0x0F;
PORTB = 0;
TRISB = 0;
TRISCbits.TRISC1 = 0; / /
TRISCbits.TRISC2 = 1; / / США получают сигнала
/ / LCD
TRISAbits.TRISA3 = 0;
TRISAbits.TRISA2 = 0;
TRISAbits.TRISA5 = 0;
RS = 0;
RW = 0;
En = 0;CapInt = 0; / / Сброс индикатора захватадля (;
(
Capon = 1; / / позволяют захватить значения
с = T1_O / / получить текущее значение
TH = TMR1H;
TL = TMR1L;t_capL = 0; t_capH = 0; t_capO = 0; / / Инициализация захватаультразвуковой ();
enable_interrupts ();
дисплей (Val);
disable_interrupts ();если (CapInt == 0) / / нет эха?
(
enable_interrupts ();
дисплей (Val);
disable_interrupts ();
)Else If (CapInt == 1) / / захваченных ничего?
(
CapInt = 0; / / сброс в следующий раз
S1 = (t_capH - е);
S2 = (t_capL - TL);
Calc = ((S1 <<8)) S2;
Calc *= 34;
Calc / = 10000 / / (1/20MHz) * 340м / с * 100см / м * 2
Val = (INT) Calc;
дисплей (Val);
)
ClearLCD ();
)
)
enable_interrupts Void (Пустота)
(
PIR1bits.TMR1IF = 0; / / timer1
PIR1bits.CCP1IF = 0; / / Capture
PIE1bits.CCP1IE = 1; / / разрешение прерывания
INTCONbits.GIE = 1; / / разрешить глобальные прерывания
INTCONbits.PEIE = 1; / / позволить периферийных прерываний
)
disable_interrupts Void (Пустота)
(
INTCONbits.GIE = 0; / / отключение глобального прерывания
INTCONbits.PEIE = 0; / / отключение периферийных прерываний
)
Пустота ультразвуковой (VOID)
(
Отправить = 1;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Delay1TCY ();
Отправить = 0;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();Отправить = 1;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Delay1TCY ();
Отправить = 0;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();Отправить = 1;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Delay1TCY ();
Отправить = 0;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Отправить = 1;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Delay1TCY ();
Отправить = 0;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
)
Пустота дисплей (неподписанных Int Value) (
Добро пожаловать ();
SendData (0xC0); / / линия 2, 0 позиций
WriteString ( "Расстояние:");
SendData (0xC5);
putdec (стоимость);
Delay1KTCYx (5000) / / ждать 1second
)
Добро пожаловать Void ()
(
Delay1KTCYx (250); / / Wait 20ms
SendData (0x38) / / Установить ЖКД для 8-разрядном режиме, 2-строчный дисплей и 5 х 8 точек символа шрифта
Delay1KTCYx (250); / / Wait 2ms
SendData (0x0E); / / Turn Off ЖК-дисплей, курсоров и шоры Off Off
Delay1KTCYx (15); / / Wait 2ms
SendData (0x01); / / Открытый ЖК-дисплей
Delay1KTCYx (15); / / Wait 2ms
SendData (0x06) / / Установить ЖК вступления режиме увеличиваются на одну и перенести курсор вправо.
Нет изображения смены.SendData (0x80);
WriteString ( "Ультразвуковая в см);
)Пустота ClearLCD ()
(
Delay1KTCYx (250); / / Wait 20ms
SendData (0x38) / / Установить ЖКД для 8-разрядном режиме, 2-строчный дисплей и 5 х 8 точек символа шрифта
Delay1KTCYx (250); / / Wait 2ms
SendData (0x0E); / / Turn Off ЖК-дисплей, курсоров и шоры Off Off
Delay1KTCYx (15); / / Wait 2ms
SendData (0x01); / / Открытый ЖК-дисплей
Delay1KTCYx (15); / / Wait 2ms
SendData (0x06) / / Установить ЖК вступления режиме увеличиваются на одну и перенести курсор вправо.
Нет изображения смены.
)Пустота SendData (неподписанных данные Char) (
LCDData = данные;
RS = 0;
RW = 0;
En = 1;
Delay1KTCYx (1);
En = 0;
)Пустота writeData (неподписанные данные Char) (
LCDData = данные;
RS = 1;
RW = 0;
En = 1;
Delay1KTCYx (1);
En = 0;
)Пустота WriteString (сопзЬ Char ROM * ул) (
в то время (* ул) (
writeData (* Str);
Ул ;
)
)Пустота putdec (неподписанных Int N)
(
неподписанных Int бэр = N% 10;
неподписанных Int Quot = N / 10;
если (далее "> 0)
(
putdec (далее ");
)
writeData (REM '0 ');
)
Это проект dectector ультразвуковой диапазон.Первоначально, она написана в 16F88
но я превращалась 18F2455.Кроме того, исходный код был написан в mikroC
но я переключения на C18.Проблема У меня в том, что хотя моя США диапазон детектора
О около 11см от стены, чтение ЖК 23641 ......
Я не знаю, почему ЖК проявляет такую большую ценность.Я изменил
бинарный в десятичную помощью функции "putdec".Я использую 20MHz кристалла и
Я подсчитал производить период 40kHz на RC1.RC2 является получение PIN-кода
пытаясь уловить сигнал, используя CCP1CON = 0b00000101.
Код:# включить <p18f2455.h>
# включить <delays.h>
# Pragma конфигурации FOSC = HS
# Pragma конфигурации WDT = OFF
# Pragma конфигурации PWRT = OFF
# Pragma конфигурации бор = OFF
# Pragma конфигурации LVP = OFF
# Pragma конфигурации MCLRE = ON# Pragma прервать MyHighInt
# Pragma Код high_vector = 0x08Пустота MyHighInt (VOID);
Пустота high_vector (VOID);
Пустота enable_interrupts (VOID);
Пустота disable_interrupts (VOID);
Пустота ультразвуковой (VOID);
Пустота дисплей (неподписанных Int стоимости);
Добро пожаловать Void ();
Пустота ClearLCD ();
Пустота writeData (неподписанные данные Char);
Пустота SendData (неподписанных данные Char);
Пустота WriteString (сопзЬ Char ROM * Str);
Пустота putdec (неподписанных Int N);неподписанных T1_O Int = 0; / / timer1 переполнение обновлен в прерывания
неподписанных t_capL Int = 0; / / низкое timer1
неподписанных t_capH Int = 0; / / timer1 высокой
неподписанных t_capO Int = 0; / / timer1 переполнение
неподписанных CapVal Int = 0; / / Capture
неподписанных краткий CapInt = 0; / / захватил что-то в прерывания
неподписанных краткий Capon = 1; / / захват только 1 Значение# DEFINE отправить PORTCbits.RC1
# DEFINE LCDData PORTB
# DEFINE RS PORTAbits.RA3
# DEFINE RW PORTAbits.RA2
# DEFINE EN PORTAbits.RA5high_vector Void (Пустота)
(
_asm GOTO MyHighInt _endasm
)# Pragma кодаMyHighInt Void (Пустота)
(
если (PIR1bits.TMR1IF == 1)
(
PIR1bits.TMR1IF = 0 / / четкое разрядные timer1 переполнение
T1_O ;
)если (PIR1bits.CCP1IF == 1)
(
PIR1bits.CCP1IF = 0 / / четкое захват флагаесли (Capon == 1)
(
Capon = 0;
t_capL = CCPR1L;
t_capH = CCPR1H;
t_capO = T1_O;
CapInt = 1;
)
)
)Основными Void (Пустота)
(
неподписанных Int Валя, S1, S2, TH, TL, с;
неподписанных долгое выч = 0;CCP1CON = 0b00000101 / / КПК, чтобы захватить всякий подъем края
T1CONbits.TMR1ON = 1; / / timer1 на
ADCON0 = 0;
ADCON1 = 0x0F;
PORTB = 0;
TRISB = 0;
TRISCbits.TRISC1 = 0; / /
TRISCbits.TRISC2 = 1; / / США получают сигнала
/ / LCD
TRISAbits.TRISA3 = 0;
TRISAbits.TRISA2 = 0;
TRISAbits.TRISA5 = 0;
RS = 0;
RW = 0;
En = 0;CapInt = 0; / / Сброс индикатора захватадля (;
(
Capon = 1; / / позволяют захватить значения
с = T1_O / / получить текущее значение
TH = TMR1H;
TL = TMR1L;t_capL = 0; t_capH = 0; t_capO = 0; / / Инициализация захватаультразвуковой ();
enable_interrupts ();
дисплей (Val);
disable_interrupts ();если (CapInt == 0) / / нет эха?
(
enable_interrupts ();
дисплей (Val);
disable_interrupts ();
)Else If (CapInt == 1) / / захваченных ничего?
(
CapInt = 0; / / сброс в следующий раз
S1 = (t_capH - е);
S2 = (t_capL - TL);
Calc = ((S1 <<8)) S2;
Calc *= 34;
Calc / = 10000 / / (1/20MHz) * 340м / с * 100см / м * 2
Val = (INT) Calc;
дисплей (Val);
)
ClearLCD ();
)
)
enable_interrupts Void (Пустота)
(
PIR1bits.TMR1IF = 0; / / timer1
PIR1bits.CCP1IF = 0; / / Capture
PIE1bits.CCP1IE = 1; / / разрешение прерывания
INTCONbits.GIE = 1; / / разрешить глобальные прерывания
INTCONbits.PEIE = 1; / / позволить периферийных прерываний
)
disable_interrupts Void (Пустота)
(
INTCONbits.GIE = 0; / / отключение глобального прерывания
INTCONbits.PEIE = 0; / / отключение периферийных прерываний
)
Пустота ультразвуковой (VOID)
(
Отправить = 1;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Delay1TCY ();
Отправить = 0;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();Отправить = 1;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Delay1TCY ();
Отправить = 0;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();Отправить = 1;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Delay1TCY ();
Отправить = 0;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Отправить = 1;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Delay1TCY ();
Отправить = 0;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
)
Пустота дисплей (неподписанных Int Value) (
Добро пожаловать ();
SendData (0xC0); / / линия 2, 0 позиций
WriteString ( "Расстояние:");
SendData (0xC5);
putdec (стоимость);
Delay1KTCYx (5000) / / ждать 1second
)
Добро пожаловать Void ()
(
Delay1KTCYx (250); / / Wait 20ms
SendData (0x38) / / Установить ЖКД для 8-разрядном режиме, 2-строчный дисплей и 5 х 8 точек символа шрифта
Delay1KTCYx (250); / / Wait 2ms
SendData (0x0E); / / Turn Off ЖК-дисплей, курсоров и шоры Off Off
Delay1KTCYx (15); / / Wait 2ms
SendData (0x01); / / Открытый ЖК-дисплей
Delay1KTCYx (15); / / Wait 2ms
SendData (0x06) / / Установить ЖК вступления режиме увеличиваются на одну и перенести курсор вправо.
Нет изображения смены.SendData (0x80);
WriteString ( "Ультразвуковая в см);
)Пустота ClearLCD ()
(
Delay1KTCYx (250); / / Wait 20ms
SendData (0x38) / / Установить ЖКД для 8-разрядном режиме, 2-строчный дисплей и 5 х 8 точек символа шрифта
Delay1KTCYx (250); / / Wait 2ms
SendData (0x0E); / / Turn Off ЖК-дисплей, курсоров и шоры Off Off
Delay1KTCYx (15); / / Wait 2ms
SendData (0x01); / / Открытый ЖК-дисплей
Delay1KTCYx (15); / / Wait 2ms
SendData (0x06) / / Установить ЖК вступления режиме увеличиваются на одну и перенести курсор вправо.
Нет изображения смены.
)Пустота SendData (неподписанных данные Char) (
LCDData = данные;
RS = 0;
RW = 0;
En = 1;
Delay1KTCYx (1);
En = 0;
)Пустота writeData (неподписанные данные Char) (
LCDData = данные;
RS = 1;
RW = 0;
En = 1;
Delay1KTCYx (1);
En = 0;
)Пустота WriteString (сопзЬ Char ROM * ул) (
в то время (* ул) (
writeData (* Str);
Ул ;
)
)Пустота putdec (неподписанных Int N)
(
неподписанных Int бэр = N% 10;
неподписанных Int Quot = N / 10;
если (далее "> 0)
(
putdec (далее ");
)
writeData (REM '0 ');
)