Autor Tema: Transmisión por rs485  (Leído 3456 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Transmisión por rs485
« en: 31 de Octubre de 2014, 17:08:45 »
Sigo dando vueltas a la transmisión  por rs485. De momento no lo he conseguido.Tengo problemas, de momento, con el master.
Código: [Seleccionar]

'16F88 MODULO DESVIOS MASTER
'Para control de la zona1 de la maqueta
'Un módulo de tres cd4094 para control de 24 leds
'un módulo de un cd4094 para control de 2 desvíos triples
'un módulo para control de desenganchadores
Define CONF_WORD = 0x3f0a
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
ANSEL = 0x00  'todos los pines digitales

CMCON = 0x07
Define SIMULATION_WAITMS_VALUE = 1  'solo para simulacion

'##############################
'definición de puertos

TRISA = %00100000
TRISB = %00000100

'##################################################################

Dim n As Byte  'variable auxiliar timer1
n = 0
Dim total_placa As Byte  'número total de placas conectadas
Dim n_simples As Byte
Dim n_triples As Byte
Dim n_desen As Byte

n_simples = 6  'seis módulos para retroseñalización de 4 desvios cada uno total
n_triples = 1  'un módulo para retroseñalizacion de 2 desvíos triples
n_desen = 1  'un módulo para retroseñalización de 16 desenganchadores
total_placa = 8

'####################################################################################################################
Symbol rs485 = RB3
rs485 = 1  'comienza en modo transmisión
Hseropen 4800  '4800  'Velocidad del puerto serie e inicializa los comandos de bajo nivel que controlan la USART

Dim uart As Byte
Dim uart_bufer(40) As Byte
uart = 0
Dim n_uart As Byte
n_uart = 40
Dim aux_trama As Byte
aux_trama = 0
Dim n_llamar As Byte  'numero de dispositivo a llamar

Dim permitido As Byte  'flag que permite el envio de trama.Espera a que conteste el slave

Dim actualiza As Byte  'flag de actualización de los leds
actualiza = 0

Dim fin_trama As Byte
fin_trama = "F"
'variaqbles auxiliares
Dim aux_n_llamar As Byte
Dim n1 As Word
n1 = 0


'###################################################################################################################
'variables situación de desvios recibidos por rs232
Dim var_desvio As Byte

'situacion inicial desvios=1
'el estado de los desvios se almacena en los 4 primeros bits de cada variable
'desvio del 1 al 4 en variable var_desvio_1
'ejemlo desvio1 en estado 1 11110001
'de esta manera la trama a enviar y recibida nunca es cero
var_desvio = %11110000

'##################################################################################################################
'configuración salidas cd4094 desvios normales

Symbol clk_4094 = PORTA.2
Symbol data_cd4094 = PORTA.0
Symbol load_cd4094 = PORTA.1

'##################################################################################################################
'configuración salidas cd4094 desvios triples

'Symbol clk_triple_cd4094 = PORTB.4
Symbol data_triple_cd4094 = PORTB.7
Symbol load_triple_cd4094 = PORTB.6

'###################################################################################################################
'configuración salidas cd4094 desvios desenganchadores

Symbol clk_desen_cd4094 = PORTB.1
Symbol data_desen_cd4094 = PORTA.3
Symbol load_desen_cd4094 = PORTB.0

'###################################################################################################################

'variables leds desvios simples
Dim cd_4094_1 As Byte
Dim cd_4094_2 As Byte
Dim cd_4094_3 As Byte

'variable leds desvios triples
Dim triple_cd_4094 As Byte

'variable leds desenganchadores
Dim desen1_cd_4094 As Byte
Dim desen2_cd_4094 As Byte

cd_4094_1 = %00000000
cd_4094_2 = %00000000
cd_4094_3 = %00000000
triple_cd_4094 = %00000000
desen1_cd_4094 = %00000000
desen2_cd_4094 = %00000000


'####################################################################################################################
'led indicadores auxiliares/código a eliminar en version definitiva

Symbol led = PORTB.4
led = 1

WaitMs 2000
led = 0
'Gosub salida_cd4094
'Gosub salida_triples_cd4094
'Gosub salida_desenganches

WaitMs 1000

'####################################################################################################################
'configuracion TIMER1
T1CON.T1CKPS1 = 0  '1  'bits 5-4  prescaler rate Select bits
T1CON.T1CKPS0 = 0  '1  'Bit 4
T1CON.TMR1CS = 0  'Bit 1 timer1 clock source Select Bit:0=internal clock (fosc/4) / 1 = external clock from pin t1cki (On the rising edge)
PIE1.TMR1IE = 1  'activa el timer1
n1 = 0  'número de repeticiones de timer1


'####################################################################################################################
'habilitación de interrupciones
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
PIE1.RCIE = 1  'Activa la interrupcion de la USART en modo rx
Enable  'INTCON.GIE habilita todas las interrupciones globales
'####################################################################################################################
'variables iniciales
n_llamar = 1
permitido = 1


'####################################################################################################################
'Borra el bufer de datos

'Gosub clear_bufer
'####################################################################################################################
'Programa principal
loop:


If RCSTA.OERR = 1 Then  'testea posible bloqueo del puerto fisico en modo Rx
Gosub clear_bufer  'borra el bufer por soft del puerto serie de entrada
Endif

If permitido = 1 Then
Gosub clear_bufer
Gosub actualiza_simples
Gosub salida_cd4094
'Gosub salida_triples_cd4094
'Gosub salida_desenganches

WaitMs 100

rs485 = 1  'comienza en modo transmisión
WaitMs 100
Hserout 0, n_llamar, n_llamar, n_llamar, n_llamar, "F"
'una vez enviada la trama espera a recibir respuesta o temporiza 1000 ms antes de enviar la trama a el
'siguiente dispositivo
WaitMs 100  'pausa para permitir la transmisión completa de la trama.
'Si no se pone la trama se corta y no llega transmisión.
rs485 = 0  'pasa a modo recepción
permitido = 0
TMR1H = 0xf8  '0xbd  'preset For timer1 msb register
TMR1L = 0x30  '0xdc  'preset For timer1 lsb register
T1CON.TMR1ON = 1  'habilitacion del TMR1
Endif

Goto loop
End                                               

'###################################################################################################################
On Interrupt  'desactiva las interrupciones
Save System  'Guarda los valores del sistema
PIE1.RCIE = 0  'desactiva la interrupcion de la USART en modo rx
T1CON.TMR1ON = 0  'deshabilitacion del TMR1

If PIR1.RCIF = 1 Then  'comprueba que es esta la interrupcion activa del modulo USART
'trama de respuesta 0,n_llamar,var_desvio,F
Dim aux_var_desvio As Byte
aux_var_desvio = 0
Hserget uart_bufer(uart)  'carga el dato en el bufer

If uart_bufer(uart) = fin_trama Then  'si se recibe F-fin trama
Toggle led
aux_trama = uart - 1
aux_var_desvio = uart_bufer(aux_trama)
aux_trama = aux_trama - 1
aux_n_llamar = uart_bufer(aux_trama)
Endif

If aux_n_llamar = n_llamar Then
aux_var_desvio = var_desvio
led = 1
Gosub clear_bufer
Endif





uart = uart + 1
If uart = 39 Then
uart = 0
Gosub clear_bufer
Endif

Endif


'###########################################################################################################
'interrupcion Timer1
'cada 10 ms
If PIR1.TMR1IF = 1 Then  'comprueba que es esta la interrupcion activa del TIMER1

n1 = n1 + 1
If n1 = 2 Then  'han pasado 1500ms 2 para simulacion

n_llamar = n_llamar + 1  'si han pasado 1000ms sin respuesta se manda la trama al siguiente desvio
If n_llamar > total_placa Then n_llamar = 1
permitido = 1
n1 = 0
Endif
TMR1H = 0xf8  '0xbd  'preset For timer1 msb register
TMR1L = 0x30  '0xdc  'preset For timer1 lsb register

T1CON.TMR1ON = 1  'habilitacion del TMR1

Endif

'activa las interrupciones
PIR1.RCIF = 0  'borra el flag de salto de la usart
PIE1.RCIE = 1  'activa la interrupcion de la USART en modo rx
PIR1.TMR1IF = 0  'borra el flag de salto del tmr1

Resume                                           

'#################################################
'rutina borrado del bufer de datos y borra error del puerto fisico en modo Rx
clear_bufer:
Dim n As Byte
For n = 0 To 1  'desbloquea el puerto serie fisico en caso de bloqueo por exceso de entrada de datos
T1CON.TMR1ON = 0  'bloquea timer1
PIE1.RCIE = 0  'deshabilita la interrupcion del modulo serie
RCSTA.CREN = 0  'protocolo de desbloqueo puerto serie
RCSTA.CREN = 1  'protocolo de desbloqueo puerto serie
RCSTA.OERR = 0  'protocolo de desbloqueo puerto serie
Next n
Gosub clearbufer  'borra el bufer por soft de los datos recibidos por el puerto serie
PIR1.RCIF = 0  'borra el flag de salto de la usart
PIE1.RCIE = 1  'activa la interrupcion de la USART en modo rx



Return                                           

clearbufer:

Dim c_serial As Byte
c_serial = 0
While c_serial < n_uart  'se ejecuta tantas veces como variables tiene el bufer
uart_bufer(c_serial) = 0  'borra el bufer con datos
c_serial = c_serial + 1
Wend
c_serial = 0
uart = 0

Return                                           



'#########################################################################################
'rutina de actualizacion de leds

actualiza_simples:
Select Case aux_n_llamar
Case 1
cd_4094_1.0 = var_desvio.0
cd_4094_1.1 = var_desvio.1
cd_4094_1.2 = var_desvio.2
cd_4094_1.3 = var_desvio.3
Case 2
cd_4094_1.4 = var_desvio.4
cd_4094_1.5 = var_desvio.5
cd_4094_1.6 = var_desvio.6
cd_4094_1.7 = var_desvio.7

Case 3
cd_4094_2.0 = var_desvio.0
cd_4094_2.1 = var_desvio.1
cd_4094_2.2 = var_desvio.2
cd_4094_2.3 = var_desvio.3
Case 4
cd_4094_2.4 = var_desvio.4
cd_4094_2.5 = var_desvio.5
cd_4094_2.6 = var_desvio.6
cd_4094_2.7 = var_desvio.7

Case 5
cd_4094_3.0 = var_desvio.0
cd_4094_3.1 = var_desvio.1
cd_4094_3.2 = var_desvio.2
cd_4094_3.3 = var_desvio.3
Case 6
cd_4094_3.4 = var_desvio.4
cd_4094_3.5 = var_desvio.5
cd_4094_3.6 = var_desvio.6
cd_4094_3.7 = var_desvio.7

EndSelect
Return                                           


actualiza_triples:

'If desvio_1 = 1 Then triple_cd_4094.0 = 0
'If desvio_1 = 2 Then triple_cd_4094.0 = 1
'If desvio_1 = 3 Then Toggle triple_cd_4094.0
'If desvio_2 = 1 Then triple_cd_4094.1 = 0
'If desvio_2 = 2 Then triple_cd_4094.1 = 1
'If desvio_2 = 3 Then Toggle triple_cd_4094.1
'If desvio_3 = 1 Then triple_cd_4094.2 = 0
'If desvio_3 = 2 Then triple_cd_4094.2 = 1
'If desvio_3 = 3 Then Toggle triple_cd_4094.2
'If desvio_4 = 1 Then triple_cd_4094.3 = 0
'If desvio_4 = 2 Then triple_cd_4094.3 = 1
'If desvio_4 = 3 Then Toggle triple_cd_4094.3
'If desvio_5 = 1 Then triple_cd_4094.4 = 0
'If desvio_5 = 2 Then triple_cd_4094.4 = 1
'If desvio_1 = 3 Then Toggle triple_cd_4094.4
'If desvio_6 = 1 Then triple_cd_4094.5 = 0
'If desvio_6 = 2 Then triple_cd_4094.5 = 1
'If desvio_6 = 3 Then Toggle triple_cd_4094.5


Return                                           


actualiza_desen:

'Select Case n_llamar
'Case 5
''zona 1
'If desvio_1 = 1 Then cd_4094_1.0 = 0
'If desvio_1 = 2 Then cd_4094_1.0 = 1
'If desvio_1 = 3 Then Toggle cd_4094_1.0
'If desvio_2 = 1 Then cd_4094_1.1 = 0
'If desvio_2 = 2 Then cd_4094_1.1 = 1
'If desvio_2 = 3 Then Toggle cd_4094_1.1
'If desvio_3 = 1 Then cd_4094_1.2 = 0
'If desvio_3 = 2 Then cd_4094_1.2 = 1
'If desvio_3 = 3 Then Toggle cd_4094_1.2
'If desvio_4 = 1 Then cd_4094_1.3 = 0
'If desvio_4 = 2 Then cd_4094_1.3 = 1
'If desvio_4 = 3 Then Toggle cd_4094_1.3
'If desvio_5 = 1 Then cd_4094_1.4 = 0
'If desvio_5 = 2 Then cd_4094_1.4 = 1
'If desvio_1 = 3 Then Toggle cd_4094_1.4
'If desvio_6 = 1 Then cd_4094_1.5 = 0
'If desvio_6 = 2 Then cd_4094_1.5 = 1
'If desvio_6 = 3 Then Toggle cd_4094_1.5
''zona 2-1
'If desvio_7 = 1 Then cd_4094_1.6 = 0
'If desvio_7 = 2 Then cd_4094_1.6 = 1
'If desvio_7 = 3 Then Toggle cd_4094_1.6
'If desvio_8 = 1 Then cd_4094_1.7 = 0
'If desvio_8 = 2 Then cd_4094_1.7 = 1
'If desvio_8 = 3 Then Toggle cd_4094_1.7

'Case 6
''zona 2-2

'If desvio_1 = 1 Then cd_4094_2.0 = 0
'If desvio_1 = 2 Then cd_4094_2.0 = 1
'If desvio_1 = 3 Then Toggle cd_4094_2.0
'If desvio_2 = 1 Then cd_4094_2.1 = 0
'If desvio_2 = 2 Then cd_4094_2.1 = 1
'If desvio_2 = 3 Then Toggle cd_4094_2.1
'If desvio_3 = 1 Then cd_4094_2.2 = 0
'If desvio_3 = 2 Then cd_4094_2.2 = 1
'If desvio_3 = 3 Then Toggle cd_4094_2.2
'If desvio_4 = 1 Then cd_4094_2.3 = 0
'If desvio_4 = 2 Then cd_4094_2.3 = 1
'If desvio_4 = 3 Then Toggle cd_4094_2.3
''zona 2-3
'If desvio_5 = 1 Then cd_4094_2.4 = 0
'If desvio_5 = 2 Then cd_4094_2.4 = 1
'If desvio_5 = 3 Then Toggle cd_4094_2.4
'If desvio_6 = 1 Then cd_4094_2.5 = 0
'If desvio_6 = 2 Then cd_4094_2.5 = 1
'If desvio_6 = 3 Then Toggle cd_4094_2.5
'If desvio_7 = 1 Then cd_4094_2.6 = 0
'If desvio_7 = 2 Then cd_4094_2.6 = 1
'If desvio_7 = 3 Then Toggle cd_4094_2.6
'If desvio_8 = 1 Then cd_4094_2.7 = 0
'If desvio_8 = 2 Then cd_4094_2.7 = 1
'If desvio_8 = 3 Then Toggle cd_4094_2.7

'EndSelect
Return                                           




'###########################################################################

'salida para control desvíos a cd4094
salida_cd4094:
load_cd4094 = 0

data_cd4094 = cd_4094_3.7
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_3.6
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_3.5
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_3.4
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_3.3
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_3.2
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_3.1
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_3.0
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_2.7
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_2.6
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_2.5
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_2.4
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_2.3
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_2.2
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_2.1
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_2.0
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_1.7
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_1.6
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_1.5
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_1.4
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_1.3
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_1.2
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_1.1
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_1.0
WaitMs 2
clk_4094 = 1
clk_4094 = 0

load_cd4094 = 1
load_cd4094 = 0

Return                                           

'#####################################################################
'salida_triples_cd4094:

'data_triple_cd4094 = triple_cd_4094.7
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.6
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.5
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.4
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.3
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.2
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.1
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.0



'load_triple_cd4094 = 1
'load_triple_cd4094 = 0
'Return





'#####################################################################
'salida_desenganches:

'data_triple_cd4094 = triple_cd_4094.7
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.6
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.5
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.4
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.3
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.2
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.1
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.0

'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.6
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.5
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.4
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.3
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.2
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.1
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0





'load_triple_cd4094 = 1
'load_triple_cd4094 = 0
'Return


Utilizo pic simulador.
El programa manda una orden tipo 0,n_llamar,"F". utilizo F como identificación  de fin de trama y n_llamar es un  número de 1 al 7, siendo estos los slaves.
Esta orden se transmite cada 1.5 seg. Utilizo el timer1 para temporizar este tiempo.
El timer1 funciona bien y va transmitiendo 0,1,F 0,2,F 0,3,F etc.
El slave identificaría su número (del 1 al 7) y contestaría.
El master recibiría y seguiría mandando orden cada 1.5
El problema que tengo de momento es que cuando entra la interrupción por la usart el timer1 deja de funcionar y no encuentro el fallo.
¿En donde estará?
Un saludo

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Transmisión por rs485
« Respuesta #1 en: 01 de Noviembre de 2014, 13:41:04 »
Bueno, a nivel simulación ya he conseguido que funcione.
Tenía mal el flag del timer1 del master.Cuando se recibía una trama dejaba de funcionar. También he cambiado el flag de fin de trama de "F" al número 255. No sé si ésto hubiera sido necesario.
Este código controla además integrados cd4094 mediante la rutina "salida_cd4094:", por si a alguien novato como yo, lo necesita.
Dejo el código del master, slave y la simulación en proteus. Me falta ahora pasar a la parte práctica, la electrónica.Bueno también me falta comprobar si el master es capaz de entender la trama enviada por los slaves, espero que funcione.
Master
Código: [Seleccionar]

'16F88 MODULO DESVIOS MASTER
'Para control de la zona1 de la maqueta
'Un módulo de tres cd4094 para control de 24 leds
'un módulo de un cd4094 para control de 2 desvíos triples
'un módulo para control de desenganchadores
Define CONF_WORD = 0x3f0a
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
ansel = 0x00  'todos los pines digitales

CMCON = 0x07
'Define SIMULATION_WAITMS_VALUE = 1  'solo para simulacion

'##############################
'definición de puertos

TRISA = %00100000
TRISB = %00000100

'##################################################################

Dim n As Byte  'variable auxiliar timer1
n = 0
Dim total_placa As Byte  'número total de placas conectadas
Dim n_simples As Byte
Dim n_triples As Byte
Dim n_desen As Byte

n_simples = 6  'seis módulos para retroseñalización de 4 desvios cada uno total
n_triples = 1  'un módulo para retroseñalizacion de 2 desvíos triples
n_desen = 1  'un módulo para retroseñalización de 16 desenganchadores
total_placa = 8

'####################################################################################################################
Symbol rs485 = RB3
rs485 = 1  'comienza en modo transmisión
Hseropen 4800  '4800  'Velocidad del puerto serie e inicializa los comandos de bajo nivel que controlan la USART

Dim uart As Byte
Dim uart_bufer(40) As Byte
uart = 0
Dim n_uart As Byte
n_uart = 40
Dim aux_trama As Byte
aux_trama = 0
Dim n_llamar As Byte  'numero de dispositivo a llamar

Dim permitido As Byte  'flag que permite el envio de trama.Espera a que conteste el slave

Dim actualiza As Byte  'flag de actualización de los leds
actualiza = 0

Dim fin_trama As Byte
fin_trama = 255
'variaqbles auxiliares
Dim aux_n_llamar As Byte
Dim n1 As Word
n1 = 0


'###################################################################################################################
'variables situación de desvios recibidos por rs232
Dim var_desvio As Byte

'situacion inicial desvios=1
'el estado de los desvios se almacena en los 4 primeros bits de cada variable
'desvio del 1 al 4 en variable var_desvio_1
'ejemlo desvio1 en estado 1 01010001
'de esta manera la trama a enviar y recibida nunca es cero
var_desvio = %01010000

'##################################################################################################################
'configuración salidas cd4094 desvios normales

Symbol clk_4094 = PORTA.2
Symbol data_cd4094 = PORTA.0
Symbol load_cd4094 = PORTA.1

'##################################################################################################################
'configuración salidas cd4094 desvios triples

'Symbol clk_triple_cd4094 = PORTB.4
Symbol data_triple_cd4094 = PORTB.7
Symbol load_triple_cd4094 = PORTB.6

'###################################################################################################################
'configuración salidas cd4094 desvios desenganchadores

Symbol clk_desen_cd4094 = PORTB.1
Symbol data_desen_cd4094 = PORTA.3
Symbol load_desen_cd4094 = PORTB.0

'###################################################################################################################

'variables leds desvios simples
Dim cd_4094_1 As Byte
Dim cd_4094_2 As Byte
Dim cd_4094_3 As Byte

'variable leds desvios triples
Dim triple_cd_4094 As Byte

'variable leds desenganchadores
Dim desen1_cd_4094 As Byte
Dim desen2_cd_4094 As Byte

cd_4094_1 = %00000000
cd_4094_2 = %00000000
cd_4094_3 = %00000000
triple_cd_4094 = %00000000
desen1_cd_4094 = %00000000
desen2_cd_4094 = %00000000


'####################################################################################################################
'led indicadores auxiliares/código a eliminar en version definitiva

Symbol led = PORTB.4
led = 1

WaitMs 2000
led = 0
'Gosub salida_cd4094
'Gosub salida_triples_cd4094
'Gosub salida_desenganches

WaitMs 1000

'####################################################################################################################
'configuracion TIMER1
T1CON.T1CKPS1 = 0  '1  'bits 5-4  prescaler rate Select bits
T1CON.T1CKPS0 = 0  '1  'Bit 4
T1CON.TMR1CS = 0  'Bit 1 timer1 clock source Select Bit:0=internal clock (fosc/4) / 1 = external clock from pin t1cki (On the rising edge)
PIE1.TMR1IE = 1  'activa el timer1
n1 = 0  'número de repeticiones de timer1


'####################################################################################################################
'habilitación de interrupciones
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
PIE1.RCIE = 1  'Activa la interrupcion de la USART en modo rx
Enable  'INTCON.GIE habilita todas las interrupciones globales
'####################################################################################################################
'variables iniciales
n_llamar = 1
permitido = 1


'####################################################################################################################
'Borra el bufer de datos

'Gosub clear_bufer
'####################################################################################################################
'Programa principal
loop:


If RCSTA.OERR = 1 Then  'testea posible bloqueo del puerto fisico en modo Rx
Gosub clear_bufer  'borra el bufer por soft del puerto serie de entrada
Endif

If permitido = 1 Then
Gosub clear_bufer
Gosub actualiza_simples
Gosub salida_cd4094
'Gosub salida_triples_cd4094
'Gosub salida_desenganches

WaitMs 100

rs485 = 1  'comienza en modo transmisión
WaitMs 100
Hserout 0, n_llamar, n_llamar, n_llamar, n_llamar, fin_trama
'una vez enviada la trama espera a recibir respuesta o temporiza 1000 ms antes de enviar la trama a el
'siguiente dispositivo
WaitMs 100  'pausa para permitir la transmisión completa de la trama.
'Si no se pone la trama se corta y no llega transmisión.
rs485 = 0  'pasa a modo recepción
permitido = 0
TMR1H = 0xf8  '0xbd  'preset For timer1 msb register
TMR1L = 0x30  '0xdc  'preset For timer1 lsb register
T1CON.TMR1ON = 1  'habilitacion del TMR1
Endif

Goto loop
End                                               

'###################################################################################################################
On Interrupt  'desactiva las interrupciones
Save System  'Guarda los valores del sistema
PIE1.RCIE = 0  'desactiva la interrupcion de la USART en modo rx
T1CON.TMR1ON = 0  'deshabilitacion del TMR1

If PIR1.RCIF = 1 Then  'comprueba que es esta la interrupcion activa del modulo USART
'trama de respuesta 0,n_llamar,var_desvio,F
Dim aux_var_desvio As Byte
aux_var_desvio = 0
Hserget uart_bufer(uart)  'carga el dato en el bufer

If uart_bufer(uart) = fin_trama Then  'si se recibe fin trama
Toggle led
aux_trama = uart - 1
aux_var_desvio = uart_bufer(aux_trama)
aux_trama = aux_trama - 1
aux_n_llamar = uart_bufer(aux_trama)
Endif

If aux_n_llamar = n_llamar Then
aux_var_desvio = var_desvio
led = 1
Gosub clear_bufer
Endif





uart = uart + 1
If uart = 39 Then
uart = 0
Gosub clear_bufer
Endif

Endif


'###########################################################################################################
'interrupcion Timer1
'cada 10 ms
If PIR1.TMR1IF = 1 Then  'comprueba que es esta la interrupcion activa del TIMER1

n1 = n1 + 1
If n1 = 1500 Then  'han pasado 1500ms 2 para simulacion

n_llamar = n_llamar + 1  'si han pasado 1500ms sin respuesta se manda la trama al siguiente desvio
If n_llamar > total_placa Then n_llamar = 1
permitido = 1
n1 = 0
Endif
TMR1H = 0xf8  '0xbd  'preset For timer1 msb register
TMR1L = 0x30  '0xdc  'preset For timer1 lsb register


Endif

'activa las interrupciones
T1CON.TMR1ON = 1  'habilitacion del TMR1
PIR1.RCIF = 0  'borra el flag de salto de la usart
PIE1.RCIE = 1  'activa la interrupcion de la USART en modo rx
PIR1.TMR1IF = 0  'borra el flag de salto del tmr1

Resume                                           

'#################################################
'rutina borrado del bufer de datos y borra error del puerto fisico en modo Rx
clear_bufer:
Dim n As Byte
For n = 0 To 1  'desbloquea el puerto serie fisico en caso de bloqueo por exceso de entrada de datos
T1CON.TMR1ON = 0  'bloquea timer1
PIE1.RCIE = 0  'deshabilita la interrupcion del modulo serie
RCSTA.CREN = 0  'protocolo de desbloqueo puerto serie
RCSTA.CREN = 1  'protocolo de desbloqueo puerto serie
RCSTA.OERR = 0  'protocolo de desbloqueo puerto serie
Next n
Gosub clearbufer  'borra el bufer por soft de los datos recibidos por el puerto serie
PIR1.TMR1IF = 0  'borra el flag de salto del tmr1
PIR1.RCIF = 0  'borra el flag de salto de la usart
PIE1.RCIE = 1  'activa la interrupcion de la USART en modo rx

Return                                           

clearbufer:

Dim c_serial As Byte
c_serial = 0
While c_serial < n_uart  'se ejecuta tantas veces como variables tiene el bufer
uart_bufer(c_serial) = 0  'borra el bufer con datos
c_serial = c_serial + 1
Wend
c_serial = 0
uart = 0

Return                                           



'#########################################################################################
'rutina de actualizacion de leds

actualiza_simples:
Select Case aux_n_llamar
Case 1
cd_4094_1.0 = var_desvio.0
cd_4094_1.1 = var_desvio.1
cd_4094_1.2 = var_desvio.2
cd_4094_1.3 = var_desvio.3
Case 2
cd_4094_1.4 = var_desvio.4
cd_4094_1.5 = var_desvio.5
cd_4094_1.6 = var_desvio.6
cd_4094_1.7 = var_desvio.7

Case 3
cd_4094_2.0 = var_desvio.0
cd_4094_2.1 = var_desvio.1
cd_4094_2.2 = var_desvio.2
cd_4094_2.3 = var_desvio.3
Case 4
cd_4094_2.4 = var_desvio.4
cd_4094_2.5 = var_desvio.5
cd_4094_2.6 = var_desvio.6
cd_4094_2.7 = var_desvio.7

Case 5
cd_4094_3.0 = var_desvio.0
cd_4094_3.1 = var_desvio.1
cd_4094_3.2 = var_desvio.2
cd_4094_3.3 = var_desvio.3
Case 6
cd_4094_3.4 = var_desvio.4
cd_4094_3.5 = var_desvio.5
cd_4094_3.6 = var_desvio.6
cd_4094_3.7 = var_desvio.7

EndSelect
Return                                           


actualiza_triples:

'If desvio_1 = 1 Then triple_cd_4094.0 = 0
'If desvio_1 = 2 Then triple_cd_4094.0 = 1
'If desvio_1 = 3 Then Toggle triple_cd_4094.0
'If desvio_2 = 1 Then triple_cd_4094.1 = 0
'If desvio_2 = 2 Then triple_cd_4094.1 = 1
'If desvio_2 = 3 Then Toggle triple_cd_4094.1
'If desvio_3 = 1 Then triple_cd_4094.2 = 0
'If desvio_3 = 2 Then triple_cd_4094.2 = 1
'If desvio_3 = 3 Then Toggle triple_cd_4094.2
'If desvio_4 = 1 Then triple_cd_4094.3 = 0
'If desvio_4 = 2 Then triple_cd_4094.3 = 1
'If desvio_4 = 3 Then Toggle triple_cd_4094.3
'If desvio_5 = 1 Then triple_cd_4094.4 = 0
'If desvio_5 = 2 Then triple_cd_4094.4 = 1
'If desvio_1 = 3 Then Toggle triple_cd_4094.4
'If desvio_6 = 1 Then triple_cd_4094.5 = 0
'If desvio_6 = 2 Then triple_cd_4094.5 = 1
'If desvio_6 = 3 Then Toggle triple_cd_4094.5


Return                                           


actualiza_desen:

'Select Case n_llamar
'Case 5
''zona 1
'If desvio_1 = 1 Then cd_4094_1.0 = 0
'If desvio_1 = 2 Then cd_4094_1.0 = 1
'If desvio_1 = 3 Then Toggle cd_4094_1.0
'If desvio_2 = 1 Then cd_4094_1.1 = 0
'If desvio_2 = 2 Then cd_4094_1.1 = 1
'If desvio_2 = 3 Then Toggle cd_4094_1.1
'If desvio_3 = 1 Then cd_4094_1.2 = 0
'If desvio_3 = 2 Then cd_4094_1.2 = 1
'If desvio_3 = 3 Then Toggle cd_4094_1.2
'If desvio_4 = 1 Then cd_4094_1.3 = 0
'If desvio_4 = 2 Then cd_4094_1.3 = 1
'If desvio_4 = 3 Then Toggle cd_4094_1.3
'If desvio_5 = 1 Then cd_4094_1.4 = 0
'If desvio_5 = 2 Then cd_4094_1.4 = 1
'If desvio_1 = 3 Then Toggle cd_4094_1.4
'If desvio_6 = 1 Then cd_4094_1.5 = 0
'If desvio_6 = 2 Then cd_4094_1.5 = 1
'If desvio_6 = 3 Then Toggle cd_4094_1.5
''zona 2-1
'If desvio_7 = 1 Then cd_4094_1.6 = 0
'If desvio_7 = 2 Then cd_4094_1.6 = 1
'If desvio_7 = 3 Then Toggle cd_4094_1.6
'If desvio_8 = 1 Then cd_4094_1.7 = 0
'If desvio_8 = 2 Then cd_4094_1.7 = 1
'If desvio_8 = 3 Then Toggle cd_4094_1.7

'Case 6
''zona 2-2

'If desvio_1 = 1 Then cd_4094_2.0 = 0
'If desvio_1 = 2 Then cd_4094_2.0 = 1
'If desvio_1 = 3 Then Toggle cd_4094_2.0
'If desvio_2 = 1 Then cd_4094_2.1 = 0
'If desvio_2 = 2 Then cd_4094_2.1 = 1
'If desvio_2 = 3 Then Toggle cd_4094_2.1
'If desvio_3 = 1 Then cd_4094_2.2 = 0
'If desvio_3 = 2 Then cd_4094_2.2 = 1
'If desvio_3 = 3 Then Toggle cd_4094_2.2
'If desvio_4 = 1 Then cd_4094_2.3 = 0
'If desvio_4 = 2 Then cd_4094_2.3 = 1
'If desvio_4 = 3 Then Toggle cd_4094_2.3
''zona 2-3
'If desvio_5 = 1 Then cd_4094_2.4 = 0
'If desvio_5 = 2 Then cd_4094_2.4 = 1
'If desvio_5 = 3 Then Toggle cd_4094_2.4
'If desvio_6 = 1 Then cd_4094_2.5 = 0
'If desvio_6 = 2 Then cd_4094_2.5 = 1
'If desvio_6 = 3 Then Toggle cd_4094_2.5
'If desvio_7 = 1 Then cd_4094_2.6 = 0
'If desvio_7 = 2 Then cd_4094_2.6 = 1
'If desvio_7 = 3 Then Toggle cd_4094_2.6
'If desvio_8 = 1 Then cd_4094_2.7 = 0
'If desvio_8 = 2 Then cd_4094_2.7 = 1
'If desvio_8 = 3 Then Toggle cd_4094_2.7

'EndSelect
Return                                           




'###########################################################################

'salida para control desvíos a cd4094
salida_cd4094:
load_cd4094 = 0

data_cd4094 = cd_4094_3.7
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_3.6
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_3.5
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_3.4
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_3.3
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_3.2
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_3.1
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_3.0
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_2.7
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_2.6
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_2.5
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_2.4
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_2.3
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_2.2
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_2.1
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_2.0
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_1.7
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_1.6
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_1.5
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_1.4
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_1.3
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_1.2
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_1.1
WaitMs 2
clk_4094 = 1
clk_4094 = 0

data_cd4094 = cd_4094_1.0
WaitMs 2
clk_4094 = 1
clk_4094 = 0

load_cd4094 = 1
load_cd4094 = 0

Return                                           

'#####################################################################
'salida_triples_cd4094:

'data_triple_cd4094 = triple_cd_4094.7
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.6
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.5
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.4
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.3
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.2
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.1
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.0



'load_triple_cd4094 = 1
'load_triple_cd4094 = 0
'Return





'#####################################################################
'salida_desenganches:

'data_triple_cd4094 = triple_cd_4094.7
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.6
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.5
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.4
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.3
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.2
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.1
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.0

'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.6
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.5
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.4
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.3
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.2
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0

'data_triple_cd4094 = triple_cd_4094.1
'WaitMs 2
'clk_triple_cd4094 = 1
'clk_triple_cd4094 = 0





'load_triple_cd4094 = 1
'load_triple_cd4094 = 0
'Return



Código del Slave

Código: [Seleccionar]

'16F628A MODULO DESVIOS SLAVE1
'modificado 9/2013. Se cambia la definición del nº de placa
'ra5 entrada, oscilador exterior a 8mhz
Define CONF_WORD = 0x3f42
Define CLOCK_FREQUENCY = 8
AllDigital  'todos los pines digitales
CMCON = 0x07
'Define SIMULATION_WAITMS_VALUE = 1  'solo para simulacion

'##############################
'definición de puertos
TRISA = %00101111
TRISB = %01110011

Symbol desvio1_1 = RA1
Symbol desvio1_2 = RA0
Symbol desvio2_1 = RA2
Symbol desvio2_2 = RA3
Symbol desvio4_1 = RA5
Symbol desvio4_2 = RB0
Symbol desvio3_1 = RB4
Symbol desvio3_2 = RB5
'##################################################################
'configuracion led indicador
Symbol led = RB7

'##################################################################
Dim n_placa As Byte  'numero de placa slave
n_placa = 1
Dim fin_trama As Byte
fin_trama = 255
Dim uart_bufer(40) As Byte
Dim uart As Byte
Dim n_uart As Byte
uart = 0
n_uart = 40
Dim correcto As Byte
correcto = 0  'si se ha recibido la trama correctamente correcto=1, envía respuesta

'#################################################
'configuración del puerto serie y rs485

Symbol rs485 = RB3
rs485 = 0  'comienza en modo receptor
Hseropen 4800  'Velocidad del puerto serie e inicializa los comandos de bajo nivel que controlan la USART
INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
PIE1.RCIE = 1  'Activa la interrupcion de la USART en modo rx
Enable  'INTCON.GIE habilita todas las interrupciones globales

'#################################################
'variables de los desvios
'situacion inicial desvios=1
'el estado de los desvios se almacena en los 4 primeros bits de cada variable
'desvio del 1 al 4 en variable var_desvio
'ejemlo desvio1 en estado 1 01010001
'de esta manera la trama a enviar y recibida nunca es cero
Dim var_desvio As Byte
var_desvio = %01010000


'#################################################
'pausa, apaga el led del portb7 y limpia el bufer de datos
led = 1
Gosub clear_bufer
WaitMs 2000
led = 0
WaitMs 2000

'#################################################
'Programa principal
loop:
If RCSTA.OERR = 1 Then  'testea posible bloqueo del puerto fisico en modo Rx
Gosub clear_bufer  'borra el bufer por soft del puerto serie de entrada
Endif

Gosub get_button
If desvio4_1 = 1 Then
led = 1
correcto = 1
Endif


'If var_desvio.0 = 0 Then
'led = 1
'WaitMs 1000
'led = 0
'Endif
'trama enviada por el master 0, n_placa,fin_trama
If correcto = 1 Then
rs485 = 1  'pasa a modo transmision
WaitMs 100
Hserout 0, n_placa, var_desvio, n_placa, var_desvio, n_placa, var_desvio, fin_trama
WaitMs 100
rs485 = 0  'pasa a modo recepcion
correcto = 0
'If desvio1_1 = 1 Then led = 1
'If desvio1_2 = 1 Then led = 0
Endif

Goto loop
End                                               

'#################################################
'rutina control teclado
get_button:


If desvio1_1 = 1 Then var_desvio.0 = 0
If desvio1_2 = 1 Then var_desvio.0 = 1
If desvio2_1 = 1 Then var_desvio.1 = 0
If desvio2_2 = 1 Then var_desvio.1 = 1
If desvio3_1 = 1 Then var_desvio.2 = 0
If desvio3_2 = 1 Then var_desvio.2 = 1
If desvio4_1 = 1 Then var_desvio.3 = 0
If desvio4_2 = 1 Then var_desvio.3 = 1


WaitMs 25


Return                                           

'#################################################
'rutina borrado del bufer de datos y borra error del puerto fisico en modo Rx
clear_bufer:
Dim n As Byte
For n = 0 To 1  'desbloquea el puerto serie fisico en caso de bloqueo por exceso de entrada de datos
PIE1.RCIE = 0  'deshabilita la interrupcion del modulo serie
RCSTA.CREN = 0  'protocolo de desbloqueo puerto serie
RCSTA.CREN = 1  'protocolo de desbloqueo puerto serie
RCSTA.OERR = 0  'protocolo de desbloqueo puerto serie
Next n
Gosub clearbufer  'borra el bufer por soft de los datos recibidos por el puerto serie
PIR1.RCIF = 0  'borra el flag de salto de la usart
PIE1.RCIE = 1  'activa la interrupcion de la USART en modo rx
Return                                           


clearbufer:

Dim c_serial As Byte
c_serial = 0
While c_serial < n_uart  'se ejecuta tantas veces como variables tiene el bufer
uart_bufer(c_serial) = 0  'borra el bufer con datos
c_serial = c_serial + 1
Wend
c_serial = 0
uart = 0

Return                                           


On Interrupt  'desactiva las interrupciones
Save System  'Guarda los valores del sistema
PIE1.RCIE = 0  'desactiva la interrupcion de la USART en modo rx

'#########################################################################################
'variables locales
Dim aux_trama As Byte
aux_trama = 0
Dim n_llamar As Byte
n_llamar = 0
'#########################################################################################

If PIR1.RCIF = 1 Then  'comprueba que es esta la interrupcion activa del modulo USART
'trama enviada por el master 0, n_llamar, fin_trama"
'n_llamar=numero de dispositivo a llamar de 1 a 8
'fin trama="F"
Hserget uart_bufer(uart)  'carga el dato en el bufer

If uart_bufer(uart) = fin_trama Then  'si se recibe fin trama

aux_trama = uart - 1
n_llamar = uart_bufer(aux_trama)  'carga el checsum recibido
If n_llamar = n_placa Then  'si coincide en nº de placa recibido con el nº de placa slave
'Toggle led
correcto = 1
n_llamar = 0
Gosub clear_bufer


Endif
Endif
uart = uart + 1

If uart = 39 Then
uart = 0
Gosub clear_bufer
Endif

Endif

PIR1.RCIF = 0  'borra el flag de salto de la usart
PIE1.RCIE = 1  'activa la interrupcion de la USART en modo rx

Resume                                           



Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Transmisión por rs485
« Respuesta #2 en: 02 de Noviembre de 2014, 13:37:20 »
En el código del master hay que cambiar  Symbol led = PORTB.4 por Symbol led = PORTA.4.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Transmisión por rs485
« Respuesta #3 en: 02 de Noviembre de 2014, 21:00:35 »
Felicidades por tu código, te hago unas pequeñas sugerencias:
Después de On Interrupt no es necesario deshabilitar la interrupción de un modulo en concreto para luego habilitarlo antes de Resume, ya que eso es automático.
No es necesario borrar el flag de indicación que hay datos en la usart, ese flag lo borra de forma automática el micro cuando el buffer quedó vacío, es el único o uno de los pocos módulos que el micro se encarga de borrar ese flag.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Transmisión por rs485
« Respuesta #4 en: 02 de Noviembre de 2014, 21:30:02 »
Otro elemento interesante, para más adelante, es que contemples el empleo de usar bases de tiempos en tu programas, se utilizan para establecer cuantas veces en un tiempo determinado se repite una rutina o algoritmo. Un ejemplo muy claro es utilizarlas para hacer parpadear led, escribir datos cada cierto tiempo en un display o enviar datos por un puerto serie, entre otras muchas cosas. Por ejemplo: con las bases de tiempos te quitarías el empleo de los ciclos de tiempo como el siguiente  “Led=on:Waitms 1000:Led=Off:Waitms 1000”. Con las bases de tiempos (Timer por software) puedes controlar el parpadeo de varios led sin que afecten a la ejecución del resto del código.
 
Dejo el enlace de ejemplo, creía que había ampliado el tema de las bases de tiempos pero parece que se me paso, veré de ampliarlo más adelante.

http://www.todopic.com.ar/foros/index.php?topic=14917.msg112159#msg112159
Saludos desde Granada, España.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Transmisión por rs485
« Respuesta #5 en: 03 de Noviembre de 2014, 17:40:30 »
Muchas gracias por tus sugerencias.Voy a ponerme en ello a ver como queda.
Las bases de tiempo sí que las he visto en los ejemplos que pusiste, pero no tengo muy claro como fucionan. Volveré a dar otra vuelta para ver si saco algo en claro.
Un saludo


 

anything