Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

01/10/2010 #101


Respuesta: ASM desde 0 (ASM desde cero)
ayuda con el comanda incf
al pulsar una entrada, en la salida debe incrementarse y prender un led de forma secuensial.


Rotación con intervalos de retardo de 1 segundo.
01/10/2010 #102


Respuesta: ASM desde 0 (ASM desde cero)
Y cuantos led tienes que prender???. Si vas a usar una secuencia es mejor realizar con la rotacion por el carry (rlcf)
01/10/2010 #103


Respuesta: ASM desde 0 (ASM desde cero)
mira tengo 5 pulsadores cada 1 activa una secuencia de 8 led (rb0-rb7)
ra0 no hace nada
ra1 activa la secuencia 10000000 ese valor tiene que pasar de forma secuencia por las otras salidas (rb0-rb7)
ra2 con la secuencia 11001100 y hace lo mismo incrementa el valor de la misma forma
y asi con cada secuencia activada por cada pulsador.
aaaaaa.al presionar 2 pulsadores no ocurre nada xd avance esto
List P=16F84A
Include <P16F84A.INC>
inicio
bsf STATUS,RP0
clrf TRISB
movlw b'11111111'
movwf TRISA
bcf STATUS,RP0

Principal

btfsc PORTA,0
call uno
btfsc PORTA,1
call dos
btfsc PORTA,2
call tres
btfsc PORTA,3
call cuatro
btfsc PORTA,4
call encender_5
call resetear

uno
btfsc PORTA,1
call resetear
btfsc PORTA,2
call resetear
btfsc PORTA,3
call resetear
btfsc PORTA,4
call resetear
call encender_1

dos

btfsc PORTA,2
call resetear
btfsc PORTA,3
call resetear
btfsc PORTA,4
call resetear
call encender_2
tres

btfsc PORTA,3
call resetear
btfsc PORTA,4
call resetear
call encender_3
cuatro

btfsc PORTA,4
call resetear
call encender_4

con esto activo cada entrada sin dejar funcionar las demas falta el programa con las salidas incrementadas ayuda no entiendoel comando xd
01/10/2010 #104


Respuesta: ASM desde 0 (ASM desde cero)
crosshad dijo: Ver Mensaje
mira tengo 5 pulsadores cada 1 activa una secuencia de 8 led (rb0-rb7)
ra0 no hace nada
ra1 activa la secuencia 10000000 ese valor tiene que pasar de forma secuencia por las otras salidas (rb0-rb7)
ra2 con la secuencia 11001100 y hace lo mismo incrementa el valor de la misma forma
y asi con cada secuencia activada por cada pulsador.
aaaaaa.al presionar 2 pulsadores no ocurre nada xd avance esto
List P=16F84A
Include <P16F84A.INC>
inicio
bsf STATUS,RP0
clrf TRISB
movlw b'11111111'
movwf TRISA
bcf STATUS,RP0

Principal

btfsc PORTA,0
call uno
btfsc PORTA,1
call dos
btfsc PORTA,2
call tres
btfsc PORTA,3
call cuatro
btfsc PORTA,4
call encender_5
call resetear

uno
btfsc PORTA,1
call resetear
btfsc PORTA,2
call resetear
btfsc PORTA,3
call resetear
btfsc PORTA,4
call resetear
call encender_1

dos

btfsc PORTA,2
call resetear
btfsc PORTA,3
call resetear
btfsc PORTA,4
call resetear
call encender_2
tres

btfsc PORTA,3
call resetear
btfsc PORTA,4
call resetear
call encender_3
cuatro

btfsc PORTA,4
call resetear
call encender_4

con esto activo cada entrada sin dejar funcionar las demas falta el programa con las salidas incrementadas ayuda no entiendoel comando xd
Hola, no entendi que quieres hacer con el programa, pero si vas a usar el puerto A tienes que configurarlo digital antes de usarlo, ya que ese puerto se puede usar como analogico o digital. Y lo otro es, que hace resetear? y donde esta esa etiqueta?
09/10/2010 #105


Respuesta: ASM desde 0 (ASM desde cero)
Hola, soy nuevo en este fantastico foro, por el que os tengo que felicitar a todos los que lo haceis posible. Descubri por casualidad el mundillo de los PICs y me fascino, estoy intentando aprender por mi cuenta pero me esta costando un triunfo, y escribo este mensaje para ver si alguien me puede ayudar.

Para ir poco a poco me he propuesto realizar un programilla sencillo (y aun asi no consigo que funcione), se trata de un 16F874A con tres pulsadores conectados en el puerto A (RA0, RA1 y RA3) y dos leds conectados en el puerto B (RB0 y RB1) y consiste en que al pulsar P1 encienda L1, si pulso P2 encienda L2 y si pulso P3 encienda ambos L1 y L2. EEl codigo es el siguiente, pero no me enciende ningun led, lo he cambiado y recambiado pero no consigo encender ningun led. ¿Que es lo que estoy haciendomal?

LIST P = 16F874A

PORTA EQU 0X05
PORTB EQU 0X06
ESTADO EQU 0X03
W EQU 0

ORG 0

bsf ESTADO,05 ;pongo a 1 el bit 5 de estado (RP0)
bcf ESTADO,06 ;y a 0 RP1 para direccionar al banco 1
movlw 0xff ;meto en W la congiguracion de los pines
movwf PORTA ;los establezco en el puerto a como entrada los tres primeros
movlw 0x00 ;meto la configuracion para el puerto b en W
movwf PORTB ;pongo todsa como salidas
bcf ESTADO,05 ;vuelvo a poner a 0 RP0 (ahora apunta al banco 0 de la memoria)

inicio btfsc PORTA, 0 ;chequea el bit 0 de PORTA, si es 0 salta una instruccion
movf PORTB, 0x01 ;mete un 1 en el pin 0 del puerto b (enciende el led)
btfsc PORTA, 1 ;chequeo el bit 1 de la puerta A
movf PORTB, 0x02 ;si esta pulsado P2 enciende L2
btfsc PORTA, 2 ;chequeo P3
movf PORTB, 0x03 ;si esta pulsado P3 endiende ambos leds
goto inicio ;bucle infinito
end
09/10/2010 #106

Avatar de ByAxel

Respuesta: ASM desde 0 (ASM desde cero)
perru dijo: Ver Mensaje
Hola, soy nuevo en este fantastico foro, por el que os tengo que felicitar a todos los que lo haceis posible. Descubri por casualidad el mundillo de los PICs y me fascino, estoy intentando aprender por mi cuenta pero me esta costando un triunfo, y escribo este mensaje para ver si alguien me puede ayudar.

Para ir poco a poco me he propuesto realizar un programilla sencillo (y aun asi no consigo que funcione), se trata de un 16F874A con tres pulsadores conectados en el puerto A (RA0, RA1 y RA3) y dos leds conectados en el puerto B (RB0 y RB1) y consiste en que al pulsar P1 encienda L1, si pulso P2 encienda L2 y si pulso P3 encienda ambos L1 y L2. EEl codigo es el siguiente, pero no me enciende ningun led, lo he cambiado y recambiado pero no consigo encender ningun led. ¿Que es lo que estoy haciendomal?

LIST P = 16F874A

PORTA EQU 0X05
PORTB EQU 0X06
ESTADO EQU 0X03
W EQU 0

ORG 0

bsf ESTADO,05 ;pongo a 1 el bit 5 de estado (RP0)
bcf ESTADO,06 ;y a 0 RP1 para direccionar al banco 1
movlw 0xff ;meto en W la congiguracion de los pines
movwf PORTA ;los establezco en el puerto a como entrada los tres primeros
movlw 0x00 ;meto la configuracion para el puerto b en W
movwf PORTB ;pongo todsa como salidas
bcf ESTADO,05 ;vuelvo a poner a 0 RP0 (ahora apunta al banco 0 de la memoria)

inicio btfsc PORTA, 0 ;chequea el bit 0 de PORTA, si es 0 salta una instruccion
movf PORTB, 0x01 ;mete un 1 en el pin 0 del puerto b (enciende el led)
btfsc PORTA, 1 ;chequeo el bit 1 de la puerta A
movf PORTB, 0x02 ;si esta pulsado P2 enciende L2
btfsc PORTA, 2 ;chequeo P3
movf PORTB, 0x03 ;si esta pulsado P3 endiende ambos leds
goto inicio ;bucle infinito
end
Bienvenido:
Te equivocas a usar la instrucción movf; lo que hace es mover o copiar el contenido del registro a dos posibles lugares que son 'W' (al acumulador o registro de trabajo) o al mismo registro. MOVF solo permite el valor '0' y '1' que son 'W' y el mismo registro respectivamente; al poner otros valores mayores de '1', compila bien pero al ser mayor lo considera como '1'.

Para escribir en los registros usa:
Código:
movlw   0x03
movwf   PORTB
...
...
bsf       PORTB,0
...
bcf       PORTB,0
Luego, los registros donde se establece entradas/salidas de un puerto son en los TRISx (TRISA, TRISB, etc.) que se encuentran en el Banco 1 que empieza en la dirección 0x80. Entonces:

-Para establecer I/O de pines en este PIC usa.
TRISA equ 0x85
TRISB equ 0x86
- Para leer o escribir en los puertos del PIC usa.
PORTA equ 0x05
PORTB equ 0x06

PD: Para que no estés declarando cada registro, usa la directiva #INCLUDE <P16F874A.INC> debajo de LIST.

saludos.
09/10/2010 #107


Respuesta: ASM desde 0 (ASM desde cero)
Gracias x contestar ByAxel, creo que me estoy liando yo solo con el chequeo de los pines de PORTA y con la escritura de los de PORTB. He realizado las siguientes modificaciones, me lo podrias corregir como al ignorante que soy?

LIST P = 16F874A

#INCLUDE <P16F874A.INC>

TRISA EQU 0x85
TRISB EQU 0x86
PORTA EQU 0X05
PORTB EQU 0X06
ESTADO EQU 0X03
W EQU 0

ORG 0

bsf ESTADO,05 ;pongo a 1 el bit 5 de estado (RP0)
bcf ESTADO,06 ;y a 0 RP1 para direccionar al banco 1
movlw 0xff ;meto en W la congiguracion de los pines
movwf TRISA ;los establezco en el puerto a como entrada los tres primeros
movlw 0x00 ;meto la configuracion para el puerto b en W
movwf TRISB ;pongo todsa como salidas
bcf ESTADO,05 ;vuelvo a poner a 0 RP0 (ahora apunta al banco 0 de la memoria)

inicio movlw 0x01
btfsc PORTA,00 ;chequea el bit 0 de PORTA, si es 0 salta una instruccion
movwf PORTB
movlw 0x02 ;mete un 1 en el pin 0 del puerto b (enciende el led)
btfsc PORTA,01 ;chequeo el bit 1 de la puerta A
movwf PORTB ;si esta pulsado P2 enciende L2
movlw 0x03
btfsc PORTA,02 ;chequeo P3
movwf PORTB ;si esta pulsado P3 endiende ambos leds
goto inicio ;bucle infinito
end
09/10/2010 #108


Respuesta: ASM desde 0 (ASM desde cero)
HOLA A TODOS..no era este el lugar pero nose como abrir un tema tengo un problema quiero hacer un control de temp con un lm 35 le pongo un amplificador y a los 50 grados me entrega 3 volt eso lo meto a la entrada A0 del conversor del PIC 16f88 pero nunca lo encuentra a ese valor osea queria prender un led para probar cuando llege a ese valor mi duda es si estoy configurando mal el pic o que este es el codigo:

int16 a;
int16 b;

void main()
{
b=0x0265;
setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_a(1);
set_tris_b(0);
set_adc_channel(0);
a=read_adc();
output_b(0);
if(a>=b){
while(true){
output_b(1);
delay_ms(2000);
}

}
Soy principiante en esto ... uso PICC eso me olvide de decir por favor necesito ayuda gracias a todos ..y perdon si me fui de tema lei lo de ASM y esta muy interesante..
09/10/2010 #109

Avatar de ByAxel

Respuesta: ASM desde 0 (ASM desde cero)
En caso de usar el #INCLUDE <P16F874A.INC>, ya no necesitas declarar los registros (PORTx, TRISx, etc...) ya que todos se encuentran en el archivo P16F874A.INC, si quieres revisarlo por lo general se encuentra en la carpeta de microchip "C:\Program Files\Microchip\MPASM Suite" incluidos los Fuses que son importantes y que no los veo en tu ejemplo.

Código:
        LIST P = 16F874A

#INCLUDE <P16F874A.INC>
        __CONFIG _CP_OFF & _DEBUG_OFF & _WDT_OFF & _LVP_OFF & _XT_OSC 
                        ; Config es para configurar los fuses y el resto lo encuentras al último del archivo
                        ; P16F874A.INC. Para saber que son debes de revisar el Datasheet del PIC en
                        ; "CONFIGURATION WORD" donde explica que hace cada uno.
Ya no es necesario que declares ESTADO EQU 0X03, puedes o no usarlo ya que dentro del archivo P16F874A.INC, se le conoce como STATUS y de esa forma lo encontraras en todo sitio al igual que W EQU 0 que también está declarado en el archivo.

Todo eso no genera código, es para uso exclusivo del compilador... ahora todo lo considerado como instrucción que escribas entre ORG 0x00 y END, eso si genera código.

El resto esta bien, solo una duda... una vez enciendas uno o todos los LEDs ¿Como los apagas? ya que aria falta un grupo de código que mantenga apagados los LEDs mientras las entradas sean cero (0)

saludos.
09/10/2010 #110


Respuesta: ASM desde 0 (ASM desde cero)
No fastidies que va a ser ese el problema!!!!!!! me faltan las instrucciones para que se apaguen? A ver la idea es un circuitillo con tres pulsadores en PORTA y dos leds en PORTB, los leds quiero que esten siempre apagadoe excepto kuando accione los pulsadores (L1 enciende cuando pulso P1, L2 cuando pulso P2 y ambos leds cuando pulso P3) igual es una idea feliz mia, pero he dado x sentado que si los pulsadores estan abiertos los leds estaran apagados, el pic no funciona igual que si haria el montaje analogico?, es decir estimulando los pulsadores en PORTA no meto y quito corriente en los pines de PORTB? Menudo cacao tengo montao!!!!!!!
09/10/2010 #111

Avatar de ByAxel

Respuesta: ASM desde 0 (ASM desde cero)
Eso de...
perru dijo: Ver Mensaje
quiero que esten siempre apagadoe excepto kuando accione los pulsadores
es lo que hace falta...
Los pulsadores en PORTA deben de tener una resistencia conectado a GND (Pull-down), así el PIC leerá cero (0) y los pulsadores conectados a +V, cuando pulses, el PIC leerá uno (1)... lo que hace falta es el código que apague el/los LEDs cuando el pulsador respectivo se encuentre abierto...

Algo así para solo una entrada...
Código:
Loop:
  btfsc   PORTA,0
  bsf     PORTB,0
  btfss   PORTA,0
  bcf     PORTB,0
  goto    Loop
Se me olvidaba... ese PIC tiene un ADC (convierte de análogo a digital) ubicado en el PORTA, pero debes de desactivar ese módulo ya que el PORTA los usas como entrada digital, para eso pones en el banco 1:

movlw 0x07 ; PORTA como I/O digitales.
movwf ADCON1

saludos
10/10/2010 #112


Respuesta: ASM desde 0 (ASM desde cero)
Joer ByAxel, no sabes lo ke te agradezco la ayuda, eres la primera persona ke enkuentro dispuesta a enseñarme. He cambiao lo ke me has komentao y ke no hay manera, en la simulacion no vario los pines de PORTB, las resistencias ya las tenia puestas lo ke pasa ke en la linea power, las he cambiao pero nada. No sera ke tengo algo mal en la simulacion??? me extraña x ke es un circuito muy simple pero visto lo visto no descarto nada. Igual me he puesto un ejercicio demasiado komplejo para no tener ni idea . Ahora mismo lo tengo asi:

LIST P = 16F874A

#INCLUDE <P16F874A.INC>

ORG 0

bsf ESTADO,05 ;pongo a 1 el bit 5 de estado (RP0)
bcf ESTADO,06 ;y a 0 RP1 para direccionar al banco 1
movlw 0xff ;meto en W la congiguracion de los pines
movwf TRISA ;los establezco en el puerto a como entrada los tres primeros
movlw 0x00 ;meto la configuracion para el puerto b en W
movwf TRISB ;pongo todsa como salidas
bcf ESTADO,05 ;vuelvo a poner a 0 RP0 (ahora apunta al banco 0 de la memoria)
movlw 0x07 ; PORTA como I/O digitales.
movwf ADCON1

inicio btfsc PORTA,0 ;chequea el bit 0 de PORTA, si es 0 salta una instruccion
bsf PORTB,0 ;mete un 1 en el pin 0 del puerto b (enciende el led)
btfss PORTA,0
bcf PORTB,0
btfsc PORTA,1 ;chequeo el bit 1 de la puerta A
bsf PORTB,1 ;si esta pulsado P2 enciende L2
btfss PORTA,1
bcf PORTB,1
btfsc PORTA,2 ;chequeo P3
bsf PORTB,2 ;si esta pulsado P3 enciende ambos leds
btfss PORTA,2
bcf PORTB,2
goto inicio ;bucle infinito
end
10/10/2010 #113

Avatar de ByAxel

Respuesta: ASM desde 0 (ASM desde cero)
He comentado la mayoría:
Código:
	ORG	0x00
	bsf	 STATUS,5	 	; Banco 1
	bcf	 STATUS,6	 	;  
	movlw 	0x07 			; PORTA como I/O digitales.
	movwf 	ADCON1
	movlw	0xFF	 		; meto en W la congiguracion de los pines
	movwf 	TRISA	 		; >> Con 0xFF estableces todo el puerto como ENTRADAS
	movlw 	0x00	 		; meto la configuracion para el puerto b en W
	movwf 	TRISB	 		; pongo todsa como salidas
	bcf	 STATUS,5	 	; Banco 0

BucleA
	clrf	PORTB			; borra todo el PORTB (mantiene apagados los LEDs)
BucleB	
	btfsc	PORTA,0 		; Chequea RA0, ¿Es cero? => salta una instrucción
	bsf 	PORTB,0	 		; de lo contrario pone a '1' el RB0 (LED1)
	btfss	PORTA,0			; Chequea RA0, ¿Es uno? => salta una instrucción
	bcf	 PORTB,0			; de lo contrario pona '0' el RB0
	btfsc 	PORTA,1	 		; ... RA1?
	bsf 	PORTB,1	 		; pone a '1' el RB1	(LED2)
	btfss 	PORTA,1			; ... RA1?
	bcf 	PORTB,1			; pone a '0' el RB1
	
	btfss	PORTA,2			; Chequea RA2, ¿Es uno? => salta una instrucción
	goto	BucleA			; de lo contrario salta a Bucle externo donde...
	bsf	PORTB,0			; pone a '1' RB0 y RB1 (LED1 y LED2)
	bsf	PORTB,1
	goto	BucleB			; Continua con el bucle interno...
	
	END
Recuerda que si incluyes el archivo P16F874A.INC ya no es necesario declarar ningún registro, es por eso que yo uso STATUS... y el registro ADCON1 está en el banco 1.
El MPLAB revisa sintaxis, mayúsculas, minúsculas, declaraciones, instrucciones y en base a eso genera los mensajes/errores, por lo que no te va a avisar si alguna secuencia la haces mal, aunque todo esté bien escrito y el PIC no funcione, es un indicio que algo se ha configurado mal... (error humano ).

La parte de encender ambos LEDs lo he resuelto de esa forma, pero hay muchas más... cada programador tiene su estilo... poco a poco usa las 35 instrucciones y veras que haces maravillas

saludos.
10/10/2010 #114


Respuesta: ASM desde 0 (ASM desde cero)
Definitivamente tiene ke ser la simulacion!!!! No hay modificaciones en el PORTB cuando pulso, de hecho no se modifica nada en el watch window y para mayor desesperacion mia veo que el estado de las lineas de los pulsadores si cambian (estan con el cuadradito en rojo y cuando pulso cambia a azul pero no cambia ningun bit de ningun registro). Muchas gracias x animarme pero si me estoy volviendo loko ya kon los pulsadores estos no te digo nada para llegar a realizar el proyecto ke tengo en mente...uffff. En la simulacion tengo: los tres pulsadores a tierra x un extremo y por el otro a +5v con una resistencia de 10k intercaladas a cada uno y estos conectados respectivamente a PORTA y a la salida de PORTB los leds con una res de 680. Madre mia!!! kon lo facil ke me las prometia y lo ignorante ke me estoy sintiendo.
10/10/2010 #115

Avatar de ByAxel

Respuesta: ASM desde 0 (ASM desde cero)
Supongo, ya lo simule (Stimulus RA0, RA1, RA2 + WatchWindow + Simulación en StepInto) y si corre... hay varias cosas a tomar en cuenta que obligado harán que el código crezca pero para ser como prueba funciona.
10/10/2010 #116


Respuesta: ASM desde 0 (ASM desde cero)
le puedes echar un vistazo?
Imágenes Adjuntas
Tipo de Archivo: jpg simulacion.JPG (166,5 KB (Kilobytes), 66 visitas)
10/10/2010 #117

Avatar de ByAxel

Respuesta: ASM desde 0 (ASM desde cero)
En el programa checas a que una entrada esté a '1' (pulsador cerrado) para encender el LED respectivo pero en el esquema hace lo contrario... cambia las resistencias a GND y los pulsadores a +V.
Las resistencias para los LED (solo en la simulación) ponlo a 100 Ohm para que se vea el brillo y hace falta poner a V+ la pata del MCLR.
- Te dejo el code que use..., ahora queda mejorar la parte donde encienden dos LED a la vez..

saludos
Archivos Adjuntos
Tipo de Archivo: txt Code.txt (1,2 KB (Kilobytes), 39 visitas)
10/10/2010 #118


Respuesta: ASM desde 0 (ASM desde cero)
Ke grande eres!!!!!!!, ya funciona, pero lo has conseguido tu . Lo ke si al kompilarlo me he fijado ke no te kaska ningun warning y a mi me saltaban 6 o asi, ¿eso es x la configuracion de la cabecera? supongo ke sera x lo de errorlevel -302. Se lo ke son algunas instrucciones (_XT_OSC y _WDT_OFF) pero eske eso a mi me keda muy lejos todabia, veras estoy siguiendo un libro y en el principio (donde estoy) no mete esas cabeceras de momento, lo mismo ke el include, me suenan de haber leido codigo x ahi pero hasta ke llegue... kon la ke he liao pa tres pulsadores y dos leds...

Muchas gracias otra vez, el codigo kuando lo leo, lo sigo mas o menos pero escribirlo ya es otra kosa, sobre todo kuando no tienes kien te diga lo ke estas haciendo mal. ¿te seria mucha molestia mandarme programas para hacer? tengo mucho interes x aprender y poder ir progresando en hacer kosillas mas komplikadas y utiles, pero ke sean basicos gg, a ver si te vas a pasar
10/10/2010 #119

Avatar de ByAxel

Respuesta: ASM desde 0 (ASM desde cero)
Esto: http://www.pic16f84a.org/, es un libro muy usado por el que empieza... es un PIC algo viejo pero sirve bastante la información...
- Siempre ten a la mano el datasheet del PIC que uses.
- Los PIC16F son en su mayoría compatibles por lo que "Si aprendes a programar uno, aprendes a programar todos" los de la serie 16F.
- Las diferencias están es sus registros, fuses, por eso "Siempre revisa el datasheet".
- Introduccion a la programacion de PIC's (assembler).

Suerte.
saludos...
10/10/2010 #120


Respuesta: ASM desde 0 (ASM desde cero)
Me referia a la hora de korregir, toda esa informacion la tengo y es realmente util, pero en kuanto me salgo un poko del guion y me atasko... El codigo kon el ke habia empezado estaba bien estructurao, kitando el mal uso del movf, pero si tu no me lo llegas a komentar no hubiera salido de ese bucle para mi estaba bien y segun el libro tb.
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.