Comunicación serial con Visual Basic 2008

Hola META en las espicaciones de antes y en programa que me propongo hace era para encender
y apagar luces ò cuarpuier cosa desde el ordenador y desde el micro.Cuando te dije que habia
hecho una mezcla del rs_10 y 11 me referia a detertar una entrada tal y como el rs10 por lo tanto esa configuracion puede serbir como sistema de alarma ya que al detectarte por ejem una
puerta que se abre te lo indicaria en el interfaz tambien hice otro programita para el micro que
iria instalado junto al ordenador que al recibir el mensaje el mensaje del micro de la puerta activase un pito.pero claro sigo en las mismas e mirado en varios libros y no veo nada (mas vien
quiero decir que no se verlo) doy por supuesto que lo explicara pero con palabras que yo por ahora no entiendo.seguiremos buscando gracias PEPE
 
Hola:

Esa idea es la que quiero hacer pero no me funcionaba ni a la de tres hace tiempo. Es decir, las dos cosas al mismo tiempo, al menos en el PIC16F887 de 40 pines.

Por ahora lo he dejado estancado sólo que funcione como salida o sólo como entrada. No me sale bien las dos cosas.

En el LCD 20x4, debe aparecer los números de los relés. Los 0 y 1 son los datos en este caso de salida. No me sale lo de entrada y que funcione. También quiero hacer la mezcla del 10 y 11, cosa que no me ha salido todavía.

rs232-lcd-18589.png


Ver zoom

En mi caso se me hace corto un PIC de 40 pines, quiero lo justo para hacer funcionar:

- 8 Entradas digitales. (Pulsadores).
- 8 Salidas digitales a relés.
- Salidas digitales mediante ooptoacopladores si sobran.
- Algunas entradas analógicas si es posible.
- LCD 20x4.
- Interfaz hecho con los tres lenguajes de Visual Studio .net Express 2010. Puede que hasta con VB 6 por puerto serie RS232.
- Opción de conectar RS232 por radio frecuencia, es lo mismo pero sin cables.
- Ya se me ocurrirá más cosas.


Lo mínimo de lo mínimo más mínimo que deseo si la cosa se me complica, es usar 8 entradas y 8 salidas digitales controlado con botones como dices y control por Visual Studio.

Saludo.
 
Última edición:
Hola META ahora me pongo a hacer un progama que haga eso que dices espero sea ese despues me dices
gracias pepe

Hola META en cuanto dices 8 entradas digitales (pulsadores) no funciona bien dado que solo dispone de 4
interrupciones de porb4-a-7 y para que funcione bien con pulsadores tiene que ser por interrupciones ahora
me pongo a hacer algo pepe

Hola Heta este programa es el que utilizo para gobernar las luces desde el ordenador y desde el micro unicamentene cabiado los mensajes que el pic manda al PC donde dice "A" decia
cuarto_1 encendido.
despues me pongo para hacer el 10-11 asta luego pepe



;*********************************RS232_INICIO-CLAVE.asm **************************************
;Sistema de govierno desde el ordenador o desde el mismo puesto ademas utiliza claves para poner asta 8 micros con las mismas siglas A,B,C,D solo cambia que antes de la letra hay que
poner la direccion "000A" "000B" "000C" "000D" para el 1º micro para el2º "001A" "001B y asi
hasta los ocho por supuesto en binario



; ==================================================================.
;
; ZONA DE DATOS **********************************************************************

LIST P=16F84
INCLUDE <P16F84.INC>
H'3FF1'

CBLOCK 0x0C
TeclaPulsada ; Va a guardar el contenido de la tecla pulsada.
MensajeApuntado ; Va a guarda la dirección del mensaje apuntado.
ENDC


#DEFINE Pulsa4 PORTB,7
#DEFINE Pulsa3 PORTB,6
#DEFINE Pulsa2 PORTB,5
#DEFINE Pulsa1 PORTB,4
#DEFINE SalidaAdelante PORTB,3 ; Define dónde se sitúan las salidas.
#DEFINE SalidaAtras PORTB,2
#DEFINE SalidaIzquierda PORTB,1
#DEFINE SalidaDerecha PORTB,0

; Código de la tecla espaciadora, (hay un espacio,
; tened cuidado al teclear el programa).
; ZONA DE CÓDIGOS ********************************************************************

ORG 0
goto Inicio
ORG 4
GOTO ser
Inicio

call RS232_Inicializa
bsf STATUS,RP0 ; Configura como salidas las 4 líneas del
bcf SalidaAdelante ; del Puerto B respetando la configuración del
bcf SalidaAtras ; resto de las líneas.
bcf SalidaIzquierda
bcf SalidaDerecha
bsf Pulsa1
bsf Pulsa2
bsf Pulsa3
bsf Pulsa4
bcf OPTION_REG,NOT_RBPU
bcf STATUS,RP0
movlw b'10001000'
movwf INTCON
clrf PORTB ; En principio todas las salidas deben estar
Principal ; apagadas.
call RS232_LeeDato ; Espera a recibir un carácter.
call TesteaTeclado
goto Principal

; "Mensajes" ----------------------------------------------------------------------------
;
Mensajes
addwf PCL,F

MensajeAdelante
DT "A ", 0x00 ; Salida portb3 encendido
MensajeAdelante_no
DT "a", 0X00 ;Salida portb3 apagado
MensajeAtras
DT "B", 0x00 ;Salida Portb2 encendido
MensajeAtras_no
DT "b", 0X00 ;Salida portb2 apagado
MensajeIzquierda
DT "C", 0x00 ;Salida portb1 encendido
MensajeIzquierda_no ;Salida portb1 apagado
DT "c", 0X00
MensajeDerecha ;Salida portb0 encendido
DT "D", 0x00
MensajeDerecha_no
DT "d", 0X00 ;Salida portb apagago

; Subrutina "TesteaTeclado" -------------------------------------------------------------
;
; Testea el teclado y actúa en consecuencia.








TesteaTeclado

TECLA_0 EQU '0'
TECLA_1 EQU '1'

btfsc PORTA,0
goto UNO


movwf TeclaPulsada
xorlw TECLA_0
btfsc STATUS,Z
goto REG_1
goto FIN

UNO
movwf TeclaPulsada
xorlw TECLA_1
BTFSC STATUS,Z
goto REG_1
goto FIN
REG_1
btfsc PORTA,1
goto UNO_1

call RS232_LeeDato
movwf TeclaPulsada
xorlw TECLA_0
btfsc STATUS,Z
goto REG_2
goto FIN
UNO_1
call RS232_LeeDato
movwf TeclaPulsada
xorlw TECLA_1
btfsc STATUS,Z
goto REG_2
goto FIN

REG_2
btfsc PORTA,2
goto UNO_2

call RS232_LeeDato
movwf TeclaPulsada
xorlw TECLA_0
btfsc STATUS,Z
goto empieza
goto FIN
UNO_2
call RS232_LeeDato
movwf TeclaPulsada
xorlw TECLA_1
btfsc STATUS,Z
goto empieza
goto FIN




empieza

TECLA_ADELANTE EQU 'A'
TECLA_ATRAS EQU 'B'
TECLA_IZQ EQU 'C'
TECLA_DER EQU 'D'

call RS232_LeeDato
movwf TeclaPulsada
xorlw TECLA_ADELANTE
btfsc STATUS,Z
goto Adelante
;
movf TeclaPulsada,W
xorlw TECLA_ATRAS
btfsc STATUS,Z
goto Atras
;
movf TeclaPulsada,W
xorlw TECLA_IZQ
btfsc STATUS,Z
goto Izquierda
;
movf TeclaPulsada,W
xorlw TECLA_DER
btfsc STATUS,Z
goto Derecha

ser
btfsc Pulsa4
goto fin3
call Retardo_20ms
btfsc Pulsa4
goto fin3
call Retardo_20ms
Adelante
btfsc SalidaAdelante
goto uno
bsf SalidaAdelante
movlw MensajeAdelante
goto Visualiza
uno
bcf SalidaAdelante
movlw MensajeAdelante_no
goto Visualiza
fin3

btfsc Pulsa3
goto fin2
call Retardo_20ms
btfsc Pulsa3
goto fin2
call Retardo_20ms
Atras
btfsc SalidaAtras
goto dos
bsf SalidaAtras
movlw MensajeAtras
goto Visualiza
dos
bcf SalidaAtras
movlw MensajeAtras_no
goto Visualiza
fin2
btfsc Pulsa2
goto fin1
call Retardo_20ms
btfsc Pulsa2
goto fin1
call Retardo_20ms
Izquierda
btfsc SalidaIzquierda
goto tres
bsf SalidaIzquierda
movlw MensajeIzquierda
goto Visualiza
tres
bcf SalidaIzquierda
movlw MensajeIzquierda_no
goto Visualiza
fin1
btfsc Pulsa1
goto final
call Retardo_20ms
btfsc Pulsa1
goto final
call Retardo_20ms
Derecha
btfsc SalidaDerecha
goto cuatro
bsf SalidaDerecha
movlw MensajeDerecha
goto Visualiza
cuatro
bcf SalidaDerecha
movlw MensajeDerecha_no
goto Visualiza
FIN

final
bcf INTCON,RBIF
retfie

; Según el estado de las salidas visualiza el estado del sistema en el visualizador LCD y en
; el monitor del ordenador.

Visualiza
movwf MensajeApuntado ; Guarda la posición del mensaje.

call RS232_LineasBlanco ; Borra la pantalla del ordenador.
movf MensajeApuntado,W
call RS232_Mensaje ; Lo visualiza en el HyperTerminal.
call RS232_LineasBlanco
bcf INTCON,RBIF
retfie



INCLUDE <RS232.INC>
INCLUDE <RS232MEN.INC>

INCLUDE <RETARDOS.INC>
END
 
Última edición:
Hola:

Le echaré un ojo al tu código, mientras le echas el mio. de momento es con un PIC16F887 y también tengo hecho con el 18F4550 en asm. El mio no me sale usar entradas y salidas almismo iempo con el RS232. Justo abajo puedes descargar el código fuente y simulación con el Proteus.

Si vas a usar PIC de 18 pines es muy poquito.
16f84a-7324.jpg


Para eso usas un conversor de bus para tener más pines. Por ejemplo, este integrado puedes conectarle por lo menos 8 y cada uno tiene 8 entradas o salidas digitales por cada integrado.

En el capítulo 6, página 409 está ese integrado llmado PCF8574 que puede ser de ayuda.
exp_io.gif

figure_02.gif

Si no hace falte mejor que mejor, ya que sería menos engorroso.
pcserver.png

Como vez la imagen de arriba, llevo desde el 2008 con este proyecto, por falta de presupuesto no he hecho gran cosa sino modificaciones para mejorarlo. Por ahora en aquella época preparé un manual sobre montar un servidor Web Apache...

http://electronica-pic.blogspot.com/2009/06/servidor-casero-apache-php-mysql.html

...para que en el futuro haga el segundo manual sobre este proyecto y como conectarlo a Internet el PIC. Por aquí puedes bajar un tutorial de las pruebas que hacía, en PDF.
https://www.forosdeelectronica.com/posts/242177/
Podemos hacer algo como esto:
fetch.php

Fuente:
http://wiki.rocrail.net/doku.php?id=phg-new_fiddle_yard&DokuWiki=





Edito:
Puede que te sirva de interés.
300px-I2pc_top.jpg


http://wiki.s1mp3.org/Debug_interface
 

Adjuntos

  • PicRS232 16F887.rar
    24.9 KB · Visitas: 88
Última edición:
hala META en estos dias e estado muy ocupado y no e mirado con detalle tu programa de todas
formas este que ultimo que envie funciona bien.Conrespecto a lo que yo necesitaba desde el
principio que es que la luz del pulsador se encienda o apague solo cuando recibe el dato desde
el micro te dire que no he prosperado nada me he conprado el libro de Francisco C harter de
programacion en visual basic.net y nada cada vez tengo mas claro que tengo que pasar por una
academia claro que el problema es el tiempo.Por otra parte y no lo puse desde el principio para
no henrredar mas la cosa es que a cada pulsador ponerle un relog para que cada punto se enci_
enda y apague a una hora determinada de esa foma tendria mas utilidad,por ejem control de rie
go,yo seguire estudiando algun dia espero prosperar.gracias PEPE
 
Hola META e miradom tu programa y te dire que para que funcione indistintamente desde el micro
como desde el ordenador en vez de poner interruptores tienes que poner pulsadores el programa
que puse funciona bien.Lo que pasa es que no esta terminado totalmente dado que para que se
active un pin del micro hay que embiar 001A 001B 001C 001D pero lo que no tengo terminado es
la respuesta del micro que el contesta A,a B,b C,c D,d cuando tendria que ser 001A,001a,001B,
001b y asis los 4 pins en micro el esquema electrico es Portb 4-7 pulsadoder (entadas) Portb 0-3
salidas Led's porta 0-2 interructores para la direccion port 3-4 comunicacion te no e puesto asi
porque no allo la forma de copiar en proteus. hasta otra PEPE
 
Hola:

Compré el libro también de charte de Visual C# 2005 y solo aprendi hacer tonterías sin aprender no comprender programación.

MU00185401.jpg


Me metí en un curso de Java que acaba de emepzar y por ahora no tengo idea. No se si daremos Visual Basic el próximo año, pero nos contó el profesor que daremos Visual Studio .net sin decir lenguajes. Si, mejor apuntarse a academias para aprender a programar. Por ahora nos están reventando con Java orientado a objetos, se parece muchísimo al C# y me alegra, así me adapo rápido, incluso aprender C para los PIC18F que no me he puesto, cosa que haré cuando acabe los dos años de curso.

De todas maneras me buscaré la vida para hacer lo que dices. Cuando envías un byte o un caracter ASCII, en Hex, Visual Studio sea capaz de detectarlo. Tu código funciona bien, ya es un paso.

Al menos quiero lograr con un PIC16F887 de 40 pines 8 entradas digitales y 8 salidas a relés. Si sobra algunas serán salidas digitales. Hay que examinar bien. Si logras hacer con el 16F887 lo que digo, con LCD incluido por supuesto, me encargaré de hacer la Interfaz y lo que me pides.

Dime que carácter en ASCII o HEX quier que detecte lo que pides, parece que son por lo menos unos 8. Me encargaré hacer el código en C# 2010 y buscándome la vida en Visual Basic 2010 que es el que tengo instalado. Cuando me lo digas, empezaré a codear e investigar.

Saludo.
 
Última edición:
Hola META el asunto es el siguiente:poner 8 microcontroladores de 4 entrada-salida todos tienen
el mismo prog enASM,cambian los interruptores de direccion RA0 RA1 RA2 que por ejem el 1 los
interrup deria 000 ,el 2 001 y asi los 8 esto tiene la ventaja que a la hora de que se estropee
un micro se cambia por otro igual pero cambiando a su direccion. por otra parte te dije que el
programa no esta terminado pues si las direcciones de entrada estan bien no las de salida que
produrare hacerla mañana de lodas formas te pongo los datos que tiene que enviar y recibir el
interfaz.para el 1º pic el pulsador debe enviar 1º-pulsador 000A 2ºpulsador 000B 3pulsador 000C
4pulsador 000D 2ºpic 5 pulsador 001A 6ºpul 001B 7ºpul 001C, 8ºpul 001D 3ºpic 9pul 010A
10pul 010B 11pul 010C 12pul 010D 4ºpic 13ºpul 011A 14ºpul 011B 15pul 011C 16 pul 011D
5ºpic 17pul 100A 18pul 100B 19pul 100C 20pul 100D 6ºpic 21pul 101A 22pul 101B 23pul 101C
24pul 101D 7ºpic 25pul 110A 26pul 110B 27pul 110C 28 pul 110D 8ºpic 29pul 111A 30pul 111B
31pul 111C 32 pul 111D los pulsadores de la interfaz mandan lo que e puesto el micro se encarga deapagar y encende y aqui apunto lo que me falta del programa por eje si se enciende el 1º pic el pic mandara 000A el cual dice que esta encendido 000a que esta apagado y cada
pinmandara su direccion con su situacion de apag ò encen el 5pic pulsador 18 te mandara
100B encendido 100b apagado mañana sin falta termino el ASM y posiblemente lo entenderas
mejor gracias por tu tiempo PEPE

se me olvido todo se transmite en ascii gracias
 
Última edición:
Hola:

Por lo que te entiendo, es que tienes un PIC maestro que controla la dirección de los 8 otros PIC esclavos. Puedes controlarlos desde RS232, claro que si.

Si lo dicho arriba es como dices, ¿cómo pretendes manejar las entradas de los PIC esclavos mediantes RS232?

Para eso usas varios PCF8574 que también debes indicar las direcciones de cada dispositivo. Es verdad que puedes comuniar un PIC on otro PIC mediante RS232, pero no es como un I2C, SPI, etc...

El PIC 1º tiene 4 pulsadores como comentas. ¿No crees que debe tener 8 pulsadores cada PIC ya que supuestamente funciona como encendido y apagado (ON/OFF)?
Cuando consigas los 8 pulsadores del ON-OFF, ya tienes lo que buscas del A,a B,b C,c D,d.

Lo que buscas, es algo parecido a esto, pero en puerto serie.
sinttulo1oso.png


Por cada llamada del PIC sería algo como esto que puse en C#:
Código:
        public void pic1_letra_A()
        {
            serialPort1.Open();
            byte[] mBuffer = new byte[1];
            mBuffer[0] = 0x41; //ASCII letra "A".
            serialPort1.Write(mBuffer, 0, mBuffer.Length);
            serialPort1.Close();
        }
En Visual Basic 2010:
Código:
Public Sub pic1_letra_A()
    serialPort1.Open()
    Dim mBuffer As Byte() = New Byte(0) {}
    mBuffer(0) = &H41 'ASCII letra "A".
    serialPort1.Write(mBuffer, 0, mBuffer.Length)
    serialPort1.Close()
End Sub

Saludo.
 
Última edición:
;*********************************RS232_INICIO-CLAVE.asm **************************************
;Sistema de gobierno desde el ordenador o desde el mismo puesto
;Joè Benjumea,15-1-2010
;Para que se enciendan ò apagen las luces en el hiperteminal hay que poner
A;,B,C,D Precedido de la direccion que tiene que ser igual que porta,0 porta,1 porta,2
; ==================================================================.
;
; ZONA DE DATOS **********************************************************************

LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

CBLOCK 0x0C
TeclaPulsada ; Va a guardar el contenido de la tecla pulsada.
MensajeApuntado ; Va a guarda la dirección del mensaje apuntado.
ENDC


#DEFINE Pulsa4 PORTB,7 ;ebtrada4
#DEFINE Pulsa3 PORTB,6 ;entrada3
#DEFINE Pulsa2 PORTB,5 ;entrada2
#DEFINE Pulsa1 PORTB,4 ;entrada1
#DEFINE SalidaAdelante PORTB,3 ;salida4
#DEFINE SalidaAtras PORTB,2 ;salida3
#DEFINE SalidaIzquierda PORTB,1 ;salida2
#DEFINE SalidaDerecha PORTB,0 ;salida1
#DEFINE Clave_0 PORTA,0 ;entrada_clave
#DEFINE Clave_1 PORTA,1 ;entrada_clave
#DEFINE Clave_2 PORTA,2 ;entrada_clave



; ZONA DE CÓDIGOS ********************************************************************

ORG 0
goto Inicio
ORG 4
goto Interrupcion
Inicio

call RS232_Inicializa
bsf STATUS,RP0
bcf SalidaAdelante
bcf SalidaAtras
bcf SalidaIzquierda
bcf SalidaDerecha
bsf Pulsa1
bsf Pulsa2
bsf Pulsa3
bsf Pulsa4
bsf Clave_0
bsf Clave_1
bsf Clave_2
bcf OPTION_REG,NOT_RBPU
bcf STATUS,RP0
movlw b'10001000'
movwf INTCON
clrf PORTB ; En principio todas las salidas deben estar
Principal ; apagadas.
call RS232_LeeDato ; Espera a recibir un carácter.
call TesteaTeclado
goto Principal



TesteaTeclado

TECLA_0 EQU '0'
TECLA_1 EQU '1'

btfsc Clave_0
goto UNO


movwf TeclaPulsada
xorlw TECLA_0
btfsc STATUS,Z
goto REG_1
goto FIN

UNO
movwf TeclaPulsada
xorlw TECLA_1
BTFSC STATUS,Z
goto REG_1
goto FIN
REG_1
btfsc Clave_1
goto UNO_1

call RS232_LeeDato
movwf TeclaPulsada
xorlw TECLA_0
btfsc STATUS,Z
goto REG_2
goto FIN
UNO_1
call RS232_LeeDato
movwf TeclaPulsada
xorlw TECLA_1
btfsc STATUS,Z
goto REG_2
goto FIN

REG_2
btfsc Clave_2
goto UNO_2

call RS232_LeeDato
movwf TeclaPulsada
xorlw TECLA_0
btfsc STATUS,Z
goto empieza
goto FIN
UNO_2
call RS232_LeeDato
movwf TeclaPulsada
xorlw TECLA_1
btfsc STATUS,Z
goto empieza
goto FIN




empieza

TECLA_ADELANTE EQU 'A'
TECLA_ATRAS EQU 'B'
TECLA_IZQ EQU 'C'
TECLA_DER EQU 'D'

call RS232_LeeDato
movwf TeclaPulsada ; Guarda el contenido de la tecla pulsada.
xorlw TECLA_ADELANTE ; ¿Es la tecla del movimiento hacia adelante?
btfsc STATUS,Z
goto Adelante ; Sí, se desea movimiento hacia adelante.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_ATRAS ; ¿Es la tecla del movimiento hacia atrás?
btfsc STATUS,Z
goto Atras ; Sí, se desea movimiento hacia atrás.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_IZQ ; ¿Es la tecla del movimiento hacia la izquierda?
btfsc STATUS,Z
goto Izquierda ; Sí, se desea movimiento hacia la izquierda.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_DER ; ¿Es tecla del movimiento hacia la derecha?
btfsc STATUS,Z
goto Derecha ; Sí, se desea movimiento hacia la derecha.

Interrupcion
btfsc Pulsa4
goto fin3
call Retardo_20ms
btfsc Pulsa4
goto fin3
call Retardo_20ms
Adelante
btfsc SalidaAdelante
goto uno
bsf SalidaAdelante
goto Visualiza_A
uno
bcf SalidaAdelante
goto Visualiza_a
fin3

btfsc Pulsa3
goto fin2
call Retardo_20ms
btfsc Pulsa3
goto fin2
call Retardo_20ms
Atras
btfsc SalidaAtras
goto dos
bsf SalidaAtras
goto Visualiza_B
dos
bcf SalidaAtras
goto Visualiza_b
fin2
btfsc Pulsa2
goto fin1
call Retardo_20ms
btfsc Pulsa2
goto fin1
call Retardo_20ms
Izquierda
btfsc SalidaIzquierda
goto tres
bsf SalidaIzquierda
goto Visualiza_C
tres
bcf SalidaIzquierda
goto Visualiza_c
fin1
btfsc Pulsa1
goto final
call Retardo_20ms
btfsc Pulsa1
goto final
call Retardo_20ms
Derecha
btfsc SalidaDerecha
goto cuatro
bsf SalidaDerecha
goto Visualiza_D
cuatro
bcf SalidaDerecha
goto Visualiza_d


Visualiza_A

btfsc Clave_0 ; Dela 216 a 249 envia al PC su direccion y lo que hizo
goto Es_uno ; encender salida_1
movlw '0' ;
call RS232_EnviaDato ;
goto Claver_1
Es_uno
movlw '1'
call RS232_EnviaDato

Claver_1
btfsc Clave_1
goto Es_uno_1
movlw '0'
call RS232_EnviaDato
goto Claver_2
Es_uno_1
movlw '1'
call RS232_EnviaDato

Claver_2
btfsc Clave_2
goto Es_uno_1_1
movlw '0'
call RS232_EnviaDato
goto Ala_A
Es_uno_1_1
movlw '1'
call RS232_EnviaDato
Ala_A
movlw 'A'
call RS232_EnviaDato
goto FIN



Visualiza_a

btfsc Clave_0 ; Dela 253 a 286 envia al PC su direccion y lo que hizo
goto Es_uno_bis ; apagar salida_1
movlw '0' ;
call RS232_EnviaDato ;
goto Claver_1_bis
Es_uno_bis
movlw '1'
call RS232_EnviaDato

Claver_1_bis
btfsc Clave_1
goto Es_uno_1_bis
movlw '0'
call RS232_EnviaDato
goto Claver_2_bis
Es_uno_1_bis
movlw '1'
call RS232_EnviaDato

Claver_2_bis
btfsc Clave_2
goto Es_uno_1_1_bis
movlw '0'
call RS232_EnviaDato
goto Ala_a
Es_uno_1_1_bis
movlw '1'
call RS232_EnviaDato
Ala_a
movlw 'a'
call RS232_EnviaDato
goto FIN


Visualiza_B

btfsc Clave_0 ; Dela 290 a 322 envia al PC su direccion y lo que hizo
goto Es_uno_bis1 ; encender salida_2
movlw '0' ;
call RS232_EnviaDato ;
goto Claver_1_bis1
Es_uno_bis1
movlw '1'
call RS232_EnviaDato

Claver_1_bis1
btfsc Clave_1
goto Es_uno_1_bis1
movlw '0'
call RS232_EnviaDato
goto Claver_2_bis1
Es_uno_1_bis1
movlw '1'
call RS232_EnviaDato

Claver_2_bis1
btfsc Clave_2
goto Es_uno_1_1_bis1
movlw '0'
call RS232_EnviaDato
goto Ala_B
Es_uno_1_1_bis1
movlw '1'
call RS232_EnviaDato
Ala_B
movlw 'B'
call RS232_EnviaDato
goto FIN



Visualiza_b

btfsc Clave_0 ; Dela 326 a 359 envia al PC su direccion y lo que hizo
goto Es_uno_bis2 ; apagar salida_2
movlw '0' ;
call RS232_EnviaDato ;
goto Claver_1_bis2
Es_uno_bis2
movlw '1'
call RS232_EnviaDato

Claver_1_bis2
btfsc Clave_1
goto Es_uno_1_bis2
movlw '0'
call RS232_EnviaDato
goto Claver_2_bis2
Es_uno_1_bis2
movlw '1'
call RS232_EnviaDato

Claver_2_bis2
btfsc Clave_2
goto Es_uno_1_1_bis2
movlw '0'
call RS232_EnviaDato
goto Ala_b
Es_uno_1_1_bis2
movlw '1'
call RS232_EnviaDato
Ala_b
movlw 'b'
call RS232_EnviaDato
goto FIN


Visualiza_C

btfsc Clave_0 ; Dela 362 a 395 envia al PC su direccion y lo que hizo
goto Es_uno_bis3 ; encender salida_3
movlw '0' ;
call RS232_EnviaDato ;
goto Claver_1_bis3
Es_uno_bis3
movlw '1'
call RS232_EnviaDato

Claver_1_bis3
btfsc Clave_1
goto Es_uno_1_bis3
movlw '0'
call RS232_EnviaDato
goto Claver_2_bis3
Es_uno_1_bis3
movlw '1'
call RS232_EnviaDato

Claver_2_bis3
btfsc Clave_2
goto Es_uno_1_1_bis3
movlw '0'
call RS232_EnviaDato
goto Ala_C
Es_uno_1_1_bis3
movlw '1'
call RS232_EnviaDato
Ala_C
movlw 'C'
call RS232_EnviaDato
goto FIN


Visualiza_c

btfsc Clave_0 ; Dela 398 a 431 envia al PC su direccion y lo que hizo
goto Es_uno_bis4 ; apagar salida_3
movlw '0' ;
call RS232_EnviaDato ;
goto Claver_1_bis4
Es_uno_bis4
movlw '1'
call RS232_EnviaDato

Claver_1_bis4
btfsc Clave_1
goto Es_uno_1_bis4
movlw '0'
call RS232_EnviaDato
goto Claver_2_bis4
Es_uno_1_bis4
movlw '1'
call RS232_EnviaDato

Claver_2_bis4
btfsc Clave_2
goto Es_uno_1_1_bis4
movlw '0'
call RS232_EnviaDato
goto Ala_c
Es_uno_1_1_bis4
movlw '1'
call RS232_EnviaDato
Ala_c
movlw 'c'
call RS232_EnviaDato
goto FIN


Visualiza_D

btfsc Clave_0 ; Dela 434a 467 envia al PC su direccion y lo que hizo
goto Es_uno_bis5 ; enciende salida_4
movlw '0' ;
call RS232_EnviaDato ;
goto Claver_1_bis5
Es_uno_bis5
movlw '1'
call RS232_EnviaDato

Claver_1_bis5
btfsc Clave_1
goto Es_uno_1_bis5
movlw '0'
call RS232_EnviaDato
goto Claver_2_bis5
Es_uno_1_bis5
movlw '1'
call RS232_EnviaDato

Claver_2_bis5
btfsc Clave_2
goto Es_uno_1_1_bis5
movlw '0'
call RS232_EnviaDato
goto Ala_D
Es_uno_1_1_bis5
movlw '1'
call RS232_EnviaDato
Ala_D
movlw 'D'
call RS232_EnviaDato
goto FIN

Visualiza_d

btfsc Clave_0 ; Dela 471 a 503 envia al PC su direccion y lo que hizo
goto Es_uno_bis6 ; apagar salida_4
movlw '0' ;
call RS232_EnviaDato ;
goto Claver_1_bis6
Es_uno_bis6
movlw '1'
call RS232_EnviaDato

Claver_1_bis6
btfsc Clave_1
goto Es_uno_1_bis6
movlw '0'
call RS232_EnviaDato
goto Claver_2_bis6
Es_uno_1_bis6
movlw '1'
call RS232_EnviaDato

Claver_2_bis6
btfsc Clave_2
goto Es_uno_1_1_bis6
movlw '0'
call RS232_EnviaDato
goto Ala_d
Es_uno_1_1_bis6
movlw '1'
call RS232_EnviaDato
Ala_d
movlw 'd'
call RS232_EnviaDato



FIN

final
bcf INTCON,RBIF
retfie




INCLUDE <RS232.INC>
INCLUDE <RETARDOS.INC>
END

Hola meta cuando me digiste si funcionaba con pic maestro 8 esclavos se puede y de echo lo hice para ex
perimentar este programa esta completo.pruebalo en el iperterminal ten presente los interructores de porta,0 porta,1 porta,2 simlos tres estan cerrados la direc es 000 seguido de A,B,C,D. yo lo he probado en
proteus y con terminal virtual fuciona bien te pongo los pins porque no allo como copiar y pegar en proteus
PORTA,0 a 3 Interruptores de direccion PORTB 0 a 3 RELES PORTB 4 a 7 Pulsadores porta 3 a4 comunicacion
ojealo por favor gracias pepe
 
Última edición:
Hola META este ultimo programa que te e puesto esta pensado para que funcione con el interfaz
que pusiste de los cuatro botones a mi me funciona bien pero este esta pensado para que funci_
one con una lucesita encima del los pulsadores y como todos los datos en embia el micro al pc
son distintos aprobeclar dicha circunstancia para apagar y encender cada una de las lucesita
yo no se cual es ojeto tuyo de usar el 16f887 cuando este esta funcionando a la perfecion
por otra parte te dire y en esto tengo esperiencia que no hace falta que el micro gobierne mas
de 4 puertas dado que la instalacion electrica que rodea al micro seria engorroso,seria mas cos_
tosa la instalacion electrica que la colocacion de otro micro separado.Por otra parte estoy pro_
bando con el 16f88 y 16f628 para usar elrelog interno y asi dos dos pines mas los utilizo como
interruptores para la direccion que asi se podria usar hasta 32 micro que es el maximo que se
puede con RS485 te recuerdo que los pines del micro para que lo hagas en proteus PORTA,0 POR
TA,1 PORTA,2 tres nterructores a masa y y 3 resistencias de 10K a 5v de PORTB,4 a 7 ,4 pulsadores sin resistecias dados que estan accivadas la resitencias internas portb,0 a 3 4 reles
y porta 3 y 4 comunicacion. por otra parte a mesnos que yo lo halla interpretado mal no se para
que quieres husar el 16f887 cuando y (si tenemos el mismo ojetivo) este funciona vien de todas formas esplicamelo con detalle haber de que forma puedo ayudar gracias pepe
 
Queiro usar el 16F887 que lo he adaptado a través del 16F84A y funciona. Mi idea es usar 8 entradas digitales y 8 salidas a base de relés. Ese es el motivo.
 
Última edición:
;Hola META e estado mirando e echo este pero fijate que cosa mas rara estan activadas las
;restistencias pull-Up y sin embargo el poerto b estando abierto los interruptores cada uno
:de las entradas tendrian que estar de color rojo en el simulador la cosa es que solo estan en
;rojo el portb7 y el port b 6 los demas no funcionan bien de todas formas te lo e puesto por_
que tu sabes que aveces tienes un error y por mucho que lo mires no lo ves de todas formas
; seguire mirando haber si lo arreglo hasta ahora pepe
;
; ===================================================================
;
;
;
;

LIST P=16F887
INCLUDE <P16F887.INC>


CBLOCK 0x0C
ENDC

ENTER EQU .13 ; Código de tecla "Enter" o "Retorno de Carro".
CAMBIO_LINEA EQU .10 ; Código para el cambio de línea.

#DEFINE Entrada0 PORTB,0 ; Define dónde se sitúan las entradas.
#DEFINE Entrada1 PORTB,1
#DEFINE Entrada2 PORTB,2
#DEFINE Entrada3 PORTB,3
#DEFINE Entrada4 PORTB,4
#DEFINE Entrada5 PORTB,5
#DEFINE Entrada6 PORTB,6
#DEFINE Entrada7 PORTB,7
#DEFINE Salida0 PORTC,0
#DEFINE Salida1 PORTC,1
#DEFINE Salida2 PORTC,2
#DEFINE Salida3 PORTC,3
#DEFINE Salida4 PORTC,4
#DEFINE Salida5 PORTC,5
#DEFINE Salida6 PORTC,6
#DEFINE Salida7 PORTC,7

; ZONA DE CODIGOS ********************************************************************

ORG 0
goto Inicio
ORG 4 ; Aquí se sitúa el vector de interrupción para
goto LeeEntradasVisualiza ; atender las subrutinas de interrupción.

Mensajes ; Los mensajes no deben sobrepasar las 256
addwf PCL,F ; primeras posiciones de memoria de programa.
MensajeEntradas
DT ENTER, CAMBIO_LINEA
DT "Entrada7 Entrada6 Entrada5 Entrada4 Entrada3 Entrada2 Entrada1 Entrada0 "
DT ENTER, CAMBIO_LINEA
DT "-------- --------- --------- --------- --------- --------- -------- -------- "
DT ENTER, CAMBIO_LINEA, 0x00
MensajeAbierto
DT "Abierto ", 0x00
MensajeCerrado
DT " Cerrado ", 0x00

Inicio
call RS232_Inicializa
bsf STATUS,RP0 ; Configura como entrada las 4 líneas correspondientes
bsf Entrada0 ; del Puerto B respetando la configuración del
bsf Entrada1 ; resto de las líneas.
bsf Entrada2
bsf Entrada3
bsf Entrada4
bsf Entrada5
bsf Entrada6
bsf Entrada7
bcf Salida0
bcf Salida1
bcf Salida2
bcf Salida3
bcf Salida4
bcf Salida5
bcf Salida6
bcf Salida7
bcf OPTION_REG,NOT_RBPU ; Activa las resistencias de Pull-Up del Puerto B.
bcf STATUS,RP0
call RS232_LineasBlanco ; Visualiza unas cuantas líneas en blanco
call RS232_LineasBlanco ; para limpiar la pantalla.
call LeeEntradasVisualiza ; Lee las entradas y visualiza por primera vez.
movlw b'10001000' ; Habilita la interrupción RBI y la general.
movwf INTCON
; clrf PORTC
CLRF PORTB
Principal
sleep ; Espera en modo de bajo consumo que se
goto Principal ; modifique una entrada.

; Subrutina de Servicio a la Interrupcion" ----------------------------------------------
;
; Lee el estado de las entradas y las monitoriza en la pantalla del HyperTerminal.

LeeEntradasVisualiza
call RS232_LineasBlanco
movlw MensajeEntradas ; Nombre de las entradas.
call RS232_Mensaje ; Lo visualiza en el ordenador.
LeeEntrada7
btfss Entrada7 ; ¿Entrada = 1?, ¿Entrada = Abierta?alida
goto Entrada7Cerrado
bcf Salida7 ; No, está cerrada.
call VisualizaAbierto
goto LeeEntrada6
Entrada7Cerrado
bsf Salida7
call VisualizaCerrado
LeeEntrada6
btfss Entrada6 ; Se repite el procedimiento para las
goto Entrada6Cerrado
bcf Salida6 ; demás entradas.
call VisualizaAbierto
goto LeeEntrada5
Entrada6Cerrado
bsf Salida6
call VisualizaCerrado
LeeEntrada5
btfss Entrada5
goto Entrada5Cerrado
bcf Salida5
call VisualizaAbierto
goto LeeEntrada4
Entrada5Cerrado
bsf Salida5
call VisualizaCerrado
LeeEntrada4
btfss Entrada4
goto Entrada4Cerrado
bcf Salida4
call VisualizaAbierto
goto LeeEntrada3
Entrada4Cerrado
bsf Salida4
call VisualizaCerrado
LeeEntrada3
btfss Entrada3
goto Entrada3Cerrado
bcf Salida3
call VisualizaAbierto
goto LeeEntrada2
Entrada3Cerrado
bsf Salida3
call VisualizaCerrado
LeeEntrada2
btfss Entrada2
Goto Entrada2Cerrado
bcf Salida2
call VisualizaAbierto
goto LeeEntrada1
Entrada2Cerrado
bsf Salida2
call VisualizaCerrado
LeeEntrada1
btfss Entrada1
goto Entrada1Cerrado
bcf Salida1
call VisualizaAbierto
goto LeeEntrada0
Entrada1Cerrado
bsf Salida1
call VisualizaCerrado
LeeEntrada0
btfss Entrada0
goto Entrada0Cerrado
bcf Salida0
call VisualizaAbierto
goto FinVisualiza
Entrada0Cerrado
bsf Salida0
call VisualizaCerrado

FinVisualiza
call RS232_LineasBlanco
bcf INTCON,RBIF ; Limpia el flag de reconocimiento de la
retfie ; interrupción.
;
VisualizaAbierto
movlw MensajeAbierto ; Visualiza el mensaje "Abierto"
call RS232_Mensaje ; en el HyperTerminal.
return
VisualizaCerrado
movlw MensajeCerrado ; Visualiza el mensaje "Cerrado"
call RS232_Mensaje ; en el HyperTerminal.
return

INCLUDE <RS232.INC>
INCLUDE <RS232MEN.INC>
INCLUDE <RETARDOS.INC>
END

; ===================================================================

; ===================================================================
 
Hola META ante de enviar el programa anterior con el 16f887 estado mirando el data seet y no se
porque me a parecido que tenia en el registro intcon todo el puertob como interrupciones por
otro lado e mirado un libro que tengo de los16f87x veo que solo tiene de interrupciones de portb
4 a portb7. yo creo que la solucion esta en elejir un pic que tengan 8 interrupciones si es que
lo hay de todas formas segure investigando haber que puedo aportar hasta ahora pepe

Hola mete e estado mirando tu programa y vei que las interrupciones las tienes con ; por otra parte e
estado mirando un tutorial el cual dice que las interrupciones del 16f887 ademas de registro intcon tambien
hay que habilitar unos bit llamados (IOCB) seguido del nº de pin por ejen iocb4 que habilita el portb4 esta
escrito en c y no o entiemdo bien pero algo sobre eso hay hasta ahora pepe
 
Última edición:
Hola:

La Hoja de datos.
PIC16F887

Aquí la migración del 16F877A al 16F887.
http://www.microchip.com.ar/rs2009/soporte/clases/Migracion_877_a_887.pdf

Hay que mirar más a fondo lo que dijiste.

El código de lo que dijiste en C#.
Código:
[COLOR=blue]private[/COLOR] [COLOR=blue]void[/COLOR] textBox1_TextChanged([COLOR=blue]object[/COLOR] sender, [COLOR=#2b91af]EventArgs[/COLOR] e)
        {
            [COLOR=blue]char[/COLOR][] charNum;
            [COLOR=blue]if[/COLOR] (textBox1.Text.Length > 0)
            {
                [COLOR=blue]string[/COLOR] Str = textBox1.Text;
                charNum = Str.ToCharArray();
                [COLOR=blue]switch[/COLOR] (([COLOR=blue]int[/COLOR])charNum[0])
                {
                    [COLOR=blue]case[/COLOR] 65:    [COLOR=green]// 'A'[/COLOR]
                    [COLOR=blue]case[/COLOR] 66:    [COLOR=green]// 'B'[/COLOR]
                    [COLOR=blue]case[/COLOR] 67:    [COLOR=green]// 'C'[/COLOR]
                    [COLOR=blue]case[/COLOR] 68:    [COLOR=green]// 'D'[/COLOR]
                    [COLOR=blue]case[/COLOR] 69:    [COLOR=green]// 'E'[/COLOR]
                    [COLOR=blue]case[/COLOR] 70:    [COLOR=green]// 'F'[/COLOR]
                        [COLOR=#2b91af]MessageBox[/COLOR].Show([COLOR=#a31515]"Mayuscula"[/COLOR] + charNum[0]);
                        [COLOR=blue]break[/COLOR];
                    [COLOR=blue]case[/COLOR] 97:    [COLOR=green]// 'a'[/COLOR]
                    [COLOR=blue]case[/COLOR] 98:    [COLOR=green]// 'b'[/COLOR]
                    [COLOR=blue]case[/COLOR] 99:    [COLOR=green]// 'c'[/COLOR]
                    [COLOR=blue]case[/COLOR] 100:   [COLOR=green]// 'd'[/COLOR]
                    [COLOR=blue]case[/COLOR] 101:   [COLOR=green]// 'e'[/COLOR]
                    [COLOR=blue]case[/COLOR] 102:   [COLOR=green]// 'f'[/COLOR]
                        [COLOR=#2b91af]MessageBox[/COLOR].Show([COLOR=#a31515]"Minuscula"[/COLOR] + charNum[0]);
                        [COLOR=blue]break[/COLOR];
                }
            }
        }
Código en Visual Basic 2010.
Código:
Private Sub textBox1_TextChanged(sender As Object, e As EventArgs)
    Dim charNum As Char()
    If textBox1.Text.Length > 0 Then
        Dim Str As String = textBox1.Text
        charNum = Str.ToCharArray()
        Select Case AscW(charNum(0))
            ' 'A'
            ' 'B'
            ' 'C'
            ' 'D'
            ' 'E'
            Case 65, 66, 67, 68, 69, 70
                ' 'F'
                MessageBox.Show("Mayuscula" & charNum(0))
                Exit Select
            ' 'a'
            ' 'b'
            ' 'c'
            ' 'd'
            ' 'e'
            Case 97, 98, 99, 100, 101, 102
                ' 'f'
                MessageBox.Show("Minuscula" & charNum(0))
                Exit Select
        End Select
    End If
End Sub
 
Última edición:
Hola META e estado hacien pruebas y e puesto el ultimo programa en un un pin 16f876 y fuciona
medi bien el caso es de porb4 a 7 funciona bien el resto de portb,0 a 3 solo se actualiza cuando
cambias una interrucion osea portb 4 a 7 y se actuliza tudo e puesto todo el portb interruptores
y el port c salida relè con esto llego a la conclusion que el programa funciona bien solo hay que
trasladarlo a un pic de 8 interrucciones.El 16f887 me e fijado bien y tiene 8 interrupcione pero
tambien hay que mirar otros rejistros dado que el portb tanbien funciona como entradas analo_
gicas aunque hay que mirar biel el registro ICBO Y IOCB e estado probando pero no e dado con la tecla de lo que estoy seguro es que hay que configurar bien las interrupciones.por otra parte ya
te dire como me va con esto ultimo que me as puesto,asta ahora pepe

Hola META Haber si puedo explicarme bien de lo que necesito se trata del interfaz que tiene 4
pulsadore t,b,a,l ese lo hice y me funciona bien pero el programa del pic no es igual el prog es el
2 que puse.Si te fijas en el prog veras que tiene 4 pulsadores para que se pueda acionar desde
el pic y desde el pc por eso es muy ynportante que cada pulsador tenga una lucesita encima
a continuacion paso a esplicate los datos que tienen que enviar cada cosa yo lo escriba como
sea ten presente que todo se tramsmite ascii datos que tiene que manda el interfaz.
1º pulsador 000A 1ª lucesita recibira 000A y debe encenderse con 000a apagarse
2º pulsador 000B 2ª lucesita recibira 000A y debe encenderse con 000b apagarse
3ª pulsador 000C 3ª lucesita recibira 000C y debe encenderse con 000b apagarse
4º pulsador 000D 4ª lucesita recibira 000D y debe encenderse con 000d apagarse
si ojeas el 2º programa o lo simulas en proteus lo veras claro es muy inportante lo de la luz por_
que independientemente que el pic funcionas desde los dos sitio lo tengo intalado a mucha
distancia y no lo veo fisicamente gracias por tu tiempo hata otra pepe
 
Última edición:
Atrás
Arriba