desktop

Curso de programación de PIC en PICBasic Pro

Saludos amigos listeros, estoy realizando unos programas en picbasic pro para el 16F628A y tengo una gran duda con las siguientes líneas de programa que no logro entender.
Espero su valiosa ayuda. Gracias de antemano.

Aquí parte del programa:
.....
eprom1="0"

PAUSE 100
READ 0, eprom1
IF eprom1=255 THEN grabar_clave
GOTO Bienvenida

grabar_clave:
Write 0, n1
....

Se supone que eprom1 vale cero. ¿Entonces qué quiere preguntar cuando eprom1=255?
Yo me he dado cuenta que al inicio del programa (con la memoria limpia) siempre se ejecuta "grabar_clave", logrando de esta manera en forma inicial guardar los datos iniciales en n1, n2... en la memoria eeprom para luego introducirlos como la clave.
Pero lo que no entiendo es. ¿Por qué con el IF está preguntando si eprom1=255, por qué no dice otro valor?
Ahora si se ejecuta inicialmente "grabar_clave" es por qué el IF dio un SI.
¿Pero cómo puede dar un SI, si dice que eprom1 (que vale 0) será igual a 255?

Saludos.

Terminator
 
Última edición por un moderador:
No cuando inicia asigna el codigo ascii a eprom1 como lo tienes, el que parece ser 48 necesitas quitar las comillas asi:
Código:
n1 var byte
eprom1 var byte

eprom1=0
[COLOR="red"]'aqui siiii... eprom1 vale 0[/COLOR]
PAUSE 100
[COLOR="blue"]'no tiene sentido que antes declares a eprom1=0 si haces la lectura de la eeprom[/COLOR]
READ 0, eprom1
[COLOR="red"]'aqui si no se ha grabado la eeprom con n1 , eprom1 vale 255[/COLOR]
IF eprom1=255 THEN grabar_clave
GOTO Bienvenida

grabar_clave:
[COLOR="Red"]??? aqui a n1 nunca le dices cuanto vale?[/COLOR]
Write 0, n1
pause 10

' debes poner una pausa de 10ms para que complete la grabacion

siempre entra al iniciar porque la memoria por defecto esta en 255 (FF)
 
Solicito apoyo en picbasicpro + ASM , requiero de hacer un retardo de 100ms en mitad de un codigo, segun yo va asi y me gustaria que me lo revizaran.
FOsc= 20Mhz
Ciclo instruccion .2uS

pseudocodigo:
Código:
Define Osc 20
cnt1             var byte
cnt2             var byte
cnt3             var byte

main:
  .
  .
  .
 cnt1=249
 cnt2=3
 Cnt3=100
 asm
 ;retard0 de 100 ms
retardo  
  nop  ;.2uS
  nop  ;.4uS
  nop  ;.6uS
  decfsz  _cnt1,f ;.8uS
  goto    retardo ; 1uS
  decfsz  _cnt2,f ; 250uS*4=1mS
  goto    retardo
  decfsz  _cnt3,f;1ms*100=100mS
  goto    retardo
 endasm 
   .
   .
   .
 Goto main

en lo que me confundo mucho es en la cuenta de los ciclos decfsz
 
Última edición:
Solicito apoyo en picbasic pro + ASM , requiero de hacer un retardo de 100ms en mitad de un código.
FOsc= 20Mhz
Ciclo instrucción .2uS
Prueba con este código de retardo (100Ms. @ 20MHz.)
Código:
retardo
    movlw    0x03
    movwf    _cnt1
    movlw    0x18
    movwf    _cnt2
    movlw    0x02
    movwf    _cnt3
retardo_0
    decfsz    _cnt1,f
    goto    $+2
    decfsz    _cnt2,f
    goto    $+2
    decfsz    _cnt3,f
    goto    retardo_0
    goto    $+1
    return
en lo que me confundo mucho es en la cuenta de los ciclos decfsz
Mira por aquí: http://www.golovchenko.org/cgi-bin/delay :cool:

Suerte.
 
Gracias Darkbytes

no hay problema que asigne los valores a las variables fuera del retardo no? para que no me "gaste" los microsegundos al declararla, puesto que hago una activacion de interrupcion asi:

pseudocodigo:
Código:
 cnt1=3 [COLOR="Blue"]'asigno valores de retardo[/COLOR]
 cnt2=24
 Cnt3=2
 TMR0L=0
 HIGH GIE  [COLOR="blue"]'activo interrupcion[/COLOR]
 input F_Port [COLOR="blue"]'cambio puerto a entrada[/COLOR]
 asm
retardo  
  decfsz _cnt1,f
  goto $+2
  decfsz _cnt2,f
  goto $+2
  decfsz _cnt3,f
  goto retardo
  goto   $+1
  goto   $+1
  goto   $+1
 endasm  
 output F_Port [COLOR="blue"]'cambio como salida el puerto [/COLOR]
 T0_High = TMR0L [COLOR="blue"]' tomo lectura de tiempo[/COLOR]
 
Gracias Darkbytes

¿No hay problema que asigne los valores a las variables fuera del retardo? Para que no me "gaste" los microsegundos al declararla, puesto que hago una activacion de interrupcion asi:
Si existe problema si asignas los valores fuera del bucle de retardo ya que se requiere reasignar los valores cada vez que se ingresa a la rutina.

¿Por qué? Por que cada vez que se sale de la rutina quedan almacenados otros valores en las variables.
Por lo tanto la rutina ya no funcionará, tal vez solo funcione la primer vez que se llama.

Y si cargas las variables antes de llamar a la rutina de retardo, da igual que si estuvieran dentro.

Nota:
Me faltó aclarar que al nombre de la rutina también hay que ponerle un guión bajo para poderla llamar.
También se puede nombrar como se hace normalmente con las etiquetas, pero antes de entrar al bloque ASM.

Saludos.
 
Última edición:
No funciona :(

algo estoy haciendo mal no hace caso a las instrucciones de ASM, sera porque compilo con MPASM?

-utilizo un pic18f2550, y me he dado cuenta que va a 48MHz porque utilizo el PLL5y div 2.
-el codigo no es mas que oscilar un led.

pseudocodigo:
Código:
define osc 48
d1               var byte
d2               var byte
d3               var byte
main:
 
 toggle led1
  asm
	movlw	0xA3
	movwf	_d1
	movlw	0x9E
	movwf	_d2
	movlw	0x03
	movwf	_d3
Delay_0
	decfsz	_d1, f
	goto	$+2
	decfsz	_d2, f
	goto	$+2
	decfsz	_d3, f
	goto	Delay_0
     
			;6 cycles
 [B][COLOR="Red"]'aqui arroja un warning en los tres goto,
 dice  que el destino de la direccion  debe ser un word  alineado y se pasma el pic, 
si los  quito no se pasma pero no hace el retardo
(Warning:destination address must be word aligned)[/COLOR][/B]
	goto	$+1 
	goto	$+1 '  
	goto	$+1

 endasm

Goto Main

el algoritmo de retardo si lo hago desde MPLAB si funciona en un pic 16f628A

mi opinion es que no funcionan los $+1 y $+2 creo :rolleyes:



Vaya!!!!!!!

si era eso no reconoce los $+1 y $+2
lo deje asi y funciona :)
psudocodigo:
Código:
	movlw	0xA3
	movwf	_d1
	movlw	0x9E
	movwf	_d2
	movlw	0x03
	movwf	_d3
Delay_0
	decfsz	_d1, 1
    goto	ex1
	decfsz	_d2, 1
ex1	
    goto	ex2
	decfsz	_d3, 1
ex2	
	goto	Delay_0
 
Última edición:
Amigos no se si ya lo mencionaron pero hoy me acabo de enterar, en el MicrodeStudio 5 con PBP3 se pueden utilizar Variables tipo Long de 32Bits, solo se tiene que poner en la linea de commando un -n

asi:
 

Adjuntos

  • Dibujo.JPG
    Dibujo.JPG
    38.4 KB · Visitas: 18
Amigos, no sé si ya lo mencionaron pero hoy me acabo de enterar, en el MicrodeStudio 5 con PBP3 se pueden utilizar Variables tipo Long de 32Bits, solo se tiene que poner en la línea de comando un -n
Sip, pero únicamente funciona con los PIC18 :cry:

La ayuda de PBP3 dijo:
Use Compiler Long Words. If enabled, LONG variables are made available. This mode is only available when compiling for a target device with the PIC18 prefix. LONG variables are interpreted as twos-complement, signed values.

Saludos.
 
Duda programa 16f88 para entrada analogica y PWM
Hola amigos,

Estoy aprendiendo poco a poco en esto de programar PIC en PBP , y temas de entradas y salidas digitales, mas o menos lo controlo (al menos lo básico).
Me gustaria en un 16f88, tener una entrada analogica con un potenciometro entre 0 y 5v, y una salida PWM para poder controlar un servomotor que varie su posicion segun el valor del potenciometro.
e estado pensando el asunto y e visto q el funcionamiento de un joystick es algo parecido y me gustaria intentarlo asi que si me podrian ayudar estaria agradecido

Me podeis orientar un poco sobre como diseñar el programa.

Gracias!!!! ...
 
Hola muchachos de nuevo vengo por aquí a molestar, a ver les cuento resulta que nunca he usado las memorias I2C pues nunca las he necesitado, y me dio por estudiar este interesante tema y encontré en un libro de basic para pics un programa que supuestamente escribe y lee la memoria, pero en el proteus no da ninguna señal de vida:confused: y como no conozco del tema no se que le faltara ó que estará mal aquí les subo los archivos para que los vean a ver sí me pueden ayudar.
Ahí me disculpan la molestadera(y)
 

Adjuntos

  • PRUEBA MEMORIAS.rar
    10.3 KB · Visitas: 62
Última edición:
encontré en un libro de basic para pics un programa que supuestamente escribe y lee la memoria, pero en el proteus no da ninguna señal de vida:confused: y como no conozco del tema no sé que le faltará ó que estará mal
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.
 
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:
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.
 
Atrás
Arriba