Ir ao conteúdo
  • Cadastre-se

Gregorio Leão

Membro Pleno
  • Posts

    28
  • Cadastrado em

  • Última visita

Tudo que Gregorio Leão postou

  1. @.if Aquele quadradinho parece o caractere de final de string, '\0'. Creio que eu esteja certo porque já tentei aumentar um laço de repetição de maior no laço for onde ocorre a leitura da string. Mas eu gostaria de saber porque sempre há um caractere perdido no meio da transmissão?
  2. Estou tentando fazer um código para ler um string e retorná-la pela UART do PIC16F887. Entretanto, o microcontrolador não retorna a string de forma correta. Estou utilizando o Arduino como intermediário para poder exibir o resultado no monitor serial da IDE Arduino. Codigo do PIC16F887: /* * File: ESP-01.c * Author: Gregorio Leão * * Created on 23 de Dezembro de 2021, 15:54 */ // PIC16F887 Configuration Bit Settings // 'C' source line config statements // CONFIG1 #pragma config FOSC = HS // Oscillator Selection bits (LP oscillator: Low-power crystal on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD) #pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled) #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) #pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled) #pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled) #pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming) // CONFIG2 #pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V) #pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define _XTAL_FREQ 20000000 void Inicia_RS232(){ SPBRG = 129; TXSTAbits.BRGH= 1; BAUDCTLbits.BRG16 = 0; TXSTAbits.SYNC = 0; RCSTAbits.SPEN = 1; INTCONbits.GIE = 1; INTCONbits.PEIE = 1; PIE1bits.TXIE = 1; PIE1bits.RCIE = 1; TXSTAbits.TXEN = 1; RCSTAbits.CREN = 1; } void Escreve_RS232(char dado){ while(!PIR1bits.TXIF); TXREG = dado; } char Le_RS232(){ while(!PIR1bits.RCIF); if(RCSTAbits.OERR){ RCSTAbits.CREN = 0; RCSTAbits.CREN = 1; } return RCREG; } void EscrevePalavra_RS232(char dados[]){ for(int i = 0; i < strlen(dados); i++){ Escreve_RS232(dados[i]); } } void Verifica_Funcionamento(){ char AT[] = "AT"; int guia = 0; char *verificacao = NULL; char *aux; char recebido[10]; do{ if(guia == 9){ for(int i = 0; i < 10; i++){ recebido[i] = 0; } } __delay_ms(1000); EscrevePalavra_RS232(AT); if(guia == 9){ guia = 0; } if(!BAUDCTLbits.RCIDL){ recebido[guia] = Le_RS232(); guia++; } Escreve_RS232('\n'); EscrevePalavra_RS232(recebido); Escreve_RS232('\n'); aux = recebido; verificacao = strstr(aux, "OK"); }while(verificacao == NULL); } void Zera_Palavra(char dado[], int TAM){ for(int i = 0; i < TAM; i++){ dado[i] = 0; } } void LePalavra_RS232(char dado[], int tamanho){ int i; for(i = 0; i < tamanho; i++){ dado[i] = Le_RS232(); } } void main(){ Inicia_RS232(); TRISDbits.TRISD2 = 0; PORTDbits.RD2 = 0; char letra; char recebido[8]; while(1){ Zera_Palavra(&recebido, 8); LePalavra_RS232(&recebido, 8); __delay_ms(1000); EscrevePalavra_RS232(recebido); Escreve_RS232('\n'); } } Codigo carregado no Arduino que estou utilizando de intermediário para usufruir de recursos de sua IDE: #include "SoftwareSerial.h" SoftwareSerial ESP_Serial(5, 11); // RX, TX void setup(){ Serial.begin(9600); ESP_Serial.begin(9600); } void loop(){ if (ESP_Serial.available()){ Serial.write(ESP_Serial.read()); } if (Serial.available()){ ESP_Serial.write(Serial.read()); } } Resultado obtido após enviar a palavra "gregorio" para o PIC:
  3. @.if O PWM do PIC funcionou, o problema estava em não ter um atraso entre um ciclo e outro, fazendo com que o microcontrolador tentasse executar todos os duty cicles de uma só vez. Muito obrigado pela ajuda.
  4. Ola, o PWM do meu pic16f887 não está funcionando. Codigo: /* * File: PWM.c * Author: Gregorio Leão * * Created on 12 de Janeiro de 2022, 23:36 */ // PIC16F887 Configuration Bit Settings // 'C' source line config statements // CONFIG1 #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD) #pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled) #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) #pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled) #pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled) #pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming) // CONFIG2 #pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V) #pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h> #include <stdio.h> #include <stdlib.h> #define _XTAL_FREQ 20000000 void Inicia_PWM(){ INTCONbits.GIE = 1; INTCONbits.PEIE = 1; PIE1bits.TMR2IE = 1; TRISCbits.TRISC2 = 1; PR2 = 255; CCP1CONbits.CCP1M0 = 0; CCP1CONbits.CCP1M1 = 0; CCP1CONbits.CCP1M3 = 1; CCP1CONbits.CCP1M2 = 1; CCP1CONbits.P1M0 = 0; CCP1CONbits.P1M1 = 0; CCP1CONbits.DC1B0 = 0; CCP1CONbits.DC1B1 = 0; CCPR1L = 0x0; PIR1bits.TMR2IF = 0; T2CONbits.T2CKPS0 = 0; T2CONbits.T2CKPS1 = 0; T2CONbits.TMR2ON = 1; while(!PIR1bits.TMR2IF); TRISCbits.TRISC2 = 0; PIR1bits.TMR2IF = 0; } void Gera_PWM(int DutyCicle){ CCPR1L = DutyCicle >> 2; CCP1CONbits.DC1B1 = DutyCicle >> 1; CCP1CONbits.DC1B0 = DutyCicle; } void Blink(){ TRISDbits.TRISD2 = 0; while(1){ PORTDbits.RD2 = 1; __delay_ms(1000); PORTDbits.RD2 = 0; __delay_ms(1000); } } void main(void) { Inicia_PWM(); while(1){ for(int i = 0; i < 1023; i++){ Gera_PWM(i); } } } Estou seguindo o que informa o datasheet do produto, entretanto, mesmo assim, não funciona. Gostaria de ajuda.
  5. @vtrx Eu corrigi isso, mas mesmo assim obrigado pela resposta.
  6. @.if Obrigado, vou ver se acho algo pesquisando
  7. Tenho um ESP-01 conectado a um arduino uno e por meio do monitor serial, atuando junto a um código carregado na placa, estou mandando comandos AT ao ESP. No entanto, ao mandar comandos que suas respectivas respostas são muito grandes, como os comandos AT+CIFSR e AT+GMR, o ESP responde com símbolos. Código carregado no Arduino: /******************************************************************************* * RoboCore - ESP8266 Primeiros Passos com Arduino * Codigo utilizado para enviar comandos AT atraves do monitor serial da Arduino * IDE. *******************************************************************************/ #include "SoftwareSerial.h" SoftwareSerial ESP_Serial(10, 6); // RX, TX void setup(){ Serial.begin(9600); ESP_Serial.begin(115200); } void loop(){ if (ESP_Serial.available()){ Serial.write(ESP_Serial.read()); } if (Serial.available()){ ESP_Serial.write(Serial.read()); } } O erro: Desde já grato pela colaboração.
  8. @Ricardov O problema foi resolvido, mas ainda assim é estranho visto que, até ontem, o executável gerado a partir do código C rodava normalmente. O problema começou ontem a noite, após eu compilar, pelo terminal, um código de um servidor socket em C. Fiz o código como informado a página da Microsoft sobre o winsock. Teria algum vínculo entre o problema e o procedimento que eu realizei?
  9. Olá a todos, estou com problemas para rodar um arquivo .exe. Compilo um código em C no vs code, o programa executa no terminal da própria IDE, mas se tento rodar o executável gerado, ele abre e fecha instantaneamente. Desde já grato.
  10. Olá a todos, estou tentando fazer uma comunicação serial através do modulo I²C do microcontrolador PIC16f887. Rodei o cogido sem erros e sem warnings, mas o microcontrolador não faz nada. Testei o circuito no real e no Proteus. Código: // CONFIG1 #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD) #pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled) #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) #pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled) #pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled) #pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming) // CONFIG2 #pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V) #pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h> #include <stdio.h> #include <stdlib.h> #include <pic16f887.h> //Testei sem essa biblioteca #define _XTAL_FREQ 20000000 void Inicia (const unsigned long feq_K){ TRISC3 = 1; // Configurando como entrada conforme fornecido na ficha TRISC4 = 1; // Configurando como entrada conforme fornecido na ficha SSPCON = 0b00101000; SSPCON2 = 0; SSPADD = (_XTAL_FREQ / (4 * feq_K * 100)) - 1; //Testei essa parte colocando o numero decimal direto, sem a equação SSPSTAT = 0b10000000; } void Espera(){ PIR1bits.SSPIF = 0; while(PIR1bits.SSPIF); } void Condicao_de_Inicio(){ Espera(); SSPCON2bits.SEN = 1; } void Condicao_de_Reinicio(){ Espera(); SSPCON2bits.RSEN = 1; } void Condicao_de_Parada(){ Espera(); SSPCON2bits.PEN = 1; } void Transmite(unsigned byte){ Espera(); SSPBUF = byte; } void Pisca_LED(){ TRISDbits.TRISD0 = 0; while(1){ PORTDbits.RD0 = 0; __delay_ms(1000); PORTDbits.RD0 = 1; __delay_ms(1000); } } void main(){ Inicia(100); INTCONbits.GIE = 1; INTCONbits.PEIE = 1; PIE1bits.SSPIE = 1; Pisca_LED(); while(1){ Condicao_de_Inicio(); Transmite(0xD0); Transmite(0x88); Transmite(0xFF); Condicao_de_Parada(); __delay_ms(1000); } }
  11. Como eu configuro isso no MPLAB? obs: Estou usando o compilador XC8
  12. Olá, estou tendo um problema com a energia do meu ci, o código compila e tudo mais, o problema é que o PIC informa que o programador, PicKit 3 no caso, não está dectando uma tensão, que o dispositivo alvo não consegue ser detectado... basicamente isso. Gostaria de alguma ajuda, sugestões, qualquer coisa do tipo. Desde já, grato!
  13. @.if Acho que o problema todo é, no caso se eu estivesse utilizando a função, é a sintaxe que deve estar errada. Na verdade coloquei pull-down externo no botão, funcionou kkkk Agora vou voltar para o meu projeto e verificar se há algum problema com a UART, assim que eu acabar ou se eu tiver alguma duvida posto aqui. Seria legal, mesmo depois que eu acabar o projeto, postar aqui, quem sabe alguem me da uma dica para melhorar o codigo kkkk
  14. @.if eu fiz o que você recomendou, tirei a interrupção do loop e funcionou. Tambem desabilitei as resistencias pull-up da PORTB e setei a porta RB0/INT como entrada. Exclui a função de interrupção e usei o codigo na função principal. funcionou o codigo: #pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD) #pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled) #pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) #define _XTAL_FREQ 4000000 #include <xc.h> #include <stdio.h> #include <stdlib.h> void Basic_Configurators(void){ CMCON = 0x07; TRISAbits.TRISA2 = 0; TRISBbits.TRISB0 = 1; } void Init_Interrupt(void){ INTCONbits.GIE = 1; //habilita todas as interrupções INTCONbits.PEIE = 0; //habilita interrupção periférica INTCONbits.INTE = 1; //habilita interrupção externa INTCONbits.INTF = 0; //limpa o sinalizador de interrupção externa OPTION_REGbits.INTEDG = 1; //borda de subida, transição de '0' para '1' configura uma interrupção INTCONbits.T0IF = 0; // desabilita sinalizador de interrrupção Overflow INTCONbits.RBIF = 0; // desabilita sinalizador de interrupção por alteração na porta B OPTION_REGbits.nRBPU = 1; //desabilita resistencia pull-up do PORTB } void main(void) { Basic_Configurators(); Init_Interrupt(); if(INTCONbits.INTF == 1){ PORTAbits.RA2 = 1; __delay_ms(1000); PORTAbits.RA2 = 0; __delay_ms(100); INTCONbits.INTF = 0; } }
  15. @.if consegui fazer funcionar, o unico problema é um atraso após preciosar o botão. Quando eu aperto o botão a primeira vez o mc liga o led, da um atraso de 1 segundo e desliga o led, ate ai tudo como planejado. O problema é que em algum momento, quando eu pressiono o botão o led não liga ou se eu apertar o botão, o mc cumpre a rotina, porém, se eu apertar o botão de novo assim que o led desligar, o led não liga de novo no mesmo instante. Não tem problema porque provavelmente é um problema de mal contato do botão, estou deduzindo isso porque o problema estava acontecendo com mais frequencia, mas eu troquei o botão e o problema apareceu com menos frequencia. Muito obrigado pela ajuda ai @.if @oleoarruda @oleoarruda na verdade esse não é o problema ja que eu havia feito a mesma coisa em codigos anteriores, creio que seja algum erro de compilação
  16. @oleoarruda @.if dei uma olhada no manual do xc8 na parte de interrupções e dizia que a sintaxe da função de interrpção era void __interrupt(high_priority ou low_priority) nome da função(void){}. Então fiz um codigo de teste, para não embolar o codigo do projeto. #pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD) #pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled) #pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) #define _XTAL_FREQ 4000000 #include <xc.h> #include <stdio.h> #include <stdlib.h> void Basic_Configurators(void){ CMCON = 0b00000111; TRISAbits.TRISA2 = 0; } void Init_Interrupt(void){ INTCONbits.GIE = 1; //habilita todas as interrupções INTCONbits.PEIE = 0; //desabilita interrupção periférica INTCONbits.INTE = 1; //habilita interrupção externa INTCONbits.INTF = 0; //limpa o sinalizador de interrupção externa OPTION_REGbits.INTEDG = 1; //borda de subida, transição de '0' para '1' configura uma interrupção INTCONbits.T0IF = 0; // desabilita sinalizador de interrrupção Overflow INTCONbits.RBIF = 0; // desabilita sinalizador de interrupção por alteração na porta B } void __interrupt() interrupcao(void){ //se o sinalizador estiver em nivel logico alto, ativa a porta RA2, trasmite a letra 'g' e zera o sinalizador if(INTCONbits.INTF == 1){ PORTAbits.RA2 = 1; __delay_ms(1000); PORTAbits.RA2 = 0; INTCONbits.INTF = 0; } } void main(void) { Basic_Configurators(); Init_Interrupt(); while(1){ interrupcao(); } return; } Dessa vez o erro apresentado foi esse: CLEAN SUCCESSFUL (total time: 6ms) make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf make[1]: Entering directory 'C:/Users/gabri/MPLABXProjects/ExperimentandoPIC16f628a9.0.X' make -f nbproject/Makefile-default.mk dist/default/production/ExperimentandoPIC16f628a9.0.X.production.hex make[2]: Entering directory 'C:/Users/gabri/MPLABXProjects/ExperimentandoPIC16f628a9.0.X' "C:\Program Files\Microchip\xc8\v2.31\bin\xc8-cc.exe" -mcpu=16F628A -c -mdfp="C:/Program Files/Microchip/MPLABX/v5.45/packs/Microchip/PIC16Fxxx_DFP/1.2.33/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -mext=cci -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mc90lib -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/InterrupcaoExterna.p1 InterrupcaoExterna.c InterrupcaoExterna.c:18:13: warning: binary integer literals are a GNU extension [-Wgnu-binary-literal] CMCON = 0b00000111; ^ 1 warning generated. "C:\Program Files\Microchip\xc8\v2.31\bin\xc8-cc.exe" -mcpu=16F628A -Wl,-Map=dist/default/production/ExperimentandoPIC16f628a9.0.X.production.map -DXPRJ_default=default -Wl,--defsym=__MPLAB_BUILD=1 -mdfp="C:/Program Files/Microchip/MPLABX/v5.45/packs/Microchip/PIC16Fxxx_DFP/1.2.33/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -mext=cci -Wa,-a -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mc90lib -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -Wl,--memorysummary,dist/default/production/memoryfile.xml -o dist/default/production/ExperimentandoPIC16f628a9.0.X.production.elf build/default/production/InterrupcaoExterna.p1 InterrupcaoExterna.c:33:: advisory: (1510) non-reentrant function "_interrupcao" appears in multiple call graphs and has been duplicated by the compiler C:/Program Files/Microchip/MPLABX/v5.45/packs/Microchip/PIC16Fxxx_DFP/1.2.33/xc8\pic\include\proc\pic16f628a.h:1838:: error: (845) symbol "interrupt_function" defined more than once InterrupcaoExterna.c:33:: error: (800) undefined symbol "??i1_interrupcao" (908) exit status = 1 nbproject/Makefile-default.mk:138: recipe for target 'dist/default/production/ExperimentandoPIC16f628a9.0.X.production.hex' failed make[2]: Leaving directory 'C:/Users/gabri/MPLABXProjects/ExperimentandoPIC16f628a9.0.X' nbproject/Makefile-default.mk:91: recipe for target '.build-conf' failed make[1]: Leaving directory 'C:/Users/gabri/MPLABXProjects/ExperimentandoPIC16f628a9.0.X' make[2]: *** [dist/default/production/ExperimentandoPIC16f628a9.0.X.production.hex] Error 1 make[1]: *** [.build-conf] Error 2 make: *** [.build-impl] Error 2 nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed BUILD FAILED (exit value 2, total time: 1s) Um detalhe é que se eu coloco o argumento "high_priority" ou "low_priority" o compilador manda eu ignorar o argumento na função void __interrupt(argumento)
  17. @oleoarruda Mas nessa função que você descreveu ficariam as configurações da interrupção ou a propria interrupção? Desde ja agradecido
  18. @.if Pow...muito obrigado ai, de verdade. Se funcionar provavelmente vou ter sucesso no meu projeto, obrigado mesmo
  19. @.if Eu achei varios exemplos na internet e tentei usa-los, porém todos deram problemas e então decidi fazer o meu codigo com base no datasheet e na analise de alguns codigos. Fiz dois codigos, o de cima para a transmissão e um outro para a recepção. No codigo de recepção o que estava dando problema era o comando de desvio de fluxo, goto, apaguei, nos dois codigos e a IDE não mostrou problemas, isso no codgio de recepção. Ja no codigo de transmissão, apaguei o comando goto e mesmo assim apresentou problemas, conclui pela logica que o problema era a interrupção. Isso tudo que relatei acima foi pouco depois de eu ter postado o topico aqui kkkk Mas a minha pergunta é, como faço pra resolver o problema da interrupção se esse for mesmo o erro? Meu codigo esta errado? Muito obrigado pela ajuda até aqui @.if
  20. Ola, estou tentando fazer um programa para transmitir um determinado dado apos uma interrupção. A interrrupção é externa, um botão quando precionado liga um led e trasmite, via porta RB2/TX, a letra 'g'. O problema é que há algo de errado, ja que o compilador está mostrando um erro, mas como sou leigo em MPLABX com compilador XC8, não estou entendendo o que há de errado, se puderem ajudar ficaria muito grato Meu codigo: // PIC16F628A Configuration Bit Settings // 'C' source line config statements // CONFIG #pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD) #pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled) #pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #define _XTAL_FREQ 4000000 #include <xc.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> //configurações basicas void basic_config(void){ CMCON = 0b00000111; TRISAbits.TRISA1 = 1; TRISAbits.TRISA0 = 0; TRISAbits.TRISA7 = 0; } //escrevendo caracter void write_RS232(unsigned char letra){ while(TXSTAbits.TRMT == 0){ TXREG = letra; } } //inicialização da UART void Initialized_RS232(void){ TRISBbits.TRISB1 = 1; //RX configurado como entrada TRISBbits.TRISB2 = 1; //TX configurado como entrada //↑ configurados conforme o datasheet ↑ SPBRG = 25; //configura a velocida de transmissão, no caso 9600 bps a 4MHz, em auta velocidade TXSTAbits.BRGH = 1; TXSTAbits.SYNC = 0; RCSTAbits.SPEN = 1; TXSTAbits.TX9 = 0; TXSTAbits.TXEN = 0; TXSTAbits.TX9D = 0; write_RS232('b'); } //configurando interrupção void Init_Interrupt(void){ INTCONbits.GIE 1; INTCONbits.PEIE = 0; INTCONbits.INTE = 1; INTCONbits.INTF = 0; OPTION_REGbits.INTEDG = 1; } //função de interrupção void interrupt transmited(void){ if(INTCONbits.INTF == 1){ PORTAbits.RA2 = 1; write_RS232('g'); INTCONbits.INTF = 0; } } void main(void) { basic_config(); Init_Interrupt(); Initialized_RS232(); while(1){ transmited(); } return; } O erro gerado: CLEAN SUCCESSFUL (total time: 13ms) make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf make[1]: Entering directory 'C:/Users/gabri/MPLABXProjects/USART_PIC16f628a-TX_For_Me.X' make -f nbproject/Makefile-default.mk dist/default/production/USART_PIC16f628a-TX_For_Me.X.production.hex make[2]: Entering directory 'C:/Users/gabri/MPLABXProjects/USART_PIC16f628a-TX_For_Me.X' "C:\Program Files\Microchip\xc8\v2.31\bin\xc8-cc.exe" -mcpu=16F628A -c -mdfp="C:/Program Files/Microchip/MPLABX/v5.45/packs/Microchip/PIC16Fxxx_DFP/1.2.33/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/TX_For_Me.p1 TX_For_Me.c ::: advisory: (2049) C99 compliant libraries are currently not available for baseline or mid-range devices, or for enhanced mid-range devices using a reentrant stack; using C90 libraries TX_For_Me.c:65:6: error: variable has incomplete type 'void' void interrupt transmited(void){ ^ TX_For_Me.c:65:15: error: expected ';' after top level declarator void interrupt transmited(void){ ^ ; 2 errors generated. make[2]: *** [build/default/production/TX_For_Me.p1] Error 1 make[1]: *** [.build-conf] Error 2 make: *** [.build-impl] Error 2 (908) exit status = 1 nbproject/Makefile-default.mk:107: recipe for target 'build/default/production/TX_For_Me.p1' failed make[2]: Leaving directory 'C:/Users/gabri/MPLABXProjects/USART_PIC16f628a-TX_For_Me.X' nbproject/Makefile-default.mk:91: recipe for target '.build-conf' failed make[1]: Leaving directory 'C:/Users/gabri/MPLABXProjects/USART_PIC16f628a-TX_For_Me.X' nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed BUILD FAILED (exit value 2, total time: 671ms)
  21. @Fermota @Fermota sou leigo em programação, mas pelo que eu sei o buffer de transmissão/recebimento via serial esvazia quando a mensagem acaba de ser transmitida/recebida. Você pode verificar isso colocando um led em uma porta e executar uma condição para o led ascenda quando o bit 0 (BF) do registrado SSPSTAT estiver cheio e verificar se o erro não está no seu código. Esse bit que eu acabei de falar e o bit que diz se o buffer está cheio ou vazio. Se cheio retorna "1" e se vazio retorna "0" Espero ter ajudado
  22. Pow muito obrigado mesmo, de verdade. Tô querendo fazer uma impressora 3D usando PIC. Mas primeiro tô tentando aprender o básico para depois fazer isso kkkk. Muito obrigado pela ajuda
  23. Pow...desculpa fazer muitas perguntas, é que eu realmente tenho interesse em usar o PIC. Gostaria de saber também se devo usa pulseira antiestatica?
  24. O circuito é simples, é um led junto a um resistor ligado na porta RB0 do pic. Sendo o positivo do led no RB0 e o negativo no Vss Fuses: O oscilador está no modo interno(INTRC_NOCLKOUT), Watchdog desabilitado, Power-up desabilitado, MCLRE habilitado, CP e CPD desabilitados, LVP desabilitado. @if. Sabe se tem alguma forma de testar se o PIC tá queimado usando o multímetro? Esqueci de falar que estou usando o pic16f887, não é o 16f887a.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...