- Messaggi: 22
- Ringraziamenti ricevuti 0
ltlib uart e interrupt
- marcoilgrande
- Autore della discussione
- Giovane Utente
-
Less
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!
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
-
Less
Di più
- Messaggi: 22
- Ringraziamenti ricevuti 0
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.
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:
Il punto di inizio e fine dove copiare ed incollare dovrebbe essere chiaro.
Saluti,
Mauro
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
-
Less
Di più
- Messaggi: 22
- Ringraziamenti ricevuti 0
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!
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.
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:
Tra
...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 Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Forum - Ultimi messaggi
-
- progetto can
- da marcelloraja
-
- MODULO GSM SIM900A
- da Mauro Laurenti
-
- Freedom III e compilazioni fallite
- da Mauro Laurenti
-
- Gestione degli errori su comunicazione seriale
- da Mauro Laurenti
-
- Timer0 e interrupt
- da Mauro Laurenti