S
shaneelal
Guest
Nisem doživela dal drugih pisnih napotkov code.I "m uporabo C18 prevajalnik in PIC 18f452.I uporablja priročnik, da mi pomaga. Ta oznaka je bil napisan prejeti prekinitev vsakih 2 sekundi od 555 timer. Ko prekine je prejel , odčitki dveh senzorjev, ki so sprejete z ADC. wirespeed je tudi bere iz druge naprave. Ti rezultati so nato prikazani na LCD-zaslon, kot tudi tv zaslona. Jaz sem novi v interrupts.
Funkcija ISR je vrsta dolga, je predolgo?
Kako lahko vložim koda bolj učinkovita?Ali lahko pišem nekaj konstant k ROM PIC?Ali ISR funkcijo, ustanovljen pravilno?Če je kaj narobe mi prosim povejte.Vsi nasveti bi bili zelo uvaževati.
Code:
# include <p18f452.h>
# include <xlcd.h>
# include <delays.h>
# include <stdlib.h>
# include <usart.h>
# include <portb.h>
# include <adc.h>
# include <string.h>/ * Bits Set konfiguracija za uporabo z ICD2 / PICDEM2 PLUS Demo Board:
* - Set XT oscilator
* - Onesposobiti watchdog timer
* - Onesposobiti nizko napetost programiranja
* /
# pragma romdata CONFIG
_CONFIG_DECL (_CONFIG1H_DEFAULT & _OSC_XT_1H,
_CONFIG2L_DEFAULT,
_CONFIG2H_DEFAULT & _WDT_OFF_2H,
_CONFIG3H_DEFAULT,
_CONFIG4L_DEFAULT & _LVP_OFF_4L,
_CONFIG5L_DEFAULT,
_CONFIG5H_DEFAULT,
_CONFIG6L_DEFAULT,
_CONFIG6H_DEFAULT,
_CONFIG7L_DEFAULT,
_CONFIG7H_DEFAULT);
# pragma romdataSistem void (void);void DelayFor18TCY (void)
(
Nov ();
Nov ();
Nov ();
Nov ();
Nov ();
Nov ();
Nov ();
Nov ();
Nov ();
Nov ();
Nov ();
Nov ();
)void DelayPORXLCD (void)
(
Delay1KTCYx (60) / / Delay of 15ms
return;
)void DelayXLCD (void)
(
Delay1KTCYx (20) / / Delay of 5ms
return;
)void main ()
(
/ / config RBO za interrupts
OpenRB0INT (PORTB_CHANGE_INT_ON & PORTB_CHANGE_INT_ON & RISING_EDGE_INT & PORTB_PULLUPS_ON);
/ / Configure zunanji LCD
OpenXLCD (FOUR_BIT & LINES_5X7); / / štiri bit mode, multiple line zaslon/ / Configure USART, DOUBLE CHECK
/ / prekine za prenos in o prejemu
/ / asinhroni način
/ * / / 8-bit transmisson
/ / ne prejemajo nič, naj grem ven??
/ / spbrg = 25 * /
OpenUSART (USART_TX_INT_OFF & & USART_RX_INT_OFF
USART_ASYNCH_MODE & & USART_EIGHT_BIT
USART_BRGH_HIGH &
USART_CONT_RX, 25);OpenADC (ADC_FOSC_8 & & ADC_RIGHT_JUST
ADC_8ANA_0REF, ADC_CH0 &
ADC_INT_OFF);/ * OpenADC (ADC_FOSC_8 & & ADC_RIGHT_JUST
ADC_8ANA_0REF & & ADC_CH1
ADC_INT_OFF); * /INTCONbits.GIE = 1; / / moram dati, da od pg58
while (1)
())# pragma prekinitev sistem / / shraniti = PRODH, PRODL, oddelek ( ". tmpdata")
Sistem void (void)
(int current_adc;
int voltage_adc;
int napetosti;
int current;
char hitrost [7];
char voltage_str [7];
char current_str [7];
int convFactor = (5,0 / 1024);
char sp_units [10] = "mm / sec";
char vol_units [10] = "voltov";
char cur_units [10] = "Amps";
char dobrodošli [20] = "Welding Monitor";
char cursorL1 [5] = "(A17";
char cursorL2 [7] = "(C0202";
char cursorL5 [7] = "(C0204";
char cursorL7 [7] = "(C0206";
char cursorL9 [9] = "(C0209";INTCONbits.INT0IE = 0; / / stop prekinja stalno
SetChanADC (ADC_CH0); / / select napetost kanal
Delay10TCYx (3);
ConvertADC ();
while (BusyADC ());
voltage_adc = ReadADC ();
napetosti = (voltage_adc * convFactor * 100);
SetChanADC (ADC_CH1); / / select trenutni kanal
Delay10TCYx (3);
ConvertADC ();
while (BusyADC ());
current_adc = ReadADC ();
trenutni = (current_adc * 1,2 * convFactor * 600);
while (! DataRdyUSART ());
getsUSART (hitrost, 7); / / dobi hitrost
while (BusyUSART ()); / / TEST da vidim, če lahko odstranite
/*************** pišite na LCD *******************/
while (BusyXLCD ());
SetDDRamAddr (0x1C);
while (BusyXLCD ());
putsXLCD (sp_units);
while (BusyXLCD ());
SetDDRamAddr (0x14);
while (BusyXLCD ());
putsXLCD (hitrost);
while (BusyXLCD ());
SetDDRamAddr (0x48);
while (BusyXLCD ());
putsXLCD (cur_units);
while (BusyXLCD ());
SetDDRamAddr (0x40);
itoa (sedanjih, current_str);
while (BusyXLCD ());
putsXLCD (current_str);
while (BusyXLCD ());
SetDDRamAddr (0x08);
while (BusyXLCD ());
putsXLCD (vol_units);
while (BusyXLCD ());
SetDDRamAddr (0x00);
itoa (napetost, voltage_str);
while (BusyXLCD ());
putsXLCD (voltage_str);
/************ pišite na tv zaslona *************************/
while (BusyUSART ());
putsUSART (cursorL1); / / jasen zaslon
while (BusyUSART ());
putsUSART (cursorL2);
while (BusyUSART ());
putsUSART (dobrodošli);
while (BusyUSART ());
putsUSART (cursorL5);
while (BusyUSART ());
putsUSART (hitrost);
while (BusyUSART ());
putsUSART (sp_units);
putsUSART (cursorL7);
while (BusyUSART ());
putsUSART (current_str);
while (BusyUSART ());
putsUSART (cur_units);
putsUSART (cursorL9);
while (BusyUSART ());
putsUSART (voltage_str);
while (BusyUSART ());
putsUSART (vol_units);
)
Funkcija ISR je vrsta dolga, je predolgo?
Kako lahko vložim koda bolj učinkovita?Ali lahko pišem nekaj konstant k ROM PIC?Ali ISR funkcijo, ustanovljen pravilno?Če je kaj narobe mi prosim povejte.Vsi nasveti bi bili zelo uvaževati.
Code:
# include <p18f452.h>
# include <xlcd.h>
# include <delays.h>
# include <stdlib.h>
# include <usart.h>
# include <portb.h>
# include <adc.h>
# include <string.h>/ * Bits Set konfiguracija za uporabo z ICD2 / PICDEM2 PLUS Demo Board:
* - Set XT oscilator
* - Onesposobiti watchdog timer
* - Onesposobiti nizko napetost programiranja
* /
# pragma romdata CONFIG
_CONFIG_DECL (_CONFIG1H_DEFAULT & _OSC_XT_1H,
_CONFIG2L_DEFAULT,
_CONFIG2H_DEFAULT & _WDT_OFF_2H,
_CONFIG3H_DEFAULT,
_CONFIG4L_DEFAULT & _LVP_OFF_4L,
_CONFIG5L_DEFAULT,
_CONFIG5H_DEFAULT,
_CONFIG6L_DEFAULT,
_CONFIG6H_DEFAULT,
_CONFIG7L_DEFAULT,
_CONFIG7H_DEFAULT);
# pragma romdataSistem void (void);void DelayFor18TCY (void)
(
Nov ();
Nov ();
Nov ();
Nov ();
Nov ();
Nov ();
Nov ();
Nov ();
Nov ();
Nov ();
Nov ();
Nov ();
)void DelayPORXLCD (void)
(
Delay1KTCYx (60) / / Delay of 15ms
return;
)void DelayXLCD (void)
(
Delay1KTCYx (20) / / Delay of 5ms
return;
)void main ()
(
/ / config RBO za interrupts
OpenRB0INT (PORTB_CHANGE_INT_ON & PORTB_CHANGE_INT_ON & RISING_EDGE_INT & PORTB_PULLUPS_ON);
/ / Configure zunanji LCD
OpenXLCD (FOUR_BIT & LINES_5X7); / / štiri bit mode, multiple line zaslon/ / Configure USART, DOUBLE CHECK
/ / prekine za prenos in o prejemu
/ / asinhroni način
/ * / / 8-bit transmisson
/ / ne prejemajo nič, naj grem ven??
/ / spbrg = 25 * /
OpenUSART (USART_TX_INT_OFF & & USART_RX_INT_OFF
USART_ASYNCH_MODE & & USART_EIGHT_BIT
USART_BRGH_HIGH &
USART_CONT_RX, 25);OpenADC (ADC_FOSC_8 & & ADC_RIGHT_JUST
ADC_8ANA_0REF, ADC_CH0 &
ADC_INT_OFF);/ * OpenADC (ADC_FOSC_8 & & ADC_RIGHT_JUST
ADC_8ANA_0REF & & ADC_CH1
ADC_INT_OFF); * /INTCONbits.GIE = 1; / / moram dati, da od pg58
while (1)
())# pragma prekinitev sistem / / shraniti = PRODH, PRODL, oddelek ( ". tmpdata")
Sistem void (void)
(int current_adc;
int voltage_adc;
int napetosti;
int current;
char hitrost [7];
char voltage_str [7];
char current_str [7];
int convFactor = (5,0 / 1024);
char sp_units [10] = "mm / sec";
char vol_units [10] = "voltov";
char cur_units [10] = "Amps";
char dobrodošli [20] = "Welding Monitor";
char cursorL1 [5] = "(A17";
char cursorL2 [7] = "(C0202";
char cursorL5 [7] = "(C0204";
char cursorL7 [7] = "(C0206";
char cursorL9 [9] = "(C0209";INTCONbits.INT0IE = 0; / / stop prekinja stalno
SetChanADC (ADC_CH0); / / select napetost kanal
Delay10TCYx (3);
ConvertADC ();
while (BusyADC ());
voltage_adc = ReadADC ();
napetosti = (voltage_adc * convFactor * 100);
SetChanADC (ADC_CH1); / / select trenutni kanal
Delay10TCYx (3);
ConvertADC ();
while (BusyADC ());
current_adc = ReadADC ();
trenutni = (current_adc * 1,2 * convFactor * 600);
while (! DataRdyUSART ());
getsUSART (hitrost, 7); / / dobi hitrost
while (BusyUSART ()); / / TEST da vidim, če lahko odstranite
/*************** pišite na LCD *******************/
while (BusyXLCD ());
SetDDRamAddr (0x1C);
while (BusyXLCD ());
putsXLCD (sp_units);
while (BusyXLCD ());
SetDDRamAddr (0x14);
while (BusyXLCD ());
putsXLCD (hitrost);
while (BusyXLCD ());
SetDDRamAddr (0x48);
while (BusyXLCD ());
putsXLCD (cur_units);
while (BusyXLCD ());
SetDDRamAddr (0x40);
itoa (sedanjih, current_str);
while (BusyXLCD ());
putsXLCD (current_str);
while (BusyXLCD ());
SetDDRamAddr (0x08);
while (BusyXLCD ());
putsXLCD (vol_units);
while (BusyXLCD ());
SetDDRamAddr (0x00);
itoa (napetost, voltage_str);
while (BusyXLCD ());
putsXLCD (voltage_str);
/************ pišite na tv zaslona *************************/
while (BusyUSART ());
putsUSART (cursorL1); / / jasen zaslon
while (BusyUSART ());
putsUSART (cursorL2);
while (BusyUSART ());
putsUSART (dobrodošli);
while (BusyUSART ());
putsUSART (cursorL5);
while (BusyUSART ());
putsUSART (hitrost);
while (BusyUSART ());
putsUSART (sp_units);
putsUSART (cursorL7);
while (BusyUSART ());
putsUSART (current_str);
while (BusyUSART ());
putsUSART (cur_units);
putsUSART (cursorL9);
while (BusyUSART ());
putsUSART (voltage_str);
while (BusyUSART ());
putsUSART (vol_units);
)