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

Temas similares

03/04/2012 #1


Dudas al migrar al PIC16F628A
Estoy migrando al Pic 16F628A pero tengo la siguiente duda por lo cual escribi u programa muy sencillo de secuencia de luces para el PIC16F84A y otro para el PIC 16F628A cambiando los fuses y configurando PORTA habilitando los pines como I/O en CMCON. Lo tengo en la protoboard. Probando el circuito con 16F84A tengo que conectar una resistencia (10K) del RA5 a VDD como tiene que ser. Si algo reset con el pulsador conectado Vcc se reinicia el programa lo cual está bien. El problema es con el 16F628A no conecto ninguna resistencia, conecto la resistencia a VDD o la conecto a VCC el programa funciona, y si hago el reset con el pulsador no funciona. Es esto normal. La verdad estoy muy desconcertado, tengo tres integrados uno de esto los compre hoy pensando que pudiese ser el integrado pero nada. Gracias por su ayuda.

Código:
LIST	   P=16F628A
  INCLUDE  <P16F628A.INC>
    __CONFIG  _CP_OFF &  _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
;**********************************************************
;**   ASIGNAMOS LAS VARIABLES DE LOS REGISTROS DE RAM ***
;**********************************************************
 cblock  0x21	
R_ContA	; Contadores para los retardos.
	R_ContB
 endc
#DEFINE  LED0	PORTB,0
#DEFINE  LED1	PORTB,1
#DEFINE  LED2	PORTB,2
#DEFINE  LED3	PORTB,3
#DEFINE  LED4	PORTB,4
#DEFINE  LED5	PORTB,5
#DEFINE  LED6	PORTB,6
#DEFINE  LED7	PORTB,7
;**********************************************************
;**   ESCRITURA DEL PROGRAMA DEL PIC    ***
;**********************************************************
    Org 0x0000
    GOTO INICIO
;**********************************************************
;**   CONFIGURAMOS PUERTOS DEL PIC     ***
;**********************************************************  
INICIO
    CLRF PORTA ;Initialize PORTA by setting output data latches
    MOVLW  0x7    ; Configuro Comparador Analogico
    MOVWF  CMCON   ; V1in-=GND, V1in+=GND, C1out=Off| V2in-=GND, V2in+=GND, C2out=Off
    BCF    STATUS,RP1 
    BSF    STATUS,RP0    ;SELECCIONAMOS EL BANCO 1
    CLRF   TRISB         ;PORTB como salida
    MOVLW  B'01111011'         ;   b'00011111'  d'031'
    MOVWF  TRISA         ;PORTA como entrada
    BCF    STATUS,RP0    ;SELECCIONAMOS EL BANCO 0
    CLRF   PORTA         ;PuertoA a cero
    CLRF   PORTB         ;PuertoB a cero
    BSF    PORTA,2
;**********************************************************
;**   EMPEZAMOS CON EL PROGRAMA     ***
;**********************************************************
Principal
       bsf	    LED0			; Enciende el LED
       call	    Retardo_200ms		; durante la suma de este tiempo.
       bcf	    LED0			; Lo apaga durante la suma de los siguientes

       bsf	    LED1			; Enciende el LED
       call	Retardo_200ms		; durante la suma de este tiempo.
       bcf	    LED1			; Lo apaga durante la suma de los siguientes

      bsf	    LED2			; Enciende el LED
      call	Retardo_200ms		; durante la suma de este tiempo.
      bcf	    LED2			; Lo apaga durante la suma de los siguientes

      bsf	    LED3			; Enciende el LED
      call	Retardo_200ms		; durante la suma de este tiempo.
      bcf	    LED3			; Lo apaga durante la suma de los siguientes

      bsf	    LED4			; Enciende el LED
      call	Retardo_200ms		; durante la suma de este tiempo.
      bcf	    LED4			; Lo apaga durante la suma de los siguientes

      bsf	    LED5			; Enciende el LED
      call	Retardo_200ms		; durante la suma de este tiempo.
      bcf	    LED5			; Lo apaga durante la suma de los siguientes

      bsf	    LED6			; Enciende el LED
      call	Retardo_200ms		; durante la suma de este tiempo.
      bcf	    LED6			; Lo apaga durante la suma de los siguientes

      bsf	    LED7			; Enciende el LED
      call	Retardo_200ms		; durante la suma de este tiempo.
      bcf	    LED7			; Lo apaga durante la suma de los siguientes

      call	Retardo_200ms
      goto 	Principal

; Subrutinas "Retardo_200ms" y "Retardo_100ms"-------------------------------------------
Retardo_200ms				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'200'			; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms		; Aporta 2 ciclos máquina.
Retardo_100ms				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'100'			; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms		; Aporta 2 ciclos máquina.
Retardo_1ms				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'1'			; Aporta 1 ciclo máquina. Este es el valor de "M".
;
; El próximo bloque "Retardos_ms" tarda:
; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 =
; = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina
; que a 4 MHz son 1002 µs = 1 ms.
;
Retardos_ms
	movwf	R_ContB			; Aporta 1 ciclo máquina.
R1ms_BucleExterno
	movlw	d'249'			; Aporta Mx1 ciclos máquina. Este es el valor de "K".
	movwf	R_ContA			; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
	nop				; Aporta KxMx1 ciclos máquina.
	decfsz	R_ContA,F		; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
	goto	R1ms_BucleInterno 		; Aporta (K-1)xMx2 ciclos máquina.
	decfsz	R_ContB,F		; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
	goto	R1ms_BucleExterno 	; Aporta (M-1)x2 ciclos máquina.
	return				; El salto de retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_200ms:	2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249).
; - Retardo_100ms:	2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249).
; - Retardo_1ms  :	2 + 1     + (2 + 4M + 4KM) =   1005 cm =   1 ms. (M=  1 y K=249).

	END
04/04/2012 #2
Moderador

Avatar de D@rkbytes

Omar266 dijo: Ver Mensaje
Estoy migrando al Pic 16F628A pero tengo la siguiente duda por lo cual escribi u programa muy sencillo de secuencia de luces para el PIC16F84A y otro para el PIC 16F628A cambiando los fuses y configurando PORTA habilitando los pines como I/O en CMCON. Lo tengo en la protoboard. Probando el circuito con 16F84A tengo que conectar una resistencia (10K) del RA5 a VDD como tiene que ser. Si algo reset con el pulsador conectado Vcc se reinicia el programa lo cual está bien. El problema es con el 16F628A no conecto ninguna resistencia, conecto la resistencia a VDD o la conecto a VCC el programa funciona, y si hago el reset con el pulsador no funciona. Es esto normal. La verdad estoy muy desconcertado, tengo tres integrados uno de esto los compre hoy pensando que pudiese ser el integrado pero nada. Gracias por su ayuda.
La configuración que usas para el reset de la primer figura, no me parece buena.
Y las demás, me parece que son tus pruebas.
El PIN RA5 en el 16F628A es un pin que puede ser usado como reset o solamente como entrada.
Por lo tanto no es necesario usar la R de 100Ω
Con tan solo una R de 4.7K o 10K hacia VDD y un pushbutton hacia VSS, basta.
Incluso se puede conectar ese pin directamente a VDD si no se va a usar como reset,
o configurarlo como entrada, con el fuse _MCLRE_OFF
Los fuses que usas en la cabecera no son los correctos,
y no es bueno configurar el fuse _BOREN_XXX (Brown Out Reset Enable Bit) en ON como lo tienes.
A menos que tu sistema requiera de esta detección.
Este sirve para hacer un reset cuando se detecte un bajo voltaje de alimentación. Y puede ser configurado.
El registro CMCON no hace los pines de entrada o salida I/O como citas, eso lo haces con TRISX
Establecer un 7 b'111' a tal registro, convierte los comparadores analógicos en digitales.
Su uso esta ligado al registro VRCON en donde se configuran los voltajes de referencia.
Cuando esta en modo digital no hace falta configurar VRCON
Estos son los fuses correctos que debes usar actualmente.
Al menos para la versión 8.83 que es la que actualmente uso.
Ya que el fuse _DATA_CP_OFF genera error de compilación. Usa _CPD_OFF
Y cambia _BODEN_ON por _BOREN_OFF
Tu programa en si, esta bien, y lo probe en un protoboard que ya tenia preparado anteriormente.
Solo por probar, ya que a simple vista se nota bien. Solo modifica tu sistema de reset.
Como quiera te adjunto el programa con los cambios que le hice.

Suerte y hasta luego.
04/04/2012 #3

Avatar de Meta

Hola:

Migrar el PIC16F84A al 16F628A no hay tantos problemas. Para dejar claro algunas cositas en tener cuentas, dejo unos documentos.

Palabras de configuración

Librerías retardos

Documentación extra. No es importante, si como curiosidad. Se trata del Posible sustituto del 16F84A a partir de la página 71 de este enlace.

Ver documento

Un saludo.
04/04/2012 #4


Les quiero agradecer por su ayuda, y disculpen la molestia pero en realidad estoy muy desconcertado, la verdad es que he hecho varios proyectos con el 16F84A, como un bípedo que retrocede y cambia de dirección cuando detecta vacio y un carro a control remoto por RF que avanza, retrocede, izquierda, derecha, para y tres cambios de velocidad por PWM. Con este ultimo trate de cambiar al 16F628A pero también tuve el problema de RA5.

Por eso hice este programa de secuencia de luces. Les cuento que sigo teniendo el mismo problema. Como dije anteriormente estoy usando tres integrados he cambiado de protoboard. Hago la prueba con su archivo hex y con 16F84A funciona perfectamente y con el 16F628A si dejo libre el pin, si lo conecto a VDD o lo conecto a VSS funciona de igual manera. Con el sistema de RESET (resistencia 4.7 o 10K a VDD y pulsador a VSS) no funciona no se reinicia. Uso la grabadora TE20se hecha por mí, y IC-Prog 1.01.

Apropósito en cuanto a _DATA_CP_OFF me está pasando lo mismo con las versiones de MPLAB 8.83 y 8.84 bajadas directamente de Microchip. En otro computador tengo la versión 8.43 con esta hice la compilación. Estuve revisando los archivos 16F628A.INC de las versiones 8.43, 8.83 y 8.84 de MPLAB. En la 8.43 figura _DATA_CP_OFF y _DATA_CP_ON pero en las otras versiones figuran DATA_CP_OFF y DATA_CP_OFF, creo que es por eso.
05/04/2012 #5
Moderador

Avatar de D@rkbytes

Omar266 dijo: Ver Mensaje
Les quiero agradecer por su ayuda, y disculpen la molestia pero en realidad estoy muy desconcertado, la verdad es que he hecho varios proyectos con el 16F84A, como un bípedo que retrocede y cambia de dirección cuando detecta vacio y un carro a control remoto por RF que avanza, retrocede, izquierda, derecha, para y tres cambios de velocidad por PWM. Con este ultimo trate de cambiar al 16F628A pero también tuve el problema de RA5.

Por eso hice este programa de secuencia de luces. Les cuento que sigo teniendo el mismo problema. Como dije anteriormente estoy usando tres integrados he cambiado de protoboard. Hago la prueba con su archivo hex y con 16F84A funciona perfectamente y con el 16F628A si dejo libre el pin, si lo conecto a VDD o lo conecto a VSS funciona de igual manera. Con el sistema de RESET (resistencia 4.7 o 10K a VDD y pulsador a VSS) no funciona no se reinicia. Uso la grabadora TE20se hecha por mí, y IC-Prog 1.01.

Apropósito en cuanto a _DATA_CP_OFF me está pasando lo mismo con las versiones de MPLAB 8.83 y 8.84 bajadas directamente de Microchip. En otro computador tengo la versión 8.43 con esta hice la compilación. Estuve revisando los archivos 16F628A.INC de las versiones 8.43, 8.83 y 8.84 de MPLAB. En la 8.43 figura _DATA_CP_OFF y _DATA_CP_ON pero en las otras versiones figuran DATA_CP_OFF y DATA_CP_OFF, creo que es por eso.
Ok. Saludos.
Pues te digo que a mi si me funciona el reset como te decia anteriormente.
Aqui una muestra de el circuito montado en protoboard.

Si te fijas, hay solo una R 10k hacia VDD y el Pushbutton hacia el VSS Pin 5 del 16F628A
Al presionarlo, todos los LED's se apagan, hasta soltarlo nuevamente comienza otra vez.
No te fijes en el circuito de la izquierda,
ya que es para unas pruebas que estaba haciendo, para comunicación serial.
Así que debes tener algo extraño por ahí mal conectado o configurado.
Checa con el IC-Prog que al cargar el HEX se encuentren los fuses así.

Ya veras que algo debes estar obviando, porque todo funciona bien.

Suerte y hasta luego.
Imágenes Adjuntas
Tipo de Archivo: jpg DSCI0021.JPG (188,7 KB (Kilobytes), 275 visitas)
Tipo de Archivo: jpg Fuses.jpg (27,4 KB (Kilobytes), 269 visitas)
05/04/2012 #6


Les quiero agradecer muchisisimo, el problema era en la grabación, pues estaba deshabilitado los fuses, ya que al hacer mi grabadora y al configurar la IC-Prog por primera vez, en la instrucciones dadas por alguien para el 16F84A dice .... “debemos dejar sin activar las opciones PWRT y CP, para evitar quemar los bits de seguridad de no lectura, probablemente no permita volver a programar el chip si se trata de un reprogramable.” , y pensé que se aplicaba para todos. Los seguiré molestado ya que mi idea es usar el 16F876A pues deseo hacer mi carro completamente microcontrolado pues el actual consta hay módulos sin microcontrolador como sigue línea y detector de obstáculos. Muchísimas gracias.
05/04/2012 #7

Avatar de Meta

Hola:

La mejor idea, si puedes, es usar el PIC16F886, más moderno.

Mirgrar del 16F87xA al 16F88x. No es que lo hagas, si tener claro las ideas para el futuro.
http://www.microchip.com.ar/rs2009/s..._877_a_887.pdf

Un saludo.
05/04/2012 #8
Moderador

Avatar de D@rkbytes

Omar266 dijo: Ver Mensaje
Les quiero agradecer muchisisimo, el problema era en la grabación, pues estaba deshabilitado los fuses, ya que al hacer mi grabadora y al configurar la IC-Prog por primera vez, en la instrucciones dadas por alguien para el 16F84A dice .... “debemos dejar sin activar las opciones PWRT y CP, para evitar quemar los bits de seguridad de no lectura, probablemente no permita volver a programar el chip si se trata de un reprogramable.” , y pensé que se aplicaba para todos. Los seguiré molestado ya que mi idea es usar el 16F876A pues deseo hacer mi carro completamente microcontrolado pues el actual consta hay módulos sin microcontrolador como sigue línea y detector de obstáculos. Muchísimas gracias.
Ok. Saludos.
Ya ves, te dije que estarias pasando algo por alto.
Y como estas migrando del 16F84A al 16F628A, pues por eso paso.
Si te fijas, en el 16F84A no existe el fuse para el MCLR y en el 16F628A si.
Yo me imagine que solo de esa forma no te podria estar funcionando el Reset.
Pero nunca me imagine que deshabilitarias ese fuse.
Ya que en el 16F628A es el que te permite usar ese pin como entrada al estar _MCLRE_OFF
En la configuración de fuses del IC_Prog para el 16F84A ese fuse no existe.
Te recomiendo que siempre que tengas dudas acerca de algún PIC.
Siempre consultes su correspondiente Hoja de Datos (Data sheet)
Todos ellos se encuentran en una zona de la web de Microchip junto con más hojas de información.
Lamentablemente no se encuentra en español, solo en Ingles, Chino y Japones.

Ok. Pues suerte, y hasta luego.
13/01/2013 #9


Ayuda pasar programa pic16f84a a 16f628a
Hola que tal, pido ayuda para poder pasar este programa que recien lo necesito en el 628 y no en el 84, pero no entiendo mucho del 28 y cuando corro el programa en PROTEUS me sale error y ya no corre bien mi programa que fincionaba bien en el 84.

Por favor necesito su ayuda.


Saludos y gracias =D

lo unico que cambie fue en el include pasar del 84 al 28, pero de resto no se que mas..


#INCLUDE <16F628A.H>
#FUSES XT, NOWDT, NOPROTECT
#USE DELAY(CLOCK=4000000)

#BYTE PORTA = 05
#BYTE PORTB = 06
#BYTE DATO1 = 0x0C
#BYTE DATO2 = 0x0D
#BYTE RESULTADO = 0x0E

VOID MAIN()
{
SET_TRIS_A(0B00000);
SET_TRIS_B(0XFF);
OUTPUT_A(0X00);
WHILE(TRUE)
{
DATO1 = (0x0F) & (PORTB);
DATO2 = (0xF0) & (PORTB);
DATO2 = SWAP(DATO2);
RESULTADO = DATO1 + DATO2;
PORTA = RESULTADO;
}
}
13/01/2013 #10

Avatar de LaElectronicaMeOdia

Deshabilita el modulo de comparador, para que el puerto A sea digital.

al Registro CMCON le asignas el valor 0x07.
13/01/2013 #11
Moderador

Avatar de D@rkbytes

LordDarwin dijo: Ver Mensaje
lo unico que cambie fue en el include pasar del 84 al 28, pero de resto no se que mas..
Si quieres utilizar el oscilador interno, cambia XT por INTRC_IO
En el PIC16F628A también se puede usar el pin RA4 (MCLR/Vpp) como entrada.
Así que puedes deshabilitar el Reset usando el fuse NOMCLR
Por último, para que el puerto A funcione como Digital I/O, en el Void Main agrega esto...
setup_comparator(NC_NC_NC_NC);
LaElectronicaMeOdia dijo: Ver Mensaje
al Registro CMCON le asignas el valor 0x07.
Sip, también funciona de esa forma, pero tendría que agregar el puntero hacia el registro CMCON...

#byte CMCON = 0x1F
Y luego como mencionas, asignarle el valor 0x07
CMCON = 0x07;

Pero en C, y para este PIC, se establece usando setup_comparator(mode);
Donde mode en este caso es NC_NC_NC_NC

Saludos.
14/01/2013 #12

Avatar de LaElectronicaMeOdia

Pero en C, y para este PIC, se establece usando setup_comparator(mode);
Donde mode en este caso es NC_NC_NC_NC
Como supiste que usa CCS?

yo uso CCS, pero como no supe que Compilador de C usa hice esa recomendacion "abierta" y si efetvimanete en CCS se usa setup_comparator(NC_NC_NC_NC) que es la forma rapida. desconozco si en otros compiladores de C es de la misma forma (me refiero a microC y similares)
14/01/2013 #13


Hola..."LordDarwin" aparte de las recomendaciones anteriores sobre pasar el puerto A a digital desplaza los registros de Dato1, Dato2, Resultado a partir de las direcciones 0x20 ya que ahí empieza los registros de uso general para el F628 mientras que en el F84 empiezan a partir de 0xC.

Saludos.

Ric.
14/01/2013 #14
Moderador

Avatar de D@rkbytes

LaElectronicaMeOdia dijo: Ver Mensaje
Como supiste que usa CCS?
Fácilmente.
Cualquier persona que conozca sobre lenguajes de programación se daría cuenta al ver el programa.
En PICC se denotan por usar librerías con extensión *.H, *.C
En ensamblador, por usar librerías con extensión *.INC, *.ASM
En PICBasic, por usar librerías con extensión *.bas, etc.
No es una regla, pero las librerías oficiales vienen con esas extensiones.

En fin, el programa de LordDarwin tiene varias cosas que lo denotan por sintaxis. P.E. (Palabra de configuración)

Saludos.
14/01/2013 #15

Avatar de LaElectronicaMeOdia

Fácilmente.
Cualquier persona que conozca sobre lenguajes de programación se daría cuenta al ver el programa.
creo que no fui claro con la pregunta

conozco los tres lenguajes de programacion (ASM, C,BASIC) y aun no se como te diste cuenta usa lenguaje C del compilador PCWH de la empresa CCS. y no por ejemplo Hi-Tech C o Mikro C
14/01/2013 #16
Moderador

Avatar de D@rkbytes

LaElectronicaMeOdia dijo: Ver Mensaje
creo que no fui claro con la pregunta

conozco los tres lenguajes de programacion (ASM, C,BASIC) y aun no se como te diste cuenta usa lenguaje C del compilador PCWH de la empresa CCS. y no por ejemplo Hi-Tech C o Mikro C
Ya lo mencione. Por la sintaxis.
Si fuera para Hi-Tech, empezaría la palabra de configuración con __CONFIG (También en ASM)
Más el usó #FUSES del PCWHD
Luego, el declaró #USE DELAY(CLOCK=4000000) del PCWHD también.
Que en Hi-Tech sería #define _XTAL_FREQ 4000000
Y tanto en Hi-Tech como en MikroC se pueden llamar a los registros directamente.
Sin embargo el declaró los punteros hacia los registros PORTA y PORTB

Por eso mencione...
el programa de LordDarwin tiene varias cosas que lo denotan por sintaxis.
Resumiendo, yo dejaría el programa de esta forma...
Código:
#include <16f628A.h>
#fuses INTRC_IO,NOWDT,NOMCLR,NOBROWNOUT
#use delay(internal = 4M)

void main()
   {
   byte dato1,dato2,resultado;
   setup_comparator(NC_NC_NC_NC);
   
   while(true)
   {
   dato1 = 0x0F & input_a();
   dato2 = 0xF0 & input_a();
   dato2 = swap(dato2);
   resultado = dato1 + dato2;
   output_b(resultado);
   }
}
No sé para que lo requiera, pero así sería una forma.

Nota: Cambie los puertos, el puerto A como entradas y el B como salidas, para usar todos los bits del puerto A.

Saludos.
14/01/2013 #17

Avatar de LaElectronicaMeOdia

ok. a eso me referia. ahora entiendo como supiste. es que ya no me gusta el CCS, y preguntaba para saber que tanta diferencia existe con otros. porque quizas siga con hi-tech.
14/01/2013 #18


el problema que tienes , y que en realidad no es un problema , es que pones a andar con el oscilador interno , por lo que el pin de reset se pone como entrada automaticamente ,deberias poner

_HS_OSC o _XT_OSC dependiendo del cristal que tengas en el protoboard
un saludo
14/01/2013 #19
Moderador

Avatar de D@rkbytes

LaElectronicaMeOdia dijo: Ver Mensaje
ok. a eso me referia. ahora entiendo como supiste. es que ya no me gusta el CCS, y preguntaba para saber que tanta diferencia existe con otros. porque quizas siga con hi-tech.
Bien, pues si existe diferencia entre el Hi-Tech y el PCWHD, la mayoría prefiere al PCWHD.
Pero se puede decir que es lo básico para empezar con el C para microcontroladores.
Al tener funciones predefinidas como todo lenguaje de alto nivel, se resuelve todo de forma más sencilla.
Ahora que si ya conoces de lenguajes, con el Hi-Tech te será más fácil hacer la migración de entorno.

Existe un programa que se llama SourceBoost IDE, y fue creado para ser el rival del Hi-Tech.

Sería cuestión de que probaras cual de ellos se adapta a tus requerimientos.
Respuesta
¿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.