Curso de programación de PIC en PICBasic Pro

1.- Estás poniendo el pin RS en el pin RA4 y ese pin es Open Drain, coloca una resistencia pull-up.
2.- En el diseño tienes el pin E en el pin RB3, pero en el código estás seleccionando RA5.
3.- Esto es opcional, pero te falta agregar la palabra de configuración.

Saludos.

hola darkbytes gracias por mirar mi proyecto, lo acabo de mirar y tienes razón con estos errores pero ya los corregí y sigue sin funcionar, aquí pongo de nuevo los archivos para que los vean y adicionalmente puse el pedacito del libro de donde saque el proyecto para que lo vean a ver sí es que me equivoque en algo para que por favor me colaboren. :apreton:
 

Adjuntos

  • PRUEBA MEMORIAS.rar
    348.9 KB · Visitas: 57
Última edición:
Hola D@rkbytes, gracias por mirar mi proyecto, lo acabo de mirar y tienes razón con estos errores pero ya los corregí y sigue sin funcionar:confused:
Debería funcionar, mira el archivo que adjunto con las correcciones que te mencioné.
 

Adjuntos

  • PRUEBA MEMORIAS II.rar
    19.6 KB · Visitas: 70
Porque dices que no funciona? yo lo probe y si funciona :unsure:

otra cosa es que no tiene sentido el If que pones dentro de For..Next y las etiquetas leer: escribir:

ponlo asi

Código:
Define Osc 4 ' Define el Oscilador para un Cristal de 4 Mhz.

DEFINE  LCD_BITS 4
Define	LCD_DREG	PORTA
Define	LCD_DBIT	0
Define	LCD_RSREG	PORTA
Define	LCD_RSBIT	4
Define	LCD_EREG	PORTB
Define	LCD_EBIT	3              
DEFINE LCD_COMMANDUS 2000

Symbol SDA = PORTB.0 ' Alias para RB0
Symbol SCL = PORTB.1 ' Alias para RB1

I       VAR Byte ' Declaración de variable "I"
A1      VAR Byte ' Declaración de variable "A1"
Direc   VAR Word ' Declaración de variable "Direc"
Control VAR Byte ' Declaración de variable "Control"
Dato    VAR Byte ' Declaración de variable "Dato"

Pause 200 ' Pausa de 200 milisegundos para la LCD

LCDOut $fe, 1 ,"HOLA"

Direc   = $00 ' Dirección en la memoria externa
Control = $A0 ' Dato de Control
Dato    = 1 ' Dato inicial a ser grabado

For I = 0 To 49 ' Repetición
 I2Cwrite SDA, SCL, Control, Direc, [dato] ' Escribe la memoria
 pause 10 ' Pausa de 10 milisegundos
 Direc = Direc + 1 ' Suma 1 a la variable "Direc"
 Dato = Dato + 2 ' Suma 2 a la variable "Dato"
Next I

LCDOUT $fe, 2,"Datos Grabados" ' Muestra mensaje por la LCD
Pause 2000 ' Pausa de 2 segundos

LCDOut $fe, 2,"Inicia Lectura" ' Muestra mensaje por la LCD
Pause 2000 ' Pausa de 2 segundos

Direc = $00 ' Inicializa la dirección en la memoria externa

For I = 0 To 49 ' Repetición
 I2CREAD SDA, SCL, Control, Direc, [A1] ' Lectura de memoria
 LCDOUT $fe, 2,"Dato ",#I,": ",#A1," " ' Muestra el dato leido
 Pause 1000 ' Pausa de 1 segundo
 Direc = Direc + 1 ' Suma 1 a la variable "Direc"
Next I

GoTo Final ' Salta a la etiqueta "final"
End
 
MUCHACHOS muchas gracias los felicito ustedes son unos MONSTRUOS para esta vaina ese bicho funciono de maravilla, y no era mucho lo que le faltaba pero ustedes lo hicieron funcionar, nuevamente gracias.
 
Buenas; hace un tiempo habia implementado unas librerias para atender interrupciones no convencionales mienras trabajabael micro... No recuerdo la pagina y justo ahora que las necesitabas para o presindir de otro micro :cry:
Basicamente me refiero a que en esta alarma que estoy jugando, tengo un modem enfora, el cual enviar u realizar llamados no es el problema... el problema es que no puedo leer mensajes u respuestas del modem y colocarlas en el display sin que me pare el programa por la instruccion serin...por que? por que serin pausa el programa y se queda esperando el dato entrante. Si bien puedo configurar el tiempo de espera y luego saltar a una etiqueta...el problema es uqe puedo perder mensajes... Implemente interrupciones por tiempo y tampoco sirve...
Si alguien recuerda esta pagina que sugiere estas interrupciones no convencionales, o tiene algunas idea, se lo voy agradecer...
Les comparto lo qe hay hasta el momento...una alarma con teclado y al detectar el disparo de la entrada portb.0, manda un sms al numero prefijado en la programacion... como esta, funciona, pero si no le encuentro solucion, para poder exprimir mas el modem, tendre que usar otro pic mas y que este se encargue solo del modem, y el 16f877 del teclado, lcd y sensores...

Código:
include "modedefs.bas"
define OSC 4

ADCON1 = %00001111 
TRISA = %00001111
TRISB = %00011111
TRISC = %10000000
TRISD = %00000011
TRISE = %00000000
;*************** DISPLAY LCD ****************
DEFINE LCD_DREG PORTD 
DEFINE LCD_BITS 4                
DEFINE LCD_DBIT 4                
DEFINE LCD_RSREG PORTD 
DEFINE LCD_RSBIT 2              
DEFINE LCD_EREG PORTD 
DEFINE LCD_EBIT 3               
DEFINE LCD_LINES 2              
POS1 var Byte
POS2 var Byte
POS3 var Byte
POS4 var Byte
POS1 = $C0 
POS2 = $C1 
POS3 = $C2 
POS4 = $C3
LCDOUT $FE,$40,$00,$00,$10,$0F,$0F,$0D,$18,$10 
LCDOUT $FE,$48,$04,$0E,$1F,$1C,$1C,$1C,$06,$05 
LCDOUT $FE,$50,$00,$00,$10,$0F,$0F,$0D,$04,$06 
LCDOUT $FE,$58,$04,$0E,$1F,$1C,$1C,$1C,$08,$18 
LCDOUT $FE,$60,$04,$0E,$1F,$07,$07,$07,$02,$03 
LCDOUT $FE,$68,$00,$00,$01,$1E,$1E,$16,$04,$0C 
LCDOUT $FE,$70,$04,$0E,$1F,$07,$07,$07,$0C,$14 
LCDOUT $FE,$78,$00,$00,$01,$1E,$1E,$16,$03,$01 

;**************** TECLADO ******************
UNO      VAR PORTB.1 
DOS      VAR PORTB.2
TRES     VAR PORTB.3
CUATRO   VAR PORTB.4
A        VAR PORTB.5 
B        VAR PORTB.6
C        VAR PORTB.7
D        VAR PORTC.0

;*************** SALIDAS ********************
LEDROJO      VAR PORTE.0
LEDVERDE      VAR PORTE.1
SIRENA   VAR PORTE.2
SONIDO    VAR PORTA.5
;*************** VARIABLES ******************
bData   Var Byte
BANDERA VAR BYTE
BANDERA1 VAR BYTE
BANDERA2 VAR BYTE
NUMERO   VAR BYTE 
R        VAR BYTE 
SET1 VAR BYTE
SET2 VAR BYTE
SET3 VAR BYTE 
SET4 VAR BYTE
dato VAR WORD 
seguridad_ON var byte

On Interrupt GoTo ZONA 
INTCON = %10010000 

LCDOUT $FE,1
LCDOUT "INICIO SISTEMA"
LCDOUT $FE,$C2,"DE SEGURIDAD"
PAUSE 1000
GOSUB perroGUARDIAN 
LCDOUT $FE,1
BANDERA = 0
INICIANDO:
FOR R=1 TO 2

HIGH LEDROJO:HIGH LEDVERDE:HIGH SONIDO
PAUSE 200
LOW LEDROJO:LOW LEDVERDE:LOW SONIDO
PAUSE 100
NEXT

LCDOUT $FE,$C0, 0
;******************GUARDAR LA CLAVE EN LA MEMORIA EEPROM************************
EEPROM 0,[1,2,3,4]
;*******************************************************************************

ARRANQUE:
PAUSE 500
LCDOUT $FE,1
LCDOUT "(*)S/N (#)Config"
LCDOUT $FE,$C0,"(0) PRUEBA GSM"
BANDERA = 0
;*******************************************************************************
LOW A
IF UNO=0 THEN NUMERO=1:RETURN
IF DOS=0 THEN NUMERO=2:RETURN
IF TRES=0 THEN NUMERO=3:RETURN
HIGH A
;*******************************************************************************
LOW B
IF UNO=0 THEN NUMERO=4:RETURN
IF DOS=0 THEN NUMERO=5:RETURN
IF TRES=0 THEN NUMERO=6:RETURN
HIGH B
;*******************************************************************************
LOW C
IF UNO=0 THEN NUMERO=7:RETURN
IF DOS=0 THEN NUMERO=8:RETURN
IF TRES=0 THEN NUMERO=9:RETURN
HIGH C
;*******************************************************************************
LOW D
IF UNO=0 THEN mensajeACTIVADO
IF DOS=0 THEN MODEM
IF TRES=0 THEN GRABAUNO
HIGH D
PAUSE 25
GOTO ARRANQUE

mensajeACTIVADO:
GOSUB perroGUARDIAN
LCDOUT $FE,1
LCDOUT $FE,2," SISTEMA ALARMA "
LCDOUT $FE,$C0,"    ACTIVADA    "
PAUSE 2000
LCDOUT $FE,1
BANDERA = 1
GOTO RESETEO

RESETEO:
;LOW PUERTA
LCDOUT $FE,1
FOR R=1 TO 2
HIGH LEDROJO:HIGH SONIDO
PAUSE 200
LOW LEDROJO:LOW SONIDO
PAUSE 100
IF D=0 AND UNO=0 THEN RESETEO
NEXT

READ 0,SET1
READ 1,SET2
READ 2,SET3
READ 3,SET4

GOSUB TECLAUNO

GRABAUNO:
lcDout $FE,1
LCDOUT $FE,3,"INGRESE SU CLAVE":LCDOUT $FE,$C3,"ANTERIOR"
PAUSE 1000
GOSUB TCLAUNO
RETURN

TCLAUNO:
LCDOUT $FE,1
LCDOUT $FE,2,"CLAVE ANTERIOR:"
GOSUB BARRIDO
GOSUB PTECLA
IF NUMERO=SET1 THEN GOSUB TCLADOS
GOTO FALSO

TCLADOS:
GOSUB BARRIDO
GOSUB PTECLA
IF NUMERO=SET2 THEN GOSUB TCLATRES
GOTO FALSO1

TCLATRES:
GOSUB BARRIDO
GOSUB PTECLA
IF NUMERO=SET3 THEN GOSUB TCLACUATRO
GOTO FALSO2

TCLACUATRO:
GOSUB BARRIDO
GOSUB PTECLA
IF NUMERO=SET4 THEN GOSUB GRABA_1
GOTO FALSO3

GRABA_1:
LCDOUT $FE,1
LCDOUT $FE,2,"INGRESE SU NUEVA":LCDOUT $FE,$C3,"CLAVE:"
LCDOUT $FE,$C5
GOSUB PTECLA:HIGH LEDROJO
GOSUB BARRIDO:GOSUB PTECLA
HIGH LEDROJO
WRITE 0,NUMERO

GRABADOS:

GOSUB BARRIDO:GOSUB PTECLA
GOSUB PTECLA:HIGH LEDROJO
HIGH LEDROJO
WRITE 1,NUMERO
GRABATRES:

GOSUB BARRIDO:GOSUB PTECLA
GOSUB PTECLA:HIGH LEDROJO
HIGH LEDROJO
WRITE 2,NUMERO

GRABACUATRO:

GOSUB BARRIDO:GOSUB PTECLA
GOSUB PTECLA:HIGH LEDROJO
HIGH LEDROJO
WRITE 3,NUMERO
LOW D
IF D=0 AND UNO=0 THEN RESETEO
HIGH D
PAUSE 500
LCDOUT $FE,1
LCDOUT $FE,2,"NUEVA CLAVE HA"
LCDOUT $FE,$C0,"SIDO CONFIGURADA"
PAUSE 2000
GOTO ARRANQUE

BARRIDO:
;*******************************************************************************
LOW A
IF UNO=0 THEN NUMERO=1:RETURN
IF DOS=0 THEN NUMERO=2:RETURN
IF TRES=0 THEN NUMERO=3:RETURN
HIGH A
;*******************************************************************************
LOW B
IF UNO=0 THEN NUMERO=4:RETURN
IF DOS=0 THEN NUMERO=5:RETURN
IF TRES=0 THEN NUMERO=6:RETURN
HIGH B
;*******************************************************************************
LOW C
IF UNO=0 THEN NUMERO=7:RETURN
IF DOS=0 THEN NUMERO=8:RETURN
IF TRES=0 THEN NUMERO=9:RETURN
HIGH C
;*******************************************************************************
LOW D
IF UNO=0 THEN GOSUB BORRAR
IF DOS=0 THEN NUMERO=0:RETURN
IF TRES=0 THEN GOSUB GRABAUNO
HIGH D
PAUSE 25
GOTO BARRIDO
;*******************************************************************************

PTECLA:

HIGH LEDROJO:HIGH SONIDO
PAUSE 100
LOW LEDROJO:LOW SONIDO

ESPACIO:
IF UNO=0 THEN ESPACIO
IF DOS=0 THEN ESPACIO
IF TRES=0 THEN ESPACIO
PAUSE 25
RETURN

TECLAUNO:
LCDOUT $FE,2,"INTRODUCIR CLAVE"
GOSUB BARRIDO
LCDOUT $FE,$C5, "*"
GOSUB PTECLA
IF NUMERO=SET1 THEN TECLADOS
GOTO FALSO

TECLADOS:
GOSUB BARRIDO
LCDOUT "*"
GOSUB PTECLA
IF NUMERO=SET2 THEN TECLATRES
GOTO FALSO1

TECLATRES:
GOSUB BARRIDO
LCDOUT "*"
GOSUB PTECLA
IF NUMERO=SET3 THEN TECLACUATRO
GOTO FALSO2

TECLACUATRO:
GOSUB BARRIDO
LCDOUT "*"
GOSUB PTECLA
IF NUMERO=SET4 THEN ABRIR
GOTO FALSO3

ABRIR:
LCDOUT $FE,1
LCDOUT $FE,2," CLAVE CORRECTA"
;HIGH PUERTA
FOR R=1 TO 4
HIGH LEDVERDE:HIGH SONIDO
PAUSE 200
LOW LEDVERDE:LOW SONIDO
NEXT
PAUSE 500
LOW D
IF D=0 AND UNO=0 THEN BORRAR
HIGH D
PAUSE 25
GOTO mensajeDESACTIVADO

FALSO:
GOSUB BARRIDO:GOSUB PTECLA:LCDOUT $FE,$C5, "*"
FALSO1:
GOSUB BARRIDO:GOSUB PTECLA:LCDOUT "*"
FALSO2:
GOSUB BARRIDO:GOSUB PTECLA:LCDOUT "*"
FALSO3:
LCDOUT $FE,1
FOR R=1 TO 10
HIGH LEDROJO:HIGH SONIDO
PAUSE 200
LOW LEDROJO:LOW SONIDO
NEXT
IF D=0 AND UNO=0 THEN BORRAR

ALERTA:
LCDOUT $FE,2,"CLAVE INCORRECTA"
HIGH LEDROJO:HIGH SONIDO
PAUSE 200
LOW LEDROJO:LOW SONIDO
LOW D
IF D=0 AND UNO=0 THEN BORRAR
HIGH D
GOTO ALERTA 

BORRAR:

LCDOUT $FE,1
GOSUB RESETEO
RETURN

mensajeDESACTIVADO:
PAUSE 1500
LOW SIRENA
BANDERA = 0
LCDOUT $FE,1
LCDOUT $FE,2," SISTEMA ALARMA "
LCDOUT $FE,$C0,"  DESACTIVADA   "
PAUSE 2000
GOTO ARRANQUE

MODEM:
LCDOUT $FE,1
LCDOUT $FE,2,"PRUEBA MODEM GSM"
LCDOUT $FE,$C0,"    ACTIVADA    "

PRUEBA1:
PAUSE 1000
LCDOUT $FE,1
LCDOUT $FE,2,"AT+CMGR=1"
serout PORTC.6,T9600,["AT+CMGR=1",10,13]
;serin PORTC.7,T9600,[],dato
serin PORTC.7,T9600,900,PRUEBA2,[],dato
LCDOUT $FE,$C0,DEC DATO

PRUEBA2:
PAUSE 1000
LCDOUT $FE,1
LCDOUT $FE,2,"AT+CMGD=1"
SEROUT PORTC.6,T9600,["AT+CMGD=1",10,13]
;serin PORTC.7,T9600,[],dato
serin PORTC.7,T9600,900,PRUEBA3,[],dato
LCDOUT $FE,$C0,DEC DATO

PRUEBA3:
pause 1000
LCDOUT $FE,1
LCDOUT $FE,2,"AT+CMGD=2"
SEROUT PORTC.6,T9600,["AT+CMGD=2",10,13]
;serin PORTC.7,T9600,[],dato
serin PORTC.7,T9600,900,PRUEBA4,[],dato
;SERIN PORTC.7,T9600,DATO
LCDOUT $FE,$C0,DEC DATO

PRUEBA4:
pause 1000
LCDOUT $FE,1
LCDOUT $FE,2,"AT+CMGF=1"
SEROUT PORTC.6,T9600,["AT+CMGF=1",10,13]
;serin PORTC.7,T9600,[],dato
serin PORTC.7,T9600,900,PRUEBA5,[],dato
;SERIN PORTC.7,T9600,DATO
LCDOUT $FE,$C0,DEC DATO

PRUEBA5:
pause 1000
LCDOUT $FE,1
LCDOUT $FE,2,"2976256173"
SEROUT PORTC.6,T9600,["AT+CMGS=",34,"2976256173",34,10,13]
;serin PORTC.7,T9600,[],dato
serin PORTC.7,T9600,900,PRUEBA6,[],dato
;SERIN PORTC.7,T9600,DATO  
LCDOUT $FE,$C0,DEC DATO

PRUEBA6:
pause 1000
LCDOUT $FE,1
LCDOUT $FE,2,"SMS: PRUEBA TEL"
SEROUT PORTC.6,T9600,["PRUEBA TEL",26,10,13] 
;serin PORTC.7,T9600,[],dato
serin PORTC.7,T9600,900,PRUEBA7,[],dato
;SERIN PORTC.7,T9600,DATO
LCDOUT $FE,$C0,# DATO
pause 1000

PRUEBA7:
PAUSE 1500
LCDOUT $FE,1
LCDOUT $FE,2,"PRUEBA TERMINADA"
LCDOUT $FE,$C0,"   REINICIANDO  "
;SEROUT PORTC.6,T9600,["ATS10=254",10,13]
;serin PORTC.7,T9600,[],dato
;serin PORTC.7,T9600,2000,arranque,[],dato
PAUSE 2000
GOTO ARRANQUE

perroGUARDIAN:
LCDOUT $FE,POS1, 0 
LCDOUT $FE,POS2, 1 
Pause 300
LCDOUT $fe, 1 
LCDOUT $FE,POS3, 2 
LCDOUT $FE,POS4, 3 
Pause 300
POS1 = POS1 + 3
POS2 = POS2 + 3
POS3 = POS3 + 3
POS4 = POS4 + 3
If POS4 > $CF Then RETRO 

goto perroguardian 

RETRO:
POS1 = $CF
POS2 = $CE
POS3 = $CD
POS4 = $CC
RETROCEDE:
LCDOUT $fe, 1 
LCDOUT $FE,POS1, 7 
LCDOUT $FE,POS2, 6 
Pause 300
LCDOUT $fe, 1 
LCDOUT $FE,POS3, 5 
LCDOUT $FE,POS4, 4 
Pause 300

POS1 = POS1 - 3
POS2 = POS2 - 3
POS3 = POS3 - 3
POS4 = POS4 - 3
If POS4 < $C0 Then REINICIA 
GoTo RETROCEDE

REINICIA:
POS1 = $C0
POS2 = $C1
POS3 = $C2
POS4 = $C3
return 

DISABLE

ZONA:
IF BANDERA = 1 THEN
HIGH SIRENA
BANDERA1 = BANDERA1 + 1
ELSE
LOW SIRENA
ENDIF

BANDERA1 = BANDERA1 + 1
IF BANDERA1 > 6 THEN BANDERA1 = 0
IF BANDERA = 1 AND BANDERA1 < 3 THEN
PAUSE 100
serout PORTC.6,T9600,["AT+CMGR=1",10,13]
PAUSE 500
SEROUT PORTC.6,T9600,["AT+CMGD=1",10,13]
pause 500
SEROUT PORTC.6,T9600,["AT+CMGD=2",10,13]
pause 500
SEROUT PORTC.6,T9600,["AT+CMGF=1",10,13]
pause 1000
SEROUT PORTC.6,T9600,["AT+CMGS=",34,"2976256173",34,10,13]
pause 1000
SEROUT PORTC.6,T9600,["DISPARO ALARMA",26,10,13]
PAUSE 100
ENDIF

INTCON = %10010000 
Resume 
Enable 
END
si alguien necesita los comandos AT u manuales de este modem, tengo todos...
basicamente, para enviar un SMS seria algo asi:
Código:
Inicio:
gosub ELIMINAR
serout PORTC.6,N9600,["AT+CMGR=1",10,13]
pause 100
if PORTB.0=0 then Z1on:
goto inicio

Z1on:
gosub ENVIO_1
serout PORTC.6,N9600,["ALARMA Z1",26,10,13]
GOSUB ENVIO_2
serout PORTC.6,N9600,["ALARMA Z1",26,10,13]
GOTO INICIO

ENVIO_1:
pause 2000
SEROUT PORTC.6,N9600,["at+cmgf=1",10,13]
pause 1000
SEROUT PORTC.6,N9600,["at+cmgs=",34,"+54297xxxxxxx",34,10,13]
pause 5000
return

ELIMINAR:
PAUSE 100
SEROUT PORTC.6,N9600,["at+cmgd=1",10,13]
pause 1000
SEROUT PORTC.6,N9600,["at+cmgd=2",10,13]
pause 1000
return
lo bueno de este modem, que por el puerto RS232, podemos hacer una infinidad de cosas... El mismo modem cuenta con 4 puertos configurable como entrada o salida para no depepnder de un microcontrolador en el caso de querer controlar luces u artefactos... Igualmente, con un PIC16F877A, Experimente enviar imagenes de camaras web IP, controles domoticos que incluyen control de luces, alarmas sectorizadas, preguntarle al sistema el estado de las luces (con dos pic 16F877), que sensor detecto intruso, etc... Lo unico que me falto probar, es la funcion GPRS de movistar, la cual por una triangulacion de antenas, nos da la ubicacion aproximada del modem... los datos que se obtienen serian similares a estos:
El móvil XXXXXXXXXX esta en un Radio: 0.19 Km.; desde ing. Butty 240, Ciudad de Buenos Aires, Ciudad de Buenos; Coordenadas (-58 22 15,-34 35 45)
realmente muy bueno este equipo
les comparto un breve video de un software que habia arrancado lubeck hace un año y medio atras...un bocho ese pibe si le das un teclado, un monitor y un cpu... hace maravillas :LOL:
https://www.facebook.com/photo.php?v=446373595464761
 

Adjuntos

  • alarma16F877gsmENFORA.JPG
    alarma16F877gsmENFORA.JPG
    75.2 KB · Visitas: 67
  • imagenes.rar
    133.7 KB · Visitas: 58
Última edición:
Yo es la primera ves que escucho eso de interrupciones no convensionales, y me suena a mentira,un modulo tiene una interrupción y es todo, lo demás serian algoritmos.
Prueba utilizar el modulo USART con las instrucones hserin y hserout,al ser por hw seguramente llama a la subrutina de interrupción.
 
hola buen día compañeros la pagina que yo conozco de interrupciones es esta:
http://www.darreltaylor.com/DT_INTS-14/intro.html
saludosss

Algo asi me imagino con lo de "interrupciones no convencionales", ese tipo imagino que las nombro "instant interrupts", no es mas que utilizar algoritmos en ensamblador hacia las mismas interrupciones que tenga el microcontrolador.

siempre es util utilizar ensamblador en basic, siempre y cuando la aplicación lo requiera y uno lo domine, en el caso de una comunicacion serial yo no lo veo necesario.
 
hola buen día compañeros la pagina que yo conozco de interrupciones es esta:
http://www.darreltaylor.com/DT_INTS-14/intro.html
saludosss

(y) Tal cual!!!! :aplauso:
pero justo no funciona el link de descarga :cry:voy a tener que usar otro micro mas :(



Yo es la primera ves que escucho eso de interrupciones no convensionales, y me suena a mentira,un modulo tiene una interrupción y es todo, lo demás serian algoritmos.
Prueba utilizar el modulo USART con las instrucones hserin y hserout,al ser por hw seguramente llama a la subrutina de interrupción.

:eek: La idea era resumir el circuito... Viendo que no reesponde por USART el modem, creo que no hay muchas vueltas que darle... :unsure: crees que no agote todas las instancias antes de consultar?! (n)
 
Última edición:
puedes poner el codigo que utilizaste usando el modulo, me parece un poco raro, si funciona por SW, no tiene porque no funcionar por HW. quizas solo te falto configurarlo adecuadamente.

para enviar o recibir con HSERIN/HSEROUT, es la misma linea que con SEROUT, pero se le suma la H delante...
la configuracion fue esta:

Código:
INCLUDE "modedefs.bas"
DEFINE HSER_RCSTA 90H
DEFINE HSER_TSTA 20H
DEFINE HSER_BAUD9600

Probe en 2400 Baudios y menos que menos... pensando que era el hardware, configure el modem y despues ni con serin y serout pude establecer comunicacion con el hyperterminal, asi que lo deje en 9600 nuevamente y con serin y serout ya hablamos y tomamos mates con el modem...
creo que un 16F628 que tengo dando vueltas me salva las papas (tengo otro 877 pero es mucho ya)
 
hola a todos: de nuevo por estos lados con la preguntadera alguien sabe si en LINUX se puede instalar el PBP y el PROTEUS?
Yo intente con wine en una netbook del gobierno (conectar igualdad) y no me dejo correrlo; mplab y ccs si pero pbp no intente. Que distro le vas a colocar? quizas buscando en google proteus parra linux, te sale que version podrias usar...saludos
 
Bueno, anoche termine la segunda beta de un RX-TX 4-20mA HOME MADE para leer instrumentos que trabajan con este protocolo... Le falta pulir, pero lo mas importante es que el hardware despues de renegar lo saque a flote. Basicamente lo que hago es leer señales 4-20mA (24Vcc) y generar con un PWM 4-20mA (24Vcc)... La otra funcion que le sume, es poder generar un espejo de corriente entre la entrada y la salida, osea, si lee 5mA, a la salida genera 5mA.
Todo corre en base a dos LM358 con fuente simple (uno se alimenta a 12Vcc y el otro a 24Vcc). GND se comparte entre ambos amplificadores operacionales y señales de entrada / salida.
Para leer la señal 4-20mA y colocarlo en el display, como anoche estaba cansado y no se me ocurria nada para trabajar con punto flotante, implemente las siguientes lineas y medianamente quedo pasable:

Código:
ADCIN 0, ent420
  nivel = ent420
  aux1=(ent420*100)/250            ;(V*100)/(R*100)
  aux1= aux1 *2
  ;****blabla bla
   LCDOUT $FE, 1
  LCDOut $fe,2,"Sal: ",DEC4 aux1,"mA"

para generar el pwm que me lleve el filtro de 0-5Vcc para crear los 4-20mA, implemente estas lineas:

Código:
PWM PORTC.2,nivelAUX,100 ;nivel PWM = (Vout * 255) / V.Fuente
Les comparto el diagrama, si necesitan algo mas, me lo piden y te lo comparto; La proxima beta es sumarle un par de lineas mas y crear otra funcion mas... "Una fuente a modo generador de corriente" para probar y calibrar instrumentos.

 

Adjuntos

  • RX_4_20-0_5V_TX_0_5V-4_20ma.PNG
    RX_4_20-0_5V_TX_0_5V-4_20ma.PNG
    26.8 KB · Visitas: 74
Última edición:
hola martin, pudiste configurar los fuses para pics 12fxxx??? saludosss
No :oops: , pero seria ideal migrar todo asi queda mucho mas chico una version :unsure: ... total lo del display es chiche que no se justifica :rolleyes: ... practicamente es derrochar un 18F452 o un 16F877 :cry:
Me olvide comentar que para obtener a la salida del filtro que esta asociado al pin donde sale el PWM, la misma tension que la entrante por el puerto analogico, uso estas lineas, lo cual me simplifica mucho mas las cosas a la hora de querer hacer un espejo de corriente:

Código:
DEFINE OSC 20 
'****************************************************************
TRISA = 1 
ADCON1 = 0 
ADCON0 = %11000001
TRISB = %00000000  
TRISC = %11100000
'****************************************************************
DEFINE ADC_BITS 8 
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 50 
'****************************************************************
ent420 var word
nivel var byte
nivelAUX var byte
aux1 var byte
tiempo var byte
'****************************************************************
ejemplo:
ADCIN 0, ent420
nivel = ent420
aux1=(ent420*100)/250            ;(V*100)/(R*100)
aux1= aux1 *2
 LCDOUT $FE, 1
 LCDOut $fe,2,"Ent=Sal: ",DEC4 aux1,"mA"
 PWM PORTC.2,nivel,100  ;nivel PWM = (Vout * 255) / V.Fuente
pause 100
GOTO ejemplo
 
Última edición:
ah, bueno, aqui encontre un pequeño programita que hice para un 12f675 y ahi tiene los fuses configurados, el problema era que habia perdido el codigo de calibracion del oscilador interno del pic, el que aparece en la ultima linea del .hex, fijate si te sirve. saludosss
https://www.forosdeelectronica.com/posts/561757/
 
Última edición:
ah, bueno, aqui encontre un pequeño programita que hice para un 12f675 y ahi tiene los fuses configurados, el problema era que habia perdido el codigo de calibracion del oscilador interno del pic, el que aparece en la ultima linea del .hex, fijate si te sirve. saludosss
https://www.forosdeelectronica.com/posts/561757/

Recien mire el topico completo, pero de esta manera, osea por oscilador interno, no lo podria usar en 20Mhz:

@ DEVICE pic12F675,
intrc_osc, wdt_off, pwrt_on, mclr_off, bod_off, protect_off

DEFINE OSC 4
DEFINE OSCCAL_1K 1


Ahora voy a ver si encuentro ejemplos basicos con FUSES y configuracion de puertos, por que como te comente, solo fueron un par de veces que use este tipo de pic y no me acuerdo nada...
Tengo que acordarme como activar el ADC y como configurar GPIO ya sea como entrada o como salida asi ya puedo pasar todo de un micro al otro... supuestamente, para hacer el pasaje de un pic a otro, tengo que anexar oscilador externo, configurar el ADC0 para usarlo como entrada analogica y configurar un puerto como salida digital y de ahi sacar el PWM... en pocas palabras parece simple, pero tengo que refrezcar la memoria al parecer :oops:
Para la version del pic grande, ahora estoy trabajando con una nueva BETA, que lo que hace es transformar una lectura en 4-20mA... osea, lee un valor analogico, lo guarda como valor max y lee otro valor como min... con eso sacamos los 4-20mA y el resto de la escala, es conversion... Seria otra de las tantas maneras de encarar la lectura del sensor HOME MADE sin importar si la saldida de este es o no 4-20mA :unsure:
 

Adjuntos

  • sensor_1.PNG
    sensor_1.PNG
    355.9 KB · Visitas: 104
  • 20140504_162747.jpg
    20140504_162747.jpg
    80.7 KB · Visitas: 114
Última edición:
Hi torres.electronico, de esta manera recientemente use un 12f683 con ADC configurado a 10bit, espero que te sirba de algo ya que tiene los fuses, las configuracion del oscilador interno, ADC y como poner los diferentes pines como salida (GPIO).
'Config de Fuses
@ DEVICE PIC12F683
@ DEVICE PIC12F683, FCMEN_OFF
@ DEVICE PIC12F683, IESO_OFF
@ DEVICE PIC12F683, WDT_ON
@ DEVICE PIC12F683, BOD_ON
@ DEVICE PIC12F683, PWRT_ON
@ DEVICE PIC12F683, PROTECT_OFF
@ DEVICE PIC12F683, MCLR_OFF
@ DEVICE PIC12F683, INTRC_OSC_NOCLKOUT
@ DEVICE PIC12F683, BOD_ON
'Config parametros ADC
DEFINE ADC_BITS 10 'Numero de bits ADC
DEFINE ADC_CLOCK 1 'Reloj ADC interno
DEFINE ADC_SAMPLEUS 30 'Tiempo ADC
'Config de Registros
OSCCON=%01100001 'Calibrar el oscilador interno a 4Mhz
CMCON0 = 7 'Comparador OFF, salida como digitales
ADCON0=%10000000 'Resultado AD justificado a la derecha
ANSEL = %00110011 'AN0,AN2 analogico, los demas digitales
TRISIO = %11001011 'GP0,GP1,GP3 Entrada,GP2,GP4,GP5 salida
GPIO = 0 'Apago los puertos GP0
 
Atrás
Arriba