# Necesito ayuda con Flowcode 5



## juanvi (Jun 28, 2013)

Ante todo disculpen, pues nunca antes he entrado en un foro y coloque por dos veces este documento en el sitio erróneo. Ya me leí las normas pero creo que nos las entendí. Ahora creo que sí que estoy en el foro adecuado.

Necesito ayuda con Flowcode 5. Cuando creo programas y los simulo todo funciona correctamente, pero cuando lo grabo en los Pics funciona de manera diferente o con fallos. Creo que podría deberse a la configuración de los Pics, pero no sé cómo configurarlos, aunque creo que ya he probado todas las posibles combinaciones. No encuentro ningún manual donde explique cómo se pueden configurar. Estoy trabajando con el Pic12f629 (aunque he probado con otros y pasa lo mismo) y el grabador Pic Burner que es un clon del Pickit2.

Justo ahora me he dado cuenta de que lo grabado en el pic funciona justo al contrario de lo programado en flowcode(en la simulación de flowcode funciona bien) Por ejemplo, cuando tendría que estar el led encendido, está apagado, cuando no le doy señal a una entrada es como si si se la diera, ocurre todo al contrario ...


----------



## andresenez (Ago 2, 2013)

te voy a mandar un manual que hizo un amigo creo que tu problema es que tiwnes q meterte en configuracion experto


----------



## soinel (Ago 6, 2015)

Hola a todos estoy empezando con el flowcode v5 y todos los programas los emulaba primero y luego los quemaba , hasta ahora los he hecho con los 16f84 que tenia rodando por casa y fenomenal pero me he puesto con los 16f876 y en la emulación funciona pero en la practica no hace nada de nada, ni encender un simple led.

También lo he intentado con los 16f676 y estoy en las mismas, en conclusión con los único que funciona al 100% es con los 16f84.

¿esto a que puede deberse?

gracias de antemano.

saludos


----------



## TRILO-BYTE (Ago 6, 2015)

sin codigo es dificil adivinar


----------



## soinel (Ago 6, 2015)

este es el ASM que genera el flowcode.


```
;/////////////////////////////////////////////////////////////////////////////////


	include "P16F876.inc"
; Heap block 0, size:111 (0x00000110 - 0x0000017E)
__HEAP_BLOCK0_BANK               EQU	0x00000002
__HEAP_BLOCK0_START_OFFSET       EQU	0x00000010
__HEAP_BLOCK0_END_OFFSET         EQU	0x0000007E
; Heap block 1, size:96 (0x00000190 - 0x000001EF)
__HEAP_BLOCK1_BANK               EQU	0x00000003
__HEAP_BLOCK1_START_OFFSET       EQU	0x00000010
__HEAP_BLOCK1_END_OFFSET         EQU	0x0000006F
; Heap block 2, size:80 (0x000000A0 - 0x000000EF)
__HEAP_BLOCK2_BANK               EQU	0x00000001
__HEAP_BLOCK2_START_OFFSET       EQU	0x00000020
__HEAP_BLOCK2_END_OFFSET         EQU	0x0000006F
; Heap block 3, size:44 (0x00000044 - 0x0000006F)
__HEAP_BLOCK3_BANK               EQU	0x00000000
__HEAP_BLOCK3_START_OFFSET       EQU	0x00000044
__HEAP_BLOCK3_END_OFFSET         EQU	0x0000006F
gbl_status                       EQU	0x00000003 ; bytes:1
gbl_14_LSR                       EQU	0x00000020 ; bytes:4
gbl_float_detect_tininess        EQU	0x00000039 ; bytes:1
gbl_float_rounding_mode          EQU	0x0000003A ; bytes:1
gbl_float_exception_flags        EQU	0x0000003B ; bytes:1
gbl_15_gbl_aSig                  EQU	0x00000024 ; bytes:4
gbl_15_gbl_bSig                  EQU	0x00000028 ; bytes:4
gbl_15_gbl_zSig                  EQU	0x0000002C ; bytes:4
gbl_15_gbl_aExp                  EQU	0x0000003C ; bytes:1
gbl_15_gbl_bExp                  EQU	0x0000003D ; bytes:1
gbl_15_gbl_zExp                  EQU	0x00000037 ; bytes:2
gbl_15_gbl_aSign                 EQU	0x0000003E ; bytes:1
gbl_15_gbl_bSign                 EQU	0x0000003F ; bytes:1
gbl_15_gbl_zSign                 EQU	0x00000040 ; bytes:1
gbl_15_gbl_zSigZero              EQU	0x00000041 ; bytes:1
gbl_15_gbl_ret                   EQU	0x00000030 ; bytes:4
gbl_indf                         EQU	0x00000000 ; bytes:1
gbl_tmr0                         EQU	0x00000001 ; bytes:1
gbl_pcl                          EQU	0x00000002 ; bytes:1
gbl_fsr                          EQU	0x00000004 ; bytes:1
gbl_porta                        EQU	0x00000005 ; bytes:1
gbl_portb                        EQU	0x00000006 ; bytes:1
gbl_portc                        EQU	0x00000007 ; bytes:1
gbl_pclath                       EQU	0x0000000A ; bytes:1
gbl_intcon                       EQU	0x0000000B ; bytes:1
gbl_pir1                         EQU	0x0000000C ; bytes:1
gbl_pir2                         EQU	0x0000000D ; bytes:1
gbl_tmr1l                        EQU	0x0000000E ; bytes:1
gbl_tmr1h                        EQU	0x0000000F ; bytes:1
gbl_t1con                        EQU	0x00000010 ; bytes:1
gbl_tmr2                         EQU	0x00000011 ; bytes:1
gbl_t2con                        EQU	0x00000012 ; bytes:1
gbl_sspbuf                       EQU	0x00000013 ; bytes:1
gbl_sspcon                       EQU	0x00000014 ; bytes:1
gbl_ccpr1l                       EQU	0x00000015 ; bytes:1
gbl_ccpr1h                       EQU	0x00000016 ; bytes:1
gbl_ccp1con                      EQU	0x00000017 ; bytes:1
gbl_rcsta                        EQU	0x00000018 ; bytes:1
gbl_txreg                        EQU	0x00000019 ; bytes:1
gbl_rcreg                        EQU	0x0000001A ; bytes:1
gbl_ccpr2l                       EQU	0x0000001B ; bytes:1
gbl_ccpr2h                       EQU	0x0000001C ; bytes:1
gbl_ccp2con                      EQU	0x0000001D ; bytes:1
gbl_adresh                       EQU	0x0000001E ; bytes:1
gbl_adcon0                       EQU	0x0000001F ; bytes:1
gbl_option_reg                   EQU	0x00000081 ; bytes:1
gbl_trisa                        EQU	0x00000085 ; bytes:1
gbl_trisb                        EQU	0x00000086 ; bytes:1
gbl_trisc                        EQU	0x00000087 ; bytes:1
gbl_pie1                         EQU	0x0000008C ; bytes:1
gbl_pie2                         EQU	0x0000008D ; bytes:1
gbl_pcon                         EQU	0x0000008E ; bytes:1
gbl_sspcon2                      EQU	0x00000091 ; bytes:1
gbl_pr2                          EQU	0x00000092 ; bytes:1
gbl_sspadd                       EQU	0x00000093 ; bytes:1
gbl_sspstat                      EQU	0x00000094 ; bytes:1
gbl_txsta                        EQU	0x00000098 ; bytes:1
gbl_spbrg                        EQU	0x00000099 ; bytes:1
gbl_adresl                       EQU	0x0000009E ; bytes:1
gbl_adcon1                       EQU	0x0000009F ; bytes:1
gbl_eedata                       EQU	0x0000010C ; bytes:1
gbl_eeadr                        EQU	0x0000010D ; bytes:1
gbl_eedath                       EQU	0x0000010E ; bytes:1
gbl_eeadrh                       EQU	0x0000010F ; bytes:1
gbl_eecon1                       EQU	0x0000018C ; bytes:1
gbl_eecon2                       EQU	0x0000018D ; bytes:1
CompTempVar2188                  EQU	0x00000042 ; bytes:1
CompTempVar2189                  EQU	0x00000042 ; bytes:1
CompTempVar2190                  EQU	0x00000042 ; bytes:1
CompTempVar2191                  EQU	0x00000042 ; bytes:1
CompTempVar2192                  EQU	0x00000042 ; bytes:1
CompTempVar2193                  EQU	0x00000042 ; bytes:1
CompTempVar2194                  EQU	0x00000042 ; bytes:1
CompTempVar2195                  EQU	0x00000042 ; bytes:1
delay_ms_00000_arg_del           EQU	0x00000043 ; bytes:1
delay_s_00000_arg_del            EQU	0x00000042 ; bytes:1
Int1Context                      EQU	0x0000007F ; bytes:1
Int1BContext                     EQU	0x00000034 ; bytes:3
	ORG 0x00000000
	GOTO	_startup
	ORG 0x00000004
	MOVWF Int1Context
	SWAPF STATUS, W
	BCF STATUS, RP0
	BCF STATUS, RP1
	MOVWF Int1BContext
	SWAPF PCLATH, W
	MOVWF Int1BContext+D'1'
	SWAPF FSR, W
	MOVWF Int1BContext+D'2'
	BCF PCLATH,3
	BCF PCLATH,4
	GOTO	interrupt
	ORG 0x00000010
delay_ms_00000
; { delay_ms ; function begin
	MOVF delay_ms_00000_arg_del, F
	BTFSS STATUS,Z
	GOTO	label1
	RETURN
label1
	MOVLW 0xF9
label2
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	ADDLW 0xFF
	BTFSS STATUS,Z
	GOTO	label2
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ delay_ms_00000_arg_del, F
	GOTO	label1
	RETURN
; } delay_ms function end

	ORG 0x0000002C
delay_s_00000
; { delay_s ; function begin
label3
	MOVLW 0xFA
	MOVWF delay_ms_00000_arg_del
	CALL delay_ms_00000
	MOVLW 0xFA
	MOVWF delay_ms_00000_arg_del
	CALL delay_ms_00000
	MOVLW 0xFA
	MOVWF delay_ms_00000_arg_del
	CALL delay_ms_00000
	MOVLW 0xFA
	MOVWF delay_ms_00000_arg_del
	CALL delay_ms_00000
	DECFSZ delay_s_00000_arg_del, F
	GOTO	label3
	RETURN
; } delay_s function end

	ORG 0x0000003B
main
; { main ; function begin
	MOVLW 0x07
	BSF STATUS, RP0
	BCF STATUS, RP1
	MOVWF gbl_adcon1
	MOVLW 0xC0
	MOVWF gbl_option_reg
label4
	MOVLW 0xFE
	BSF STATUS, RP0
	ANDWF gbl_trisb, W
	MOVWF gbl_trisb
	MOVLW 0xFE
	BCF STATUS, RP0
	ANDWF gbl_portb, W
	MOVWF CompTempVar2188
	MOVLW 0x01
	IORWF CompTempVar2188, W
	MOVWF gbl_portb
	MOVLW 0xFD
	BSF STATUS, RP0
	ANDWF gbl_trisb, W
	MOVWF gbl_trisb
	MOVLW 0xFD
	BCF STATUS, RP0
	ANDWF gbl_portb, W
	MOVWF CompTempVar2189
	MOVLW 0x02
	IORWF CompTempVar2189, W
	MOVWF gbl_portb
	MOVLW 0xFB
	BSF STATUS, RP0
	ANDWF gbl_trisb, W
	MOVWF gbl_trisb
	MOVLW 0xFB
	BCF STATUS, RP0
	ANDWF gbl_portb, W
	MOVWF CompTempVar2190
	MOVLW 0x04
	IORWF CompTempVar2190, W
	MOVWF gbl_portb
	MOVLW 0xF7
	BSF STATUS, RP0
	ANDWF gbl_trisb, W
	MOVWF gbl_trisb
	MOVLW 0xF7
	BCF STATUS, RP0
	ANDWF gbl_portb, W
	MOVWF CompTempVar2191
	MOVLW 0x08
	IORWF CompTempVar2191, W
	MOVWF gbl_portb
	MOVLW 0xEF
	BSF STATUS, RP0
	ANDWF gbl_trisb, W
	MOVWF gbl_trisb
	MOVLW 0xEF
	BCF STATUS, RP0
	ANDWF gbl_portb, W
	MOVWF CompTempVar2192
	MOVLW 0x10
	IORWF CompTempVar2192, W
	MOVWF gbl_portb
	MOVLW 0xDF
	BSF STATUS, RP0
	ANDWF gbl_trisb, W
	MOVWF gbl_trisb
	MOVLW 0xDF
	BCF STATUS, RP0
	ANDWF gbl_portb, W
	MOVWF CompTempVar2193
	MOVLW 0x20
	IORWF CompTempVar2193, W
	MOVWF gbl_portb
	MOVLW 0xBF
	BSF STATUS, RP0
	ANDWF gbl_trisb, W
	MOVWF gbl_trisb
	MOVLW 0xBF
	BCF STATUS, RP0
	ANDWF gbl_portb, W
	MOVWF CompTempVar2194
	MOVLW 0x40
	IORWF CompTempVar2194, W
	MOVWF gbl_portb
	MOVLW 0x7F
	BSF STATUS, RP0
	ANDWF gbl_trisb, W
	MOVWF gbl_trisb
	MOVLW 0x7F
	BCF STATUS, RP0
	ANDWF gbl_portb, W
	MOVWF CompTempVar2195
	MOVLW 0x80
	IORWF CompTempVar2195, W
	MOVWF gbl_portb
	MOVLW 0x01
	MOVWF delay_s_00000_arg_del
	CALL delay_s_00000
	BSF STATUS, RP0
	CLRF gbl_trisb
	BCF STATUS, RP0
	CLRF gbl_portb
	MOVLW 0x01
	MOVWF delay_s_00000_arg_del
	CALL delay_s_00000
	GOTO	label4
; } main function end

	ORG 0x000000A4
_startup
	MOVLW 0xD5
	BCF STATUS, RP0
	BCF STATUS, RP1
	MOVWF gbl_14_LSR
	MOVLW 0xC4
	MOVWF gbl_14_LSR+D'1'
	MOVLW 0xBB
	MOVWF gbl_14_LSR+D'2'
	MOVLW 0xDC
	MOVWF gbl_14_LSR+D'3'
	CLRF gbl_15_gbl_aSig
	CLRF gbl_15_gbl_aSig+D'1'
	CLRF gbl_15_gbl_aSig+D'2'
	CLRF gbl_15_gbl_aSig+D'3'
	CLRF gbl_15_gbl_bSig
	CLRF gbl_15_gbl_bSig+D'1'
	CLRF gbl_15_gbl_bSig+D'2'
	CLRF gbl_15_gbl_bSig+D'3'
	CLRF gbl_15_gbl_zSig
	CLRF gbl_15_gbl_zSig+D'1'
	CLRF gbl_15_gbl_zSig+D'2'
	CLRF gbl_15_gbl_zSig+D'3'
	CLRF gbl_15_gbl_aExp
	CLRF gbl_15_gbl_bExp
	CLRF gbl_15_gbl_zExp
	CLRF gbl_15_gbl_zExp+D'1'
	CLRF gbl_15_gbl_aSign
	CLRF gbl_15_gbl_bSign
	CLRF gbl_15_gbl_zSign
	CLRF gbl_15_gbl_zSigZero
	CLRF gbl_15_gbl_ret
	CLRF gbl_15_gbl_ret+D'1'
	CLRF gbl_15_gbl_ret+D'2'
	CLRF gbl_15_gbl_ret+D'3'
	CLRF gbl_float_rounding_mode
	CLRF gbl_float_exception_flags
	CLRF gbl_float_detect_tininess
	BCF PCLATH,3
	BCF PCLATH,4
	GOTO	main
	ORG 0x000000CC
interrupt
; { interrupt ; function begin
	BCF STATUS, RP0
	BCF STATUS, RP1
	SWAPF Int1BContext+D'2', W
	MOVWF FSR
	SWAPF Int1BContext+D'1', W
	MOVWF PCLATH
	SWAPF Int1BContext, W
	MOVWF STATUS
	SWAPF Int1Context, F
	SWAPF Int1Context, W
	RETFIE
; } interrupt function end

	ORG 0x00002007
	DW 0x3FFD
	END
```


----------



## D@rkbytes (Ago 6, 2015)

No sé de Flowcode, pero sí de ensamblador.
Al ver el código, parece que lo único que hace es poner en 1 todo el puerto B por un tiempo y en 0 por otro tiempo.

Algo así:

bucle
movlw 0xFF
movwf PORTB
call retardo
clrf PORTB
call retardo
goto bucle

Pero hasta abajo del programa está lo interesante... La palabra de configuración.

```
[COLOR=Blue]ORG 0x00002007
    DW 0x3FFD
    END[/COLOR]
```
Aquí se está configurando al PIC de esta forma:

```
[COLOR=Blue]_XT_OSC & _WDTE_ON & _PWRTE_OFF & _BOREN_ON & _CP_OFF & _LVP_ON & _CPD_OFF & _WRTE_ON & _DEBUG_OFF[/COLOR]
```
Esto en orden, quiere decir lo siguiente:
Crystal oscillator <= 4 MHz.
Watch Dog Timer = ON
Power On Timer = OFF
Brown-Out Reset = ON
Code Protect = OFF
Low Voltaje Programming = ON
Code Protection Data = OFF
Flash Program Memory Write = ON
In-Circuit Debugger Mode = OFF

El principal causante de que tu programa no funcione, se debe al bit 2 (WDTE)
Este fuse debe estar en OFF, ya que, si no se resetea el Watch Dog Timer por código, se producirá un reset cada vez que este Timer se desborde.
El bit 7 (LVP) también debe estar en 0, a menos que vayas a programar el PIC con bajo voltaje.
Si este bit se encuentra activo, el pin RB3 no será funcional porque será usado para este tipo de programación.
También es recomendable activar el bit 3 (PWRTE) para estabilizar el voltaje del microcontrolador antes de que inicie el programa.

No sé cómo se configuren los bits de la palabra de configuración en Flowcode, pero para el PIC16F876, debe quedar de esta forma:

```
[COLOR=Blue]_XT_OSC & _WDTE_OFF & _PWRTE_ON & _BOREN_ON & _CP_OFF & _LVP_OFF & _CPD_OFF & _WRTE_ON & _DEBUG_OFF[/COLOR]
```
O sea,  0x3F71 en vez de 0x3FFD

Esta configuración también se puede realizar con la aplicación que uses para grabar el PIC.


----------



## soinel (Ago 7, 2015)

efectivamente eso era, el flowcode no lo configura automáticamente, curiosamente para los 16f84 acierta por eso funciona, una pregunta mas con los 16F676 .

¿en que me tendría que vasar en cada caso para configurar los diferentes PIC?¿hay algunas reglas básicas?

gracias
Saludos


----------



## D@rkbytes (Ago 7, 2015)

soinel dijo:


> ¿En qué me tendría que basar en cada caso para configurar los diferentes PIC?
> ¿Hay algunas reglas básicas?


Lo fundamental es leer la hoja de datos, porque ahí se explica detalladamente como funciona cada módulo, los periféricos involucrados y otras cosas importantes.

La palabra de configuración y la inicialización de los puertos son algunas de las primeras cosas a configurar.
En la palabra de configuración se define principalmente el tipo de oscilador y otros parámetros básicos.
Y con la configuración de los puertos definimos para qué serán usados.
Esto involucra configurar los diferentes módulos que utilizan los puertos como I/O (Entradas y salidas)

Por ejemplo. En los PIC con módulo ADC, es importante determinar cuales pines funcionarán en modo digital y cuales funcionarán en modo análogo.
Y dependiendo del tipo de PIC, se configura el registro correspondiente.
No todos son iguales, algunos se configuran por medio del registro CMCON, otros con el registro ADCON1 y otros con el registro ANSEL.
Pero en el modo análogo no sólo éstos registros se deben configurar, existen otros que trabajan conjuntamente y es por eso que se debe leer la hoja de datos para saber como funcionan y como se configuran conforme a lo que pretendemos hacer.

Tampoco vamos a encontrar siempre los mismos nombres de los registros en todos los PIC.
Pueden tener variantes y también mejoras incluidas, o que necesiten de otros registros para funcionar.
En la hoja de datos también se encuentra explicado para qué sirve cada bit de la palabra de configuración.

En sí, no hay reglas, lo que si hay son pasos a seguir, y el primero de ellos es leer la hoja de datos.

Suerte.


----------



## soinel (Ago 7, 2015)

Muchas gracias, me has sido de gran ayuda.

Seguiré leyendo y practicando.

saludos


----------



## soinel (Ago 12, 2015)

Buenas tardes, vengo con otra duda que tengo es con el flowcode como puedo hacer para que cuando ponga una entrada ra0 a 1 lo guarde en una variable y no pase a 0 cuando ra0 este a 0.

saludos



Me respondo yo solo, lo he hecho con un if .

si RA0 esta a uno variable ENCALVADO es igual a uno.

posiblemente se haga mas sencillo pero así lo he solucionado, si hay alguna manera mas sencilla hacérmelo saber .

Saludos a todos


----------



## soinel (Ago 13, 2015)

Buenas tardes, ¿quien me hecha una mano a interpretar el data sheet del 16f876 para que todas las entradas sean digitales.

No lo veo y ¿cuantas puertas se pueden utilizar como digitales en este pic?

gracias


----------



## D@rkbytes (Ago 13, 2015)

No es nada complicado, pero sí necesitas saber inglés.

Antes que nada, primero mira que pines pueden funcionar en modo análogo.


En la imagen se puede ver que los pines (RA<3:0>) y RA<5> forman parte del módulo ADC.
Entonces se puede determinar que sólo el puerto A tiene pines que pueden ser análogos.

Ahora debes buscar cómo se inicializa el puerto A.

En este ejemplo se puede ver que el registro ADCON1 debe tener el valor 6.
¿Pero cómo saber qué valor debe tener el registro ADCON1?
Sencillo, buscando la información del registro ADCON1 en la hoja de datos.
​Aquí se pueden ver los valores que debe tener el registro ADCON1 según la configuración deseada.
En este caso se requiere que todos los pines que pueden funcionar en modo análogo, sean digitales.
Entonces debes buscar esa configuración.

Abajo de la tabla dice: *A = Analog input* y *D = Digital I/O*
Mira bien y encontrarás que el valor indicado en binario es, *011x*
La *x* significa que ese bit no es relevante y por lo tanto puede estar en 1 o en 0.
O sea que el valor del registro *ADCON1* para que todos los pines sean digital I/O puede ser 6 o 7.
*0110* = 6 y *0111* = 7

¿Lo ves? No es nada complicado. ​


----------



## julio1984 (Sep 24, 2015)

Buenas noche comunidad,hace poco que entre en el mundo de los pic , y la verdad es que lei varias cosas sobre interrupciones del tmr0, y todavia no logro entender. primeramente me propuse hacer un medidor de frecuencia, para entender como funciona y luego de esto poder realizar un programa que active a cierta frecuencia de una entrada digital externa, pero como dije hasta hoy no sale . encontre en la pagina de matrix un ejemplo de frecuencimetro pero parece que no la cazo, si alguno me podria orientar un poco les agradeceria, desde ya muchas gracias. atte Julio ...


----------



## torres.electronico (Sep 24, 2015)

Hola Julio, no voy recalcarte que hay mejores lenguajes, cada uno elige lo que le parece mas comodo para trabajar; Lo que si te podria decir, es que leas las normas de participacion del foro y como subir archivos; Mas que nada para que en tu proximo mensaje subas lo que ya hicistes, y el resto de la comunidad te pueda corregir / ayudar en tu trabajo. Saludos


PD: es un comentario con buena onda


----------



## Argonaut (Ene 30, 2016)

Hola, sabéis alguien se es posible convertir una programación en ASM, y convertirla al FLOWCODE? Un Saludo.


----------



## Humberto Reyes (Ene 31, 2016)

No he probado eso pero lo que si es posible es integrar fragmentos de un program en c o hacer un loop con un programa de C por si solo

Julio te recomiendo que tomes un ejemplo de flowcode sobre interupciones lo pongas a emular y genera cambios "La practica Hace al Ninja" no olvides


----------

