Doracenzi 0 Denunciar post Postado Novembro 21, 2012 Olá pessoal, estou com um problema em um projeto que esta a quase uma semana me atrasando, é o seguinte, eu preciso usar uma interrepção externa para que de tempo em tempo o PIC18F4550 envie a temperaturas lidas, esse bloco da leitura das temperaturas tem que ser em uma interrepção externa para nao atrapalhar no restante da função principal MAIN, o problema é que eu implementei o TIMER 0 como o fabricante do compilador diz, com toda a sintaxe correta(eu acho) e mesmo assim a interrpução nao ocorre, nao enviando os dados. Eu nao consigo mesmo achar o que esta de errado na implementação, por favor se alguem souber onde esta o erro me ajude, me de uma luz. Obrigado desde já. Deixo aqui em baixo o código implementado em C no PIC C compiler. [color="#0000FF"]#include <18F4550.h> #device adc=10 #int_RTCC #FUSES NOWDT //No Watch Dog Timer #FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale #FUSES INTRC_IO //Internal RC Osc, no CLKOUT #FUSES NOPROTECT //Code not protected from reading #FUSES NOBROWNOUT //No brownout reset #FUSES BORV20 //Brownout reset at 2.0V #FUSES NOPUT //No Power Up Timer #FUSES NOCPD //No EE protection #FUSES STVREN //Stack full/underflow will cause reset #FUSES NODEBUG //No Debug mode for ICD #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOWRT //Program memory not write protected #FUSES NOWRTD //Data EEPROM not write protected #FUSES IESO //Internal External Switch Over mode enabled #FUSES FCMEN //Fail-safe clock monitor enabled #FUSES PBADEN //PORTB pins are configured as analog input channels on RESET #FUSES NOWRTC //configuration not registers write protected #FUSES NOWRTB //Boot block not write protected #FUSES NOEBTR //Memory not protected from table reads #FUSES NOEBTRB //Boot block not protected from table reads #FUSES NOCPB //No Boot Block code protection #FUSES MCLR //Master Clear pin enabled #FUSES LPT1OSC //Timer1 configured for low-power operation #FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode) #FUSES PLL12 //Divide By 12(48MHz oscillator input) #FUSES CPUDIV4 //System Clock by 4 #FUSES USBDIV //USB clock source comes from PLL divide by 2 #FUSES VREGEN //USB voltage regulator enabled #FUSES ICPRT //ICPRT enabled #use delay(crystal=8000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) #DEFINE AN pin_D3 #DEFINE BN pin_D4 #DEFINE AP pin_D5 #DEFINE BP pin_D6 #DEFINE delay1 500 int b = 0; char aux[4]; int i = 0; float valor = 0; float diferenca = 0; int flag = 0; int aux1 = 0; int aux2 = 0; int16 valor_anal1 = 0, valor_temp1 = 0, valor_anal2 = 0, valor_temp2 = 0, valor_anal3 = 0, valor_temp3 = 0, valor_anal4 = 0, valor_temp4 = 0; void RTCC_isr(void) { //Sensores de temperatura set_adc_channel(0); // Canal do ADC 0 delay_ms(1); valor_anal1 = read_adc(); // Lê o LM35 1 valor_temp1 = (valor_anal1 * 0.00488) * 100; // Converte em graus celsius set_adc_channel(1); // Canal do ADC 1 delay_ms(1); valor_anal2 = read_adc(); // Lê o LM35 2 valor_temp2 = (valor_anal2 * 0.00488) * 100; // Converte em graus celsius set_adc_channel(2); // Canal do ADC 2 delay_ms(1); valor_anal3 = read_adc(); // Lê o LM35 3 valor_temp3 = (valor_anal3 * 0.00488) * 100; // Converte em graus celsius set_adc_channel(3); // Canal do ADC 3 delay_ms(1); valor_anal4 = read_adc(); // Lê o LM35 4 valor_temp4 = (valor_anal4 * 0.00488) * 100; // Converte em graus celsius //Envia para a porta serial a Temperatura lida do LM35 printf("A%2.1fB%2.1fC%2.1fD%2.1f\n", (float)valor_temp1, (float)valor_temp2, (float)valor_temp3, (float)valor_temp4); } void main() { setup_adc_ports(AN0_TO_AN3); setup_adc(ADC_CLOCK_DIV_2); setup_psp(PSP_DISABLED); setup_spi(0);; setup_wdt(WDT_OFF); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_ccp1(CCP_OFF); setup_comparator(NC_NC_NC_NC); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); enable_interrupts(INT_RTCC); enable_interrupts(GLOBAL); setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF); set_tris_a(0b11111111); while(true) { /*Captura do pacote enviado pela interface*/ if (kbhit()) { aux[0] = 0; aux[1] = 0; aux[2] = 0; aux[3] = 0; aux[4] = 0; aux[0] = getc(); //inicio do quadro aux[1] = getc(); aux[2] = getc(); aux[3] = getc(); aux[4] = getc(); putc(aux[0]); putc(aux[1]); putc(aux[2]); putc(aux[3]); putc(aux[4]); } [/color] Compartilhar este post Link para o post Compartilhar em outros sites
GBecker 51 Denunciar post Postado Novembro 21, 2012 Doracenzi, Nunca programei em C para a família 18F, mas ja mexi com os 16F em assembly. Então vou dar meu pitaco. O registrador de configuração do timer e das interrupções (especificas e o habilitador global) foram corretamente configurados? Depurou o código para ter certeza que o Timer está sendo incrementado? Não entendi a relação que você está fazendo entre o Timer 0 e interrupção externa. Pelo menos na família 16F, uma interrupção externa é uma coisa e interrupção de Timer é outra. Sem relação nenhuma entre elas. Espero ter ajudado, FLW! Compartilhar este post Link para o post Compartilhar em outros sites
Doracenzi 0 Denunciar post Postado Novembro 22, 2012 Amigo obrigado por responder. Eu je encontrei o problema de tanto tentar, era apenas uma declação do TIMER que eu havia colocado antes das declaraçoes globais e por isso o bloco nao era executado. Mas mesmo assim Obrigado. Problema Resolvido, vamos para o próximo problema hehe. Compartilhar este post Link para o post Compartilhar em outros sites
GBecker 51 Denunciar post Postado Novembro 27, 2012 Beleza cara, qualquer dúvida é só postar aí. Compartilhar este post Link para o post Compartilhar em outros sites