TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: elgarou en 13 de Noviembre de 2009, 03:08:46
-
Hola, la verdad soy un total novato en lo que se refiere a microcontroladores y programacion, pero estoy realizando un proyecto en el que necesito convertir a midi la señal de 4 piezoelectricos y enviarla al computador, por lo que he investigado el 16f877 parece una buena opcion, es asi??.
bueno, despues de eso, me cabe preguntar sobre la programacion, he instalado el mplab y he intentado descifrar algunas rutinas en lenguaje assembler, lo que me imagino se debe hacer debe ser algo como:
-inicilaizar los conversores A/D del pic
-tomar el nivel peak del piezo y asignarlo como velocity
-rellenar el resto de la trama midi, (canal, nota, velocity)
-activar la usart y definir la frecuencia correspondiente al protocolo midi, para poder mandar los datos midi al pc
la verdad es que tengo muchas dudas, para activar los conversores A/D creo se utilizan los registros adcon0 y adcon1, la usart (nisiquiera se bien que es, jajajjajajaj) creo tiene un registro SPRG para fijar los kbaudios, agradeceria algun trozo de codigo bien explicado para entender bien como se lleva todo esto a lenguaje ASM y arrojar algo de luz sobre el tema.
bueno, muchas gracias de antemano
-
hola, y bienvenido al foro. es mas menos como dices. busca entre mis mensajes que ya hice un controlador, secuenciador, y una bateria, a ver ande andaran en el foro. empieza con el programa y pregunta algo en concreto para que te podamos ayudar, te recomiendo armar una placa y empezar pulsando un boton, envia un dato, enciende un led... y ve subiendo de nivel. mira el post rutinas para compartir (http://www.todopic.com.ar/foros/index.php?topic=23812.0) ahí tienes las que uso yo para configurar la usart para midi 31250kb el cad registros de desplazamiento, ademas de muchas mas rutinas que te pueden servir
por si no lo conoces tienes los proyectos de eedrum (http://www.edrum.info/) y ucapps (http://ucapps.de/)
un saludo
-
gracias por responder tan prontamente, respecto a los proyectos edrum y ucapps, los he investigado, en la pagina de edrum encontre solo firmaware en formato hex y no codigo fuente, bueno no quiero pasarme, pero la verdad es que tengo dudas fundacionales por decirlo asi jajjajajjaja, por ej el template del mplab para el 16f877 trae un monton de codigo que no entiendo:
list p=16f877 ; list directive to define processor
#include <p16f877.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF
; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.
;***** VARIABLE DEFINITIONS
w_temp EQU 0x7E ; variable used for context saving
status_temp EQU 0x7F ; variable used for context saving
;**********************************************************************
ORG 0x000 ; processor reset vector
clrf PCLATH ; ensure page bits are cleared
goto main ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
; isr code can go here or be located as a call subroutine elsewhere
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
main
; remaining code goes here
END ; directive 'end of program'
he estado estudiando instruciones y los registros de este pic, pero nisiquiera se si todo el codigo que pone por defecto el mplab es solo ejemplo o tiene algun proposito, se que por lomenos incluye el modelo del pic y que eso es necesario:
"list p=16f877 ; list directive to define processor
#include <p16f877.inc> ; processor specific variable definitions"
el resto, chino jajajjajajajja
bueno como dije no quiero pasarme, pero de momento hasta eso me aproblema.
saludos
-
A pero eso es fácil de resolver, solo necesita un par de horas sentado :mrgreen: Por aquí un tutorial de asm (http://www.todopic.com.ar/foros/index.php?topic=23623.0), donde se explican cada una de las instrucciones. Después por aquí (http://www.todopic.com.ar/foros/index.php?topic=24720.0) hay varios ejemplo para ir desarrollando los primeros programitas en assembler utilizando los módulos disponibles de cada PICs.
Saludos!
-
Gracias por responder nuevamente, ya algo he aprendido del lenguaje y los ejemplos y el tutorial de asm me han sido de mucha ayuda, he encontrado este archivo, lo mas parecido a lo que necesito programar, bueno el asunto es que inspecionando el archivo aparece la siguiente rutina:
;************************************
; Switch Debounce Delay (100mS)
;************************************
sw_dbnc movlw 80h ; Delay routine
movwf dlyreg2
debnce call delay3
decfsz dlyreg2
goto debnce
return
;*************************************
; Delay Subroutine (770uS)
;*************************************
delay3 movlw .255
movwf dlyreg3
dly3 decfsz dlyreg3
goto dly3
nop
return
osea una rutina de demora, me parece que es con objeto de prevenir el rebote de los sensores, pero por lo que he averiguado y testeado un circuito rectificador analogo simple deja el pulso que entregan los piezos en condiciones para entrar a los pines del pic, bueno esa es mi duda por el momento, la rutina en cuestion es invocada solo al final del programa (si es que revise bien) cosa que tampoco comprendo:
call noteon
call delay3
call delay3
call delay3
call delay3
call noteoff
goto main
end
(el codigo completo esta adjunto)
Saludos!!
-
para conseguir algo de sensibilidad al tocar, vas a tener que ingeniartelas, no son solo pulsadores on/off con rutina antirebotes, por eso se usa el cad. ademas no se levanta hasta una tension y vuelve a cero, si no que depende como golpés el parche la onda que saca. vamos lo ideal es eso. usea que primero envia note_on, seguido del valor del aftertouch, y ultimo note_on a cero o note_off con la velocidad de levantado. tiene tela :mrgreen:si no fue pulsado envia note_on, si lo fue aftertouch, y si es cero despues de un note_on, hay que enviar el note_off. te recomiendo usar punteros para saber que paso. en cada registro de pad, ya que el midi solo utiliza los bits 6-0 el 7 siempre esta libre para guardar info
el organigrama podria ser asi:
-configurar perifericos
programa
-seleccion de canal a testear
-guarda el resultado de cada conversion en un registro de ram diferente para cada pad(usar el registro indf, direccionado por fsr)
- si es diferente el resultado de la conversion con el dato guardado, envia el dato
- si es igual continua el programa, no se modifico el canal del cad
-continua testeando canales del cad i
-seleccion de canal a testear
-guarda el resultado de cada conversion en un registro de ram diferente para cada pad
- si es diferente el resultado de la conversion con el dato guardado, envia el dato
- si es igual continua el programa, no se modifico el canal del cad
-asis como canales quieras testear, yo utilizo 8x4051 para conseguir 64 entradas(no para la bateria)
-goto programa, y vuelve a empezar
en esta web explican el protocolo midi 1.0 (http://www.eumus.edu.uy/docentes/jure/midi/)
para verificar los datos que entran u salen del pc tienes midiox (http://www.midiox.com/)
un saludo
-
He estado estado estudiando la rutina de inicializacion de conversores A/D de suky:
http://www.todopic.com.ar/foros/index.php?topic=27929.0
pero me parece que esta seteada para solo una entrada analoga, ¿como puedo generar una subrutina para usar el multiplexador y poder recoger las señales de los 4 piezos?, los bits CHS2:CHS0 del registro adcon0 solo permiten seleccionar un canal, por eso creo se debe implementar una rutina para muestrear 4 entradas analogas, eso de momento.
Saludos!!
-
Primero indicas cuales pines serán analógicos y sus referencias de tensión. Luego al realizar las conversiones seleccionas el canal, esperas 20us, lees el canal; seleccionas otro canal y haces lo mismo. Muéstranos como lo harías y te decimos si fallaste en algo ;-)
Saludos!
-
Ok, ahi esta la rutina para las 4 entradas (adjunto archivo, ojala este buena jajajjajaj), bueno ahora vuelvo a preguntar, servira un clock de 4 MHZ para configurar la usart 31250kb??, se pueden usar los nombres de los registros y sus bits sin declarar equivalencias??, tampoco se que es vdd y vss, osea son tensiones de referencia segun parece, pero no se si serviran para el nivel que entrega un piezo.
por favor echenle un ojo al archivo.
Saludos!!
-
Creo que asi esta mejor, jajjajajajaj, le hice algunos cambios, mejor lo adjunto por que si no usa mucho espacio.
-
no se si lo veo bien :shock: pero creo que si configuras un canal detras de otro, habra que leer el resultado.
vdd y vss es como si dijeramos positivo y negativo + y -... usea que si configuras el cad para la tension de ref. del micro= 0-5volt. o asi yo lo entiendo
tienes esta rutina preparada como ejemplo en rutinas para compartir, y otra que calcula la usart con el oscilador que sea, aunque los musicos siempre se quejan de algo llamado latencia, intenta usar 20mhz
esto lo utilizo para leer el valor de potenciometros
incio del programa, se configuran todos los perifericos, entradas, salidas....
-en micaso sale asi
CONFIG_ADCON1 ;00000000
BANKSEL ADCON1
MOVLW B'00000000'
MOVWF ADCON1
- y antes de cada lectura se configura ADCON0
MOVLW CH_AN_0 ;A W yo tengo definido que es CH_AN_0
CALL CANAL_AD_X ;CANALx DEL CAD y asi esta rutina vale para cada canal
- asi cada vez que se cambia de canal se hace una nueva lectura del cad
CANAL_AD_X ;SELECCIONA CANAL X DEL CAD NO INICIA LA CONVERSION
BANKSEL ADCON0
MOVWF ADCON0
CALL DEMORA ;LA ADQUISICION CORRECTA PARA CARGAR EL CONDENSADOR ANTES DE INICIAR LA CONVERSION 20uS
BANKSEL N_POTE
INCF N_POTE,F ;SIGUIENTE POTE
INCF FSR,F ;CADA VEZ QUE SE LLAMA A LA RUTINA QUE LEE EL
;VALOR DEL POTE, SE INCREMENTA EL REGISTRO FSR, PARA QUE REALICE LAS OPERACIONES
;EN EL REGISTRO DEL SIGUIENTE POTENCIOMETRO
BANKSEL ADCON0
BSF ADCON0,GO ;INICIA LA CONVERSION
ESPERA_CAD ;TESTEA HASTA QUE TERMINA LA CONVERSIÓN
BTFSC ADCON0,GO ;HASTA QUE SE PONE A CERO EL BIT GO/DONE
GOTO ESPERA_CAD ;VUELVE ATRAS HASTA QUE TERMINE
MOVF ADRESH,W
MOVWF REG_DIVISOR
CALL COMPENSACION ;ESTA LO QUE HACE ES DEJAR EL RESULTADO EN 7BITS
MOVF REG_DIVISOR,W
RESTA
BANKSEL REG_POTEX
BCF STATUS,Z
SUBWF INDF,W ;aqui lo compara con el resultado de la anterior lectura, se guarda en un registro diferente para cada entrada
BTFSC STATUS,Z
RETURN
ENVIA_DATOS ;BYTE DE STATUS
BANKSEL REG_CHANNEL
MOVLW STATUS_CC
CONTINUA_ENVIANDO
ADDWF REG_CHANNEL,W ;SUMA W Y REG_CHANNEL PARA ELEGIR CANAL DE TRANSMISION 0-15
CALL ENVIAR_USART
;BYTE Nº DE CONTROLADOR, LEE EL VALOR GUARDADO EN LA EEPROM PARA INDICAR EL Nº DE CONTROLADOR
CALL LECTURA_EEPROM_POTES
CALL ENVIAR_USART
;BYTE CON EL VALOR DEL CONTROLADOR, POSICION DEL POTENCIOMETRO
BANKSEL REG_DIVISOR
MOVF REG_DIVISOR,W ;ESTA COMO SE QUEDO DESPUES DE HABERLO COMPENSADO
CALL ENVIAR_USART
;SE GUARDA EL NUEVO VALOR EN EL REGISTRO QUE CORRESPONDE A CADA POTENCIOMETRO
BANKSEL REG_DIVISOR
MOVF REG_DIVISOR,W
BANKSEL REG_POTEX
MOVWF INDF ;GUARDA EN INDF EL ULTIMO VALOR DEL CAD, CADA VEZ QUE SE LLAMA A LA RUTINA QUE LEE EL
;VALOR DEL POTE, SE INCREMENTA EL REGISTRO FSR PARA QUE REALICE LAS OPERACIONES
;EN EL REGISTRO DEL SIGUIENTE POTENCIOMETRO
CALL ENVIAR_POSICION ;muestra el valor de W en los diplays
RETURN
mira que ya tienes el orden de como se envian los datos para activar un note on, solo tienes que definir el valor de status_cc
un saludo
-
Miren, lo que necesito realizar es algo muy parecido a esto:
http://www.embedds.com/beatsneaks-the-coolest-and-stylish-midi-drum-shoes/
creo que el tipo de sensores utilizado en el video no son piezos pero esa es la idea, comunicar los sensores instalados en el calzado mediante el pic con el pc, por eso no necesito after touch, solo una nota midi de velocity proporcional a la presion ejercida por el pie, quizas nisiquiera necesito utilizar mas de un canal midi solo setear notas midi diferentes para cada entrada analoga.
gracias por la rutina, la voy a estudiar
Saludos!!
-
creo que para eso puedes probar dos plantillas con cobre( punta, tacon) usea 8 laminas para usarlas de interruptor, separadas lo justo para al taconear, se toquen unas con otras, y contando el numero de rebotes en x tiempo se mide la presion. mas menos asi lo estoy haciendo para un teclado, claro no hay zapatos de por medio :mrgreen: a mas rebotes menos presion a menos rebotes mas fuerte. es a la inversa. de esta forma evitas el cad, realmente lento para este tipo de aplicaciones
un saludo
-
La verdad no entendi la idea, ¿es usar un tipo de sensor casero? ¿algo como esto?:
http://www.elektronika.ba/600/pressure-sensor-cheap-and-homemade/
bueno este es mi proyecto de titulo, y por lo que hemos investigado, los piezos nos parecieron la mejor opcion por su respuesta impulsiva, que proporciona la sincronia necesaria y por que despues de pasar el impulso por una etapa rectificadora analoga, esta queda como se muestra en la foto adjunta, me parece ideal para entrar al pic.
sin embargo como las entradas analogas estan multiplexadas quizas se genere latencia por tener que leer un canal analogo por vez, aunque no se cuanta ni si sera un problema.
Saludos!!
-
hola, ha pasado tiempo, bueno el posteo el codigo k he hecho, me ha surgido un problema con la transmicion via usart, testeando el codigo en el pic simulator ide, observo k el registro TXREG no se carga y que el bucle de testeo del bit TRMT se demora demasiado, la verdad he buscado el problema bastante, he borrado la rutina de envio a la usart para ver si asi se carga el registro TXREG y asi si se carga, pero cuando incluyo esta rutina en cualquier parte del programa sucede lo que explique, bueno espero que puedan ayudarme, gracias de antemano.
list p=16f877 ; list directive to define processor
#include <p16f877.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF
; NOTA:
; Oscilador utilizado 4MHz.--------> servira para setear la usart a 31,250 Kbd??
; ************************************************
velocity equ 0x20 ; Registro para guardar Byte alto de la conversion.-
velocity1 equ 0x21
velocity2 equ 0x22
velocity3 equ 0x23
velocity_0 equ 0x24 ; velocity seteada a 0000 0000, equivale a un note off
contador equ 0x25 ; Registro utilizado en demora.-
canal_on equ 0x26 ; mensaje midi de sistema, note on, toma los los valores de canal 2,3,4,5 (ej: note on canal 5 = 1001 0100)
canal_off equ 0x27
nota equ 0x28
vel_max equ 0x29
; ************************************************
ORG 0x00
goto Inicio
;----------------------------------------------------------------------
;***Envio_usart***
Envio_usart
bsf STATUS,5
X btfss TXSTA,1
goto X
bcf STATUS,5
return
Inicio
;seteo usart
bsf STATUS,RP0
movlw b'10001000'
movwf TRISC
movlw 01h
movwf SPBRG
movlw b'00100000'
movwf TXSTA
bcf STATUS,RP0
movlw b'10010000'
movwf RCSTA
Main
ADC
bsf STATUS,5
movlw 0XFF
movwf TRISA
bsf STATUS,5
movlw 0x02 ; Justificado a la izquierda, Fosc/8, RA0_RA1_RA2_RA3_RA5 analógico, VDD, VSS.
movwf ADCON1
bcf STATUS,5 ; Banco 0
movlw 0x45 ; Fosc/8, Canal 0, módulo habilitado.-
movwf ADCON0
call Demora_20us
movwf velocity
movlw 0x4D ; Fosc/8, Canal 1, módulo habilitado.-
movwf ADCON0
call Demora_20us
movwf velocity1
movlw 0x55 ; Fosc/8, Canal 2, módulo habilitado.-
movwf ADCON0
call Demora_20us
movwf velocity2
movlw 0x5D ; Fosc/8, Canal 3, módulo habilitado.-
movwf ADCON0
call Demora_20us
movwf velocity3
goto Comparar
Demora_20us
bcf STATUS,5
movlw 0x05 ; CONTADORES
movwf contador ; Iniciamos contador.-
Repeticion
decfsz contador ; Decrementa Contador1.-
goto Repeticion ; Si no es cero repetimos ciclo.-
Espera
btfsc ADCON0,GO ; Espera a que termine conversion.-
goto Espera
movf ADRESH,W ;----------------> REVISAR ASUNTO MSB LSB
return
Comparar
bcf STATUS,5
movlw 0x91 ; canal 2 ; inicio canal (note on)
movwf canal_on
movlw 0x81 ; canal 2 ; inicio canal (note off)
movwf canal_off
movlw 0x01 ; nota 1, inicio nota
movwf nota
movlw 0x00
movwf velocity_0 ; inicio velocity = 0, equivalente a note off
movlw 0x7F
movwf vel_max
clrw
ch2
bcf STATUS,5
iorwf velocity,F
btfsc STATUS,Z ; si velocity diferente de 0, salta y envia el dato
goto ch3
movf canal_on,w
movwf TXREG
call Envio_usart
movf nota,w
movwf TXREG
call Envio_usart
bcf velocity,7
movf velocity,w
movwf TXREG
call Envio_usart
movf canal_off,w
movwf TXREG
call Envio_usart
movf nota,w
movwf TXREG
call Envio_usart
movf velocity_0,w
movwf TXREG
call Envio_usart
clrw ; deja en 0 a W
ch3
incf canal_on ; canal 3,4,5
incf canal_off ; canal 3,4,5
iorwf velocity1,F ; testea siguiente registro de velocity, linea xxx
btfsc STATUS,Z
goto ch4
movf canal_on,w
movwf TXREG
call Envio_usart
movf nota,w
movwf TXREG
call Envio_usart
bcf velocity1,7
movf velocity1,w
movwf TXREG
call Envio_usart
movf canal_off,w
movwf TXREG
call Envio_usart
movf nota,w
movwf TXREG
call Envio_usart
movf velocity_0,w
movwf TXREG
call Envio_usart
clrw ; deja en 0 a W
ch4
incf canal_on ; canal 3,4,5
incf canal_off ; canal 3,4,5
iorwf velocity2,F
btfsc STATUS,Z
goto ch5
movf canal_on,w
movwf TXREG
call Envio_usart
movf nota,w
movwf TXREG
call Envio_usart
bcf velocity2,7
movf velocity2,w
movwf TXREG
call Envio_usart
movf canal_off,w
movwf TXREG
call Envio_usart
movf nota,w
movwf TXREG
call Envio_usart
movf velocity_0,w
movwf TXREG
call Envio_usart
clrw ; deja en 0 a W
ch5
incf canal_on ; canal 3,4,5
incf canal_off ; canal 3,4,5
iorwf velocity3,F
btfsc STATUS,Z
goto Main
movf canal_on,w
movwf TXREG
call Envio_usart
movf nota,w
movwf TXREG
call Envio_usart
incf canal_on ; canal 3,4,5
bcf velocity3,7
movf velocity3,w
movwf TXREG
call Envio_usart
movf canal_off,w
movwf TXREG
call Envio_usart
movf nota,w
movwf TXREG
call Envio_usart
movf velocity_0,w
movwf TXREG
call Envio_usart
goto Main
end
-
mira la que uso yo, y a ver si te da una idea
ENVIAR_USART ;EL DATO A TRANSMITIR ESTA ALOJADO EN W HASTA QUE TERMINE EL ULTIMO ENVIO
BANKSEL TXSTA
BTFSS TXSTA,TRMT ;SI ESTA A UNO EL REGISTRO ESTA VACIO
GOTO ENVIAR_USART ;SI ESTA A CERO, SIGUE LLENO Y A DE ESPERAR
BANKSEL TXREG
MOVWF TXREG ;Y CARGA EL DATO A TRANSMITIR EN TXREG
BANKSEL TXSTA
BSF TXSTA,TXEN ;ACTIVA EL ENVIO TXEN=1
ESPERAR
BANKSEL PIR1
BTFSS PIR1,TXIF ;CUANDO TERMINA, SE PONE A UNO TXIF Y SALTA
GOTO ESPERAR ;ESTA INSTRUCCION, SI NO VOLVERIA A ESPERAR.
BCF TXSTA,TXEN
BCF STATUS,RP0 ;BANK 0
BCF STATUS,RP1
RETURN
seguramente se pueda abreviar cambiando los banksel y alguna cosilla, pero funciona
un saludo
-
he probado la rutina que posteaste alogic.on , creo k el registro TXREG si se carga pero el bucle de testeo del bit TRMT demora alrededor de mas de 1 milisegundo, es esto normal??, ademas no veo la salida por el pin RC6 usando el osciloscopio del simulador, quizas sea problema del pic simulator, pero en fin, no puedo estar seguro de que el codigo que he escrito sea funcional, ojala puedan simularlo uds y recomendarme un simulador mas idoneo si fuera el caso.
Saludos!!
-
Me he dado cuenta k el registro TXREG se carga solo si habilito el bit TXEN despues, y solo se carga con un par de datos, despues de la habilitacion del bit para transmitir el registro no se vuelve a llenar y las bandera TXIF se queda indicando que el buffer de transmicion esta lleno, ya que el registro TXREG no se vuelve a cargar, la verdad nose donde esta el error, espero me puedan ayudar.
Saludos
-
a mi siempre me ha funcionado parar, respirar, y volver a empezar de cero. con lo aprendido. no en cada fallo pero si cuando hay algo que no consigo localizar. eso depende de la paciencia de cada uno para revisar el codigo una y otra vez.
por que pones estas lineas de configuracion en el programa principal, se modifican en algun momento?? si no ponlas en inicio y solo se usan al principio para la configuracion
Inicio
;seteo usart
bsf STATUS,RP0
movlw b'10001000'
movwf TRISC
movlw 01h
movwf SPBRG
movlw b'00100000'
movwf TXSTA
bcf STATUS,RP0
movlw b'10010000'
movwf RCSTA
ADC
bsf STATUS,5
movlw 0XFF
movwf TRISA
bsf STATUS,5
movlw 0x02 ; Justificado a la izquierda, Fosc/8, RA0_RA1_RA2_RA3_RA5 analógico, VDD, VSS.
movwf ADCON1
Main
bcf STATUS,5 ; Banco 0
movlw 0x45 ; Fosc/8, Canal 0, módulo habilitado.-
movwf ADCON0
call Demora_20us
movwf velocity
movlw 0x4D ; Fosc/8, Canal 1, módulo habilitado.-
movwf ADCON0
call Demora_20us
movwf velocity1
movlw 0x55 ; Fosc/8, Canal 2, módulo habilitado.-
movwf ADCON0
call Demora_20us
movwf velocity2
movlw 0x5D ; Fosc/8, Canal 3, módulo habilitado.-
movwf ADCON0
call Demora_20us
movwf velocity3
goto Comparar
Demora_20us
bcf STATUS,5
movlw 0x05 ; CONTADORES
movwf contador ; Iniciamos contador.-
Repeticion
decfsz contador ; Decrementa Contador1.-
goto Repeticion ; Si no es cero repetimos ciclo.-
Espera
btfsc ADCON0,GO ; Espera a que termine conversion.-
goto Espera
movf ADRESH,W ;----------------> REVISAR ASUNTO MSB LSB
return
Comparar
bcf STATUS,5
movlw 0x91 ; canal 2 ; inicio canal (note on)
movwf canal_on
movlw 0x81 ; canal 2 ; inicio canal (note off)
movwf canal_off
movlw 0x01 ; nota 1, inicio nota
movwf nota
movlw 0x00
movwf velocity_0 ; inicio velocity = 0, equivalente a note off
movlw 0x7F
movwf vel_max
clrw
ch2
bcf STATUS,5
iorwf velocity,F
btfsc STATUS,Z ; si velocity diferente de 0, salta y envia el dato
goto ch3
movf canal_on,w
movwf TXREG
call Envio_usart
movf nota,w
movwf TXREG
call Envio_usart
bcf velocity,7
movf velocity,w
movwf TXREG
call Envio_usart
movf canal_off,w
movwf TXREG
call Envio_usart
movf nota,w
movwf TXREG
call Envio_usart
movf velocity_0,w
movwf TXREG
call Envio_usart
clrw ; deja en 0 a W
ch3
incf canal_on ; canal 3,4,5
incf canal_off ; canal 3,4,5
iorwf velocity1,F ; testea siguiente registro de velocity, linea xxx
btfsc STATUS,Z
goto ch4
movf canal_on,w
movwf TXREG
call Envio_usart
movf nota,w
movwf TXREG
call Envio_usart
bcf velocity1,7
movf velocity1,w
movwf TXREG
call Envio_usart
movf canal_off,w
movwf TXREG
call Envio_usart
movf nota,w
movwf TXREG
call Envio_usart
movf velocity_0,w
movwf TXREG
call Envio_usart
clrw ; deja en 0 a W
ch4
incf canal_on ; canal 3,4,5
incf canal_off ; canal 3,4,5
iorwf velocity2,F
btfsc STATUS,Z
goto ch5
movf canal_on,w
movwf TXREG
call Envio_usart
movf nota,w
movwf TXREG
call Envio_usart
bcf velocity2,7
movf velocity2,w
movwf TXREG
call Envio_usart
movf canal_off,w
movwf TXREG
call Envio_usart
movf nota,w
movwf TXREG
call Envio_usart
movf velocity_0,w
movwf TXREG
call Envio_usart
clrw ; deja en 0 a W
ch5
incf canal_on ; canal 3,4,5
incf canal_off ; canal 3,4,5
iorwf velocity3,F
btfsc STATUS,Z
goto Main
movf canal_on,w
movwf TXREG
call Envio_usart
movf nota,w
movwf TXREG
call Envio_usart
incf canal_on ; canal 3,4,5
bcf velocity3,7
movf velocity3,w
movwf TXREG
call Envio_usart
movf canal_off,w
movwf TXREG
call Envio_usart
movf nota,w
movwf TXREG
call Envio_usart
movf velocity_0,w
movwf TXREG
call Envio_usart
goto Main
end
tambien he visto esta linea de configuracion de los fuses, tienes puesto
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF
para cristales de 4mhz se usa XT y para mayores HS
un saludo
-
creo k lo he solucionado, testeando el bit TXIF en vez del TMRT, ahora puedo ver k las banderas se activan y desactivan cuando corresponde pero aun no puedo ver la salida del RC6 en el osciloscopio, alguna recomendacion para realizar una simulacion total de mi proyecto con la entrada de pulsos analogos hasta la transmicion via usart?? la verdad me es muy necesario.
(adjunto el codigo nuevo)
SALUDOS!!
-
para la simulacion te puede valer un pulsador, y creo recordar que hay una herramienta para verificar la usart en vez del osciloscopio, si quieres probar señales analogicas en isis puedes cargar algun ruido y dispararlo
un saludo