|
Minichat
Feliz año dos meses tarde!!! Aqui el tiempo pasa mas lento Feliz año 2024. Me embargó la nostalgia al ver que aun existe el foro Feliz Navidad 2023 02/10/2023 Saludos chicos cuanto tiempo, El_ Nene cuanta razon 2023 Saludos! Iniciar sesión despues de 13 años, que recuerdos! y aún así algo te llama para volver a entrar saludos años t años que no entraba a esta pagina Acabo de empezar un nuevo proyecto, a ver si los demás os animais. cuanto tiempo!!! Buen año a todos! Hola Locos Saludos-28-oct-2022 Saludos-28-oct-2022 Aloha. 14/Sept/2022 No veo como enviar mensaje No veo como enviar mensaje Hola 2022!! Buenas Mundo!!! 31/12/21 Buenas tardes.... 25/11/21 Saludos!!! un buen dia para el que lea esto un buen dia para el que lea esto
|
|
Ver tema anterior :: Ver tema siguiente |
Autor |
Mensaje |
Teotekaplan Moderador
País: Sexo: Registrado: 31 marzo 2003 Mensajes: 4124 Ubicación: Madrid
|
Publicado: Vie, 29 Abr 2005 12:25 am Asunto: Recibiendo infrarrojos. código |
|
|
Aquí dejo comentado un código en ASM para recibir correctamente los infrarrojos. funciona con un XTAL de 4 Mhz y el timer0 con el preescaler /4
Código: |
#DEFINE RAMstart 0x0C ; Para 16C84
COUNT EQU RAMstart+1 ; Un contador, usado para varias cosas
DELAY EQU RAMstart+2 ; Usada en las rutinas DELAYxxx
X_DELAY EQU RAMstart+3 ; Usada en las rutinas X_DELAYxxx
TOGGLE EQU RAMstart+4 ; RC5 Toggle bit
SYSTEM EQU RAMstart+5 ; RC5 byte de sistema
COMND EQU RAMstart+6 ; RC5 byte de comando
MZDATA EQU RAMstart+7 ; RC5 byte de datos
BIT_COUNT EQU RAMstart+12 ; Contador de bits entrantes
BYTE_COUNT EQU RAMstart+13 ; Contador de bytes almacenados
TEMP EQU RAMstart+14 ; Usada por PARSE para retener parejas de 2 bits
SERIAL_BUF EQU RAMstart+15 ; Buffer de entrada para la trama completa
SERIAL_2 EQU RAMstart+16
SERIAL_3 EQU RAMstart+17
SERIAL_4 EQU RAMstart+18
SERIAL_5 EQU RAMstart+19
SERIAL_6 EQU RAMstart+20
FIELD EQU RAMstart+21 ; Almacén temporal para field bit (medio bit)
PARSE_FLAGS EQU RAMstart+22 ; DECODE devuelve los datos en esta variable
MZ_FLAG EQU RAMstart+23 ; Activar si el formato es RC5 extendido
w EQU 0
f EQU 1
ONE EQU B'00000001' ; formas de los patrones de parejas de bits
ZERO EQU B'00000010'
;***************************************************************************
; Esperamos a que la entrada sea cero
;***************************************************************************
POLL_RA3 BTFSC PORTA, DATA_IN ; Comprobamos la entrada
GOTO POLL_RA3 ; Si es 1, seguimos esperando
MOVLW D'147' ; Hay un cero, cargamos el timer con 444 uSeg
; menos 11 que perdemos en llamadas etc = 433 ciclos
; 255-147=108 conteos x 4 preescaler
MOVWF TMR0 ; Creamos una espera de 1/4 bit
BCF INTCON,T0IF ; Ponemos el overfloy del timer a 0
BCF STATUS,C ; lo mismo con el bit de acarreo
CALL READ ; Leemos la trama
BTFSC STATUS,C ; El flag de acarreo indica datos no válidos
GOTO POLL_RA3 ; Repetimos la lectura
CALL PARSE ; Interpretamos los datos
BTFSC STATUS,C ; El flag de acarreo indica datos no válidos
GOTO POLL_RA3 ; Comenzamos de nuevo si hubo errores
;****************************************************************************
;READ .. lee la trama y la almacena en el buffer de 6 bytes
; Recordar que la salida es activa a nivel bajo
;****************************************************************************
READ ; Primero borramos el buffer
MOVLW SERIAL_BUF ; Comienzo del buffer
MOVWF FSR ; Cargamos el registro indirecto
RD_LOOP1 CLRF INDF ; Ponemos un 0
INCF FSR,f ; Vamos al siguiente byte
MOVLW SERIAL_BUF+6 ; Comprobamos si hemos limpiado los 6
XORWF FSR,w
BTFSS STATUS,Z
GOTO RD_LOOP1 ; Repite hasta que esté completo
CLRF BIT_COUNT
CLRF BYTE_COUNT
MOVLW SERIAL_BUF ; Volvemos al principio del buffer
MOVWF FSR
RD_LOOP2 BTFSS INTCON, T0IF ; Esperamos que el timer cuente 444 uSeg
GOTO RD_LOOP2
CALL RESTART_TMR0 ; Ponemos el timer en 888 uSeg
BTFSC PORTA,3 ; comprobamos la entrada
GOTO BAD_DATA ; si es alta (valor 0), error
RD_LOOP3 BTFSS INTCON, T0IF ; Esperamos que el timer cuente 444 uSeg
GOTO RD_LOOP3
CALL RESTART_TMR0 ; Ahora lo dejamos ajustado a 888 uSeg
INCF BIT_COUNT,f
MOVLW D'43' ; Comprobamos que sean 42 bits
XORWF BIT_COUNT,w
BTFSC STATUS,Z
GOTO RD_FINISH ; Salimos si los hemos contado
BSF STATUS,C ; Acarreo a 1
BTFSC PORTA,3 ; Miramos la entrada
BCF STATUS,C ; La entrada es alta (puesta a 0): cambiamos el acarreo
; Ahora el bit está en el flag de acarreo
RLF INDF,f ; rotamos el flag al buffer
INCF BYTE_COUNT,f ;
BTFSC BYTE_COUNT,3 ; Comprobamos que llenamos los 8 bits
CALL NEXT_BYTE ; Si los llenamos, vamos a por el siguiente byte
GOTO RD_LOOP3 ; Repetimos hasta que estén los 42.
RD_FINISH BCF STATUS,C ;
RLF INDF,f ; el último byte del buffer sólo lleva
RLF INDF,f ; 2 bits cargados
RLF INDF,f ; Así que rotamos 6 veces
RLF INDF,f ; para dejarlos en los bits 6 y 7
RLF INDF,f
RLF INDF,f
BCF STATUS,C ; Acarreo a 0 para lectura correcta
RETURN
;****************************************************************************
;NEXT_BYTE .. Incrementa el FSR y borra el contador
;
;****************************************************************************
NEXT_BYTE INCF FSR,f
CLRF BYTE_COUNT
RETURN
;****************************************************************************
;RESTART_TMR0 .. Pone el timer en 888 uSeg
; y refrescamos el flag de overflow.
;****************************************************************************
RESTART_TMR0
BCF INTCON, T0IF ; Borramos el flag de overflow
MOVLW D'37' ; 255 - 37 = 218 x 4 = 872 uSeg
MOVWF TMR0 ; los otros 16 uSeg se nos van en bucles
RETURN ; llamadas etc.
;****************************************************************************
;PARSE .. convierte la trama de datos recibida
; en bytes limpios para usar
;****************************************************************************
PARSE
MOVLW SERIAL_BUF ; Ponemos el inicio del buffer
MOVWF FSR ; en el FSR
CLRF TEMP ; Inicializamos variables
CLRF BYTE_COUNT ;
CLRF MZ_FLAG ;
CLRF FIELD ;
CLRF TOGGLE ;
CLRF SYSTEM ;
CLRF COMND ;
CLRF MZDATA ;
; El primero es un medio bit (field bit)
RLF INDF,f ; Lo metemos al acarreo
RLF TEMP,f ; y lo llevamos a TEMP
RLF INDF,f ; segundo bit (medio bit)
RLF TEMP,f ; y también a TEMP
INCF BYTE_COUNT,f
CALL DECODE
BTFSC PARSE_FLAGS,2 ; pareja de bits no válidas
GOTO BAD_DATA
RRF PARSE_FLAGS,f ; ponemos medio bit en el acarreo
RLF FIELD,f ; y lo movemos a FIELD
CLRF TEMP ; El siguiente es el bit toffle
RLF INDF,f ; Primer bit a acarreo
RLF TEMP,f ; Lo pasamos a TEMP
RLF INDF,f ; Segundo bit
RLF TEMP,f ; idem
INCF BYTE_COUNT,f
CALL DECODE
BTFSC PARSE_FLAGS,2 ; pareja de bits no válidas
GOTO BAD_DATA
RRF PARSE_FLAGS,f ; ponemos medio bit en el acarreo
RLF TOGGLE,f ; y lo movemos a TOGGLE
MOVLW 0x05 ; Ahora viene el byte de sistema
MOVWF COUNT ; consta de 5 bits
SYS_1 CLRF TEMP
RLF INDF,f ; Primer bit a acarreo
RLF TEMP,f ; Lo pasamos a TEMP
RLF INDF,f ; Segundo bit
RLF TEMP,f ; idem
INCF BYTE_COUNT,f
BTFSC BYTE_COUNT,2 ; dos rotaciones por cada cuenta
CALL NEXT_BYTE ; Cambiamos de byte si es 4
CALL DECODE
BTFSC PARSE_FLAGS,2 ; pareja de bits no válidas
GOTO BAD_DATA
RRF PARSE_FLAGS,f ; bit al acarreo
RLF SYSTEM,f ; Lo movemos a SYSTEM
DECFSZ COUNT,f ; tenemos los 5 bits?
GOTO SYS_1 ; todavía no, repetimos
; Ahora testeamos si hay 2 espacios
; que indicarían formato extendido
; Si existe, subimos un flag
; y nos lo saltamos hasta el byte
; de comando
MOVLW B'11000000' ; máscara para el segundo byte del buffer
ANDWF SERIAL_2,w ; son los 2 ceros?
BTFSS STATUS,Z ;
GOTO PHILIPS ; No se encontró el espacio
CALL NEXT_BYTE ; nos saltamos el primer espacio
RLF INDF,f ; y el segundo
RLF INDF,f ;
INCF BYTE_COUNT,f
MOVLW 0x01
MOVWF MZ_FLAG ; Ponemos el flag de espacio a 1
PHILIPS MOVLW 0x06 ; Siguiente el byte de comando, 6 bits
MOVWF COUNT
CMD_1 CLRF TEMP
RLF INDF,f ; Primer bit al acarreo
RLF TEMP,f ; Lo pasamos a TEMP
RLF INDF,f ; Segundo bit
RLF TEMP,f ; idem
INCF BYTE_COUNT,f ;
BTFSC BYTE_COUNT,2 ; (2 rotaciones por cada uno)
CALL NEXT_BYTE ; pasamos al siguiente byte del buffer con contador a 4
CALL DECODE
BTFSC PARSE_FLAGS,2 ; Datos erróneos
GOTO BAD_DATA
; Hemos encontrado un bit valido
RRF PARSE_FLAGS,f ; Lo ponemos en el acarreo
RLF COMND,f ; lo pasamos a COMND
DECFSZ COUNT,f ; hemos hecho los 6 bits?
GOTO CMD_1 ; todavía no
BTFSS FIELD,0 ; Si field bit=0 entonces comnd=comnd+64
BSF COMND,6
BTFSC MZ_FLAG,0 ; Comprobamos si es formato extendido
GOTO MDAT_1 ; Si lo es, lo interpretamos
RETURN ; Terminamos aqui para RC5 normal
MDAT_1 MOVLW 0x06 ; Vamos a por el byte de datos, 6 bits
MOVWF COUNT
MDAT_2 CLRF TEMP
RLF INDF,f ; Primer bit al acarreo
RLF TEMP,f ; Lo ponemos en TEMP
RLF INDF,f ; Segundo bit
RLF TEMP,f ; idem
INCF BYTE_COUNT,f ;
BTFSC BYTE_COUNT,2 ; (2 rotaciones por conteo)
CALL NEXT_BYTE ; Al llegar a 4, pasamos de byte
CALL DECODE
BTFSC PARSE_FLAGS,2 ; Errores encontrados
GOTO BAD_DATA
; Bit correcto
RRF PARSE_FLAGS,f ; lo metemos al acarreo
RLF MZDATA,f ; lo pasamos a MZDATA
DECFSZ COUNT,f ; tenemos los 6 bits?
GOTO MDAT_2 ; No, todavía no
PARSE_DONE RETURN
;****************************************************************************
; DECODE .. metemos los datos de los 2 bits en TEMP
; el resultado en PARSE_FLAGS
; PARSE_FLAGS<0> = dato válido, uno o cero
; PARSE_FLAGS<1> = sin usar
; PARSE_FLAGS<2> = a 1 para dato no válido
;****************************************************************************
DECODE
CLRF PARSE_FLAGS
MOVLW ONE
XORWF TEMP,w ; Compara con '01'
BZ ONE_EXIT
MOVLW ZERO
XORWF TEMP,w ; compara con '10'
BZ ZERO_EXIT
BAD_EXIT BSF PARSE_FLAGS,2 ; no es ni 01 ni 10
RETURN
ONE_EXIT BSF PARSE_FLAGS,0 ; dato válido en el LSB
ZERO_EXIT RETURN ; de PARSE_FLAGS
;****************************************************************************
; BAD_DATA .. Salida sif Read o Parse encuentran un error
; Se pone el acarreo a 1 para indicar un error.
;****************************************************************************
BAD_DATA
BSF STATUS,C ; acarreo a 1 para error
RETURN
|
'Me lo contaron y lo olvidé. Lo vi y lo entendí. Lo hice y lo aprendí.' |
|
Volver arriba |
|
|
apoguita modder
País: Sexo: Registrado: 28 septiembre 2004 Mensajes: 285 Ubicación: Guatemala
|
|
Volver arriba |
|
|
Potxoki modder
País: Sexo: Registrado: 31 octubre 2003 Mensajes: 87 Ubicación: Madrid
|
|
Volver arriba |
|
|
RaDoN Moderador
País: Sexo: Registrado: 06 diciembre 2002 Mensajes: 1288 Ubicación: Sevilla
|
Publicado: Vie, 29 Abr 2005 1:29 am Asunto: |
|
|
Muchisimas gracias teo !!! particularmente aunque me encanta todo el proyecto, me quedo con el protocolo RC5, que lo leere trankilo mañana (weno hoy que ya son mas de las 12). Y gracias tb por compartir el código ASM que tiene mucho curro.
Ya queda poco, animo TEO
Edito: Me entrometo un poco en este hilo de Teo, para postear algo para aquellos que quieran implementar RC5 en sus proyectos PICs. Le comentaba a Teo de traducirlo a C, pero cuando e buscando un poco ... ya me lo encontre hecho Lo dejo aquí, lee la entrada del TSOP1736 por RA0 y manda la info del boton pulsado al terminal de windows por RS232. En cuando me haga con un TSOP1736 lo pruebo y os cuento
Código: |
//***************************************************
// CCS Compiler
// telecom - Télécommande ir
//
// Auteur : HEILIG Yves
//***************************************************
#include <16f84.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=115200, xmit=PIN_B6, rcv=PIN_B7)
#define REC_IR PIN_B6 // récepteur ir
//**********************
// Programme principal
//**********************
main() {
int1 bit;
int i, nbit, erreur;
byte buffer[2];
printf ("Test Telecommande IR : PHILIPS\r\n\n");
while (TRUE) {
buffer[0]=0;
buffer[1]=0;
erreur=0;
nbit=0;
i=0;
while ( i++ != 4) { // Test si REC_IR au repos prolongé
if (REC_IR == 0) i=0;
delay_us (889);
}
while (input(REC_IR)==1); // Attend bit de START
delay_us(444); // on se positionne au milieu
while ((nbit++ != 13) && (erreur == 0)) {
delay_us (889);
if (input(REC_IR)==0) {
delay_us (889);
if (input(REC_IR) != 1) erreur=1;
bit=0; // c'est un 0
}
else {
delay_us (889);
if (input(REC_IR) != 0) erreur=1;
bit=1;
}
shift_left(buffer,2,bit); // et on le pousse dans le buffer
}
if (erreur) printf ("Erreur\n\r");
else {
printf ("%x %x Touche %d\n\r",buffer[1],buffer[0],buffer[0]);
}
}
}
|
*Mas info en este link: http://perso.wanadoo.fr/yves.heilig/robot-mobile-irbot/9-test-rc5-robot.htm |
|
Volver arriba |
|
|
insane_style modder
País: Sexo: Registrado: 28 enero 2005 Mensajes: 87 Ubicación: Burgos
|
Publicado: Sab, 30 Abr 2005 5:09 pm Asunto: |
|
|
Esta muy chulo este proyecto, me han llamado mucho la atención estos relojes siempre, enhorabuena Teo.
Aquí podeis ver otra cosilla que se puede hacer con este sistema. Muy curiosa también |
|
Volver arriba |
|
|
Jose_JN modder
País: Sexo: Registrado: 09 noviembre 2002 Mensajes: 1714 Ubicación: JAEN
|
Publicado: Sab, 30 Abr 2005 7:22 pm Asunto: |
|
|
Teotekaplan escribió: | tiene que girar a 25 * 60 = 1500 RPM |
De donde sale el 60?
Por cierto, podrias colgal el código asm de las rutinas de dibujado? |
|
Volver arriba |
|
|
Gilder modder
País: Sexo: Registrado: 31 enero 2005 Mensajes: 280 Ubicación: salamanca
|
Publicado: Sab, 30 Abr 2005 7:52 pm Asunto: |
|
|
vaya un monstruo jaja, no digo mas Amd 3000 1024kingston, XFX 6600gt. DFI lanparty NF4 |
|
Volver arriba |
|
|
juantxorena modder
País: Sexo: Registrado: 02 septiembre 2002 Mensajes: 1396 Ubicación: La Comarca
|
Publicado: Sab, 30 Abr 2005 9:33 pm Asunto: |
|
|
Jose_JN escribió: | Teotekaplan escribió: | tiene que girar a 25 * 60 = 1500 RPM |
De donde sale el 60?
Por cierto, podrias colgal el código asm de las rutinas de dibujado? |
60 segundos = 1 minuto. La velocidad del ventilador va en revoluciones por minuto, lo otro son hercios, es decir, revoluciones por segundo. |
|
Volver arriba |
|
|
ajm modder
País: Sexo: Registrado: 03 junio 2004 Mensajes: 299 Ubicación: Tenerife
|
Publicado: Sab, 30 Abr 2005 9:37 pm Asunto: |
|
|
mira Teotekaplan prefiero pagarte y ke tu me hagas uno, a intertar hacerlo yo, pq con tantos eskemas k as puesto... ya veo teletubies en 3D xDDDD
saludos[img:b33fd77078]http://usuarios.lycos.es/hardcorefotos1/upload/ajm/logo%20hm.jpg[/img:b33fd77078] |
|
Volver arriba |
|
|
Jose_JN modder
País: Sexo: Registrado: 09 noviembre 2002 Mensajes: 1714 Ubicación: JAEN
|
Publicado: Dom, 01 May 2005 6:02 am Asunto: |
|
|
Ups! vale, ya veo el 60 : joder que lapsus |
|
Volver arriba |
|
|
Teotekaplan Moderador
País: Sexo: Registrado: 31 marzo 2003 Mensajes: 4124 Ubicación: Madrid
|
Publicado: Dom, 01 May 2005 12:02 pm Asunto: |
|
|
Radón gracias por el código C, ya me lo guardo en un TXT y lo pruebo hehehe. Seguramente lo haga en el entrenador del F876 que tengo pa no andar montando más placas hehehe.
Sobre los códigos ASM... imposible. Primero porque aun no he escrito nada de código (todavía estoy rematando la mecánica, me sobra apenas 1 mm de altura y no entra bien en la caja) y segundo porque lo voy a hacer en C.
El ASM me quema muchísimo, sólo trabajo en código máquina después de compilar en C, depurando alguna cosa que se pueda -sobre todo- reducir de tamaño.
Según vaya teniendo partes en C iré poniéndolas, y también el fichero HEX pa quien quiera hacer uno sin complicarse con el compilador. Es que no quiero coger ningún código de los que hay hechos. No tendría gracia.
AJM: Lo importante es que tengas muy claro el sistema mecánico, después sólo necesitas el esquema electrónico y el HEX que pasaré en su momento. Es más maña que otra cosa.'Me lo contaron y lo olvidé. Lo vi y lo entendí. Lo hice y lo aprendí.' |
|
Volver arriba |
|
|
RaDoN Moderador
País: Sexo: Registrado: 06 diciembre 2002 Mensajes: 1288 Ubicación: Sevilla
|
|
Volver arriba |
|
|
Jose_JN modder
País: Sexo: Registrado: 09 noviembre 2002 Mensajes: 1714 Ubicación: JAEN
|
Publicado: Dom, 01 May 2005 5:01 pm Asunto: |
|
|
Bueno, me da = que lo pongas en ASM que en C.
La cosa es enterarme de como funcona. No me gusta hacer cosas sin saber lo que hago... |
|
Volver arriba |
|
|
Jose_JN modder
País: Sexo: Registrado: 09 noviembre 2002 Mensajes: 1714 Ubicación: JAEN
|
Publicado: Dom, 15 May 2005 3:55 am Asunto: |
|
|
Que ha pasado con esto??
Sigue adelante o ke?? |
|
Volver arriba |
|
|
DuDuDMaN modder
País: Sexo: Registrado: 11 agosto 2004 Mensajes: 361 Ubicación: En UNO de los 69.588.359.698 ordenadores del mundo. (Barcelona)
|
|
Volver arriba |
|
|
|
|
Este sitio no se hace responsable de ningún daño que cause en su ordenador con la información que en el se expone.Todos los productos y marcas están registrados por sus respectivos propietarios. Prohibida la reproducción total o parcial de los textos e imagenes de esta web sin el consentimiento expreso de su autor. Hardcore-Modding.com 2001-2019 Los comentarios son propiedad de sus autores (ya sean anonimos o registrados). Portal basado en NukeET, RSS
Página Generada en: 0,964 segundos
π |