Ir ao conteúdo
  • Cadastre-se

Gregorio Leão

Membro Pleno
  • Posts

    27
  • Cadastrado em

  • Última visita

posts postados por Gregorio Leão

  1. 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:

     

    Captura de Tela (6).png

  2. 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.

     

     

    Captura de Tela (4).png

  3. 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: 

    851237402_CapturadeTela(2).png.e8c3623ee3291aa6f648770c968c46e1.png

     

    Desde já grato pela colaboração.

  4. @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? 

  5. 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!

     

    • Curtir 1
  6. @.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 

  7. @.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;
        }
        
    }

     

  8. @.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

  9. @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)

     

    • Curtir 1
  10. @.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

  11. 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)
    

     

  12. @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 👍

  13. Em 26/10/2020 às 07:48, if. disse:

    ... teoricamente. Na prática você pode medir os diodos que tem entre gnd e vcc (ou VDD e VSS) em todos os pinos. É o máximo que seu multímetro alcança. Valores atípicos aos do diodo, há suspeita. Entre os pinos vcc e gnd também há um 'diodo' mas este dá um valor ligeiramente menor.

    C3JnrHv.png

    Lembrando que mesmo diodo dando bom, não significa que o ci tá bom, tá bom? Teste completo é necessário como p.ex. programar pra piscar tudo bem como as análises do programa e rever a montagem e configurações - p.ex. tem pino que só é entrada ou saída open drain. Outro mc pra comparações e/ou outro programador são bem vindos.

    E se tiver pulseira use. Se não, descarregue-se em algo metálico grande.

    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

  14. Em 24/10/2020 às 07:30, if. disse:

    Publique o circuito. Mas antes verifique sua montagem, alimentação, reset e etc. No programa verifique a correta configuração dos fuses.

    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...