TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Correia en 09 de Octubre de 2011, 23:04:49
-
buenas noches ysaludos a toda la comunidad de todopic, la presente es para preguntar una pequeña pregunta para la comunicacion rs232 (casi usart) se usa la libreria predefinida:
"#use rs232 (opciones)..
ahora en los ejemplos que he visto esta libreria es solo para los pic16f8xx y pic18fxxx?
ya que veo que esos micros tienen el RX y TX en RC6y RC7, execto el pic16f628a (el que uso apra practicar), lo tiene en el RB2 Y RB1, es decir que esa libreria predefinida no me sirve con el pic16f628a, xq supongo que en su configuracion reconoce es PIN_C6 y PIN_C7, espero su respuesta.
-
Si no pones los pines, la sentencia #use rs232 utilizará los de la usart por defecto del PIC, allí donde estén.
Si quieres usar otros pines, puedes definir los que tú quieras usando los parámetros xmit y rcv como en este ejemplo.
#use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3)
-
creo que si declaras tu los pines utilizas el usart por software, y lo ideal es usar el hardware, ya que para algo lo tiene :)
-
Si los declaras y coinciden con los pines hardware, los usa por hardware. CCS sólo hace la emulación software si no coinciden.
-
#include <16F628A.h>
#use delay(clock=4000000)
#define TX PIN_B2
#define RX PIN_B1
#use RS232(BAUD=9600, XMIT=PIN_B2, RCV=PIN_B1, PARITY=N, BITS=8)
#fuses PUT, NOWDT, INTRC_IO, MCLR
#byte TRISA = 0x85
#byte PORTA = 0x05
#byte TRISB = 0x86
#byte PORTB = 0x06
#byte CMCON = 0x1F
void main (){
int8 i;
CMCON=0x07;
TRISA=0x01;
PORTA=0x00;
bit_set(TRISB,1);
bit_clear(TRISB,2);
while (1){
for(i=0;i<=10;i++){
putc(i);
delay_ms(1000);
}
}
}
buenas yo de nuevo muchachos veran, estoy simulando esa programacion en proteus con el instrumento virtual "virtual terminal" para que me muestre los numeros, pero cuando arranco no muestra nada, =s y tengo bien conectado todo el RX del virtual terminal con el TX del pic, y el RX del pic con el TX de virtual terminal, en assembler lo hice y si me funciona y ahora que quiero probar C por la simplicidad no funciona =s ayuda!!
-
nocturno no comprendo mucho esa parte de hadware y software me la explicas un poco mas?
-
Es simple: el pic que has elegido tiene los pines TX y RX en B2 y B1 respectivamente.
Eso significa que el hardware de tu micro incorpora una USART conectada en esos pines para la gestión de las comunicaciones serie.
En tu programa declaras expresamente el uso de esos pines, y por tanto usarás dicho hardware. De hecho, te podrías haber ahorrado colocar los pines porque son los que usa por defecto.
Sin embargo, podrías haber puesto cualquier otro par de pines y también funcionaría, aunque las comunicaciones serie serían gestionadas por el propio proceso del microcontrolador, ocupando tiempo de proceso y de programa.
-
entiendo, entocnes por que cuando conecto el virtual terminal como debe ser a esos pines y corro el programa no me muestra los numeros =s.
-
Clickea sobre el virtual terminal y coloca Hexadecimal y veras los datos enviados. Sino tienes que enviar caracteres ASCII.
Saludos!
-
dios dame calma, le doy click al virtual y no hay ninguna opcion para poner hexadecimal, cambie por enviar un caracter asscii y no aparece, cuando arranca aparece en rojo el pin RX, TX , RTS del virtual terminal
-
los has conectado cruzado?? el RX del pic al TX del terminal, y el TX del pic al RX del terminal
-
si señor y ahora pruebo con la que programe en asm que me funciono y simulo en proteus hace 2 dias y no funciona no se si es cosa del virtual terminal
-
claro yo estoy conectando directo los pines del pic a los del virtual terminal, ya que en otra ocasion me corrio con el programa de asm que programe y ahora no, x.x en el proteus I hata that.
-
dios dame calma, le doy click al virtual y no hay ninguna opcion para poner hexadecimal, cambie por enviar un caracter asscii y no aparece, cuando arranca aparece en rojo el pin RX, TX , RTS del virtual terminal
:? Al colocar Start o Run, aparece la ventana del virtual terminal, en esa ventana click derecho, Hex Display Mode ;-)
También podes colocarle un osciloscopio a la linea para ver que pasa, ejecutarlo paso a paso, etc......
Saludos!
-
ahora si funciona que cosas no x.x gracias suky, oye suky no tendras un ejemplo d como usar el hyperterminal con el proteus para recibir y enviar informacion me gustaria hacer esa practica.
-
ahora si funciona que cosas no x.x gracias suky, oye suky no tendras un ejemplo d como usar el hyperterminal con el proteus para recibir y enviar informacion me gustaria hacer esa practica.
Hay que buscar en el foro ;-)
-
tengo un problema, gracias a ustedes corre la simulacion del virtual terminal, ahora me puse a comunicar dos pic, uno es transmisor y el otro receptor, el receptor tiene 4 leds conectados desde RA0-RA3 para mostrar los numero en binario que le transmitira el pic transmisor, los numeros seran del 1-10 y se repitira el ciclo, la cosa es que le puse un interruptor al pic transmisor para que cuando no se pase el interruptor no mande ningun dato, pero al simular el interruptor no lo he pasado y se ve el pic recpetor mostrando 3 leds prendidos O.O y eso que no pase el interruptor que podria ser? la programacion es esta:
PROGRAMACION DEL PIC TRANSMISOR POR MEDIO USART
...............................
...............................
void main (){
int valor;
bit_set(TRISA,0);
porta=0x00;
while(1){
if (bit_test(PORTA,0)==0){
for (valor=0;valor<=10;valor++){
putc(valor);
delay_ms(1000);}
}
}
}
-
Y el código del receptor?
-
este es el del receptor, la recepcion la hice por interrupciones.
#include <16F628A.h>
#use delay(clock=4000000)
#define TX PIN_B2
#define RX PIN_B1
#use RS232(BAUD=9600, XMIT=PIN_B2, RCV=PIN_B1, PARITY=N, BITS=8)
#fuses PUT, NOWDT, INTRC_IO, MCLR
#byte TRISA = 0x85
#byte PORTA = 0x05
#byte TRISB = 0x86
#byte PORTB = 0x06
#byte CMCON = 0x1F
int8 valor;
#INT_RDA
RDA_isr(){
valor=getc();
}
void main (){
CMCON=0x07;
TRISA=0x00;
PORTA=0x00;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(1){
PORTA=valor;
}
}
-
Inicializa la variable a 0 para asegurarte. Después funciona correctamente?
-
suky lo arregle de esta forma y funciona
#include <16F628A.h>
#use delay(clock=4000000)
#define TX PIN_B2
#define RX PIN_B1
#use RS232(BAUD=9600, XMIT=PIN_B2, RCV=PIN_B1, PARITY=N, BITS=8)
#fuses PUT, NOWDT, INTRC_IO, MCLR
#byte TRISA = 0x85
#byte PORTA = 0x05
#byte TRISB = 0x86
#byte PORTB = 0x06
#byte CMCON = 0x1F
int8 valor;
#INT_RDA
RDA_isr(){
valor=getc();
PORTA=valor;
}
void main (){
CMCON=0x07;
TRISA=0x00;
PORTA=0x00;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(1){
}
}
pero aun hay algo que no logro hacer como en assembler suky no se si pueda ayudarme vos debe saber por que tiene mas experiencia programando en lenguaje C
-
algo que no logro es, cuando paso el interruptor comienza a mandar al informacion al pic recpetor y este la muestra en los leds, pero yo quiero que cuando lo pase, y al momento le de denuevo al interruptor para que este abierto, el deje de pasar la informacion y se quede mostrando el leds receptor lo ultimo que mostro, en assembler lo logre pero en C no se como.