TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: japifer_22 en 24 de Mayo de 2010, 22:02:20
-
hola otra vez, bueno les comento que debido a las limitaciones que me encuentro con el o los pic 16f me he tenido que decidir por aprender a programar los pic de la serie 18f (yo estoy utilisando uno 18f4550), en lenguaje C.
bueno esto es debido a que quiero medir 2 señales con los timer, y las interrupciones externa , provenientes de un receptor RC futaba, ya que quiero medir el tiempo en alto de estas señales.
bueno, vamos al grano, lo que quiero es que me orienten para poder medir estas 2 señales, yo ya he podido medir una de ellas con el timer1 por RB0, pero lo que no se es como tengo que configurar ahora el timer0 para poder medir la segunda señal, bueno esto es porque el timer0 se puede configurar a 8 ó 16 bit, y esto es lo que no sé cómo se hace.
además quería que me dijesen como hago para visualizar un dato en una LCD de 2x16 en el puerto D del PIC 18f4550, ademas de como seria su conexion en este puerto.
saludos!
-
Si estas usando CCs, ya la Lcd viene predeterminada al puerdo D
-
Hola, para configurar el timer0 como de 16 bits debes abrir el archivo p18f2550.h. Ahí vienen los defines para configurarlo correctamente.
De la misma forma, para la LCD, debes leer el archivo lcd.c y analizar los defines para configurarla. Ahí viene el pinout de la lcd para puerto B o D.
-
hola, voy a ver lo que me disen, aver si saco algo de esto, pero la duda que igual tengo, es que la LCD se conecta de la misma forma que en las de los 16f ??
-
hola, voy a ver lo que me disen, aver si saco algo de esto, pero la duda que igual tengo, es que la LCD se conecta de la misma forma que en las de los 16f ??
Sí. El archivo lcd.c detalla eso. ;-)
-
Sí. El archivo lcd.c detalla eso. ;-)
Tambien puedes buscar la Flex_Lcd.c con eso = puedes definir los puntos de control de la LCD
-
hola, e echo un codigo, en el cual no me esta funcionando la lcd y no se porque, queria ver si me pueden echar una mano con esto, como digo lo puse en el puerto D del pic. con la siguiente conexion:
// D0 enable
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7
bueno mi codigo es el que sigue:
#include <18f4550.h>
#device adc=10 // Conversión con 10 bits
#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN
#use delay(clock=4000000)
#define LCD_DATA_PORT getenv("SFR:PORTD") // declaro usar el portb para el control del lcd
#include <lcd.c> //libreria manejo lcd de 20x4 modificada por suky para el puerto D
#use standard_io(A)
#use standard_io(C)
#use standard_io(E)
////////////////////////////////////////////////////////////////////////////////////
//
// Defines de funciones
//
////////////////////////////////////////////////////////////////////////////////////
void lastre_piston(void);
void inclinasion_submaniro(void);
////////////////////////////////////////////////////////////////////////////////////
//
// Defines y Constantes
//
////////////////////////////////////////////////////////////////////////////////////
float const uSxTick = 0.1; // Microsegundos por Tick de TMR1 a 4 Mhz
////////////////////////////////////////////////////////////////////////////////////
//
// Variables en RAM
//
////////////////////////////////////////////////////////////////////////////////////
int1 flagToggleFlanco=0; // Flag para cambiar de flanco
int16 t1=0x00,t2=0x00,tt=0x00; // Variables para guardar estados de ...
float st=0.0; // TMR1 en cada flanco y hacer la resta
int1 flagHayDatos=0; // Flag para indicar que ya hay datos de ..
// dos flancos (de subida y bajada)
int1 flagHayTransmitir=0; // Flag para indicar que hay datos para ...
// Transmitir al PC.
int16 a; //variables para el PWM
float b;
int k=0,m=0;
////////////////////////////////////////////////////////////////////////////////////
//
// Interrupción por Externa por Cambio de Flanco en RB0
//
////////////////////////////////////////////////////////////////////////////////////
#int_ext
void handle_ext_int(){
if(flagToggleFlanco==0){ // He recibido Flanco de Subida
t1=get_timer1(); // Guardo en t1 el valor de TMR1 al Flanco de Subida
ext_int_edge(0,H_TO_L); // Configuro para capturar siguiente flanco de Bajada
flagToggleFlanco=1; // Indico que el siguiente flanco será de Bajada
} else { // He recibido Flanco de Bajada
t2=get_timer1(); // Guardo en t2 el valor de TMR1 al Flanco de Bajada
ext_int_edge(0,L_TO_H); // Configuro para capturar siguiente flanco de subida
flagToggleFlanco=0; // Indico que el siguiente flanco será de Subida
set_timer1(0); // Reinicio TMR1
if(flagHayDatos==0){ // Si los datos anteriores han sido procesados ...
flagHayDatos=1; // Indico que ya hay nuevos datos de flancos para calcular
}
}
}
void main() {
lcd_init(); //inicializa lcd
////////////////////////////////////////// INICIALIZACIONES GENERALES
delay_ms(333); // Espero a que todo se estabilice e ...
disable_interrupts(global); // Inicializo el Micro y ...
disable_interrupts(int_timer1); // deshabilitando todo lo no necesario ...
disable_interrupts(int_ext);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
delay_ms(333);
/////////////////////////////////////////// INICIALIZACIONES PERTINENTES A LA APLICACION
ext_int_edge(0,L_TO_H); // Configuro captura de 1er flanco de subida
flagToggleFlanco = 0; // inicializo el Flag para cambiar de flanco
enable_interrupts(int_ext);
enable_interrupts(global);
setup_ccp1(CCP_PWM); //ccp1 modo PWM
setup_timer_2(T2_DIV_BY_1, 49, 1);
// Configuramos entradas analogicas:
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
// Tomamos las medidas
set_adc_channel(0);
output_low(PIN_C3);
output_low(PIN_C4);
lastre_piston();
a=20; // punto medio del duty de 10 bits
set_pwm1_duty(a);//duty cycle con una variable para variar el PWM
do {
if(k==1 && m==1){
inclinasion_submaniro();
}
if(flagHayDatos==1){ // Detecto que ya hay datos de flancos ...
if(t2 > t1){ // Compruebo que estoy en la misma vuelta de TMR1
tt = t2 - t1; // Calculo en Tick's de TMR1 el tiempo entre flancos
st = uSxTick * tt; // Calculo en uS el tiempo.
flagHayTransmitir=1; // Indico que tengo nuevo valor para transmitir
}
flagHayDatos=0; // Indico que ya han sido procesados los datos.
}
/*
if(Command!=0x00){ // Si he recibido un comando vía Serie ...
if(Command=='T'){ // Si el comando es 'T' (Transmite) ...
if(flagHayTransmitir==1){ // Si hay algo pendiente de transmitir ...
printf("Ticks %Lu - %Lu = %Lu = %3.1fuS \r\n",t2,t1,tt,st);
flagHayTransmitir=0; // Indico que ya he transmitido lo pendiente.
}
}
Command=0x00; // Indico que ya he procesado el comando.
}
*/
set_pwm1_duty(a);//duty cycle con una variable para variar el PWM
/////////////////////////////////////////// COMANDO PARA VARIAR EL PWM
b=a;
lcd_gotoxy(1,1);
printf(lcd_putc,"PWM=%f",b);
lcd_gotoxy(1,2);
printf(lcd_putc,"Ticks =%3.1fuS",st);
if(st>=107.4 && st<=174){
output_high(PIN_C3);
a=((175-st)*2.96)+1;
}
else{
output_low(PIN_C3);
}
if(st>=180 && st<=196.8){
output_high(PIN_C4);
a=((st-180)*(198/16))+1;
}
else{
output_low(PIN_C4);
}
} while (TRUE); //...CICLO INFINITO...........
}
////////////////////////////////////////////////////////////////////////////////////
//
// Funcion para poner lastres a piston a su 50% de su recorrido
//
////////////////////////////////////////////////////////////////////////////////////
void lastre_piston(void){
////////////////////////////////////////////////////////////////////////////////////
//
// Variables en RAM
//
////////////////////////////////////////////////////////////////////////////////////
int h=0,i=0,z=0,x=0;
float g=0,j=0;
while(TRUE){
////////////////////////////////////////////////////////////////////////////////////
// Control lastre 1
////////////////////////////////////////////////////////////////////////////////////
if(input(PIN_B5) && h==0){ //detecta que no este a su 100% el recorrido del piston
output_high(PIN_B6); //activo la reversa del piston para dejarlo al 100% del recorrido (puente H)
output_low(PIN_B7); //desactivo el avance del piston para que retroceda (puente H)
}
else if(!input(PIN_B5) && h==0){ //detecta que el piston esta al 100% del recorrido...
g=2292; //pulsos que generado al 100% del recorrido por C0
h=1; //vandera para poner el piston al 50% de su recorrido
output_low(PIN_B6); //desactivo la reversa del piston (puente H)
output_low(PIN_B7); //desactivo el avance del piston (puente H)
delay_ms(100); //tiempo de espera antes de poner el piston al 50%
}
if(h==1 && g>1146){ //detecta que el piston todavia es mayor al 50% de su recorrido
output_low(PIN_B6); //desactivo la reversa del piston (puente H)
output_high(PIN_B7); //activo el avance del piston para dejarlo al 50% (puente H)
if(!input(PIN_C0)){ //contador de pusos invalidos y tiempo presionado el boton
z++; //contador de revotes
}
else{ //se solto el boton de conteo
if(z>0){ g=g-1; //decremento g para saver cuando llega al 50% (1146) el piston
z=0;
}
}
}
else if(h==1 && g<=1146){ //detecta que el piston esta al 50% y desactiva el puente H
output_low(PIN_B6); //desactivo la reversa del piston (puente H)
output_low(PIN_B7); //desactivo el avance del piston (puente H)
k=1; //vandera que indica que el lastre esta a 50%
}
lcd_gotoxy(1,1);
printf(lcd_putc,"M1 %f %i",g,h);
////////////////////////////////////////////////////////////////////////////////////
// Control lastre 2
////////////////////////////////////////////////////////////////////////////////////
if(input(PIN_B1) && i==0){ //detecta que no este a su 100% el recorrido del piston
output_high(PIN_B2); //activo la reversa del piston para dejarlo al 100% del recorrido (puente H)
output_low(PIN_B3); //desactivo el avance del piston para que retroceda (puente H)
}
else if(!input(PIN_B1) && i==0){ //detecta que el piston esta al 100% del recorrido...
j=2256; //pulsos que generado al 100% del recorrido por B4
i=1; //vandera para poner el piston al 50% de su recorrido
output_low(PIN_B2); //desactivo la reversa del piston (puente H)
output_low(PIN_B3); //desactivo el avance del piston (puente H)
delay_ms(100); //tiempo de espera antes de poner el piston al 50%
}
if(i==1 && j>1128){ //detecta que el piston todavia es mayor al 50% de su recorrido
output_low(PIN_B2); //desactivo la reversa del piston (puente H)
output_high(PIN_B3); //activo el avance del piston para dejarlo al 50% (puente H)
if(!input(PIN_B4)){ //contador de posicion del piston
x++; //contador de revotes
}
else{ //se solto el boton de conteo
if(x>0){ j=j-1; //decremento j para saver cuando llega al 50% (1146) el piston
x=0;
}
}
}
else if(i==1 && j<=1128){ //detecta que el piston esta al 50% y desactiva el puente H
output_low(PIN_B2); //desactivo la reversa del piston (puente H)
output_low(PIN_B3); //desactivo el avance del piston (puente H)
m=1; //vandera que indica que el lastre esta al 50%
}
lcd_gotoxy(1,2);
printf(lcd_putc,"M2 %f %i",j,i);
if(k==1 && m==1){
break;
}
}}
////////////////////////////////////////////////////////////////////////////////////
//
// Funcion para dejar el submarino equilibrado
//
////////////////////////////////////////////////////////////////////////////////////
void inclinasion_submaniro(void){
int16 Valor; // para 10 bits
float resolucion= 5.0/1024.0; // Conversión con 10 bits
float inclinacion=0;
int p;
for(p=0;;p++){
Valor=read_adc();//almacena el valor de medicion
inclinacion= valor * resolucion; //convierte de resolucion de 10bit a numeros
lcd_gotoxy(1,1);
printf(lcd_putc,"%f voltios", inclinacion );
if(inclinacion>=2.49 && inclinacion<=2.51){
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B6);
output_low(PIN_B7);
k=0;m=0;
break;
}
else{
if(inclinacion>2.51){
output_low(PIN_B2);
output_high(PIN_B3);
output_high(PIN_B6);
output_low(PIN_B7);
}
else if(inclinacion<2.49){
output_high(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B6);
output_high(PIN_B7);
}
}
}}