TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: GusTor en 01 de Abril de 2022, 10:47:42
-
Hola a todos, alguien me podria indicar si lo resolvio para que funcionen como salidas los pines RD4 a RD7 en el pic 18f45k80, ya probe de todo, quizas se me pasa algun FUSE, estoy usando CCS, lo estoy usando en 64MHz y lo utilizo en placas que ya utilizaban el 18F4620, tambien ya probe escribir cada pin con output_high(...) y escribir directo cada pin del port, los otros pines si me funcionan. Gracias de antemano por alguna data
-
Hola a todos, alguien me podria indicar si lo resolvio para que funcionen como salidas los pines RD4 a RD7 en el pic 18f45k80, ya probe de todo, quizas se me pasa algun FUSE, estoy usando CCS, lo estoy usando en 64MHz y lo utilizo en placas que ya utilizaban el 18F4620, tambien ya probe escribir cada pin con output_high(...) y escribir directo cada pin del port, los otros pines si me funcionan. Gracias de antemano por alguna data
Una pregunta ¿Qué es lo que estás tratando de activar o controlar con los terminales RD4 y RD7?
-
Esos pines los utilizo para un lcd de caracteres,necesito como salida todo el port D, para probar le puse una R de 1K y en el osciloscopio aparecen pulsos de algunos microsegundos, no lo llegue a capturar, pareciera como si tienen otra funcion por defecto, me lei la hoja de datos 18f66k80, pero no encontre nada...Una cosa a tener en cuenta, el pin RB2 tampoco me funcionaba como salida y puse el Fuse CANC y ahi si me anduvo y me dejo de andar RC7, con lo cual intui que la utiliza para la recepcion cel CAN, pero necesito que casi todos los pines sean salida y no lo logro
-
Esos pines los utilizo para un lcd de caracteres,necesito como salida todo el port D, para probar le puse una R de 1K y en el osciloscopio aparecen pulsos de algunos microsegundos, no lo llegue a capturar, pareciera como si tienen otra funcion por defecto, me lei la hoja de datos 18f66k80, pero no encontre nada...Una cosa a tener en cuenta, el pin RB2 tampoco me funcionaba como salida y puse el Fuse CANC y ahi si me anduvo y me dejo de andar RC7, con lo cual intui que la utiliza para la recepcion cel CAN, pero necesito que casi todos los pines sean salida y no lo logro
Hice la pregunta, porque parece que el puerto D no puede suministrar o recibir (siendo salida) mucha corriente. tal vez sea ese tu problema.
-
Igualmente estoy midiendo las salidas sin carga, con el osciloscopio,genere una cuadrada en el portd y mido cada pin sin carga, funcionan los pines RD0 a RD3 pero nada en RD4 a RD7
-
Igualmente estoy midiendo las salidas sin carga, con el osciloscopio,genere una cuadrada en el portd y mido cada pin sin carga, funcionan los pines RD0 a RD3 pero nada en RD4 a RD7
Deberías compartir la configuración de los terminales para determinar si algo te falta o algo está demás.
-
Si ok, ahi va:
set_tris_b(0);
set_tris_d(0);
//lcd
output_low(lcd_rs_tris);
output_low(lcd_e_tris);
output_low(D0_tris);
output_low(D1_tris);
output_low(D2_tris);
output_low(D3_tris);
output_low(D4_tris);
output_low(D5_tris);
output_low(D6_tris);
output_low(D7_tris);
y declarados como bits en un h :
#bit D0 = portd.0
#define D0_tris PIN_D0
#bit D1 = portd.1
#define D1_tris PIN_D1
#bit D2 = portd.2
#define D2_tris PIN_D2
#bit D3 = portd.3
#define D3_tris PIN_D3
#bit D4 = portd.4
#define D4_tris PIN_D4
#bit D5 = portd.5
#define D5_tris PIN_D5
#bit D6 = portd.6
#define D6_tris PIN_D6
#bit D7 = portd.7
#define D7_tris PIN_D7
nuevamente aclaro que los demas pines me funcionan bien solo RD4, RD5 RD6 y RD7 no me funcionan como salida, ayer estuvetodo el dia probando, despues retomo a seguir buscando en el datasheet, pero si a alguno le paso, me sirve que me tiren algun dato
-
Si ok, ahi va:
set_tris_b(0);
set_tris_d(0);
//lcd
output_low(lcd_rs_tris);
output_low(lcd_e_tris);
output_low(D0_tris);
output_low(D1_tris);
output_low(D2_tris);
output_low(D3_tris);
output_low(D4_tris);
output_low(D5_tris);
output_low(D6_tris);
output_low(D7_tris);
y declarados como bits en un h :
#bit D0 = portd.0
#define D0_tris PIN_D0
#bit D1 = portd.1
#define D1_tris PIN_D1
#bit D2 = portd.2
#define D2_tris PIN_D2
#bit D3 = portd.3
#define D3_tris PIN_D3
#bit D4 = portd.4
#define D4_tris PIN_D4
#bit D5 = portd.5
#define D5_tris PIN_D5
#bit D6 = portd.6
#define D6_tris PIN_D6
#bit D7 = portd.7
#define D7_tris PIN_D7
nuevamente aclaro que los demas pines me funcionan bien solo RD4, RD5 RD6 y RD7 no me funcionan como salida, ayer estuvetodo el dia probando, despues retomo a seguir buscando en el datasheet, pero si a alguno le paso, me sirve que me tiren algun dato
Creo que debes ocupar LAT para utilizar un puerto como salida. PORT se utiliza para entradas.
-
Si ok, ahi va:
set_tris_b(0);
set_tris_d(0);
//lcd
output_low(lcd_rs_tris);
output_low(lcd_e_tris);
output_low(D0_tris);
output_low(D1_tris);
output_low(D2_tris);
output_low(D3_tris);
output_low(D4_tris);
output_low(D5_tris);
output_low(D6_tris);
output_low(D7_tris);
y declarados como bits en un h :
#bit D0 = portd.0
#define D0_tris PIN_D0
#bit D1 = portd.1
#define D1_tris PIN_D1
#bit D2 = portd.2
#define D2_tris PIN_D2
#bit D3 = portd.3
#define D3_tris PIN_D3
#bit D4 = portd.4
#define D4_tris PIN_D4
#bit D5 = portd.5
#define D5_tris PIN_D5
#bit D6 = portd.6
#define D6_tris PIN_D6
#bit D7 = portd.7
#define D7_tris PIN_D7
nuevamente aclaro que los demas pines me funcionan bien solo RD4, RD5 RD6 y RD7 no me funcionan como salida, ayer estuvetodo el dia probando, despues retomo a seguir buscando en el datasheet, pero si a alguno le paso, me sirve que me tiren algun dato
Creo que debes ocupar LAT para utilizar un puerto como salida. PORT se utiliza para entradas.
Es decir algo así:
-
Ayer lo probe y nada, por eso creo que es de los Fuses, alguna funcion por defecto de esos pines
-
Ayer lo probe y nada, por eso creo que es de los Fuses, alguna funcion por defecto de esos pines
me imagino que también estás desactivando las entradas como analógicas y comparadores que puedan poseer los terminales que tienes problemas ¿verdad?
-
Le puse esto
setup_adc_ports(NO_ANALOGS);
pero de comparadores no vi, lo que si quise usar la funcion para apagar la transmision pero me dio error, lo saque de 18f45k80.h
////////////////////////////////////////////////////////////////// UART
// UART Prototypes:
_bif void setup_uart(int32 baud);
_bif void setup_uart(int32 baud, int8 stream);
_bif void setup_uart(int32 baud, int8 stream, int32 clock);
_bif void set_uart_speed(int32 baud);
_bif void set_uart_speed(int32 baud, int8 stream);
_bif void set_uart_speed(int32 baud, int8 stream, int32 clock);
// Constants used in setup_uart() are:
// FALSE - Turn UART off
// TRUE - Turn UART on
#define UART_ADDRESS 2
#define UART_DATA 4
#define UART_AUTODETECT 8
#define UART_AUTODETECT_NOWAIT 9
#define UART_WAKEUP_ON_RDA 10
#define UART_SEND_BREAK 13
En teoria si le paso un false o cero a la funcion deberia apagar la transmision, pero me dio error cuando la llamo, despues voy a ver el bit de que registro la apaga, en los fuses no encontre nada
Ahora busco de los comparadores a ver si encuentro algo
-
A mi también me ha pasado, tienes que usar los reg. LAT.
Yo los defino a mano (#Byte LATD dirección) tanto el Byte como sus bit asociados, y lo mismo hago con sus respectivos registros ANSEL.
Bueno yo uso el PIC18F46k22 que imagino que será igual.
-
Acabo de probar esto:
#byte LatD = 0xf8c esto lo defino en el h
bit_set(LatD,4);
bit_set(LatD,5);
bit_set(LatD,6);
bit_set(LatD,7);
-
Acabo de probar esto:
#byte LatD = 0xf8c esto lo defino en el h
bit_set(LatD,4);
bit_set(LatD,5);
bit_set(LatD,6);
bit_set(LatD,7);
Me falto poner que no funciono
-
Deberías publicar un código de prueba completo, porque en la simulación anda lo mas bien.
#include<18F45k80.h>
#byte LatD = 0xf8c
void main(void){
set_tris_d(0x0) ;
bit_set(LatD,4);
bit_set(LatD,5);
bit_set(LatD,6);
bit_set(LatD,7);
while(1);
}
-
Lo siento pero no uso esas sentencias.
Si quiere probar lo siguiente:
#Byte ANCON0 = 0xF5D
#Byte ANCON1 = 0xF5C
#Byte TRISD = 0xF95
#Byte PORTD = 0xF83
#Byte LATD = 0xF8C
#BIT LATD_0 = LATD.0
#BIT LATD_1 = LATD.1
#BIT LATD_2 = LATD.2
#BIT LATD_3 = LATD.3
#BIT LATD_4 = LATD.4
#BIT LATD_5 = LATD.5
#BIT LATD_6 = LATD.6
#BIT LATD_7 = LATD.7
//NO ANALOGICAS
ANCON0 = 0;
AMCON1 = 0;
//PORTD SALIDAS
TRISD = 0;
//PIN D6 Y D7 A 1
LATD_6 = 1;
LATD_7 = 1;
PD: por supuesto D6 y D7 no deben de estar asignados a un modulo usart.
-
Buenas, queria decirles que acabo de crear un proyecto de cero solo con esto y funciona bien el portD como salida, vere porque no me funciona en el proyecto que usaba el 18f4620, pero me quedo tranquilo que si pueden funcionar como salidas, quizas siga consultando por el proyecto que no me funciona a ver porque es, uso timers y entrada AD pero estan deshabilitadas, desde que no me funciono deshabilite todo
Esto si funciono...
#include <18f45k80.h>
#include "def18f.h"
el def18.h :
//Puertos
#byte porta = 0xf80
#byte trisa = 0xf92
#byte portb = 0xf81
#byte trisb = 0xf93
#byte portc = 0xf82
#byte trisc = 0xf94
#byte portd = 0xf83
#byte trisd = 0xf95
#byte porte = 0xf84
#byte trise = 0xf96
#byte LatD = 0xf8c
#byte ANCON0 = 0xf5d
#byte ANCON1 = 0xf5c
hasta aca el def
Aca el .c :
#device ADC=8,HIGH_INTS=TRUE //Conversion AD de 8 bits, prioridad de ints habilitada
#FUSES PLLEN,INTRC_HP,INTRC_IO,NOIESO,CANC,NOWRTC,NOWRTB,NOEBTR,NOEBTRB
#FUSES NOWDT,NOFCMEN //2
#FUSES NOMCLR //3
//#FUSES NOSTVREN,BBSIZ2K,NODEBUG //4
#FUSES PROTECT//,NOCPB,NOCPD //5
//#FUSES NOWRT,NOWRTC,NOWRTB,NOWRTD, //6
//#FUSES NOEBTR,NOEBTRB //7
#use delay(clock=64000000)
void main(void){
setup_oscillator(OSC_16MHZ|OSC_PLL_ON);
set_tris_d(0x0) ;
do{
bit_set(LatD,0);
bit_set(LatD,1);
bit_set(LatD,2);
bit_set(LatD,3);
bit_set(LatD,4);
bit_set(LatD,5);
bit_set(LatD,6);
bit_set(LatD,7);
delay_ms(100);
bit_clear(LatD,0);
bit_clear(LatD,1);
bit_clear(LatD,2);
bit_clear(LatD,3);
bit_clear(LatD,4);
bit_clear(LatD,5);
bit_clear(LatD,6);
bit_clear(LatD,7);
delay_ms(100);
}while(1);
-
Ya descubri porque no funcionan los pines RD4 a RD7, usando la funcion output_high(Port.Pin) para configurar como salida, no funcionan pero solo los pines RD4 a RD7
Usando la funcion set_tris_d(0) ahi si, a mi no me funciono porque hice el tris antes de que tenia hecho el output_high y otuput_low
Si bien las funciones output_high y output_low se supone que configuran como salidas al pin pasado como parametro, se ve que el asembler generado por el CCS no funciona bien en todos los casos
Asi que queria agradecerles por las sugerencias a quienes se molestaron en investigar, fueron de ayuda
-
...o, se ve que el asembler generado por el CCS no funciona bien en todos los casos
No me sorprende...
-
Me alegro que te funcione, llevo muchos años usando el CCS y una vez que te adaptas a el va bien.