#include "mcc_generated_files/mcc.h"
#include "LiquidCristalPIC.h"
#include <stdio.h>
#include <stdint.h>
//Main application
int cont = 0 ;
char data[16];
int error = 0;
char buffer[4];
void __interrupt() TMR_0 (){
if (PIR3bits.TMR0IF) {
if(cont == 16){
cont = 0; // CUANDO EL CONTADOR LLEGA A 16, ESTE SE PONE A 0
}
LATA = cont; //ESCRIBE POR EL PUERTO A EL NUMERO QUE REPRESENTA CONT
data[cont]=DATA_GetValue(); // GUARDA EL VALOR LEIDO EN LA POSICION CONT DEL ARRAY
cont ++; // AUMENTA EN UNO EL CONTADOR
}
PIR3bits.TMR0IF = 0; // BAJAMOS LA BANDERA DE INTERRUPCION
TMR0H = 155; // RECARGAMOS DE NUEVO EL VALOR DEL TEMPORIZADOR 155
}
void main(void)
{
SYSTEM_Initialize();
LED_SetLow();
__delay_ms(2000);
LED_SetHigh();
__delay_ms(2000);
// If using interrupts in PIC18 High/Low Priority Mode you need to enable the Global High and Low Interrupts
// If using interrupts in PIC Mid-Range Compatibility Mode you need to enable the Global Interrupts
// Use the following macros to:
// Enable the Global Interrupts
INTCON0bits.GIE=1; // HABILITACION INTERRUPCIONES GLOBALES
PIE3bits.TMR0IE = 1; // hABILITACION INTERRUPCION POR DESBORDAMIENTO DEL TMR0
T0CON0bits.EN =0; // TIMER DESABILITADO
T0CON0bits.MD16 = 0; //8 bit mode
T0CON0bits.OUTPS = 0; // POSTSCLAER 1:1
T0CON1bits.CS = 0b010; // CLOCK SOURCE FOSC/4
T0CON1bits.ASYNC = 0; //SINCRONIZED FOSC/4
T0CON1bits.CKPS = 0b0101; // PRESCALER 0b0101
TMR0H = 155; // CARGA VALOR PARA 62.5 US 16KHZ 155
TMR0L = 0; // MODO 8 BITS PARTE BAJA ES 0
__delay_ms(500);
Lcd_Init();
Lcd_Text("SensorLine16");
__delay_ms(2000);
Lcd_Clear();
T0CON0bits.EN =1; //HABILITA EL TIMER0
while (1)
{
Lcd_Set_Cursor(1,1); //POSICIONA EL CURSOR EN 1FILA 1 COLUMNA
for(int i = 0; i<16; i++){ //HACE UN BARRIDO DESDE 0 A 15 PARA MOSTRAR EN PANTALLA LOS VALORES DE LOS 16 SENSORES
if (data[i] == 0){ //SI DETECTA EL FONDO BLANCO LA PANTALLA MUESTRA UN CARACTER PIXELADO
Lcd_Write_Char(0xff);
}
else{
Lcd_Write_Char(' '); //SI DETECTA LA LINEA NEGRA LA PANTALLA MUESTRA UN ESPACIO EN BLANCO
}
}
//CALCULO DEL ERROR//
error = (data[0]*(-8)+data[1]*(-7)+data[2]*(-6)+data[3]*(-5)+data[4]*(-4)+data[5]*(-3)+data[6]*(-2)+data[7]*(-1)+data[8]*(1)+data[9]*(2)+data[10]*(3)+data[11]*(4)+data[12]*(5)+data[13]*(6)+data[14]*(7)+data[15]*(8));
sprintf(buffer,"%d",error);
Lcd_Set_Cursor(2,1);
Lcd_Text(" ");
Lcd_Set_Cursor(2,1);
Lcd_Text(buffer);
}
}data[cont-1]=PORTAbits.RA4;
un saludo
Gracias por la respuesta.La otra opción sería así:
Esto solamente pasa en las 2 primeras cuentas y no entiendo por que. Me explico, si el sensor fisicamente tiene una lectura de 01011, el array almacena 001011.
un saludo
escribir esto seria correcto?
data[cont-1]=PORTAbits.RA4;
el registro PORT segun datasheet es de 8 bits por lo que no deberia ocupar 2 bytes no?
el registro PORT segun datasheet es de 8 bits por lo que no deberia ocupar 2 bytes no?
Gracias por vuestra respuesta.
En el caso que me menciona DominusDRR, adjunto una imagen con lo que a mi me aparece, no veo el tamaño que asigna el compilador.
He probado a definir int8_t, int16_t y sigue desplazando el valor leido.
El caso que me dice el compañero Robert76, data[17], tampoco funciona.
un saludo
Hola buenos dias, estoy realizando un seguidor de linea con un array de 16 sensores multiplexados. Para realizar la lectura utilizo un un timer en el PIC18F57q43 (placa curiosity) en concreto1.6Khz.
En la funcion de interrupcion hago lo siguiente,:
Tengo una variable contador y otra variable data[16], la variable contador empieza en 0, cuando se ejecuta la primera interrupcion escribo por el puerto A (LATA = cont), la siguiente linea almaceno el valor del sensor (data[cont]=PORTAbits.RA4); y finalmente incremento con cont++.
Pues el problema biene cuando veo el debug y lo que me encuentro es que la primera lectura la guarda en las posiciones del array 0 y 1 y no se por que.
Porr ejemplo si tengo en los 3 primeros sensores 011, el software me alamcena en el array 0011, me desplaza una posicion los datos. (ver imagenes) sin embargo si escribo la lectura (data[cont-1]=PORTAbits.RA4), funciona correctamente.Código: [Seleccionar]#include "mcc_generated_files/mcc.h"
#include "LiquidCristalPIC.h"
#include <stdio.h>
#include <stdint.h>
//Main application
int cont = 0 ;
char data[16];
int error = 0;
char buffer[4];
void __interrupt() TMR_0 (){
if (PIR3bits.TMR0IF) {
if(cont == 16){
cont = 0; // CUANDO EL CONTADOR LLEGA A 16, ESTE SE PONE A 0
}
LATA = cont; //ESCRIBE POR EL PUERTO A EL NUMERO QUE REPRESENTA CONT
data[cont]=DATA_GetValue(); // GUARDA EL VALOR LEIDO EN LA POSICION CONT DEL ARRAY
cont ++; // AUMENTA EN UNO EL CONTADOR
}
PIR3bits.TMR0IF = 0; // BAJAMOS LA BANDERA DE INTERRUPCION
TMR0H = 155; // RECARGAMOS DE NUEVO EL VALOR DEL TEMPORIZADOR 155
}
void main(void)
{
SYSTEM_Initialize();
LED_SetLow();
__delay_ms(2000);
LED_SetHigh();
__delay_ms(2000);
// If using interrupts in PIC18 High/Low Priority Mode you need to enable the Global High and Low Interrupts
// If using interrupts in PIC Mid-Range Compatibility Mode you need to enable the Global Interrupts
// Use the following macros to:
// Enable the Global Interrupts
INTCON0bits.GIE=1; // HABILITACION INTERRUPCIONES GLOBALES
PIE3bits.TMR0IE = 1; // hABILITACION INTERRUPCION POR DESBORDAMIENTO DEL TMR0
T0CON0bits.EN =0; // TIMER DESABILITADO
T0CON0bits.MD16 = 0; //8 bit mode
T0CON0bits.OUTPS = 0; // POSTSCLAER 1:1
T0CON1bits.CS = 0b010; // CLOCK SOURCE FOSC/4
T0CON1bits.ASYNC = 0; //SINCRONIZED FOSC/4
T0CON1bits.CKPS = 0b0101; // PRESCALER 0b0101
TMR0H = 155; // CARGA VALOR PARA 62.5 US 16KHZ 155
TMR0L = 0; // MODO 8 BITS PARTE BAJA ES 0
__delay_ms(500);
Lcd_Init();
Lcd_Text("SensorLine16");
__delay_ms(2000);
Lcd_Clear();
T0CON0bits.EN =1; //HABILITA EL TIMER0
while (1)
{
Lcd_Set_Cursor(1,1); //POSICIONA EL CURSOR EN 1FILA 1 COLUMNA
for(int i = 0; i<16; i++){ //HACE UN BARRIDO DESDE 0 A 15 PARA MOSTRAR EN PANTALLA LOS VALORES DE LOS 16 SENSORES
if (data[i] == 0){ //SI DETECTA EL FONDO BLANCO LA PANTALLA MUESTRA UN CARACTER PIXELADO
Lcd_Write_Char(0xff);
}
else{
Lcd_Write_Char(' '); //SI DETECTA LA LINEA NEGRA LA PANTALLA MUESTRA UN ESPACIO EN BLANCO
}
}
//CALCULO DEL ERROR//
error = (data[0]*(-8)+data[1]*(-7)+data[2]*(-6)+data[3]*(-5)+data[4]*(-4)+data[5]*(-3)+data[6]*(-2)+data[7]*(-1)+data[8]*(1)+data[9]*(2)+data[10]*(3)+data[11]*(4)+data[12]*(5)+data[13]*(6)+data[14]*(7)+data[15]*(8));
sprintf(buffer,"%d",error);
Lcd_Set_Cursor(2,1);
Lcd_Text(" ");
Lcd_Set_Cursor(2,1);
Lcd_Text(buffer);
}
}
Agradeceria que alguien le echara un vistazo y me dijera que hay mal porque ya no se que puede ser. Enun procipio creia que era la pantalla lcd pero al ver el array en el debug lo descaré.
un saludo. Muchas gracias
Gracias a todos de nuevo, respecto a verificar el código ensamblador, tengo que decir que no tengo ni zorra idea de ensamblador.
La función que observa, Getvalue la genera MCC es equivalente a PORTAbits.RA4.
De que forma realizarían ustedes el código que he escrito, por si se me pasase algo por alto o no declarase bien alguna variable.
Lo que no me explico es que dean la posición 0 y 1, las 14 restantes las guarda corelativamente.
Gracias, un saludo