Progetti

   

Tutorial

   

Servizi

   
Benvenuto, Ospite
Nome utente: Password: Ricordami
  • Pagina:
  • 1
  • 2

ARGOMENTO: ltlib uart e interrupt

ltlib uart e interrupt 4 Mesi 2 Settimane fa #1

  • marcoilgrande
  • Avatar di marcoilgrande
  • Offline
  • Fresh Boarder
  • Messaggi: 14
  • Karma: 0
Ciao a tutti,
come da manuale xc8 sto provando l'esercizio a pagina 331, cioè l' Eusart con interruzione. non mi servirà solo come esercizio ma mi tornerà utile per un mio progetto.
il problema è che il manuale usa delle librerie credo plib ma io vorrei usare le ltlib.

purtroppo non riesco a far funzionare l'interrupt. Credo che le ltlib inizializzano la eusart senza l'interruzione rx abilitata, solo che io non so dove andare a toccare. Qualcuno mi sa aiutare?

Grazie a tutti e w laurtec!
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

ltlib uart e interrupt 4 Mesi 2 Settimane fa #2

  • marcoilgrande
  • Avatar di marcoilgrande
  • Offline
  • Fresh Boarder
  • Messaggi: 14
  • Karma: 0
ecco il codice
#include <xc.h>
 
#include "LTlib.h"
//#include "PIC18F4550_config.h"
 
#include "module_IO.h"
#include "module_IO.c"
 
#include "LTlib_delay.h"
#include "LTlib_delay.c"
 
#include "LCD_44780.h"
#include "LCD_44780.c"
 
#include "module_UART.h"
#include "module_UART.c"
 
//***********************************************
//          GESTIONE INTERRUPT
//***********************************************
 
__interrupt (high_priority) void ISR_alta (void){
    //variabile che conta i dati ricevuti
    unsigned char data;
    //Flag per controllare la ricevuzione del primo carattere
    static char fristTime =0;
 
    //controllo che l'interrupt sia stato generator dallusart
    if(PIR1bits.RCIF==1) {
 
        //resetto gli interrupt EUSART
        PIR1bits.RCIF=0;
 
        //controllo la ricezione del primo carattere
        if (fristTime ==0) {
        LCD_clear();
        //memorizzo il fatto che ho già puliuto il ddisplay
        fristTime=1;
 
 
        }
 
        //Leggo il dato dal buffer di ricezione
        data=UART1_read_byte();
 
        LCD_write_char(data);
 
        //invio il carattere al terminae
 
        UART1_write_byte (data);
        //attendo che il dato vegna trasmesso
        while (UART1_TX_busy()); 
 
        //se premo back space pulisco lo schermo
        if(data==0x08){
            LCD_clear();
 
        }
 
    // se premo esc termino l'operazione
        if (data==0x1B) {
            LCD_clear();
            //chiudo l'usart
            UART1_close();
            //ripulisco lcd prima di riscrivere
            LCD_clear();
            // L'usar è stata chiusa
            LCD_write_message ("RS232 : Closed");
            //disabilito l'interrupt globale
            INTCONbits.GIE=0;
            }
 
        }
}
 
//***********************************************
//          programma principale
//***********************************************
 
 
int main (void){
 
    //inizializzo porta tutti ingressi
    LATA=0x00;
    TRISA=0xFF;
 
      //inizializzo portb tutti ingressi
    LATB=0x00;
    TRISB=0xFF;  
 
    //inizializzo port c
    LATC=0x00;
    TRISC=0b11111101;
 
        //inizializzo portD tutte uscite
    LATD=0x00;
    TRISD=0x00;  
 
        //inizializzo portE tutti ingressi
    LATE=0x00;
    TRISE=0xFF;
 
    LCD_initialize(8);
 
    //configuro l'usart
          UART1_open(UART_BAUDRATE_9600);
//    OpenUSART( USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & 
//            USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 64);
    //invio stringa al terminale
    UART1_write_message ("...start writing: ");
 
    //invio la stringa all lcd
    LCD_write_message("...start writing: ");
 
    //resetto gli interrupt vecchi
    PIR1bits.RCIF =0;
 
    //abilito modalità compatibile di default vale zero
    //abilito modalità compatibile con i pic 16 
RCONbits.IPEN=0;
 
//Abilito l'interrput ad alta priorità
INTCONbits.GIE=1;
 
 
//Abilito interrupt a bassa priorità
INTCONbits.PEIE=1;
 
 
   //ciclo infinito
 
while (1) {
    }
}
Ultima modifica: 4 Mesi 2 Settimane fa da Mauro Laurenti.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

ltlib uart e interrupt 4 Mesi 2 Settimane fa #3

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Offline
  • Moderatore
  • Messaggi: 4476
  • Ringraziamenti ricevuti 515
  • Karma: 49
Salve Marco,

nei nuovi esempi che trovi nel testo XC8 Step by Step puoi vedere quelli per Freedom III che sono basati sulla libreria LTlib.

LTlib non ti permette di gestire le interruzioni. Ho voluto gestire un numero limitato di parametri.
Ho pensato più volte di aggiungere un'altra funzione, tipo UART1_configuration (xxxxx) che potesse permettere di configurare parametri aggiuntivi.
...per ora mai fatta per cui le interruzioni vanno abilitate direttamente nel registro PIEx.

Devi usare questo codice da cambiare con il tuo:
    // Configura l'USART
    // 8 bit
    // 19200 bit/s
    // 1 bit stop
    // 0 bit parità
    UART1_open(UART_BAUDRATE_19200);
 
    // Invio la stringa al terminale
    UART1_write_message ("...start writing: ");
 
    // Invio la stringa all'LCD
    LCD_write_message ("...start writing");
 
    // Resetto gli Interrupt vecchi
    PIR1bits.RCIF = 0;
 
    //Abilito Interruzione UART
    PIE1bits.RCIE = 1;
 
    // Abilito modalità compatibile (di default vale già 0)
    RCONbits.IPEN = 0;
 
    // Abilito l'interrupt globale
    INTCONbits.GIE = 1;
 
    // Abilito interrupt per periferiche
    INTCONbits.PEIE = 1 ;



Il punto di inizio e fine dove copiare ed incollare dovrebbe essere chiaro.

Saluti,

Mauro
Ultima modifica: 4 Mesi 2 Settimane fa da Mauro Laurenti.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
Ringraziano per il messaggio: marcoilgrande

ltlib uart e interrupt 4 Mesi 2 Settimane fa #4

  • marcoilgrande
  • Avatar di marcoilgrande
  • Offline
  • Fresh Boarder
  • Messaggi: 14
  • Karma: 0
Grazie mille Mauro, ora funziona!

Già che ci sono ne approfitto:
se non ho capito male le plib non funzionano più con mplabx 3.45 e compilatore 1.38.
Penso che sia per quello che l'esempio su pwm non compila e da errore 500.
Ho visto qualche tutorial sul sito, ma è in previsione una libreria dedicata con ltlib?
Utilizzare le librerie è sicuramente più semplice e ordinato!
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

ltlib uart e interrupt 4 Mesi 2 Settimane fa #5

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Offline
  • Moderatore
  • Messaggi: 4476
  • Ringraziamenti ricevuti 515
  • Karma: 49
Ottimo.

...da quando le plib hanno creato qualche problema di incompatibilità ho deciso di tagliare i ponti e scrivere le mie librerie anche per le periferiche interne al PIC.

Per il PWM ho pensato di scrivere anche una libreria, ma non l'ho fatto...

Generare un segnale PWM non è complicato.

Questo è l'esempio del testo XC8 Step by Step scritto per Freedom III:
#include <xc.h>
 
#include "PIC18F46K22_config.h"
 
#include "delay.h"
#include "delay.c"
 
//*************************************
//     Prototipi delle funzioni
//*************************************
void board_initialization (void);
void set_duty_cycle (unsigned int duty_cycle);
void turn_on_PWM2 (void);
 
 
//*************************************
//            main
//*************************************
int main (void){
 
    // Periodo del segnale PWM
    unsigned char period;
 
    unsigned int duty_cycle = 0;
 
    board_initialization ();
 
    // Avvio il TMR2 per il PWM
    T2CONbits.TMR2ON = 0x01;
 
    // Imposto una frequenza di 20KHz
    period = 249;
 
    // Apro il modulo PWM
    turn_on_PWM2 ();
 
    while (1) {
 
        // Aggiorno il duty cycle
        set_duty_cycle (duty_cycle);
 
        // Incremento il duty cycle
        duty_cycle++;
 
        // Controllo che non sia maggiore di 2^10
        if (duty_cycle > 1023) {
                duty_cycle =0;
        }
 
        delay_ms (2);
    }
}
 
//*************************************
//    Implementazione della funzione
//*************************************
 void board_initialization (void) {
 
    // Imposto PORTA
    LATA = 0x00;
    ANSELA = 0x00;
    TRISA = 0xFF;
 
    // Imposto PORTB
    LATB = 0x00;
    ANSELB = 0x00;
    TRISB = 0xFF;
 
    // Imposto PORTC
    LATC = 0x00;
    ANSELC = 0x00;
    TRISC = 0b11111101;
 
    // Imposto PORTD
    LATD = 0x00;
    ANSELD = 0x00;
    TRISD = 0xFF;
 
    // Imposto PORTE
    LATE = 0x00;
    ANSELE = 0x00;
    TRISE = 0xFF;
 
 }
 
 
 //************************************
//	Imposta il Duty Cycle
//************************************
 
void set_duty_cycle (unsigned int duty_cycle) {
 
    CCPR2L = (unsigned char) (duty_cycle >> 2);
 
    if (duty_cycle & 0x0001)
        CCP2CONbits.DC2B0 = 0x0001;
    else
        CCP2CONbits.DC2B0 = 0x0000;
 
    if (duty_cycle & 0x0002)
        CCP2CONbits.DC2B1 = 0x0001;
    else
        CCP2CONbits.DC2B1 = 0x0000;
}
 
 
//************************************
//	Attiva il modulo PWM
//************************************
void turn_on_PWM2 (void) {
 
    CCP2CON = CCP2CON | 0b00001100;
}

Tra
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
  • Pagina:
  • 1
  • 2
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Powered by Forum Kunena
   
© LaurTec 2006-2015