ltlib uart e interrupt

  • marcoilgrande
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
Di più
6 Anni 3 Mesi fa #1 da marcoilgrande
ltlib uart e interrupt è stato creato da marcoilgrande
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!

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • marcoilgrande
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
Di più
6 Anni 3 Mesi fa - 6 Anni 3 Mesi fa #2 da marcoilgrande
Risposta da marcoilgrande al topic ltlib uart e interrupt
ecco il codice
Code:
#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 6 Anni 3 Mesi fa da Mauro Laurenti.

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
6 Anni 3 Mesi fa - 6 Anni 3 Mesi fa #3 da Mauro Laurenti
Risposta da Mauro Laurenti al topic ltlib uart e interrupt
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:
Code:
// 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 6 Anni 3 Mesi fa da Mauro Laurenti.
I seguenti utenti hanno detto grazie : marcoilgrande

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • marcoilgrande
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
Di più
6 Anni 3 Mesi fa #4 da marcoilgrande
Risposta da marcoilgrande al topic ltlib uart e interrupt
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!

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
6 Anni 3 Mesi fa #5 da Mauro Laurenti
Risposta da Mauro Laurenti al topic ltlib uart e interrupt
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:
Code:
#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

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Forum - Ultimi messaggi