TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: RedPic en 05 de Abril de 2006, 15:40:54

Título: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 05 de Abril de 2006, 15:40:54
Esto que os escribo es más una declaración de intenciones que un avance de proyecto. Pero en fín, tnego la necesidad de compartirlo con todos ustedes.

Primero explico la necesidad.

Tanto para mi anterior proyecto, el Teclado PS/2 para el PIC, como para otros que tengo en mente, como la lectura conexión de dispositivos con transmisión síncrona con protocolos OMROM y Wiegand26 (lectores de tarjetas magnéticas, de proximidad, chip y Mifare ...) o los asuntos de lecturas de dispositivos IR (infrarrojos como los que ha usado M.Nocturno en su proyecto del Dimmer con Mando), el tema de poder analizar una trama me fascina, me subyuga y me trae por la vía de la amargura.

Segundo la disponibilidad.

He visto montajes muy sencillos para poder monitorizar ocho señales distintas por medio del puerto paralelo del PC, con programas hechos en C++ para DOS incluso con fuentes, pero para los que usamos S.O. con nucleo Windows/NT la cosa se nos complica un poco/mucho. El NT no permite el acceso tan directo al puerto paralelo como es necesario para medir tiempos de uS simultáneamente en ocho pines ....

Los que hay para ventana windows deben llevar además un programa/driver ... total que no. Por otro lado hay verdaderas virguerías tanto comerciales como otros proyectos en curso por parte de Picmaníacos. Imagino que lo que está montando M.Nocturno con su Scope y Labview es una cosa de verdad y de una vez.

Yo quizás no aspire a tanto.

Tercero mis intenciones.

Por mas vueltas que le doy yo solo soy capaz de encontrar que necesito analizar tres señales ... así que la voy a hacer de cuatro por si acaso y así me curo en salud.

Lo que deseo es ver en la pantalla de mi PC es el conograma de cuatro señales simultáneas (mas o menos) con periodos desde unas decenas de uS hasta algunos milisegundos, digamos que ... hummm ... el pulso mas corto sea de 25 uS y el más largo de 25 mS; durante un lapso máximo de tiempo de muestreo de dos o tres segundos (o incluso menos).

No creo necesitar mucho mas que esto. Para ello me gustaría usar un PIC 18F4550 (de ahí lo que comentaba en otro hilo sobre el tener que acabar lo de la RRBOARD2 ya que ésta es para 16F877/18F4550)

Este PIC tiene 3 interrupciones externas, RB0, RB1 y RB2 y ún módulo CCP con lo que cuatro señales pueden "digerirse" razonablemente bien. Tiene además amplio espacio para programas y 2 Kbytes completos de RAM que pueden darme juego para el muestreo.

Intento realizar un buffer cíclico, como la pescadilla que se muerde la cola, con el máximo de RAM que pueda, y los datos recopilados enviarlos tan rápico como pueda al PC vía RS232, o mejor aún via USB 2.0 de tal forma que vaya vaciando el buffer de muestreo a la mayor prontitud posible, con el fin de liberar memoria RAM para seguir muestreando ....

El PC se encargaría de almacenar los datos y representarlos gráficamente. Con medidor de tiempos, lupa, marcha adelante y atrás, sincronismos ... y todas las herramientas de análisis que se me ocurran.

He pensado ponerle al PIC distintas formas de disparo (trigger) pudiendo elegir una de las líneas, o por el contrario generando él un pulso de reloj de disparo, o que espere a la primer interrupción en una de las lineas para empezar a samplear ... o .... mil maneras de hacerlo.

Quiero también poder decirle que tal o cual señal la tome de forma directa o invertida, con o sin pull-up o pull-down, fundamental para un montón tipos de señales que lo necesitan.

Y para ampliaciones poner ponerle adaptadores de niveles de tensión o amplificaciones ....

En fin, es tan fácil y barato soñar.  8)




Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: Nocturno en 05 de Abril de 2006, 16:15:17
Bonito, interesante y apetecible proyecto, amigo Diego. Lo copiaré en cuanto acabes  :lol:

Una pregunta: ¿porqué enviar por serie si tienes usb en ese pic?
Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: RedPic en 05 de Abril de 2006, 16:24:19
Ja, ja, ja  :D  :D  :D

Manolo: Porque el Serie lo conozco y el USB no ... y ardo :twisted: por verlo samplear

Ja ja ja  :D  :D  :D

Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: Nocturno en 05 de Abril de 2006, 16:42:40
En ese caso, cuando samplees serie, te ayudo con el usb y lo dejamos super-conectable.
Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: RedPic en 05 de Abril de 2006, 16:47:47
Si, quiero.

(Cásate conmigo, Manolo)  :D  :D  :D  :D


Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: LordLafebre en 05 de Abril de 2006, 17:05:13
ejem ejem..... que propuestas... ja ja... aceptalo manolo... ji ji ji  :P
Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: Modulay en 05 de Abril de 2006, 17:37:29
Que bien un bodorrio!!
Gio,tu y yo podemos hacer de damas de honor jaja
Solo falta el cura
Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: J1M en 05 de Abril de 2006, 17:57:09
Manolo, Diego, yo os declaro marido y .... marido.... puedes besar al novio..... XDDD

Ahora haber quien hace el papel de quien... en fin en fin... eso decididlo vosotros jejejeje
Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: Nocturno en 05 de Abril de 2006, 18:00:00
Que no, que no, que tiene barba y eso pincha ...
Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: Geo en 05 de Abril de 2006, 18:27:41
La idea me parece muy interesante (no tanto lo de la boda, pero cada quien su vida :P), si este semestre me salen las cosas bien con gusto el próximo me gustaría colaborar, suerte y ánimo :).

Saludos,
José Jorge (Geo).
Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: RaDoN en 05 de Abril de 2006, 18:31:37
Pues ami me parece muy buen proyecto, ademas un cacharrín de este en el "laboratorio" casero no viene mal  :D
Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: Chaly29 en 05 de Abril de 2006, 20:35:40
Hola RedPic, personalmente en muchas ocasiones necesite de un "implemento" como el que describes, me anoto para ayudar en lo que este a mi alcance.

Un saludo.

Atte. CARLOS

Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: valdorre en 05 de Abril de 2006, 21:10:44
hola redpic, me anoto para ayudar, en un momento yo use un analizador de 5 canales que se conectaba al puerto paralelo, es un programa en DOS que se llama logic.exe (que original) que hizo un tal Kyle Quinnell...
si queres el programa abisame y te lo envio.
saludos
Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: RedPic en 06 de Abril de 2006, 17:42:13
Parte 1ª (Broma)

ja ja ja  :D  :D  :D   Manolo parece que no me quiere (y yo se lo agradezco por que si no vaya papelón ...)
¡Vaya forma de empezar un proyecto !  ja ja ja  :D  :D  :D

Parte 2ª (Menos broma)

Muchas gracias a todos por vuestra colaboración. La deseo y la acepto gustoso.

Valdorre: Ese programa Logic.exe es el que he montado en mi PC y lo he probado. Es el que ha disparado mi interés por hacerlo con el PIC.


Manos a la obra: En primer lugar me gustaría definir dos métodos de sampleo:

a.- Periódico ajustable. Se determinan los Canales activos y se le envía al PIC un valor para la frecuencia de sampleo. Cada vez que se cumple el periodo se testean los Canales activos y se guardan los valores de estado y el tiempo transcurrido (número de periodos consumidos). No se usan las interrupciones.

b.- Por cambio de estado. Se programan los flancos a detectar (de subida, de bajada, o ambos) Cada vez que se produce un evento del tipo programado se guarda el estado al que llega y el tiempo transcurrido desde el inicio. Se usan las interrupciones.

Ahora en segundo lugar quiero pensar sobre el método de disparo del inicio del sampleo (ya veremos mas tarde el método para guardar y transmitir los datos sampleados).

He pensado en poder elegir entre:

a.- Inicio retardado programable. Desde el PC de control se le envia el retardo para iniciar el sampleo, el PIC realiza una cuenta atrás monitorizándolo mediante el Soft del PC y al llegar a 0 comienza el sampleo, empezando a guardar valores leidos.

b.- Inicio de sampleo al recibir una interrupción en un Canal predefinido, de los 3 disponibles con INT EXT, a partir de esta señal se guardan los valores leídos.

c.- Inicio de sampleo al recibir una interrupción en cualquiera de los Canales activos, a partir de cualquiera de estas señales se guardan los valores leídos.

Cualquiera de los metodos b y c puede configurarse para empezar el sampleo a partir de la n-ava interrupción recibida.

Y por último los métodos para finalizar el sampleo:

a.- Final retardado programable. Desde el PC de control se le envia el retardo para finalizar el sampleo, el PIC deja de samplear al consumirse el tiempo programado.

b.- Tiempo máximo sin cambio de señal en un Canal activo predefinido. Se le envía al PIC un periodo en el cual si no cambia el estado de un Canal determinado cesa el guardar valores y da por finalizado el sampleo.

c.- Tiempo máximo sin cambio de señal en cualquier Canal activo. Se le envía al PIC un periodo en el cual si no cambia el estado de nigún Canal activo cesa el guardar valores y da por finalizado el sampleo.

Bueno, para empezar a destilar jugo de cerebro no esta mal ... ¿no?  :shock:

Se aceptas ideas, propuestas, sugerencias, apuntes, adelantos, lucubraciones y hasta chistes sobre el tema.   :D






 
Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: valdorre en 07 de Abril de 2006, 00:26:11
hola redpic, bueno te paso unas ideas a ver que tal
métodos para finalizar el sampleo, tambien podria ser que finalice el sampleo cuando se termine el espacio en la unidad de almacenamiento.
para hacer el almacenamiento yo habia pensado que se podria utilizar una ram de una 486(las de 72 pines) tengo que buscar porque habia visto en una pagina como controlar estas ram, que te pueden dar 1, 4, 8 y hasta 16mega de almacenamiento segun la memoria y las encontras tiradas en cualquier casa del ramo. creo que con esas capacidades de almacenamiento no tendriamos problemas.
en cuanto encuentre el vinculo lo posteo.
una vez finalizado el sampleo volcamos todos los datos almacenados al pc que podria ser por puerto serie.
bueno decime que te parece

saludos
Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: valdorre en 07 de Abril de 2006, 01:06:57
hola otra vez
aca hay un enlace con datos tecnicos de estas simms
http://www.pjrc.com/tech/mp3/simm/datasheet.html
saludos
Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: Nocturno en 07 de Abril de 2006, 02:16:34
Diego, ¿has hecho cálculos por encima sobre la velocidad de proceso que necesitas?.
Si utilizas un PIC18F a su máxima velocidad, o sea, con 12 MIPS, y quieres samplear un periodo mínimo de 25us, tendrías que conseguir que tu bucle/interrupción no bajase de las 300 instrucciones.

Creo que realmente es conseguible.

Sin embargo, también pienso que deberías ser más ambicioso en cuanto a velocidades de captura. Piensa que 25us es una frecuencia de 40KHz, y cualquier comunicación I2C trabaja a 400KHz, por lo que no podrías rastrearla. Y eso si no intentas analizar comunicaciones SPI.

En fin, podrías considerar la posibilidad de hacerlo con un dspic, a ver qué tal.
Título: Re: Analizador lógico de 4 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 07 de Abril de 2006, 16:17:11
Si Manolo, si lo he pensado ... pero quiero ir quemando etapas poco a poco ... deseo entender lo que estoy haciendo y enfrentarme a los problemas cuando se planteen los límites.

En principio quiero depurar la recepción de señales manejables, a frecuencias bajas del tipo de las que conozco bien sus tramas para comparar los resultados teóricos con los prácticos. Quiero ir añadiendoles prestaciones tras dejar claras las fases anteriores, o al menos su límites.

No solo no he hecho nunca nada con DSPic sino que ni siquiere he tostado nunca un 18FXXXX ... además tengo que implementar el formato de datos a pasar al PC y desarrollar el Soft (Seguramente con Delphi 6 o CBulider 6) para manejarlos en el PC ...

En fin, que lo de "(Simple)" en el título del proyecto indica sobre todo mis propias carestías y desconocimientos. He creído que enfrentarme por primera vez a un 18FXXXX con un proyecto "alcanzable" y útil es una buena manera de empezar. Y que ya habrá tiempo para complicarlo y darle altos vuelos, avanzando con metas intermedias y sin poner ningún tipo de cortapisa a aspiración alguna.

Todo llegará, amigo Manuelo, todo llegará, que la barca es nueva y no se hunde.  :lol:

 
Título: Re: Analizador lógico de 4 Canales (Simple) monitorizando en el PC
Publicado por: dogflu66 en 08 de Abril de 2006, 10:20:50
Es posible que para este tema sea mejor una memoria de doble puerto ya que se puede escribir y leer al mismo tiempo, y generando un doble bufer para tener un apuntador que indique que celdillas tienen datos y cuales no, de este modo se podria independizar la escritura y lectura de datos con lo que se podria optimizar el tema… en fin no es mas que un decir…. de las memorias de doble puerto ni idea de nomenclatura ni características… si interesa, toca buscar… este sistema de bufer lo tengo implementado en algunos programitas y funciona muy bien, lo uso con la ram del pic, y en este caso utilizo los tiempos muertos para hacer la lectura… de todas formas es un proyecto interesante y mas aun, acertado.. Amigo Diego...  :)
Título: Re: Analizador lógico de 4 Canales (Simple) monitorizando en el PC
Publicado por: Nocturno en 08 de Abril de 2006, 12:57:42
No sé si la implementación con una memoria de doble puerto resultaría exitosa, pero yo realmente lo veo muy claro con una FIFO; tan claro como que es el mismo sistema que uso en mi osciloscopio.
Tanto es así que si a mi osciloscopio le quito el ADC, tendría 8 entradas digitales que se capturan al ritmo que marca un clock, o sea, tengo un analizador lógico de 8 canales.
Título: Re: Analizador lógico de 4 Canales (Simple) monitorizando en el PC
Publicado por: dogflu66 en 08 de Abril de 2006, 17:20:16
Maestro Manolo me quito el sombreo ante usted...  :D
Título: Re: Analizador lógico de 4 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 08 de Abril de 2006, 19:26:36
Buenooooooooo .........

No puedo esperar a que termine mi RRBOARD2 ... así que voy a hacer dos o tres cosas ...

1º.- "Pinchar" el 18F4550 en la placa de desarrollo Edupic (http://picmania.garcia-cuervo.com/MiPlacaDesarrollo.htm)

2º.- Pasar del Soft y el Hard de programación de esta placa de desarrollo y prepararle la conexión para el GTP-USB+ y su Winpic800

3º.- Montar un MAX232 con dos canales, uno para la RRBOARD1 (que va a generar señales "tipo" y quiero darle ordenes desde el PC) y otro para la Edupic (que va a detectar estas señales y enviar los resultados al PC)

Y con esto voy a poder empezar a montar y probar el Analizador.

Título: Re: Analizador lógico de 4 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 11 de Abril de 2006, 18:09:17
Como he logrado conectar el GTP-USB+ a la tarjeta de desarrollo Edupic y en ésta he pinchado el 18F4550 y lo he programado con éxito ....

pues estos días que voy a disfrutar de no tener que ir al trabajo los voy a dedicar a darle un buen empujón a este proyecto.

Os tendré al tanto.


Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 14 de Abril de 2006, 10:33:55
ja ja ja  :D  :lol:  :D Acabo de darme cuenta de que estoy haciendo el Soft para el PC con 3 canales y en el proyecto hablaba de 4 canales ... así que ... le cambio el título al proyecto y lo dejo en ... Analizador lógico de 3 Canales  ja ja ja  :D  :lol:  :)

(Quien no se consuela es porque no quiere)

(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_Preview_Exe.JPG)

Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: valdorre en 14 de Abril de 2006, 13:06:21
hola redpic se ve bien el programa, en que lenguaje lo hiciste delphi o c?
yo estoy empesando con delphi 7 y ni a palos puedo darle una apariencia asi a mis programas :lol:

saludos
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 14 de Abril de 2006, 16:09:49
Amigo Valdorre:

Estoy haciendolo en Delphi 6.0 usando la VCL VCLSkin2 (http://www.link-rank.com/) de Link Rank

Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 15 de Abril de 2006, 09:33:26
Continuamos avanzando ....  8)

Como nunca había trabajado con ningún PIC de la serie 18F estoy intentando quemar etapas una a una y no querer saltar directamente del punto de salida hasta la meta, por que si así lo hiciese solo estaría abocado a darme una soberana torta con cualquier problemilla que me encuentre por el camino. Así que ....

1º He adaptado, programado y probado el universal Wink.c (parpadeo de un led). Todo Ok.

2º He adaptado, programado y probado el no menos universal Echo.c (Eco mediante la RS232). Todo Ok.

3º He adaptado, programado y probado mi propio test para la Interrupción Externa por RB0. Todo Ok.

y 4º He jugado con este último programa para empezar a probar cómo detectar un único tren de pulsos por esta misma RB0.

La entrada que utilizo tiene conectada una pull-up externa por lo que inicialmente configuro la interrupción externa para detectar el flanco de bajada.

Cuando aparece el primer flanco inicializo a 0 el Timer_1 y habilito la interrupción por desbordamiento de este mismo Timer_1.

Cada vez que me llega un flanco conmuto al flanco contrario la configuración de la interrupción para detectar convenientemente cada flanco que me llegue.

Cada vez que me llega un flanco guardo el valor del Timer_1 en ese momento y el número de veces que se ha desbordado dicho Timer 1.

Si el flanco es de subida lo guardo en la tabla de Flancos de Subida, si el flanco es de bajada lo guardo en la tabla de Flancos de Bajada.

Si le envío por la RS232 cualquier caracter me vuelca en la misma el contenido de ambas tablas ....

Como puede verse en la imagen que os muestro a cada entrada de una tabla corresponde una en la otra tabla, con lo que tengo perfectamente definido el pulso. Como sé cuanto dura cada interrupción por desbordamiento, y cada incremento del Timer tengo perfectamente delimitado tanto la duración de cada pulso como la separación entre ellos ...


(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_INTEXT_RB0_test.JPG)

El siguiente paso ha de ser lógicamente ampliar estas tablas, construidas para una única interrupción, para las correspondientes interrupciones de los pines RB1 y RB2. Y transmitir las tres detecciones hasta el programa del PC para que realice la oportuna representación gráfica ....

Esto va por buen camino ....  :lol:

Os mantendré informados.




Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RaDoN en 15 de Abril de 2006, 09:39:17
Veo que tas montao en la CBR y vas a tope jejeje. Muy interesante la tablita, ya de por si es un analizar logico.
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 15 de Abril de 2006, 09:45:22
Gracias Dani.

Yo siempre he sido de Yamaha ... prefiero la R1 ...  :lol:

Esta quedando bien ... ahora viene lo bonito ....

Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 15 de Abril de 2006, 15:05:44
Buenoooo, como veo que tengo la detección del Canal 0 mas o menos controlada le he implementado ya unas funciones de transmision de las tablas de valores "formateada" para poder recibirla desde el PC ...

Me lanzo ahora a continuar con el programa EXE del PC para ver si detecto y muestro la primera señal en la pantalla ....

(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_INTEXT_RB0_test2.JPG)

Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 16 de Abril de 2006, 08:48:30
Continuamos avanzando ...

El Firmware del PIC 18F4550 y el Software del PC hablan el mismo idioma ...

El PIC dispone ya de una recepción de comandos de dos tipos:

1.- Comandos destinados a volcar información a un Monitor RS232 (me ha dado la idea Radon con su comentario de un par de post mas abajo) Así puedo analizar los datos numéricamente si necesidad de Soft alguno (mas allá de un Siow, Hyperterminal o similar) Este grupo de comandos dispara el envío de la información de forma "amigable", tabulada y con cabeceras de explicación de qué es lo que está enviado. Le llamo "friendly_trans"

2.- Comandos destinados a enviar la informacion "formateada" al Soft del PC en la que se define una trama con: inicio de transmisión, datos encapsulados con inicio y fin de cada "churrete" y fin de transmisión. Este grupo de comandos dispara el envío de la información de forma sistemática con una estructura definida, fácil de procesar por el Soft del PC. Le llamo "hardy_trans".

Ejemplo de recepción de los mismos datos en formatos "amigable" y "duro" ...

Con el Monitor Siow de CCS C:

(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_INTEXT_RB0_test3.JPG)


Y con el RRLOGICANALYZER.EXE del PC que ya recibe correctamente los datos recopilados por el PIC y es capaz de mostrármelos ... listos para lanzarme a la siguiente fase del proyecto: ¡¡¡ Dibujarlos !!!

(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_Preview_Exe2.JPG)

Como podéis comprobar en ambos casos los datos son exactamente los mismos ....  :-/

Os tendré al tanto de los nuevos avances ...



Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 16 de Abril de 2006, 17:24:13
Un solo detalle que creo que no he puesto aún en todo este desarrollo que llevamos visto.

Es la base de tiempos que estamos utilizando, y a los que se refieren las tablas de datos capturados por el PIC, que pueden verse en la imágen del post anterior.

Si os fíjais además de la columna de orden de detección hay otras dos que nos indican respectivamente el Número de Overflows completos que se han producido en el TIMER1 y el valor del Timer en el momento de producirse la interrupción.

Como las señales utilizadas en el ejemplo de dicha imagen están invertidas, esto es: que primero se produce la interrupción por flanco de bajada y despues viene la de subida, la primera linea de datos a tener en cuenta es precisamente la numero 0 de la tabla de Falling Edges, seguida de la número 0 de la de Rising Edges, a continuación se produce la numero 1 de la de Falling Edges y después la 1 de la otra tabla ... y así hasta las numeros 9 de ambas que definen el último pulso detectado.

Todos estos números estan expresados en Overflows y Ticks del Timer1, que a su vez está configurado con:

setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);

Por lo que va exactamente a "toda pastilla" y esto significa que se incrementa, un Tick cada (FOSC/4).

Como el Cristal generador del Clock es de 20 Mhz tenemos un Ciclo de instrucción de 1/2000000*4=0.0000002 segundos
o lo que es lo mismo 0.2 uS (microsegundos) por Tick, valor por el que tenemos que multiplicar la columna Timer para expresarla en Tiempos.

Como el TIMER1 es un contador de 16 Bits, de 0 a 65535, cada desbordamiento se produce cada 65536 Ticks, o sea cada 0.2 uS * 65536 = 13107,2 uS, o lo que es lo mismo cada 13.1072 mS (milisegundos), valor por el que tenemos que multiplicar la columna Overflows para expresarla en Tiempos.

Así, desde el inicio del muestreo. se puede calcular cada flanco de subida o bajada con:

X (en uS) = 13107,2 * Overflow + 0.2 uS * Timer

y esta X es la muestra que hay que representar gráficamente, desplazando la correspondiente línea vertical del flanco, tras transformarla para adecuarla la escala de tiempos, establecida para cada división de la regla de medida (dibujada con pequeños puntos blancos sobre la imagen y que puede ser ajustada mediante Escala (t))

Continuamos para bingo  :lol:

Os mantendré informados.


Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 16 de Abril de 2006, 17:57:18
Otra pequeña reflexión técnica antes de dar por finalizada la jornada Picmaníaca de hoy ...

Fijaos que en todos los ejemplos que he posteado hasta ahora (podéis ver las imágenes de los Monitores Siow que he pegado en los distintos mensajes) siempre la primera interrupción se produce a los 21 Ticks del TIMER1, los siguientes son cada uno de su padre y de su madre ...

Y me he pregundado ¿por qué es esto así?

La respuesta es fácil y tiene que ver por la forma en que he programado en el PIC la ext_handler() o rutina de manejo de la interrupción externa.

Con el fin de tener siempre unos valores coherentes desde un valor conocido del estado del TIMER1, y no dejar a éste correr alocadamente desde que el PIC se resetea, he implementado un trozo de código que es el causante de que esta primer interrupción llegue siempre con el mismo "retraso" y se registre con ese valor ....

Mi idea es cuando se produzca la primer interrupción, y solo en la primera interrupción, pongo el TIMER1 a 0 y habilito la interrupción por desbordamiento de dicho timer. Así todas las muestras parten exactamente del mismo tiempo de referencia. Esté como esté el TIMER1 al llegar la primera interrupción éste es inicializado y así todas las interrupciones posteriores serán expresadas como distancias, en tiempo, que las separa de la primera que se ha producido.

La rutina completa es:

Código: CSS
  1. #int_ext
  2. ext_handler() {
  3.  
  4.    if(nTintext==0){
  5.       set_timer1(0);
  6.       nTimer1Overflow=0;
  7.       enable_interrupts(int_timer1);
  8.    }
  9.  
  10.    ++nTintext;
  11.  
  12.    switch(fedge){
  13.  
  14.       case 0:  TimesDown[uTimeDown][0]=get_timer1();
  15.                TimesDown[uTimeDown][1]=nTimer1Overflow;
  16.                ++uTimeDown;
  17.                fedge=1;
  18.                ext_int_edge(0,L_TO_H);
  19.                break;
  20.  
  21.       case 1:  TimesUp[uTimeUp][0]=get_timer1();
  22.                TimesUp[uTimeUp][1]=nTimer1Overflow;
  23.                ++uTimeUp;
  24.                fedge=0;
  25.                ext_int_edge(0,H_TO_L);
  26.                break;
  27.    }
  28. }

Luego los famosos 21 Ticks de TIMER1, que me muestra como valor recogido para la primera interrupción, son exactamente lo que el PIC necesita para procesar , recordad que sólo en la primera interrupción detectada, desde el código if(nTintext==0) hasta el registro del valor en TimesDown[uTimeDown][0]=get_timer1();

Calcularé en tiempos tanto este valor para la primera interrupción, como el salto de ese mismo if(nTintext==0) para las ulteriores interrupciones, con el fin de corregir las tablas de tiempos recogidas,y que se ajusten así mas a la realidad de lo que está ocurriendo en esos pines de Dios.

Os mantendré informados.  :lol:



Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 17 de Abril de 2006, 17:38:51
Sin palabras ...  :-/



(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_Preview_Exe3.JPG)
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: piriots en 17 de Abril de 2006, 18:20:08
Que deprisa redpic veo que llevas el turbo puesto! Muchas felicidades por otro de tus magnificos proyectos!! Yo por distintas razones llevo algun tiempo alejado del foro pero voy siguiendo los proyectos.

Salu2
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: Sispic en 18 de Abril de 2006, 02:29:15
Un proyecto interesantisimo ademas que te esta quedando de PM.

Que bien me vendria ahora uno de 8 canaletas  :lol:

Solo queria comentar otra posivilidad que podria ser para perder los menos ciclos posibles al coger las muestras .


Se podria usar la interrupcion de timmer ( valor variable del mismo , indicado por el usuario ).
alli llenar un buffer con el valor del puerto (los 8 bits sin preocuoparse por su nivel) e incrementar un puntero .
Buffer lleno ? ..... a enviarlo . stop timer hasta nueva orden .

Usar la interrupcion de cambio de estado del puerto para el trigger ... alli start timmer si se cumple la condicion deseada.

Puedes usar un cristal del 12mhz con pll . es a lo maximo que puede correr el pic .
ASM en los puntos criticos .
Lo ideal seria con dspic . ya veras cuando pruebes algunooo .........  :)

a disfrutar .



Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: Manofwar en 18 de Abril de 2006, 06:45:54
Estupendo proyecto RedPic.

Creo que podrías volver a llamarlo de 4 Canales, si como dice Sispic, utilizas la interrupción por cambio en el puerto B<7:4> y pasas el valor completo de estos 4 bits al software.

Si no me equivoco ya que no conozco mucho los 18F, incluso de 7 Canales si utilizas las interrupciones externas RB0/RB1/RB2 junto con la de cambio en RB<7:4> y pasas el valor completo del puerto B a tu software.

Saludos desde Almería, España
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 18 de Abril de 2006, 15:55:42
Otro palito a la burra ....   8)

He realizado un nuevo muestreo (realizado con un simple botón rebotando ...)
Lo cargo con el Soft del PC y lo dibujo (como en las pruebas anteriores )
Tal como puede comprobarse en la imagen que acompaño la primera interrupción llega hasta los valores:
9 Overflows de Timer1 + 37752 Ticks de Timer 1
con lo que aplicando la formula correspondiente de
X (en uS) = 13107,2 * Overflow + 0.2 uS * Timer
Nos dá un valor del flanco de subida de X (en uS) = 13107,2 * 9 + 0.2 uS * 37752 = 125511 uS tras comenzar el muestreo.
O sea 125,511 milisegudos.
He añadido este cálculo a la ventana de Valores.
He seleccionado en la Escala de Tiempos el valor de 50 ms por división (raya grande en la regla)
He realizado los correspondientes cálculos para encontrar cúantos microsegundos le corresponden a cada pixel.
Y he añadido el cálculo inverso para que al mover el ratón sobre el gráfico me indique a qué valor de tiempo corresponde.

Ea, el Analizador lógico de 3 Canales (simple) ya mide en tiempos sobre la pantalla ....   :-/


(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_Preview_Exe4.JPG)


Y eso es todo por hoy. Mañana más.

Os tendré informados.

Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 19 de Abril de 2006, 02:51:14
Amigos Sispic, Manofwar, Piriots ...

Todo se andará, todo se andará ... fijaos que ahora solo estoy manejando un único canal pra poner a punto el Soft del PC con todas las funcionalidades posibles...

Ya he pensado tambien en el módulo Compare CCP para obtener otro canal "interruptivo" y podemos añadir otros mas "a pelo", sin interrupciones que actuen como "esclavos" de los que disponen de interrupción y podemos así ahorrar un importante consumo de RAM.

Pretendo dejar este proyecto bien terminado con los tres (o cuatro) canales y justo después encarar su ampliación a n canales y mayor velocidad de muestreo, probablemente con dsPic ... sin olvidar que debo conectar es mismo tri-channel mediante USB para transferencias rápidas de info del PIC al PC ....

Pero lo dicho, cada cosa a su debido tiempo, que si no lo único que consigo es embarbascarme con mas problemas (o desconocimientos) de los que puedo digerir.  :lol:

Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 23 de Abril de 2006, 09:56:04
Nooooo, no creáis que este proyecto está durmiendo el sueño de los justos, nada de eso ...  :P

Estoy solucionando algunos asuntos muy importantes antes de acometer nuevas fases.

En concreto estoy liado con la representación gráfica (en detalle) de la señal escaneada. En post anteriores pudistéis ver cómo se podía ya medir en pantalla con solo mover el puntero del ratón ... pero había un pequeño fallo, o mejor dicho una importante carestía, y era que cuando cambiaba la base de tiempos, con el "t / div" y la ponía muy corta o lo que es lo mismo que ampliaba la escala de representación, se me salía el gráfico del área de dibujo por la derecha.

Natural, si tengo un testeo que dura 200 ms y estoy representándolo a una escala que hace que en pantalla solo aparezcan, digamos que por ejemplo unos 100 ms, la señal no cabe y ... pues no se ve.

Ahora ya si se vé.  :-/

Lo que he hecho es añadir tantos bloques del tamaño de una "t/div" como me hagan falta a la imagen, y ésta montarla sobre un Scrollbox para que con las barras de desplazamiento pueda ver cualquier porción de ella.

Y funciona de maravilla ....

En el ejemplo que podéis ver a continuación muestro una ampliación a lo bestia de una imagen hasta ser capaz de visualizar un micropulso de 37 microsegundos, muestreado entre otros del orden de más de una centena de milisegundos, de hecho es un rebote del botón pulsador en el momento de soltar el pulsador y cerrarse éste ...

una gozada  8) :


(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_Preview_Exe5.JPG)

Mañana, más. Os mantendré informados.

Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: Sispic en 23 de Abril de 2006, 14:57:40
Como disfrutasssssss  :-/ :-/

Una gozada tu proyecto . :P
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 23 de Abril de 2006, 15:13:59
Si, amigo Sisco, disfruto, gozo, me divierto, flipo en colores jua jua jua  :D  :D  :D

¿se me nota tanto? si, supongo que sí ...  :-/  :-/  :-/

Este proyecto en concreto llevaba años en la reserva esperando su turno ... y ahora ... con los PIC's y con ustedes ...
tengo el apoyo, la serenidad y la ilusión suficientes para hincarle el diente ....

Gracias a vuestras palabras de apoyo ... son el motor que hace funcionar todo esto.  Snif :8}

Título: Re: Analizador lógico de 4 Canales (Simple) con monitorización/edición en PC
Publicado por: RedPic en 23 de Abril de 2006, 18:49:11
.
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: jfh900 en 23 de Abril de 2006, 18:50:28
Adelante con tu proyecto, estas realizando un trabajo barbaro, y la presentación que estas obteniendo es profesional. Animo y a seguir con el proyecto.
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 24 de Abril de 2006, 02:39:35
Hola RedPic, personalmente en muchas ocasiones necesite de un "implemento" como el que describes, me anoto para ayudar en lo que este a mi alcance.

Un saludo.

Atte. CARLOS

Amigo Chaly (y demás amigos) te tomo la palabra  :):

No es para "yá" pero necesito tu/vuestra ayuda ...

Chaly, eres de los foreros en que mas confianza tengo en cuanto a conocimientos electrónicos "puros" ... que es donde mas agua hago y estoy mas perdido ...  :? ... y por eso te cito mas directamente ...  :mrgreen:

Por el momento a este proyecto aún le queda bastante ya que el Soft del PC quiero que sea lo mas completo posible, además al PIC quiero implementarle una buena comunicación con el PC para que puedan ser configuradas desde éste el mayor número de parámetros y/o circunstancias posibles de las formas de muestreo de cada canal ....

En principio solo voy a tratar señales digitales a nivel TTL por lo que no hay excesivos problemas, pero ...

La idea que quiero planterarte/plantearos es la de adaptar otros tipos de señales para que puedan ser también analizadas con este Hard/Soft que estamos desarrollando. Imagínate, por ejemplo, que deseamos testear una comunicación RS232 con señales +12 y -12 ... o que queremos utilizar otras con niveles de milivoltios que hay que amplificar... o ... de decenas o centenas de voltios que haya que atenuar... o ... incluso señales que tenemos que "cuadrar" para poder ser leídas por el PIC (estoy pensando en disparadores Schmitt o similar) ... etc. etc. etc.

En fin, un poco de Hardware de conversores de señales para poder ampliar este proyecto ... (siento no poder darte mas info de lo que quiero porque simplemente no la tengo, son solo ideas, pequeñas ideas que tengo)


Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RaDoN en 24 de Abril de 2006, 09:57:55
Vamos, lo que es una etapa de entrada :D (yo todavia me ando pegando con la del frecuencimetro, es bastante puñetera la cosa)
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: J1M en 24 de Abril de 2006, 10:09:59
Me vuelvo a quitar el sombrero ante vos, maestro Diego, que barbaridad, ya me gustaría a mí que mis proyectos avanzaran como los tuyos...

animo que está quedando de lujo :D
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: Nocturno en 24 de Abril de 2006, 17:42:17
Don Diego, si sólo vas a tratar señales digitales, creo que la mayoría estará entre 1,8 y 5V con la excepción del RS232.
No creo que debas complicarte tanto.
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: Kid_Bengala en 25 de Abril de 2006, 16:59:57
Como te he dicho anteriormente, estas hecho un monstruo...

Por cierto, ya que estamos (mas bien estais) hablando de analizadores logicos. Me podeis ayudar con esto http://www.todopic.com.ar/foros/index.php?topic=11728.0?. gracias.

saludos de antonio
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 25 de Abril de 2006, 17:18:49
Si Don Manué lo que pasa es que quiero "pensar" en cosas ... son como dije antes "pequeñas ideas" ... pero lo básico es como tú dices (de hecho las señales en las que estoy verdaderamente interesado son todas TTL puras y duras)

Otra cosa, mariposa.  :P

Estos dos días no he hecho "nada". Y para mí "nada" significa ... recostarme en mi sillón orejero, abrir el PDF del 18F4550 y leer...  8)

¡Atento Sisco! .... como sabéis estoy utilizando las tres Interrupciones Externas por RB0, RB1 y RB2 del 18F4550 .... pero además este magnífico micro tienes dos CCP con sus correspondientes interrupciones Capture. Lo cual me ayuda a implementar un par de canales más y subir el proyecto ¡hasta 5 canales! sin excesiva complicación. Como verás Sisco, tus 8 canales no estan tan lejos ...  :mrgreen:

Nota: La función Capture, para los que no lo hayan usado nunca, consiste en la detección por hardware del periodo de un pulso. Se habilita esta función indicándole qué flanco del pulso en el pin es el que va a realizar el inicio de la medida, y qué timer es el que va a utilizar para ello. El tiempo, número de ticks de dicho timer, que tarda en presentarse el siguiente flanco se guarda en un registro asociado al CCP con lo que nos realiza la función de sensado sin necesidad de software alguno (como es el caso del que estoy usando en las otras interrupciones externas, en las que soy yo quien hace la copia inicial y final de los valores del Timer)

Esta función Capture no la he usado nunca en los PIC pero en los Motorola 68HC11 si las usé con profusión y no había caído en ella hasta que las ví en el Datasheet de marras, razón por la que os recomiendo que cuando no tengaís cosas imperiosas que hacer ... os relajéis y leáis un rato ...  :-)

Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RaDoN en 26 de Abril de 2006, 07:24:10
[...] recostarme en mi sillón orejero [...]

jejejeje ... tb se me ocurre qye se puede usar las interrupciones RB4:7, siempre salta la misma interrupción, pero luego no es complicado saber cual la causó no?
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: vszener en 26 de Abril de 2006, 13:18:29
Saber que pin genero la interrupcion del potb <4:7> no es dificil, es mas, hay un ejemplo en el post de Ejemplitos en C para 16F648A (http://www.todopic.com.ar/foros/index.php?topic=4530.0) , concretamente el numero 48, que trata ese asunto...

Por cierto amigo RedPic, fenomenal tu trabajo!!!


Suerte!!! :wink:
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 26 de Abril de 2006, 14:57:55
¡¡¡ Véis como es bueno tener amigos puros de corazón, generosos, erudítos y ocurrentes !!! ¡¡¡ Viva la madre que sus parió !!!!

Gracias M.vszener y D.Radon. Siscooooo ya tenemos otraaaaaa.  :mrgreen:

Con la INT RB4..7 .... Que con las 3 RB0..2 y con la CCP1 de RC2 y la CCP2 (que puede ser detectada en RC1 o RB3) tenemos un total de 6 canales .... ya nos falta menos.

Nota: Para usar INT RB4..7 hay que tener cuidado con ICSP (habrá que tomar nota de las pruebas realizadas por Olotill y sus valores de resistencias) ya que interfieren con RB6 y RB7 que son PGC y PGD respectivamente.   8)






Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: Sispic en 27 de Abril de 2006, 02:43:14
Con una resistencia de 1K , no tendras problema .
Lo mejor  al final el proyecto es puntearlas al ser una entradas criticas y evitar malos funcionamientos .

umm .....y bien podrias usar un dowmloader en este caso , ya que usas rs232.

Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: valdorre en 27 de Abril de 2006, 13:43:06
que maravilla!!! me alejo unos dias del foro y cuando vuelvo hay muchisimas novedades :-/ :-/ :-/
que buena pinta tiene este analizador
animo que falta menos :-)
saludos
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 28 de Abril de 2006, 18:37:36
Continuamos avanzando, mu poco a poco, pero avanzando al fin y al cabo ...

Le he añadido un par de detalles, una pantalla de Log para ir enviando mensajes y un sistema de medida sobre la representación gráfica.

Con esto doy por concluído el asunto de la representación gráfica. Hace lo que quería que hiciese asi que se acabó lo que se daba ...  :mrgreen:

(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_Preview_Exe6.JPG)

Ahora lo siguiente es implementar la configuración del PIC desde el Soft del PC ... y añadir los otros dos canales, que ya va siendo hora de ver los sincronismos y asíncronías de este invento  :D

Os mantendré informados.

Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: Nocturno en 29 de Abril de 2006, 02:39:07
¡Qué pinta, qué pintaaaaaaa!
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 29 de Abril de 2006, 03:30:04
Sencillo, a la par que elegante.  8)



ja, ja, ja, ja,  :D  :D  :D
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RaDoN en 29 de Abril de 2006, 06:10:43
Estas hecho un hacha Diego!!
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 30 de Abril de 2006, 17:36:17
¡¡¡ Necesito de vuestra capacidad de análisis !!!

Os ruego que pongáis vuestros cerebros a destilar jugo de neuronas y me hechéis una mano sobre un efecto que me está desquiciando los nervios, y no le veo el por qué por ninguna parte ... no sé si es que estoy mas obtuso de lo normal o es que he alcanzado mi nivel de incompetencia, y en él me mantengo.  Estoy atascado :shock:

Voy a intentar explicaros lo mas claramente posible el problema a ver si podéis arrojar luz sobre lo que está pasando:

Descripción del problema: Como sabéis, la sonda lógica detecta un tren de pulsos, guardando y transmitiendo posteriormente los tiempos en que ocurren los distintos y alternados flancos de subida y bajada. Esto lo hace perfectamente el 90% de las veces, pero hay un 10% de error, de muestreos en que se solapan dos pulsos consecutivos .... ante la imposibilidad física de que me llegen dos flancos del mismo tipo sin pasar antes por un flanco contrario imagino que el problema estriba en la forma de detectarlo y/o guardar los valores de tiempo correspondientes, pero no veo dónde está el error ....

Elementos que intervienen:

.- El hardware que genera el pulso a detectar es un simple pulsador, conectado al PIN B0 mediante una resistencia Pull-Up que tira a masa cuando es pulsado. Por ello los pulsos son inversos, flanco de bajada -> flanco de subida, tantas veces como pulsaciones-rebotes se produzcan.

.- La Interrupción Externa en el PIC está configurada al Reset para detectar primero un flanco de bajada.

.- Al llegar la primera interrupción, y solo en esa primera interrupción, se pone a 0 el valor del Timer1 y se habilita la Interrupción por Desbordamiento del Timer1.

.- Al aparecer una Interrupción Externa se conmuta el flanco para detectar el opuesto que configura un pulso completo.

.- Cada flanco detectado se guarda en una tabla con dos valores: El valor en ese instante del Timer1 y el número de veces que dicho Timer1 se ha desbordado.

.- Al recibir el PIC cierto comando via RS232 envía al PC las tablas de datos recogidos ...

El código concreto que realiza la detección de pulsos (y que sospecho es el responsable del problema) es axactamente este:

1º.- En Reset

Código: CSS
  1. void On_reset(void){
  2.  
  3.    disable_interrupts(global);
  4.    disable_interrupts(int_timer1);
  5.    disable_interrupts(int_rda);
  6.    disable_interrupts(int_ext);
  7.  
  8.    setup_adc_ports(NO_ANALOGS);
  9.    setup_adc(ADC_OFF);
  10.    setup_spi(FALSE);
  11.    setup_psp(PSP_DISABLED);
  12.    setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
  13.    setup_timer_0(RTCC_OFF);
  14.    setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
  15.    setup_timer_2(T2_DISABLED,0,1);
  16.    setup_timer_3(T3_DISABLED);
  17.    setup_comparator(NC_NC_NC_NC);
  18.    setup_vref(FALSE);
  19.  
  20.    for(i=0;i<NMUESTRAS;i++){ TimesUpT[i]=0;   TimesUpI[i]=0;}
  21.    for(i=0;i<NMUESTRAS;i++){ TimesDownT[i]=0; TimesDownI[i]=0;}
  22.  
  23.    nTintext=0;
  24.    uTimeUp=0;
  25.    uTimeDown=0;
  26.  
  27.    ext_int_edge(0,H_TO_L);
  28.    fedge=0;
  29.  
  30.    delay_ms(100);
  31.  
  32.    enable_interrupts(int_rda);
  33.    enable_interrupts(int_ext);
  34.    enable_interrupts(global);
  35.  
  36.    set_timer0(0);
  37. }
  38.  

2º.- En tratamiento de interrupciones :

Código: CSS
  1. #int_ext
  2. ext_handler() {
  3.  
  4.    long t;
  5.    long n;
  6.  
  7.    ++nTintext;
  8.    if(nTintext==1){
  9.       set_timer1(0);
  10.       nTimer1Overflow=0;
  11.       enable_interrupts(int_timer1);
  12.    }
  13.    n=nTimer1Overflow;
  14.    t=get_timer1();
  15.    if(fedge==0){
  16.       ext_int_edge(0,L_TO_H);
  17.       TimesDownI[uTimeDown]=n;
  18.       TimesDownT[uTimeDown]=t;
  19.       ++uTimeDown;
  20.    }
  21.    else
  22.    {
  23.       ext_int_edge(0,H_TO_L);
  24.       TimesUpI[uTimeUp]=n;
  25.       TimesUpT[uTimeUp]=t;
  26.       ++uTimeUp;
  27.    }
  28.    ++fedge;
  29. }
  30.  
  31. #int_timer1
  32. timer1_handler(){
  33.    ++nTimer1Overflow;
  34. }
  35.  

Este soft en el PIC funciona correctamente, como ya os he dicho el 90% de las veces, lamentablemente el restante 10% hace "cosas raras" tal como podéis ver en la imagen inferior, y estimo que un 10% de error es excesivo y tengo que corregirlo antes de continuar con este proyecto.

(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_ERROR_01.JPG)

Fijáos que los pulsos van sucediendose de forma correcta uno tras otro, primero los flancos de bajada depués los de subida. Cada uno de ellos mas "lejos" del inicio, 0 Interupciones + 0 Tick's, conforme van llegando ... Por ejemplo el pulso número 04 comienza en el desbordamiento 30 y con el Timer1 a 412 ticks y se acaba en el mismo desbordamiento 30 pero con el Timer1 a 681 por lo que dura 54 uS, y el siguiente pulso, el número 5, comienza también en el desbordamiento 30 pero con el Timer1 a 813 ticks, por lo que comienza exactamente 132 ticks de Timer1 mas tarde, o sea 26,4 uS después; y acaba en el desbordamiento 33 con Timer1 a 7271 ... Todo correcto ....

Pero los pulsos 06 y 07 se solapan .... el 06 va desde los valores de desbordamiento y timer 43/687 hasta los 43/30923 y el 07 va desde los valores 43/1055 hasta los 46/15067  ¡¡¡ Mal !!!

Según estos datos el pulso 07 ha llegado antes de que termine el 06 ¡¡¡ Mal !!!

Parece como si realmente los datos estuviesen intercambiados y el fin del pulso 06 fuese realmente el comienzo del 07 y simétricamente como si el inicio del 07 fuese realmente el final del 06 ¿¿¿¿¿ :shock: ??????

Y por mas vueltas que le doy al código no encuentro el por qué ocurre esto ....

¿Se os ocurre algo? ¿tenéis piedad de un pobre programador desesperado? ¿eh?  :?


Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: Nocturno en 01 de Mayo de 2006, 02:57:47
Dudo que te sirva de ayuda mi comentario, porque veo que tienes el tema bastante controlado y seguramente lo que te diré será producto de mi espesura, pero por si acaso.

Según veo, la variable que determina si el próximo pulso debe ser de bajada o de subida es fedge. Por lo que veo, dicha variable no cambia a un estado fijo en cada parte del if (fedge==0), sino que posteriormente haces un ++fedge;

Deduzco por tanto que fedge es de tipo boolean y con esa operación vas invirtiéndola.

Sin embargo, yo me aseguraría poniendo:
Código: CSS
  1. if(fedge==0){
  2.       ext_int_edge(0,L_TO_H);
  3.       TimesDownI[uTimeDown]=n;
  4.       TimesDownT[uTimeDown]=t;
  5.       ++uTimeDown;
  6.       fedge=1;
  7.    }
  8.    else
  9.    {
  10.       ext_int_edge(0,H_TO_L);
  11.       TimesUpI[uTimeUp]=n;
  12.       TimesUpT[uTimeUp]=t;
  13.       ++uTimeUp;
  14.       fedge=0;
  15.    }

¿Cómo lo ves?
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 01 de Mayo de 2006, 04:25:43
Manolo, Efectivamente fedge es int1, y como tú dices estaba antes .... lo quité y lo puse con ++fedge con los mismos resultados. Lo hice así en un intento de acortar el código dentro del manejo de la interrupción ... antes tambien tenia las tablas como multidimensionales TimesUp[n][m] pero las abría en dos distintas y el código volvio a decrecer ...

Creo que es un problema de tiempos .... creo que es un problema de tiempos .... creo que es un problema de tiempos .... pero ... ¿donde? ... ¿donde? ... ¿donde? ...






Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: Nocturno en 01 de Mayo de 2006, 04:35:12
Hombre si un pulso es extra-corto, a tu soft sólo le dará tiempo de ver un flanco (el de bajada o el de subida), pero no el otro.

Quizás, en el tiempo que el micro no está haciendo nada, en el bucle del main, deberías estar permanentemente controlando que la señal está al nivel que se supone que debería estar. O sea, si estás esperando un pulso de subida debería estar a 0, y si lo esperas de bajada debería estar a 1.

Si algo no encaja, podrías enviar un código de error.
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 02 de Mayo de 2006, 14:22:50
Bicheando por el Foro he dado con esto del maestro, y sin embargo amigo, J1M : Módulo USB del 18Fx550 (http://www.todopic.com.ar/foros/index.php?topic=8513.0) usado para sus inventos USBianos ...

Código: CSS
  1. ...
  2. Para vuestro caso que es de 4Mhz tendriais:
  3. #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN
  4. #use delay(clock=48000000)
  5. ...
  6.  

Me he ido a la página 32 del datasheet del 18F4550 y ....

(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_PLL_01.JPG)

Entonces la pregunta sería ... ¿me sirve esto para poner mi 4550 a tó lo que dé? ....

Si me ayudais a encontrar los fuses correctos ... ¿podemos hacer andar el 4550 a 48Mhz con mi critsal de 20Mhz?

¿Es a esto a lo que se refería el maestro Sisco?

 :shock:  :shock:  :shock:  :shock:  :shock:  :P


Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: Nocturno en 02 de Mayo de 2006, 15:21:47
Lo máximo que corre es a 48MHz con cristal de 12MHz y PLLx4.
Pero no te confundas, eso son 12MIPS, porque cada instrucción se come cuatro ciclos de reloj.
Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 06 de Mayo de 2006, 08:45:22
Lo máximo que corre es a 48MHz con cristal de 12MHz y PLLx4.
Pero no te confundas, eso son 12MIPS, porque cada instrucción se come cuatro ciclos de reloj.

Entonces 48 MHZ -> 12 MIPS y como yo ahora tengo 20 MHZ -> 5 MIPS podemos 12 MIPS - 5 MIPS = + 7 MIPS lo que significa que obtengo una ganancia neta de + 7 MIPS, cuasi triplicando mi actual velocidad de proceso ....

¿Los TIMER'S van en consonancia? quiero decir si con 20MHZ a pelo tengo un tick de Timer1 de 0.2 uS ¿debo esperar con los 12MHZ Peeleleados un tick de Timer1 de 0.083 uS?

¿eh?

Título: Re: Analizador lógico de 3 Canales (Simple) monitorizando en el PC
Publicado por: RedPic en 06 de Mayo de 2006, 09:35:33
Un post breve pero importante antes de la traca final con banda de música, bar ambigú y cantos regionales que va a significar mi siguiente post con la finalización, conclusión, acabado, peinado y puesta en carga de este larguísimo e inacabable proyecto.  :mrgreen:

Teoria y práctica para la implementación de un protocolo cutre, chapucero y venido a menos, entre un Pic 18F4550, programado en CSS C, sobre tarjeta de desarrollo Edupic con un cristal de 20MHZ y un PC AMD Semprom +2600 con 1 GByte de RAM, dotado operativamente de Windows XP Professional Service Pack II, sobre el que se ejecuta un programa aplicativo desarrollado en Boralnd Delphi 6.0 Enterprise Update Pack 2, mediante el VCL ApdComPort de la librería TpaPro (TurboPower Async Professional Package en Sourceforgue.net) mediante interface RS-232-C estándar en ambos extremos.

ja, ja, ja  :D  :D  :D ... con el título sólo mas de uno se hace una tesis doctoral .... ja, ja, ja  :D  :D  :D

1º Lista de comandos PC -> PIC

   COMMAND_RESET    = 'R';
   COMMAND_FIRMWARE = 'W';
   COMMAND_DATA     = 'X';
   COMMAND_CONFIG   = 'C';
   COMMAND_CONFIG1  = '1';
   COMMAND_CONFIG2  = '2';
   COMMAND_CONFIG3  = '3';

2º Comando de ACK (Acknowledge Receipt of a Packet) PIC -> PC

char const RESPONSE_ACK          = '^';

printf("^\r\n");

3º Estructura de transmisión datos PIC -> PC

CI (Carácter de Inicio) = '{'
CF (Carácer de Finalizacion) = '}'

Estructura de envío : n * (CI + m * (data) + CF + '\r\n') + ACK

4º Estructura de datos de configuración, 1 byte:

Codificacion en Delphi:

     c.Compreso := 0;
     if c.Active  then c.Compreso := c.Compreso + 128;
     if c.Raising then c.Compreso := c.Compreso +  64;
     if c.Falling then c.Compreso := c.Compreso +  32;
     if c.Trigger then c.Compreso := c.Compreso +  16;
     if c.Invert  then c.Compreso := c.Compreso +   8;

Decodificacion en CSS C por Bit

   // Habilito Canal 1
   if(bit_test(C1_SETTINGS,7)==1){
      enable_interrupts(int_ext);
   }
   ...
   // Configuro Channel1 Flanco inicial
   if(bit_test(C1_SETTINGS,7)==1){
     if(bit_test(C1_SETTINGS,5)==1){
        fedge1=0;
        ext_int_edge(0,H_TO_L);
     }
     if(bit_test(C1_SETTINGS,6)==1){
        fedge1=1;
        ext_int_edge(0,L_TO_H);
     }
   }

y 5º Estructura de datos de muestreo

CI + NumPulso + Canal + nRTCC raise + Timer raise + nRTCC fall + Timer fall + CF + "\r\n"

Emisión en CSS C:

   for(i=0;i<NMUESTRAS;i++){
      printf("{ %3u %1u %5lu %5lu %1u %5lu %5lu }\r\n",i+1,tUpC[ i ],tUpI[ i ],tUpT[ i ],tDownC[ i ],tDownI[ i ],tDownT[ i ]);
   }
   delay_ms(10);
   ack_trans();

===========================================================

E j e m p l o s


Ejemplo: Orden de "envíame" la versión del firmware actual.

Al recibir el PIC el comando 'W' envía el string "{1.2.0}[13][10]^\r\n"

Ejemplo : Conversación completa PC <-> PIC comentada

Transmit: W     Receive: {1.2.0}[13][10]^[13][10]  Pregunta firmare y recibe firmware

Transmit: C     Receive: { 177 209 209 }[13][10]^[13][10] Pregunta configuracion y recibe settings de los tres canales

Transmit: 1     Receive: ^[13][10] Envia "preparate para recibir configuracion canal 1" recibe ACK

Transmit: [177] Receive: ^[13][10] Envia "configuracion canal 1" recibe ACK

Transmit: 2     Receive: ^[13][10] Envia "preparate para recibir configuracion canal 2" recibe ACK

Transmit: [177] Receive: ^[13][10] Envia "configuracion canal 2" recibe ACK

Transmit: 3     Receive: ^[13][10] Envia "preparate para recibir configuracion canal 2" recibe ACK

Transmit: [177] Receive: ^[13][10] Envia "configuracion canal 3" recibe ACK

Transmit: R     Receive: ^[13][10] Envia "reseteate, limpia muestreos anteriores y reconfigurate" recibe ACK

Transmit: C     Receive: { 177 177 177 }[13][10]^[13][10] Envia "dame configuraciones" recibe configuraciones de los tres canales y ACK

Transmit: X     

Receive: {   1 1    11 32930 1     0     8 }[13][10] Envía "dame muestreos" y recibe tabla de datos
            {   2 1    46 52262 1    37 43339 }[13][10]
            {   3 0     0     0 0     0     0 }[13][10]
            {   4 0     0     0 0     0     0 }[13][10]
            {   5 0     0     0 0     0     0 }[13][10]
                 ...
            {  65 0     0     0 0     0     0 }[13][10]
            ^[13][10]



Nota 1: Todo el código completo en el post final de este proyecto.

Nota 2: Todo este control desarrollado para comunicar con un Soft específico que dibuje los pulsos en pantalla está disponible en el Firmware del 18F4550 para ser accedido numéricamente desde un simple terminal serie (Siow, Hyperterminal ... etc) estilo Telnet.

Título: Re: Analizador lógico de 3 Canales monitorizado en el PC ¡¡¡ Funcionando !!!
Publicado por: RedPic en 06 de Mayo de 2006, 20:10:59
Lo prometido es deuda. Aquí está el final de este proyecto.

¡¡¡ Que suenen las trompetas !!!! ¡¡¡¡ Que repiquen las campanas !!!!

 :-/   :mrgreen:   :D   :-/   :mrgreen:   :D   :-/   :mrgreen:   :D

Una imagen vale mas que mil palabras

(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_Preview_Exe7.GIF)


Le he conectado un Lector de Tarjetas de Proximidad marca Ápice utilizando el protocolo OMROM C&D; cuya transmisión de datos la efectúa con tres señales, Clock (CK), Data (DT) y Card Present (CP).

Ésta última señal de CP se activa antes de comenzar la transmisión y se desactiva la última tras haber concluído con la misma.

La señal de reloj CK es una serie de pulsos síncronos con un periodo de 500 uS y un Duty Cicle del 50%.

Cada señal de CK muestra el valor de un bit de Datos en DT.

La transmisión de datos se inicia y se finaliza con 8 bits "cero".

La transmisión de los datos relativos al código grabado en la tarjeta se compone de tantos grupos de 4 bits (nibble LSB) mas paridad par como dígitos tenga éste. En el caso concreto de esta trasmisión monitorizada por la Sonda Lógica es el número 79127.

He utilizado este ejemplo en concreto porque profesionalmente soy el padre del firmware del lector que realiza la transmisión, y por lo tanto conozco perfectamente el tipo de señales que iba a recibir en la sonda, con lo que el evaluar si funciona correctamente era mucho mas fácil. A esto le he llamado la "fase de calibración" cuyos resultados podéis ver en la imagen anterior.

El programa CSS C que implementa la sonda es:

Código: CSS
  1. // RR Logical Analyzer v.1.2.2d
  2.  
  3. #include <18f4550.h>
  4. #fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN
  5. #use delay(clock=20000000)
  6. #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)
  7.  
  8. int  const NMUESTRAS=192;
  9.  
  10. char const SOFT_COMMAND_RESET    = 'r';
  11. char const SOFT_COMMAND_FIRMWARE = 'w';
  12. char const SOFT_COMMAND_DATA     = 'x';
  13. char const SOFT_COMMAND_CONFIG   = 'c';
  14. char const SOFT_COMMAND_EEPROM   = 'e';
  15.  
  16. char const HARD_COMMAND_RESET    = 'R';
  17. char const HARD_COMMAND_FIRMWARE = 'W';
  18. char const HARD_COMMAND_DATA     = 'X';
  19. char const HARD_COMMAND_CONFIG   = 'C';
  20. char const HARD_COMMAND_CONFIG1  = '1';
  21. char const HARD_COMMAND_CONFIG2  = '2';
  22. char const HARD_COMMAND_CONFIG3  = '3';
  23. char const RESPONSE_ACK          = '^';
  24.  
  25. int  const DIR_C1_SETTINGS       =  0;
  26. int  const DIR_C2_SETTINGS       =  1;
  27. int  const DIR_C3_SETTINGS       =  2;
  28.  
  29. // Variables en RAM /////////////////////////////////////////////////
  30.  
  31. char Version[]="1.2.2d\0";
  32. char CharRcv=0;
  33. char Command=0;
  34.  
  35. int  i=0x00;
  36. int  uTimeUp=0;
  37. int  uTimeDown=0;
  38. int  nTintext=0;
  39. int  tUpC[NMUESTRAS];
  40. long tUpT[NMUESTRAS];
  41. long tUpI[NMUESTRAS];
  42. int  tDownC[NMUESTRAS];
  43. long tDownT[NMUESTRAS];
  44. long tDownI[NMUESTRAS];
  45. long nTimer1Overflow;
  46. int1 fedge1=0;
  47. int1 fedge2=0;
  48. int1 fedge3=0;
  49. int1 flag_recibe_config1=0;
  50. int1 flag_recibe_config2=0;
  51. int1 flag_recibe_config3=0;
  52.  
  53. // Settings x CANAL /////////////////////////////////////////////////
  54.  
  55. int  C1_Settings= 0;
  56. int1 C1_Active  = 0;
  57. int1 C1_Raising = 0;
  58. int1 C1_Falling = 0;
  59. int1 C1_Trigger = 0;
  60. int1 C1_Invert  = 0;
  61.  
  62. int  C2_Settings= 0;
  63. int1 C2_Active  = 0;
  64. int1 C2_Raising = 0;
  65. int1 C2_Falling = 0;
  66. int1 C2_Trigger = 0;
  67. int1 C2_Invert  = 0;
  68.  
  69. int  C3_Settings= 0;
  70. int1 C3_Active  = 0;
  71. int1 C3_Raising = 0;
  72. int1 C3_Falling = 0;
  73. int1 C3_Trigger = 0;
  74. int1 C3_Invert  = 0;
  75.  
  76. // Definicion de funciones //////////////////////////////////////////
  77.  
  78. void menu_trans(void);
  79. void friendly_eeprom_trans(void);
  80. void friendly_firmware_trans(void);
  81. void hardy_firmware_trans(void);
  82. void friendly_data_trans(void);
  83. void hardy_data_trans(void);
  84. void friendly_config_trans(void);
  85. void hardy_config_trans(void);
  86. void on_reset(int1 verbose);
  87. void ack_trans(void);
  88. void set_channel1(void);
  89. void set_channel2(void);
  90. void set_channel3(void);
  91. void config_channels(int1 verbose);
  92.  
  93. #int_rda
  94. void rda_handler() {
  95.  
  96.    CharRcv=0;
  97.    if(kbhit()){
  98.       CharRcv=getc();
  99.       if(CharRcv!=0){
  100.          Command=CharRcv;
  101.       }
  102.    }
  103. }
  104.  
  105. #int_ext
  106. ext_handler() {
  107.  
  108.    long t;
  109.    long n;
  110.  
  111.    disable_interrupts(int_timer1);
  112.    disable_interrupts(int_ext1);
  113.    disable_interrupts(int_ext2);
  114.    ++nTintext;
  115.    if(nTintext==1){
  116.       set_timer1(0);
  117.       nTimer1Overflow=0;
  118.    }
  119.    n=nTimer1Overflow;
  120.    t=get_timer1();
  121.  
  122.    if(fedge1==0){
  123.       ext_int_edge(0,L_TO_H);
  124.       tDownI[uTimeDown]=n;
  125.       tDownT[uTimeDown]=t;
  126.       tDownC[uTimeDown]=1;
  127.       ++uTimeDown;
  128.    }else
  129.    {
  130.       ext_int_edge(0,H_TO_L);
  131.       tUpI[uTimeUp]=n;
  132.       tUpT[uTimeUp]=t;
  133.       tUpC[uTimeUp]=1;
  134.       ++uTimeUp;
  135.    }
  136.    ++fedge1;
  137.    if(bit_test(C2_SETTINGS,7)==1){
  138.       enable_interrupts(int_ext1);
  139.    }
  140.    if(bit_test(C3_SETTINGS,7)==1){
  141.       enable_interrupts(int_ext2);
  142.    }
  143.    enable_interrupts(int_timer1);
  144. }
  145.  
  146. #int_ext1
  147. ext1_handler() {
  148.  
  149.    long t;
  150.    long n;
  151.  
  152.    disable_interrupts(int_timer1);
  153.    disable_interrupts(int_ext);
  154.    disable_interrupts(int_ext2);
  155.    ++nTintext;
  156.    if(nTintext==1){
  157.       set_timer1(0);
  158.       nTimer1Overflow=0;
  159.    }
  160.    n=nTimer1Overflow;
  161.    t=get_timer1();
  162.  
  163.    if(fedge2==0){
  164.       ext_int_edge(1,L_TO_H);
  165.       tDownI[uTimeDown]=n;
  166.       tDownT[uTimeDown]=t;
  167.       tDownC[uTimeDown]=2;
  168.       ++uTimeDown;
  169.    }else
  170.    {
  171.       ext_int_edge(1,H_TO_L);
  172.       tUpI[uTimeUp]=n;
  173.       tUpT[uTimeUp]=t;
  174.       tUpC[uTimeUp]=2;
  175.       ++uTimeUp;
  176.    }
  177.    ++fedge2;
  178.    if(bit_test(C1_SETTINGS,7)==1){
  179.       enable_interrupts(int_ext);
  180.    }
  181.    if(bit_test(C3_SETTINGS,7)==1){
  182.       enable_interrupts(int_ext2);
  183.    }
  184.    enable_interrupts(int_timer1);
  185. }
  186.  
  187. #int_ext2
  188. ext2_handler() {
  189.  
  190.    long t;
  191.    long n;
  192.  
  193.    disable_interrupts(int_timer1);
  194.    disable_interrupts(int_ext);
  195.    disable_interrupts(int_ext1);
  196.    ++nTintext;
  197.    if(nTintext==1){
  198.       set_timer1(0);
  199.       nTimer1Overflow=0;
  200.    }
  201.    n=nTimer1Overflow;
  202.    t=get_timer1();
  203.  
  204.    if(fedge3==0){
  205.       ext_int_edge(2,L_TO_H);
  206.       tDownI[uTimeDown]=n;
  207.       tDownT[uTimeDown]=t;
  208.       tDownC[uTimeDown]=3;
  209.       ++uTimeDown;
  210.    }else
  211.    {
  212.       ext_int_edge(2,H_TO_L);
  213.       tUpI[uTimeUp]=n;
  214.       tUpT[uTimeUp]=t;
  215.       tUpC[uTimeUp]=3;
  216.       ++uTimeUp;
  217.    }
  218.    ++fedge3;
  219.    if(bit_test(C1_SETTINGS,7)==1){
  220.       enable_interrupts(int_ext);
  221.    }
  222.    if(bit_test(C2_SETTINGS,7)==1){
  223.       enable_interrupts(int_ext1);
  224.    }
  225.    enable_interrupts(int_timer1);
  226. }
  227.  
  228. #int_timer1
  229. timer1_handler(){
  230.    ++nTimer1Overflow;
  231. }
  232.  
  233. // ON_RESET /////////////////////////////////////////////////////////
  234.  
  235. void on_reset(int1 verbose){
  236.  
  237.    disable_interrupts(global);
  238.    disable_interrupts(int_timer1);
  239.    disable_interrupts(int_rda);
  240.    disable_interrupts(int_ext);
  241.    disable_interrupts(int_ext1);
  242.    disable_interrupts(int_ext2);
  243.  
  244.    setup_adc_ports(NO_ANALOGS);
  245.    setup_adc(ADC_OFF);
  246.    setup_spi(FALSE);
  247.    setup_psp(PSP_DISABLED);
  248.    setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
  249.    setup_timer_0(RTCC_OFF);
  250.    setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
  251.    setup_timer_2(T2_DISABLED,0,1);
  252.    setup_timer_3(T3_DISABLED);
  253.    setup_comparator(NC_NC_NC_NC);
  254.    setup_vref(FALSE);
  255.    port_b_pullups(FALSE);
  256.    set_tris_b(0b00000111);
  257.  
  258.    for(i=0;i<NMUESTRAS;i++){ tUpT[i]=0; tUpI[i]=0; tUpC[i]=0; tDownT[i]=0; tDownI[i]=0; tDownC[i]=0;}
  259.  
  260.    nTintext=0;
  261.    uTimeUp=0;
  262.    uTimeDown=0;
  263.    flag_recibe_config1=0;
  264.    flag_recibe_config2=0;
  265.    flag_recibe_config3=0;
  266.  
  267.    config_channels(verbose);
  268.  
  269.    delay_ms(100);
  270.    // Habilito Canal 1
  271.    if(bit_test(C1_SETTINGS,7)==1){
  272.       enable_interrupts(int_ext);
  273.       if(verbose){ printf("\r\nint_ext enabled\r\n");}
  274.    }
  275.    // Habilito Canal 2
  276.    if(bit_test(C2_SETTINGS,7)==1){
  277.       enable_interrupts(int_ext1);
  278.       if(verbose){ printf("\r\nint_ext1 enabled\r\n");}
  279.    }
  280.    // Habilito Canal 3
  281.    if(bit_test(C3_SETTINGS,7)==1){
  282.       enable_interrupts(int_ext2);
  283.       if(verbose){ printf("\r\nint_ext2 enabled\r\n");}
  284.    }
  285.    // Habilito Recepción RS232
  286.    enable_interrupts(int_rda);
  287.    
  288.    // Habilito Interrupciones Global
  289.    enable_interrupts(global);
  290. }
  291.  
  292. // MAIN //////////////////////////////////////////////////////////////////
  293.  
  294. void main() {
  295.  
  296.    on_reset(0);
  297.  
  298.    do{
  299.  
  300.       if(Command!=0){
  301.  
  302.          // Accepta byte de configuracion para Channel 1
  303.          if(flag_recibe_config1==1){
  304.             set_channel1();
  305.          }
  306.          // Accepta byte de configuracion para Channel 2
  307.          if(flag_recibe_config2==1){
  308.             set_channel2();
  309.          }
  310.          // Accepta byte de configuracion para Channel 3
  311.          if(flag_recibe_config3==1){
  312.             set_channel3();
  313.          }
  314.  
  315.          // Procesa cxommandos
  316.          switch(Command){
  317.  
  318.             // Commands Telnet  - SOFT COMMANDS ---------------------
  319.  
  320.             case '?': menu_trans();
  321.                       break;
  322.             case SOFT_COMMAND_RESET :
  323.                       on_reset(1);               // Reset
  324.                       break;
  325.             case SOFT_COMMAND_FIRMWARE:
  326.                       friendly_firmware_trans(); // Send Firmaware
  327.                       break;
  328.             case SOFT_COMMAND_DATA :
  329.                       friendly_data_trans();     // Send Data
  330.                       break;
  331.             case SOFT_COMMAND_CONFIG :
  332.                       friendly_config_trans();   // Send Config
  333.                       break;
  334.             case SOFT_COMMAND_EEPROM :
  335.                       friendly_eeprom_trans();   // Send EEPROM
  336.                       break;
  337.  
  338.             // Commands Soft PC - HARD COMMANDS ---------------------
  339.  
  340.             case HARD_COMMAND_RESET :
  341.                       on_reset(0);               // Reset
  342.                       ack_trans();
  343.                       break;
  344.             case HARD_COMMAND_FIRMWARE:
  345.                       hardy_firmware_trans();    // Send Firmaware
  346.                       break;
  347.             case HARD_COMMAND_DATA :
  348.                       hardy_data_trans();        // Send Data
  349.                       break;
  350.             case HARD_COMMAND_CONFIG :
  351.                       hardy_config_trans();      // Send Config
  352.                       break;
  353.             case HARD_COMMAND_CONFIG1 :          // Atento : siguiente recepción de Cfg Channel 1
  354.                       flag_recibe_config1=1;
  355.                       ack_trans();
  356.                       break;
  357.             case HARD_COMMAND_CONFIG2 :          // Atento : siguiente recepción de Cfg Channel 2
  358.                       flag_recibe_config2=1;
  359.                       ack_trans();
  360.                       break;
  361.             case HARD_COMMAND_CONFIG3 :          // Atento : siguiente recepción de Cfg Channel 3
  362.                       flag_recibe_config3=1;
  363.                       ack_trans();
  364.                       break;
  365.          }
  366.          Command=0;
  367.       }
  368.  
  369.    } while (TRUE);
  370. }
  371.  
  372. // menu_trans ///////////////////////////////////////////////////////
  373.  
  374. void menu_trans(void){
  375.  
  376.    friendly_firmware_trans();
  377.  
  378.    printf("Telnet format:\r\n\n");
  379.    printf("  %c  reset tables\r\n",     SOFT_COMMAND_RESET);
  380.    printf("  %c  version firmware\r\n", SOFT_COMMAND_FIRMWARE);
  381.    printf("  %c  config transmit\r\n",  SOFT_COMMAND_CONFIG);
  382.    printf("  %c  data transmit\r\n",    SOFT_COMMAND_DATA);
  383.    printf("  %c  eeprom transmit\r\n",  SOFT_COMMAND_EEPROM);
  384.    printf("\r\n");
  385.    printf("Hardware format:\r\n\n");
  386.    printf("  %c  reset tables\r\n",     HARD_COMMAND_RESET);
  387.    printf("  %c  version firmware\r\n", HARD_COMMAND_FIRMWARE);
  388.    printf("  %c  data transmit\r\n",    HARD_COMMAND_DATA);
  389.    printf("  %c  config transmit\r\n",  HARD_COMMAND_CONFIG);
  390.    printf("  %cb config Channel1\r\n",  HARD_COMMAND_CONFIG1);
  391.    printf("  %cb config Channel2\r\n",  HARD_COMMAND_CONFIG2);
  392.    printf("  %cb config Channel3\r\n",  HARD_COMMAND_CONFIG3);
  393.    printf("\r\n");
  394.  
  395. }
  396.  
  397. // Set Canal ////////////////////////////////////////////////////////
  398.  
  399. void set_channel1(void){
  400.  
  401.    flag_recibe_config1=0;
  402.    C1_Settings=Command;
  403.    Command=0;
  404.    write_eeprom(DIR_C1_SETTINGS,C1_SETTINGS);
  405.    delay_ms(10);
  406.    ack_trans();
  407. }
  408.  
  409. void set_channel2(void){
  410.  
  411.    flag_recibe_config2=0;
  412.    C2_Settings=Command;
  413.    Command=0;
  414.    write_eeprom(DIR_C2_SETTINGS,C2_SETTINGS);
  415.    delay_ms(10);
  416.    ack_trans();
  417. }
  418.  
  419. void set_channel3(void){
  420.  
  421.    flag_recibe_config3=0;
  422.    C3_Settings=Command;
  423.    Command=0;
  424.    write_eeprom(DIR_C3_SETTINGS,C3_SETTINGS);
  425.    delay_ms(10);
  426.    ack_trans();
  427. }
  428.  
  429. void config_channels(int1 verbose){
  430.  
  431.    // Recupero configuracion desde la EEPROM
  432.    C1_SETTINGS = read_eeprom(DIR_C1_SETTINGS);
  433.    C2_SETTINGS = read_eeprom(DIR_C2_SETTINGS);
  434.    C3_SETTINGS = read_eeprom(DIR_C3_SETTINGS);
  435.    if(verbose){ printf("\r\Config 1=%u 2=%u 3=%u\r\n",C1_SETTINGS,C2_SETTINGS,C3_SETTINGS);}
  436.    // Configuro Channel1 Flanco inicial
  437.    if(bit_test(C1_SETTINGS,7)==1){
  438.      if(bit_test(C1_SETTINGS,5)==1){
  439.         fedge1=0;
  440.         ext_int_edge(0,H_TO_L);
  441.         if(verbose){ printf("\r\nint_ext 0 H_to_L\r\n");}
  442.      }
  443.      if(bit_test(C1_SETTINGS,6)==1){
  444.         fedge1=1;
  445.         ext_int_edge(0,L_TO_H);
  446.         if(verbose){ printf("\r\nint_ext 1 L_to_H\r\n");}
  447.      }
  448.    }
  449.    // Configuro Channel2 Flanco inicial
  450.    if(bit_test(C2_SETTINGS,7)==1){
  451.      if(bit_test(C2_SETTINGS,5)==1){
  452.         fedge2=0;
  453.         ext_int_edge(1,H_TO_L);
  454.         if(verbose){ printf("\r\nint_ext1 0 H_to_L\r\n");}
  455.      }
  456.      if(bit_test(C2_SETTINGS,6)==1){
  457.         fedge2=1;
  458.         ext_int_edge(1,L_TO_H);
  459.         if(verbose){ printf("\r\nint_ext1 1 L_to_H\r\n");}
  460.      }
  461.    }
  462.    // Configuro Channel3 Flanco inicial
  463.    if(bit_test(C3_SETTINGS,7)==1){
  464.      if(bit_test(C3_SETTINGS,5)==1){
  465.         fedge3=0;
  466.         ext_int_edge(2,H_TO_L);
  467.         if(verbose){ printf("\r\nint_ext2 0 H_to_L\r\n");}
  468.      }
  469.      if(bit_test(C3_SETTINGS,6)==1){
  470.         fedge3=1;
  471.         ext_int_edge(2,L_TO_H);
  472.         if(verbose){ printf("\r\nint_ext2 1 L_to_H\r\n");}
  473.      }
  474.    }
  475. }
  476.  
  477. // ack_trans ////////////////////////////////////////////////////////
  478.  
  479. void ack_trans(void){
  480.  
  481.    printf("%c\r\n",RESPONSE_ACK);
  482. }
  483.  
  484. // eeprom_trans /////////////////////////////////////////////////////
  485.  
  486. void friendly_eeprom_trans(void){
  487.  
  488.    int i,j,u;
  489.  
  490.    printf("\r\n");
  491.    for(i=0;i<16;i++) printf("%X ",i);
  492.    printf("\r\n");
  493.    for(i=0;i<16;i++) printf("== ");
  494.    printf("\r\n");
  495.    j=0;
  496.    for(i=0;i<255;i++){
  497.      u=read_eeprom(i);
  498.      printf("%X ",u);
  499.      if(++j>15){
  500.        j=0;
  501.        printf("\r\n");
  502.      }
  503.    }
  504.    u=read_eeprom(255);
  505.    printf("%X ",u);
  506.    printf("\r\n\r\n");
  507. }
  508.  
  509. // firmware_trans ///////////////////////////////////////////////////
  510.  
  511. void friendly_firmware_trans(void){
  512.  
  513.    printf("\r\nLogical Analyzer v.%s by Redpic\r\n\n",Version);
  514. }
  515.  
  516. void hardy_firmware_trans(void){
  517.  
  518.    printf("{%s}\r\n",Version);
  519.    delay_ms(10);
  520.    ack_trans();
  521. }
  522.  
  523. // data_trans ///////////////////////////////////////////////////////
  524.  
  525. void friendly_data_trans(void){
  526.  
  527.    disable_interrupts(int_timer1);
  528.  
  529.    printf("\r\nResults Table:\r\n\n");
  530.  
  531.    printf("Total INT_EXT detected %2u\r\n",nTintext);
  532.  
  533.    printf("\r\nFalling edges Table\r\n\n");
  534.    printf("Nº C   Overflows  Timer\r\n");
  535.    printf("=======================\r\n");
  536.    for(i=0;i<NMUESTRAS;i++){
  537.       printf("%2u %1u       %5lu  %5lu\r\n",i,tDownC[i],tDownI[i],tDownT[i]);
  538.    }
  539.    printf("\r\n\nRising edges Table\r\n\n");
  540.    printf("Nº C   Overflows  Timer\r\n");
  541.    printf("=======================\r\n");
  542.    for(i=0;i<NMUESTRAS;i++){
  543.       printf("%2u %1u       %5lu  %5lu\r\n",i,tUpC[i],tUpI[i],tUpT[i]);
  544.    }
  545. }
  546.  
  547. void hardy_data_trans(void){
  548.  
  549.    disable_interrupts(int_timer1);
  550.  
  551.    for(i=0;i<NMUESTRAS;i++){
  552.       printf("{ %3u %1u %5lu %5lu %1u %5lu %5lu }\r\n",i+1,tUpC[i],tUpI[i],tUpT[i],tDownC[i],tDownI[i],tDownT[i]);
  553.    }
  554.    delay_ms(10);
  555.    ack_trans();
  556. }
  557.  
  558. // config_trans /////////////////////////////////////////////////////
  559.  
  560. void friendly_config_trans(void){
  561.  
  562.    disable_interrupts(int_timer1);
  563.  
  564.    printf("\r\nConfig Channels :\r\n\n");
  565.  
  566.    printf("Channel 1 = %2u\r\n\n",C1_Settings);
  567.    printf("Channel 2 = %2u\r\n\n",C2_Settings);
  568.    printf("Channel 3 = %2u\r\n\n",C3_Settings);
  569. }
  570.  
  571. void hardy_config_trans(void){
  572.  
  573.    disable_interrupts(int_timer1);
  574.  
  575.    printf("{ %3u %3u %3u }\r\n",C1_Settings,C2_Settings,C3_Settings);
  576.    delay_ms(10);
  577.    ack_trans();
  578. }
  579. ///////////////////////////////////////////////////////////////////////////////////////////////////
  580.  

Buenoooooo .... sé que a este proyecto se le pueden (y deben) hacer docenas de ampliaciones y mejoras. Algunas ya las tengo claras como por ejemplo la de colocarle un delay ajustable antes de comenzar a samplear, es fundamental para señales que tienen un periodo de latencia alto y de la que queremos investigar partes mas avanzadas de las que la sonda tiene posibilidad de rastrear, tambien se debería poder ajustar que el sampleado comienze a partir de un número determinado de interrupciones recibidas por un canal en concreto. también ....

Pero por ahora se va a quedar así. Hay otros proyectos que esperan que les meta mano y ... hay que seguir avanzando, hasta llegar allí donde nunca antes nadie ha estado.  8)  :lol:  :P

Os mantendré informados.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: Nocturno en 07 de Mayo de 2006, 02:17:25
Enhorabuena, Don Diego. Eres rápido como el rayo.

Cuando mi osciloscopio desde la mesa ha visto la foto de tu sonda lógica y las palabras "PROYECTO TERMINADO" se le han caído dos lagrimones y luego me ha mirado con una cara muy rara.
Qué envidiaaaaaaaaaaaaaaaaaa.

En fin, si esta es la versión 1.0.6 no me quiero ni imaginar qué será cuando vayas por la 3.4.8.
Enhorabuena otra vez.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: dogflu66 en 07 de Mayo de 2006, 07:19:08
Felicidades Diego, y todo con acabado profesional...  :lol: :lol: :lol:
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: Sispic en 07 de Mayo de 2006, 12:58:08
Vaya , eres de los pocos que terminan proyectos .  En hora buena

don PROYECTO TERMINADO :-)

Good Herramienta .

Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RaDoN en 07 de Mayo de 2006, 13:22:34
Im-presionante, felicidades diego!!  :-/ :-/ :-/ :-/
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: jfh900 en 07 de Mayo de 2006, 13:46:45
Enhora buena por la terminación del proyecto, ha quedado muy profesional.

Un saludo.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 07 de Mayo de 2006, 14:10:19
Gracias, gracias ... me siento abrumado  :oops:

(  ;-) )

Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: Manofwar en 08 de Mayo de 2006, 05:03:45
Que máquina Redpic, enhorabuena por ese pedazo de PROYECTO con mayúsculas.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: ALE1973 en 08 de Mayo de 2006, 08:06:14
Simplemente...... Espectacular... sin palabras...

Felicitaciones...


Saludos.
Alejandro
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: Veguepic en 08 de Mayo de 2006, 11:06:33
FELICITACIONES MAESTRO

Me quito el sombrero ante usted Don Diego, el proyecto es simplemente espectacular y el acabado muy profesional. Ya se que cual es el siguiente pic que voy a pedir, el tan esperado 18F4550, ya siento sus patitas en mis manos.  :D :D :D

Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: JulianA en 08 de Mayo de 2006, 17:51:36
Sin duda hay que darte las gracias por el gran trabajo llevado a cabo, y lo documentado del mismo. Desde luego, para los que nos gusta este mundillo, y deseamos "cacharrear", éste es un ejemplo perfecto para ello.

Quería no obstante preguntarte si tienes en mente publicar asimismo el código fuente de la aplicación para PC (elaborada en delphi , con algún componente vcl adicional, según indicas en otro post anterior).

En todo caso, muchas gracias tanto por el tremendo trabajo como por lo ya publicado.

Saludos.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 08 de Mayo de 2006, 18:12:30
Gracias Julian  :oops: ...  y si, tengo previsto hacer público el soft del PC, tanto el exe compilado como el source en Delphi. Pero antes quiero redactar el proyecto en su forma definitiva, las explicaciones y eso y con todo listo después publicarlo en mi web y en el foro.

Un saludo.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 08 de Mayo de 2006, 18:35:50
Lo siento, realmente lo siento mucho  :oops: :oops: :oops: ... pero no puedo dejar que la hierba crezca bajo mis piés ... ja ja ja  :D  :D  :D

En el post en el que daba por cerrado el proyecto avanzaba alguna posibilidades de mejora de éste ... y ... pos ezo ... que ya he hecho una cosa mas ....

Me explico: El cacharro que le he enchufado a la sonda me manda un maravilloso Data & Clock perfecto .... perooooooo .... el cacho mamón tiene la mala costumbre de largar un pulso inverso por el Clock ¡¡¡ varios miles de milisegundos antes de comenzar a transmitir los datos !!! ...

Esto podéis verlo en la tabla de datos descargada tras un sampleo (Marcado en rojo el pulso inicial):

(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_EditData_01.GIF)

Se puede comprobar que todas las demás interrupciones se presentan en sus respectivos pines mas allá de las 250 Overflows de Timer1 para cada una de ellas ... o sea a mas de 13.1073 mS * 250 = 3.276,8 mS ....

Esto hace que al dibujarlo a una escala razonable con respecto a las señales de los datos aparezcan estos absolutamente enanos en comparación con el total de la transmisión, y si intentamos ampliarlo reduciendo la escala de tiempos se nos  genera una imagen de varios kilometros a lo ancho  :5] :

(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_EditData_02.GIF)

Solución : Recortar la parte inicial del muestreo hasta conseguir quedarnos únicamente con la parte interesante del mismo. He pensado varias soluciones pero todas pasaban por modificar el modo de muestreo ... o su inicialización en las interrupciones externas del PIC o ...

Al final me he decidido por dejar el muestreo tal como está, que es perfecto  :D , y realizar un tratamiento de los datos ya descargados en el PC ... Así que he implementado un método para quitar todas aquellas señales, valores de interrupciones Fall y Raise, de la tabla que estén por debajo de un valor dado. Y tras ello calculo cúal es el minimo valor de una interrupción que está por encima de lo recortado y se lo resto a TODAS las interrupciones para que se acerquen proporcionalmente al inicio, todas iguales y respetando sus respectivos periodos:

(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_EditData_03.GIF)

Al aplicar este recorte la tabla de datos queda tal como se muestra mas abajo, con exactamente los mismos periodos que antes (ved la última columna de la tabla) pero todas mucho mas cerca del inicio del muestreo. El único valor realmente reducido es el que originó el tratamiento y que tambien aparece marcado en rojo:

(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_EditData_04.GIF)

Y ya con estos datos, que son exactamente iguales a los originales pero mucho mas cerca del inicio de coordenadas podemos redibujarlos a una escala muchooooo mayor .... con gran lujo de detalles ... con posibilidad de medir distancias entre los pulsos ... y por supuesto muuuuuuchooooo mas bellooooooooo ...  :mrgreen:  :mrgreen:  :mrgreen:

(http://picmania.garcia-cuervo.com/images/PRJ_RRLOGICANALYZER_EditData_05.GIF)

Así que así queda esto ( por ahora, claro  8) )

Os mantendre informados.

Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: JulianA en 08 de Mayo de 2006, 19:35:36
Pues muchas gracias de nuevo. Más aun teniendo en cuenta que, como todos podemos ver, depuras al máximo hasta el mínimo problema que detectas (seguro que hasta los que no detectas también).

Estaremos expectantes. Saludos.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: Veguepic en 17 de Junio de 2006, 11:07:04
Hola Diego:

Como recien me acaban de llegar unos 18LF4550 que los amables y muy desinteresados señores de thailandia envian, que especialmente les habia pedido para el analizador logico.  :-/ :-/

Me puse a revisar la informacion, veo que has colgado en tu pagina el firmware y el software, si bien se que todavia falta terminar seran estos los que tienen la ultima modificacion?

Supongo que el diagrama no lo cuelgas porque todavia quieres hacerle algunas modificaciones.

Una sugerencia adicional a los moderadores de proyectos es el que este proyecto no tiene chincheta. Tuve que usar el buscardo para encontrarlo.

Saludos
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: umalrovi en 22 de Julio de 2006, 17:30:53
En prime rlugar datr le enhorabuena, me has ejadoejo pero lo más bonito de todo es lo mucho que vamos a aprender yo por lo menos.

Tengo pensado hacer un proyecto parecido al tuyo y la adquisición la estoy haciendo en Labview. La conexión entre el PIC y la adquisición la hago mediante el puerto de comunicaciones RS232.


Muchas gracias por dejar el código y ayudar a la gente. GRACIAS.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 22 de Julio de 2006, 18:43:32
Umalrovi:

Muchas gracias por tus palabras. Hoy mismo he recibido el paquete con el LabView 8.0 Así que en breve estaré siguiendote los pasos.  :mrgreen:

Veguepic:

Las ultimas modificaciones las voy a hacer con la vista puesta en el LabView. Os mantendré informados.

En cuanto a lo de la chincheta para este proyecto solo puedo decirte que ...
Los Caminos de los Moderadores son Insondables. ja ja ja  :D :D :D

No me gusta pedir chinchetas para mis propios proyectos, aunque alguna vez lo he hecho, lo confieso, entre otras cosas porque yo a mis proyectos los veo con ojos de padre y no estoy seguro de merecerlo, y después que tampoco tengo claro qué criterios serían aplicables para chinchetear un proyecto determinado.

Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 23 de Julio de 2006, 15:33:22
Analizado con el Analizador lógico los pulsos IR enviados por un viejo mando de televisor.

Basado (copiado) del trabajo de M. Nocturno Interpretando mando infrarrojos con dsPIC (http://www.elrebujito.es/modules.php?name=News&file=article&sid=90&mode=&order=0&thold=0) usando como sensor un TSOP1738 ...

(http://picmania.garcia-cuervo.com/images/IR_TSOP17xx.GIF)

(http://picmania.garcia-cuervo.com/images/IR_Dump_01_RRLogicAnalyzer.jpg)

(http://picmania.garcia-cuervo.com/images/IR_Dump_02_Cronograma_SONY_SIRC_Command_16_11.GIF)

(http://picmania.garcia-cuervo.com/images/IR_Dump_03_Cronograma_SONY_SIRC_Command_17_11.GIF)

Todo desarrollado en Recibiendo tramas y preguntándonos : ¿Esto qué es lo que es? (http://picmania.garcia-cuervo.com/Experimentos_IR.htm)


Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: mandoanaiz en 20 de Diciembre de 2007, 14:11:21
 :mrgreen:
No habia seguido este hilo, pero como dice alguno por ahí:
Im     presionante.

Tempus fugit.
dicho de otra manera: me falta tiempo para poder leer (ya no entender) todas las virguerias que haceis por aquí.
 :-)
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: xootraoox en 21 de Diciembre de 2007, 13:02:11
Amigo Diego... estuve viendo este gran proyecto y al ejecutar el software me lanza unos errores.... me dice que no se encuentra la imagen bla bla bla... hice una subcarpeta dentro de la carpeta y puse unas imagenes cualquiera y evite los errores pero no son validas mis imagenes, por lo que dedusco que debo tenerlas para poder abrir el programa. es posible me la envies para poder ejecutarlo sin problemas?

te dejo mi correo

xootraoox arroba gmail punto com

desde ya muchas gracias
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 21 de Diciembre de 2007, 17:16:07
Un momento que ahora os las peino (las imágenes)
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: xootraoox en 21 de Diciembre de 2007, 17:49:18
ok... muchisimas gracias diego
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 21 de Diciembre de 2007, 19:43:02
Listas para descargar en este ZIP (http://picmania.garcia-cuervo.net/recursos/RRLA_images.zip)

Ponedlas en un sub-directorio llamado images del directorio donde ejecutéis el RRLogicalAnalyzer.exe  :mrgreen:
 
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: Diego Gonzalez en 24 de Febrero de 2008, 18:40:39
Hola Diego (Redpic)

Como te comente hace un par de dias estoy interesado en probar tu analizador, El caso  es que estoy haciendo alguna que otra prueba de conectividad con el programa, y todo va bien, se producen transmisiones de configuracion de sonda, etc. Sin embargo, en muchas ocasiones se producen lecturas erroneas.

Todo esto lo estoy haciendo con un cristal de 24Mhz, que es el que tengo ahora mismo a mano. (siempre me falta el que no tiene que faltarme). El caso es que hasta que no haga un pedido, este va a ser el valor que tengo. Lo he compilado indicando ese clock, se produce comunicacion correcta (a 19200 baudios) con lo que no se por donde mirar fallos, ya que por tiempos no parece ser. (amenos que esto si le importe al programa).

¿Que me recomiendas?

Te pongo los pasos que sigo;

1-Conecto todo
2-Abro el programa y le doy a conectar (satisfactoriamente)
3-Activo todos los canales
4-Le doy a enviar config
5-Le doy a descargar
6-Empiezo a tocar todos los botones imaginables, porque despues de dibujar a veces sale alguna trama y otras veces ninguna (como deberia ser)
7-Os consulto :-)

Muchas gracias, enhorabuena y un saludo!! :)

Pd; Estoy a la busqueda y captura del cristal adecuado, podia haber esperado a probar con el de 20mhz y contaros que tal, pero bueno, esque estoy contento con que "por lo menos se conecte" :mrgreen:
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: Diego Gonzalez en 25 de Febrero de 2008, 19:24:33
Hola Diego;

Ya esta todo funcionando a 20 mhz. En cuanto pueda si quereis pongo algunas imagenes de capturas infrarrojas

saludos :-/
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 25 de Febrero de 2008, 19:25:26
Me alegra mucho que te sirva. Pon, pon, son Bienvenidas.  :mrgreen: :mrgreen: :mrgreen:
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: Diego Gonzalez en 25 de Febrero de 2008, 20:36:59
Hola;

Bueno a mi las graficas no me quedan tan bonitas como a ti (salen unas rayas que puedes observar)

(http://img292.imageshack.us/img292/8135/dibujogo3.th.png) (http://img292.imageshack.us/my.php?image=dibujogo3.png)

Y la herramienta recortar no me funciona, una pena ya que al aumentar el zoom tarda una eternidad en dibujar la trama. Lo maximo que aumente fue a 10ms/div, con 5ms, ya ni quise probar.

Bueno, ahor que se ve que funciona, ya podré consultar algun problemilla que surja, si me lo permitiis.

Muchas gracias y un saludo. :mrgreen:

Pd; El problema de antes, de que diera lecturas erroneas, era porque no sabia como funcionaba el programa.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 26 de Febrero de 2008, 03:15:27
Tengo que darle una revisión a los códigos, tanto al del PIC como al Delphi, para adaptarlo a lo que ahora se y que antes no sabia. Pero sobre todo para ponerle a ambos el enlace USB a toda pastilla y recoger y representar la información en vivo y en directo. A ver cuando le meto mano.  :mrgreen:
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: Diego Gonzalez en 26 de Febrero de 2008, 07:26:35
Hola Diego,

Entonces ¿Tal y como está ahora (pese al "palo" de no poder recortar) crees que yo ya no puedo hacer mas? ¿Que no hay errores de conexion o cualquier cosa que desvirtue las graficas?¿Te habia pasado a ti alguna vez?¿Alguien mas lo ha probado?

Ahora mismo acabo de retocar una captura con el paint, y la verdad que ya se ve perfecta.(aunque sea un metodo artesanal jejej)

Cuando tengas novedades estaremos encantados de escucharlas,

Muchas gracias por compartir el proyecto, espero darle alguna utilidad y un saludo! :mrgreen:
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: Diego Gonzalez en 26 de Febrero de 2008, 07:29:29
AH!, y por cierto, eso del USB, tiene una pinta estupenda! :D

Trama de un led infrarrojo conmutando manualmente retocada con el paint!!  :D

(http://img168.imageshack.us/img168/3949/dibujofu6.th.png) (http://img168.imageshack.us/my.php?image=dibujofu6.png)

saludos


Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 08 de Marzo de 2008, 05:14:15
Para todos los amigos que insistentemente me preguntan por privado que qué pines uso para recoger los datos en el Analizador lógico de 3 Canales y que no se miran el código fuente decirles que:

Uso PIN_B0 PIN_B1 y PIN_B2 a través de las interrupciones #INT_ENT, #INT_ENT2 y #INT_ENT3

Ea.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: togarha en 02 de Octubre de 2008, 14:38:48
Buenas,

Acabo de ver este post y la verdad es que me ha gustado bastante... Me gusta la idea y creo que voy a hacerme uno, el problema es que hoy en día pocos ordenadores tienen puerto serie :s así que habrá que ir directamente a intentarlo con el USB. Que tal va el tema del USB? Con el pic quizá me atrevería a cambiar a USB (aunque tendría que aprenderlo), pero para un soft de PC me quedo lejos...

Alguien está avanzando con el analizador lógico vía USB???

Gracias de antemano,

Un saludo,


Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: undertech en 18 de Octubre de 2008, 05:21:09
Hola a todos, he encontrado este foro y me ha gustado. Veo muchos proyectos y demas informacion que es muy util para aprender y practicar.

Hace un tiempo vi este proyecto en la pagina de RedPic y monte algunos de sus circuitos. Hasta ahi todo bien, jaja, pero este proyecto se me atraganta, seguramente por falta de practiva con los 18F.

No consigo comunicacion pic-pc y seguramente es por elegir mal las configuraciones en Winpic800.
El xtal lo tengo en 20Mhz y no se muy bien como decirselo a winpic800.
¿Alguien me puede ayudar??

Gracias

Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 18 de Octubre de 2008, 06:31:53
Bueno, pisha, vamos a ver si podemos hacer algo.

Lo primero es que publiques aquí tu código, al menos la parte de los fuses y hasta el #rs232 para ver cómo está tu programa. Despues le metermos mano al WinPic. ¿Usas un GTP-USB u otro programador?

Venga, ya verás como funciona.

Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: undertech en 18 de Octubre de 2008, 06:40:09
Mi codigo???

NOOO, tu codigo.

Yo empleo tu codigo y no se si tal como entra en winpic800 ya vale o hay que configurar algo en la config.

El programador es GTP-USB Lite con winpic800 y todo lo monto en tu Placa de desarrollo para el 4550 con la extension de los dos puertos serie. (Usando el canal 1)

Es por esto que me extraña que no me funcione, pues no modifico nada sobre tu diseño. Uso 20 Mhz.

OK?

Gracias
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 18 de Octubre de 2008, 07:42:25
Vamos a ver.

En los últimos cinco años he escrito y reescrito varias decenas de versiones de varios cientos de programas. "Mi código" es multi-tentacular como la cabeza de Hidra. Y todo ello para por lo menos tres hardwares distintos.  :mrgreen:

Ahora mismo tengo una versión totalmente distinta e incompatible, casi seguro, con la que tu tienes y que puedes ver en Detectando Flancos de subida (y de bajada) con un 18F4550 (http://www.todopic.com.ar/foros/index.php?topic=23020.0) (del que ya hay que yo recuerde por lo menos tres versiones)

Ja, ja, ja  :D :D :D Acabo de contar las versiones del RRLogicAnalyzer original y ¡¡¡ tengo 6 versiones distitnas!!!

¿Cual es la tuya? ¿Eh?

Mas cosas: Tienes que comprobar si el sistema hardware está correctamente montado.

1º.- ¿El PIC 18F4550 de la RR2 es capaz de hacer parpadear un Led? Si es que sí entonces es que el oscilador oscila bien y por lo tanto el mico va bien.
2º.- ¿El PIC 18F4550 de la RR2 es capaz de hacer eco por la RS232 a un Hyperterminal en el PC? Si es que si entonces es que la USART está bien configurada y que el doble RS232 esta bien montado.
3º.- ¿El PIC 18F4550 de la RR2 es capaz de responder a la inicialización del Software del RRAnalyzer? Si es que si entonces la configuración del Soft y la del PIC coinciden.

Por eso, te ruego que:

1º.- Pongas exactamente el código que tienes para que yo pueda verlo. Desde la primera línea hasta el #rs232 (por lo menos)
2º.- Contéstame a los tres puntos anteriores.

Ya veras como al final damos con lo que te pasa.  :mrgreen:
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: undertech en 19 de Octubre de 2008, 17:30:41
Vamos a ver.

A los tres puntos, Ok, la rrboard2 funciona, probada con leds, rs232, lcd etc.

El codigo es el que actualmente tienes en tu web.

Si tienes algo mas actual por favor si puedes me lo envias.

No hace nada ni por hiperterminal a 19200.

Raro raro.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: jfh900 en 19 de Octubre de 2008, 18:29:10
Yo repasaría las conexiones que van desde el micro al MAX232 y de este hasta el conector, amén de los cables de conexión. Es posible que tengas una mala soldadura o algún problema en el hardware.

Un saludo
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 19 de Octubre de 2008, 19:04:18
Cárgale al 18F4550 el programa de Eco de Teoría y praxis de las comunicaciones serie TTL con los PIC's 16F/18F en CCS C  (http://www.todopic.com.ar/foros/index.php?topic=23222.msg186114#msg186114) y júrame por la cobertura de tu móvil que ves el eco en el Hyperterminal.

¡Ah! y dime qué puerto COM es el que estás usando (COM1, COM2, COM3 ... etc)

Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: undertech en 19 de Octubre de 2008, 21:16:39
Bien, Copiado, pegado, compilado y probado.

Te juro no sólo por la cobertura de mi orange, sino incluso por Snoopy, que tengo el mensaje de entrada y el eco.

Te remito a mi pregunta inicial, se positivamente que el problema no es hardware, es soft y seguro que son los fuses.

Este ejemplo me ha hecho ver un poco mas los fuses, ya que en el ejemplo del analizador, no esta la linea que define los osciladores y plls. Por eso no se que poner al no conocerlos.

Lo primero que he hecho, mal por cierto, en este ejemplo ha sido pasar el clock a 20 Mhz y retocar la linea de fuses. Obviamente no ha funcionado bien. Luego como buen españolito he leido el articulo y he visto lo de ejemplos a 20 mhz con pll activado, etc etc.

He puesto la linea como la tenias tu y el clock en 48 y perfecto.
La RRBOARD2 siempre la he usado con un 877 asi que sabia que funcionaba pero no con 4550.

Empecemos si te parece con la linea / lineas de fuses que deberia llevar el analizador y partimos de esas pruebas, ¿te parece?


Venga,
Saludos.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 20 de Octubre de 2008, 03:42:44
De nuevo: ¡Ah! y dime qué puerto COM es el que estás usando (COM1, COM2, COM3 ... etc)

Y después vamos con los fuses.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: undertech en 20 de Octubre de 2008, 07:38:46
Bueno, es Com1 pero no lo veo importante ¿no?

Vuelvo a reiterar, aun a riesgo de ser repetitivo, que no veo en el fuente del analizador la linea de fuses pertenecientes al pll, divisores, etc.

Fijate que yo pensaba que para 48 Mhz internos, se necesitaban 12 externos y solo 12. En tu ejemplo del eco, veo que perfectamente con 20 de entrada podemos activar el pll de 96 dividos por 2 para obtener los 48.

Al no estar los fuses en el fuente y yo no conocer bien como actuan, pues ....imaginate.

Sigo pensando que no hay problema de Hardware ni de comunicacion con el PC ni de configuracion PC.

Ahora eso si, el que entiende de esto eres tu, jaja.

Por cierto una cosa. En estas PIC el reset actua de forma diferente al resto???

Te lo digo porque en el ejemplo del ECO, al pulsar el boton de reset no me vuelve a escribir el mensaje de entrada, como si no hiciese el reset. Te lo pregunto no sea que por ahi pueda haber algo raro.

Un saludo y gracias por tu dedicacion.

Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 20 de Octubre de 2008, 08:46:23
Bueno, es Com1 pero no lo veo importante ¿no?

No es importante si usas COM1. Pero si hubieras u hubieses usado cualquier otro COM el Soft RRLogicAnalizer.exe hubiera u hubiese permanecido indiferente a todo. Está puesto el puerto COM1 a güebo y si lo cambias el en configurador después no se toma en cuenta por el Soft y sigue mirando el COM1  :oops:. Por eso mi pregunta.  :D :D :D

Vuelvo a reiterar, aun a riesgo de ser repetitivo, que no veo en el fuente del analizador la linea de fuses pertenecientes al pll, divisores, etc.
Fijate que yo pensaba que para 48 Mhz internos, se necesitaban 12 externos y solo 12. En tu ejemplo del eco, veo que perfectamente con 20 de entrada podemos activar el pll de 96 dividos por 2 para obtener los 48.
Al no estar los fuses en el fuente y yo no conocer bien como actuan, pues ....imaginate.

El no estar el PLL en los fuses es porque no hace falta que esté el PLL en los fuses si no vamos a usar el PLL. Quiero decir: Si quiero que el PIC corra a 48 Mhz pongo el PLL y el DIV a funcionar, si no lo quiero entonces no lo pongo, que no es obligatorio usar el PLL del 18F4550. Por eso no te preocupes.  :mrgreen:

Lo único importante es que si uso el fuse HS (cristal mayor de 4 Mhz) el #use_delay debe corresponder con la frecuencia exacta del Cristal que estoy usando, sea ésta la que sea. Así un cristal de 20 Mhz debe corresponderse con un #use delay(clock=20000000), uno de 12 Mhz debe ser correspondido con #use delay(clock=12000000) porque el cálculo de baudios para la USART va a ser en función de este delay.

Sigo pensando que no hay problema de Hardware ni de comunicacion con el PC ni de configuracion PC.
Ahora eso si, el que entiende de esto eres tu, jaja.
Por cierto una cosa. En estas PIC el reset actua de forma diferente al resto???
Te lo digo porque en el ejemplo del ECO, al pulsar el boton de reset no me vuelve a escribir el mensaje de entrada, como si no hiciese el reset. Te lo pregunto no sea que por ahi pueda haber algo raro.
Un saludo y gracias por tu dedicacion.


Prueba a añadirle solo el Fuse NOMCLR para que no se quede in albis y a ver que pasa.

Otra cosa: Si tu le cargas el firmware del Analyzer y con un Hipèrterminal escribes 'w'[intro] (en minúsculas) ¿hace algo?



Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: undertech en 20 de Octubre de 2008, 11:08:51
Nada, no hay manera.

He puesto NOMCLR y he dejado los fuses tal como salen en el winpic800. Y nada.
He cambiado al 20 mhz divide by 5. Y nada.
He cambiado el valor vbor a 4.5 (no se muy bien para que es, pero en el otro ejemplo estaba asi, y por defecto sale mas bajo.

Es increible pero cierto.
Al compilar selen unos warnings sin importancia creo. Variables que no se usan y funciones no voids que no retornan nada.

OK?
Probato todo desde el hyperterminal a 19200. Y no sale nada al mandar la w.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 20 de Octubre de 2008, 12:01:37
 :shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock:

Pues no lo entiendo.  :(
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: Nocturno en 20 de Octubre de 2008, 12:48:56
Huele a fuse que alimenta. ¿Puedes desactivar el BOR en vez de subirlo de nivel?
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 20 de Octubre de 2008, 16:08:06
Utiliza esta configuración y dinos algo:

Código: C#
  1. #fuses HS,NOMCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN
  2. #use delay(clock=20000000)
  3. #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)
  4.  

Menos el HS todo lo demás es un NO-A-TODO. Ja, ja, ja  :D :D :D

P.D.: ¿Es posible que el WinPic800 marque otra configuración que la descrita en los fuses? como por ejemplo si tuviera u tuviese algún checbox del estilo de "no-mires-los-fuses-que-los-pongo-a-mano". Un poné.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: undertech en 20 de Octubre de 2008, 19:47:03
NADA, no hay nada que hacer.

Un par de preguntas:

Es normal lo que pregunte del reset??? No sea que.................
El oscilador lo tengo que poner en 20Mhz input divide by 5?

De todas formas con los fuses que me has puesto lo he probado con 4 mhz y con 20 en la configuracion y nada de nada.
Siempre pruebo con Hyperterminal para evitar posibles fallos etc etc.

como dijo el otro: raro raro raro
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: micro_pepe en 31 de Marzo de 2009, 18:28:29
Me gustaria montar este analizador, pero no encuentro el esquema del hardware ni el software, he mirado en la pagina de RedPic y en este hilo pero no lo veo.

Un saludo.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: leoelectronic en 09 de Septiembre de 2010, 16:48:14
saludos amigo redpic creo que llegue tarde para ayudar en la construcción del analizador, lastima pero para aquella ocacion no tenia ni idea en el apasionante mundo en el que me meti;
quisiera construir tu proyecto, para agregarlo a mi laboratorio de electrónica y mas aun para realizar pruebas con uC, me parece indispensable (por lo menos para los que no tenemos un osciloscopio que guarde registros) por lo visto ya lo terminaste así lo he podido ver en otros rincones de la web, he visto el Firmware para el 18F4550 y Software para el PC del RRLogicalAnalyzer (intuyo que son tuyos), pero me falta el diseño del hardware creo que lo llamas RRBOARD2 si no es mucha molestia y esta a tu alcance decirme donde encontrarlo te lo agradeceré mucho..

Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: RedPic en 13 de Septiembre de 2010, 03:57:06
Aqui mismo en el Foro lo tienes todo: RRBOARD2 (http://www.todopic.com.ar/foros/index.php?topic=2300.0)
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: caeshark_ en 25 de Mayo de 2011, 06:25:33
Hola a todos el motivo de mi mensaje es para ver si podeis ayudarme a hacer funcionar el analizador logico de redpic.
Me sale el tipico error de las imagenes, pero supongo que esto no tendra nada que ver con el funcionamiento del programa, el caso es que lo he probado en win7 y winxp y no consigo que conecte la sonda con el pc. (Solucionado lo de las imagenes)
Me sale todo el rato el mensaje de no he conseguido conectar con el pic 18f4550
La comunicacion inicial esta predefinida a 19200? el montaje es con un max232?
Tengo que poner el programa en algun directorio especifico para que este funcione? O tener el programa en el que se programo el software?
Y luego esta el esquema ya he leido por donde captura las señales pero como de momento no consigo conectar pues por ahora no me preocupa esto, si alguien pudiera mandarme el esquema de conexionado, me da igual como este aunque sea dibujado a mano en un papel es que quiero liarme con lo de los infrarrojos y esta herramienta pues es basica para poder hacerlo.Muchas gracias y ruego me contesteis a kaeshark@hotmail.com por privado o aqui en el foro.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: caeshark_ en 25 de Mayo de 2011, 06:38:37
Esto no tiene nada que ver pero el micro lo grabe con un clon del icd2.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: leoelectronic en 26 de Marzo de 2012, 15:58:17
Pues a mi tampoco me funciona me sale el mismo error en verdad no se como conectarlo  :5]
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: EeePic en 09 de Julio de 2012, 04:49:43
Buenas a todos, yo tenía el mismo problema de que no conectaba (ni enviaba ni recibía nada por el RS232) y he podido solucionarlo, buscando por otros foros para buscar un ejemplo de comunicación serie con un 18F4550, hasta dar con un ejemplo que me funcionase.  He realizado unos cambios al código fuente y he conseguido que el soft comunique con el PC sin problemas, ahora el problema que tengo es que no termino de entender como funciona la sonda y el programa. Alguien podría poner un tutorial pequeñito para burros como yo, que no saben realizar un sampleo?  :oops:. Con tal de que me ponga sobre la pista, me sirve...

En principio, para que me funcione la comunicación serie hay varios puntos importantes:

Los fuses:

Código: [Seleccionar]
#fuses HS,NOMCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN

#FUSES CPUDIV1         //DIVISION DE FRECUENCIA DEL OSCILADOR: 1

La inicialización de la uart:

Código: [Seleccionar]
#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7,stream=PC,bits=8)

Y para imprimir (o enviar, como se quiera llamar) el texto por el puerto serie del PIC, sustituir todos los printf, por la orden fprintf, de acuerdo a este esquema:

Printf original:

Código: [Seleccionar]
printf("Telnet format:\r\n\n");

Sentencia fprintf:

Código: [Seleccionar]
fprintf(PC,"Telnet format:\r\n\n");

En principio, como se ve, se trata de añadir el stream sobre el que queremos que se envien los datos, en este caso "PC", que se definió en la sentencia de inicialización de la UART, mas arriba.

Posteo el código completo para que lo vayáis probando y espero que os solucione los problemas. Yo estoy haciendo las pruebas con la tarjeta entrenadora de Mikroeletronika, la EasyPic v6, y me ha funcionado, con cristal de 20Mhz y CCS C v4.130. Ahora me queda probar que realice las capturas correctamente, que es donde de momento me he quedado estancado y necesito un empujoncito.

El código:

Código: [Seleccionar]
// RR Logical Analyzer v.1.2.2d
#include <18F4550.h>

#fuses HS,NOMCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN

#FUSES CPUDIV1         //DIVISION DE FRECUENCIA DEL OSCILADOR: 1

#use delay(clock=20000000)
#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7,stream=PC,bits=8)

int  const NMUESTRAS=192;

char const SOFT_COMMAND_RESET    = 'r';
char const SOFT_COMMAND_FIRMWARE = 'w';
char const SOFT_COMMAND_DATA     = 'x';
char const SOFT_COMMAND_CONFIG   = 'c';
char const SOFT_COMMAND_EEPROM   = 'e';

char const HARD_COMMAND_RESET    = 'R';
char const HARD_COMMAND_FIRMWARE = 'W';
char const HARD_COMMAND_DATA     = 'X';
char const HARD_COMMAND_CONFIG   = 'C';
char const HARD_COMMAND_CONFIG1  = '1';
char const HARD_COMMAND_CONFIG2  = '2';
char const HARD_COMMAND_CONFIG3  = '3';
char const RESPONSE_ACK          = '^';

int  const DIR_C1_SETTINGS       =  0;
int  const DIR_C2_SETTINGS       =  1;
int  const DIR_C3_SETTINGS       =  2;

// Variables en RAM /////////////////////////////////////////////////

char Version[]="1.2.2d\0";
char CharRcv=0;
char Command=0;

int  i=0x00;
int  uTimeUp=0;
int  uTimeDown=0;
int  nTintext=0;
int  tUpC[NMUESTRAS];
long tUpT[NMUESTRAS];
long tUpI[NMUESTRAS];
int  tDownC[NMUESTRAS];
long tDownT[NMUESTRAS];
long tDownI[NMUESTRAS];
long nTimer1Overflow;
int1 fedge1=0;
int1 fedge2=0;
int1 fedge3=0;
int1 flag_recibe_config1=0;
int1 flag_recibe_config2=0;
int1 flag_recibe_config3=0;

// Settings x CANAL /////////////////////////////////////////////////

int  C1_Settings= 0;
int1 C1_Active  = 0;
int1 C1_Raising = 0;
int1 C1_Falling = 0;
int1 C1_Trigger = 0;
int1 C1_Invert  = 0;

int  C2_Settings= 0;
int1 C2_Active  = 0;
int1 C2_Raising = 0;
int1 C2_Falling = 0;
int1 C2_Trigger = 0;
int1 C2_Invert  = 0;

int  C3_Settings= 0;
int1 C3_Active  = 0;
int1 C3_Raising = 0;
int1 C3_Falling = 0;
int1 C3_Trigger = 0;
int1 C3_Invert  = 0;

// Definicion de funciones //////////////////////////////////////////

void menu_trans(void);
void friendly_eeprom_trans(void);
void friendly_firmware_trans(void);
void hardy_firmware_trans(void);
void friendly_data_trans(void);
void hardy_data_trans(void);
void friendly_config_trans(void);
void hardy_config_trans(void);
void on_reset(int1 verbose);
void ack_trans(void);
void set_channel1(void);
void set_channel2(void);
void set_channel3(void);
void config_channels(int1 verbose);

#int_rda
void rda_handler() {

   CharRcv=0;
   if(kbhit()){
      CharRcv=getc();
      if(CharRcv!=0){
         Command=CharRcv;
      }
   }
}

#int_ext
ext_handler() {

   long t;
   long n;

   disable_interrupts(int_timer1);
   disable_interrupts(int_ext1);
   disable_interrupts(int_ext2);
   ++nTintext;
   if(nTintext==1){
      set_timer1(0);
      nTimer1Overflow=0;
   }
   n=nTimer1Overflow;
   t=get_timer1();

   if(fedge1==0){
      ext_int_edge(0,L_TO_H);
      tDownI[uTimeDown]=n;
      tDownT[uTimeDown]=t;
      tDownC[uTimeDown]=1;
      ++uTimeDown;
   }else
   {
      ext_int_edge(0,H_TO_L);
      tUpI[uTimeUp]=n;
      tUpT[uTimeUp]=t;
      tUpC[uTimeUp]=1;
      ++uTimeUp;
   }
   ++fedge1;
   if(bit_test(C2_SETTINGS,7)==1){
      enable_interrupts(int_ext1);
   }
   if(bit_test(C3_SETTINGS,7)==1){
      enable_interrupts(int_ext2);
   }
   enable_interrupts(int_timer1);
}

#int_ext1
ext1_handler() {

   long t;
   long n;

   disable_interrupts(int_timer1);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext2);
   ++nTintext;
   if(nTintext==1){
      set_timer1(0);
      nTimer1Overflow=0;
   }
   n=nTimer1Overflow;
   t=get_timer1();

   if(fedge2==0){
      ext_int_edge(1,L_TO_H);
      tDownI[uTimeDown]=n;
      tDownT[uTimeDown]=t;
      tDownC[uTimeDown]=2;
      ++uTimeDown;
   }else
   {
      ext_int_edge(1,H_TO_L);
      tUpI[uTimeUp]=n;
      tUpT[uTimeUp]=t;
      tUpC[uTimeUp]=2;
      ++uTimeUp;
   }
   ++fedge2;
   if(bit_test(C1_SETTINGS,7)==1){
      enable_interrupts(int_ext);
   }
   if(bit_test(C3_SETTINGS,7)==1){
      enable_interrupts(int_ext2);
   }
   enable_interrupts(int_timer1);
}

#int_ext2
ext2_handler() {

   long t;
   long n;

   disable_interrupts(int_timer1);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext1);
   ++nTintext;
   if(nTintext==1){
      set_timer1(0);
      nTimer1Overflow=0;
   }
   n=nTimer1Overflow;
   t=get_timer1();

   if(fedge3==0){
      ext_int_edge(2,L_TO_H);
      tDownI[uTimeDown]=n;
      tDownT[uTimeDown]=t;
      tDownC[uTimeDown]=3;
      ++uTimeDown;
   }else
   {
      ext_int_edge(2,H_TO_L);
      tUpI[uTimeUp]=n;
      tUpT[uTimeUp]=t;
      tUpC[uTimeUp]=3;
      ++uTimeUp;
   }
   ++fedge3;
   if(bit_test(C1_SETTINGS,7)==1){
      enable_interrupts(int_ext);
   }
   if(bit_test(C2_SETTINGS,7)==1){
      enable_interrupts(int_ext1);
   }
   enable_interrupts(int_timer1);
}

#int_timer1
timer1_handler(){
   ++nTimer1Overflow;
}

// ON_RESET /////////////////////////////////////////////////////////

void on_reset(int1 verbose){

   disable_interrupts(global);
   disable_interrupts(int_timer1);
   disable_interrupts(int_rda);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext1);
   disable_interrupts(int_ext2);

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_psp(PSP_DISABLED);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   setup_timer_0(RTCC_OFF);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

 
   port_b_pullups(FALSE);
   set_tris_b(0b00000111);

   for(i=0;i<NMUESTRAS;i++){ tUpT[i]=0; tUpI[i]=0; tUpC[i]=0; tDownT[i]=0; tDownI[i]=0; tDownC[i]=0;}

   nTintext=0;
   uTimeUp=0;
   uTimeDown=0;
   flag_recibe_config1=0;
   flag_recibe_config2=0;
   flag_recibe_config3=0;

   config_channels(verbose);

   delay_ms(100);
   // Habilito Canal 1
   if(bit_test(C1_SETTINGS,7)==1){
      enable_interrupts(int_ext);
      if(verbose){ fprintf(PC,"\r\nint_ext enabled\r\n");}
   }
   // Habilito Canal 2
   if(bit_test(C2_SETTINGS,7)==1){
      enable_interrupts(int_ext1);
      if(verbose)fprintf(PC,"\r\nint_ext1 enabled\r\n");}
   }
   // Habilito Canal 3
   if(bit_test(C3_SETTINGS,7)==1){
      enable_interrupts(int_ext2);
      if(verbose){ fprintf(PC,"\r\nint_ext2 enabled\r\n");}
   }
   // Habilito Recepción RS232
   enable_interrupts(int_rda);
   
   // Habilito Interrupciones Global
   enable_interrupts(global);
}

// MAIN //////////////////////////////////////////////////////////////////

void main() {

   
   on_reset(0);

   do{

      if(Command!=0){

         // Accepta byte de configuracion para Channel 1
         if(flag_recibe_config1==1){
            set_channel1();
         }
         // Accepta byte de configuracion para Channel 2
         if(flag_recibe_config2==1){
            set_channel2();
         }
         // Accepta byte de configuracion para Channel 3
         if(flag_recibe_config3==1){
            set_channel3();
         }

         // Procesa cxommandos
         switch(Command){

            // Commands Telnet  - SOFT COMMANDS ---------------------

            case '?': menu_trans();
                      break;
            case SOFT_COMMAND_RESET :
                      on_reset(1);               // Reset
                      break;
            case SOFT_COMMAND_FIRMWARE:
                      friendly_firmware_trans(); // Send Firmaware
                      break;
            case SOFT_COMMAND_DATA :
                      friendly_data_trans();     // Send Data
                      break;
            case SOFT_COMMAND_CONFIG :
                      friendly_config_trans();   // Send Config
                      break;
            case SOFT_COMMAND_EEPROM :
                      friendly_eeprom_trans();   // Send EEPROM
                      break;

            // Commands Soft PC - HARD COMMANDS ---------------------

            case HARD_COMMAND_RESET :
                      on_reset(0);               // Reset
                      ack_trans();
                      break;
            case HARD_COMMAND_FIRMWARE:
                      hardy_firmware_trans();    // Send Firmaware
                      break;
            case HARD_COMMAND_DATA :
                      hardy_data_trans();        // Send Data
                      break;
            case HARD_COMMAND_CONFIG :
                      hardy_config_trans();      // Send Config
                      break;
            case HARD_COMMAND_CONFIG1 :          // Atento : siguiente recepción de Cfg Channel 1
                      flag_recibe_config1=1;
                      ack_trans();
                      break;
            case HARD_COMMAND_CONFIG2 :          // Atento : siguiente recepción de Cfg Channel 2
                      flag_recibe_config2=1;
                      ack_trans();
                      break;
            case HARD_COMMAND_CONFIG3 :          // Atento : siguiente recepción de Cfg Channel 3
                      flag_recibe_config3=1;
                      ack_trans();
                      break;
         }
         Command=0;
      }

   } while (TRUE);
}

// menu_trans ///////////////////////////////////////////////////////

void menu_trans(void){

   friendly_firmware_trans();

   fprintf(PC,"Telnet format:\r\n\n");
   fprintf(PC,"  %c  reset tables\r\n",     SOFT_COMMAND_RESET);
   fprintf(PC,"  %c  version firmware\r\n", SOFT_COMMAND_FIRMWARE);
   fprintf(PC,"  %c  config transmit\r\n",  SOFT_COMMAND_CONFIG);
   fprintf(PC,"  %c  data transmit\r\n",    SOFT_COMMAND_DATA);
   fprintf(PC,"  %c  eeprom transmit\r\n",  SOFT_COMMAND_EEPROM);
   fprintf(PC,"\r\n");
   fprintf(PC,"Hardware format:\r\n\n");
   fprintf(PC,"  %c  reset tables\r\n",     HARD_COMMAND_RESET);
   fprintf(PC,"  %c  version firmware\r\n", HARD_COMMAND_FIRMWARE);
   fprintf(PC,"  %c  data transmit\r\n",    HARD_COMMAND_DATA);
   fprintf(PC,"  %c  config transmit\r\n",  HARD_COMMAND_CONFIG);
   fprintf(PC,"  %cb config Channel1\r\n",  HARD_COMMAND_CONFIG1);
   fprintf(PC,"  %cb config Channel2\r\n",  HARD_COMMAND_CONFIG2);
   fprintf(PC,"  %cb config Channel3\r\n",  HARD_COMMAND_CONFIG3);
   fprintf(PC,"\r\n");

}

// Set Canal ////////////////////////////////////////////////////////

void set_channel1(void){

   flag_recibe_config1=0;
   C1_Settings=Command;
   Command=0;
   write_eeprom(DIR_C1_SETTINGS,C1_SETTINGS);
   delay_ms(10);
   ack_trans();
}

void set_channel2(void){

   flag_recibe_config2=0;
   C2_Settings=Command;
   Command=0;
   write_eeprom(DIR_C2_SETTINGS,C2_SETTINGS);
   delay_ms(10);
   ack_trans();
}

void set_channel3(void){

   flag_recibe_config3=0;
   C3_Settings=Command;
   Command=0;
   write_eeprom(DIR_C3_SETTINGS,C3_SETTINGS);
   delay_ms(10);
   ack_trans();
}

void config_channels(int1 verbose){

   // Recupero configuracion desde la EEPROM
   C1_SETTINGS = read_eeprom(DIR_C1_SETTINGS);
   C2_SETTINGS = read_eeprom(DIR_C2_SETTINGS);
   C3_SETTINGS = read_eeprom(DIR_C3_SETTINGS);
   if(verbose){ fprintf(PC,"\r\Config 1=%u 2=%u 3=%u\r\n",C1_SETTINGS,C2_SETTINGS,C3_SETTINGS);}
   // Configuro Channel1 Flanco inicial
   if(bit_test(C1_SETTINGS,7)==1){
     if(bit_test(C1_SETTINGS,5)==1){
        fedge1=0;
        ext_int_edge(0,H_TO_L);
        if(verbose){ fprintf(PC,"\r\nint_ext 0 H_to_L\r\n");}
     }
     if(bit_test(C1_SETTINGS,6)==1){
        fedge1=1;
        ext_int_edge(0,L_TO_H);
        if(verbose){ fprintf(PC,"\r\nint_ext 1 L_to_H\r\n");}
     }
   }
   // Configuro Channel2 Flanco inicial
   if(bit_test(C2_SETTINGS,7)==1){
     if(bit_test(C2_SETTINGS,5)==1){
        fedge2=0;
        ext_int_edge(1,H_TO_L);
        if(verbose){ fprintf(PC,"\r\nint_ext1 0 H_to_L\r\n");}
     }
     if(bit_test(C2_SETTINGS,6)==1){
        fedge2=1;
        ext_int_edge(1,L_TO_H);
        if(verbose){ fprintf(PC,"\r\nint_ext1 1 L_to_H\r\n");}
     }
   }
   // Configuro Channel3 Flanco inicial
   if(bit_test(C3_SETTINGS,7)==1){
     if(bit_test(C3_SETTINGS,5)==1){
        fedge3=0;
        ext_int_edge(2,H_TO_L);
        if(verbose){ fprintf(PC,"\r\nint_ext2 0 H_to_L\r\n");}
     }
     if(bit_test(C3_SETTINGS,6)==1){
        fedge3=1;
        ext_int_edge(2,L_TO_H);
        if(verbose){ fprintf(PC,"\r\nint_ext2 1 L_to_H\r\n");}
     }
   }
}

// ack_trans ////////////////////////////////////////////////////////

void ack_trans(void){

   fprintf(PC,"%c\r\n",RESPONSE_ACK);
}

// eeprom_trans /////////////////////////////////////////////////////

void friendly_eeprom_trans(void){

   int i,j,u;

   fprintf(PC,"\r\n");
   for(i=0;i<16;i++) printf("%X ",i);
   fprintf(PC,"\r\n");
   for(i=0;i<16;i++) printf("== ");
   fprintf(PC,"\r\n");
   j=0;
   for(i=0;i<255;i++){
     u=read_eeprom(i);
     fprintf(PC,"%X ",u);
     if(++j>15){
       j=0;
       fprintf(PC,"\r\n");
     }
   }
   u=read_eeprom(255);
   fprintf(PC,"%X ",u);
   fprintf(PC,"\r\n\r\n");
}

// firmware_trans ///////////////////////////////////////////////////

void friendly_firmware_trans(void){

   fprintf(PC,"\r\nLogical Analyzer v.%s by Redpic\r\n\n",Version);
}

void hardy_firmware_trans(void){

   fprintf(PC,"{%s}\r\n",Version);
   delay_ms(10);
   ack_trans();
}

// data_trans ///////////////////////////////////////////////////////

void friendly_data_trans(void){

   disable_interrupts(int_timer1);

   fprintf(PC,"\r\nResults Table:\r\n\n");

   fprintf(PC,"Total INT_EXT detected %2u\r\n",nTintext);

   fprintf(PC,"\r\nFalling edges Table\r\n\n");
   fprintf(PC,"Nº C   Overflows  Timer\r\n");
   fprintf(PC,"=======================\r\n");
   for(i=0;i<NMUESTRAS;i++){
      printf("%2u %1u       %5lu  %5lu\r\n",i,tDownC[i],tDownI[i],tDownT[i]);
   }
   fprintf(PC,"\r\n\nRising edges Table\r\n\n");
   fprintf(PC,"Nº C   Overflows  Timer\r\n");
   fprintf(PC,"=======================\r\n");
   for(i=0;i<NMUESTRAS;i++){
      fprintf(PC,"%2u %1u       %5lu  %5lu\r\n",i,tUpC[i],tUpI[i],tUpT[i]);
   }
}

void hardy_data_trans(void){

   disable_interrupts(int_timer1);

   for(i=0;i<NMUESTRAS;i++){
      fprintf(PC,"{ %3u %1u %5lu %5lu %1u %5lu %5lu }\r\n",i+1,tUpC[i],tUpI[i],tUpT[i],tDownC[i],tDownI[i],tDownT[i]);
   }
   delay_ms(10);
   ack_trans();
}

// config_trans /////////////////////////////////////////////////////

void friendly_config_trans(void){

   disable_interrupts(int_timer1);

   fprintf(PC,"\r\nConfig Channels :\r\n\n");

   fprintf(PC,"Channel 1 = %2u\r\n\n",C1_Settings);
   fprintf(PC,"Channel 2 = %2u\r\n\n",C2_Settings);
   fprintf(PC,"Channel 3 = %2u\r\n\n",C3_Settings);
}

void hardy_config_trans(void){

   disable_interrupts(int_timer1);

   fprintf(PC,"{ %3u %3u %3u }\r\n",C1_Settings,C2_Settings,C3_Settings);
   delay_ms(10);
   ack_trans();
}
///////////////////////////////////////////////////////////////////////////////////////////////////


He modificado el código lo mínimo imprescindible para que funcione la comunicación serie. Por favor, si algún maestro pudiera confirmar que no afecta al buen funcionamiento de la sonda, se lo agradecería muchísimo. (aunque no lo parezca, estoy muy muy verde aún en esto de los PICs).

Gracias a todos y en especial a RedPic, por este fantástico programa y para agradecerle su esfuerzo.

Un saludo!!!
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: EeePic en 09 de Julio de 2012, 14:28:01
Me respondo a mi mismo.... :grin: :grin:

(http://img546.imageshack.us/img546/8202/sondai.jpg) (http://imageshack.us/photo/my-images/546/sondai.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Parece que voy progresando...

Gracias de nuevo!!
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: nutriax en 28 de Enero de 2014, 12:27:17
Hola RedPic, puedes subir una version de tu soft para que trabaje con los diferentes com?? ya que cuando intento conectarlo me dice que no se puede conectar al hardware 18F4550 y he realizado pruebas con hyperterminal y me devuelvo todo el menu y demas, por lo que creo que solo es porque a nivel de programacion (software de pc) no toma en cuenta los demas comm tal como tu lo dijiste en post anteriores.
Muchas gracias.
Título: Re: Analizador lógico de 3 Canales monitorizado en el PC
Publicado por: n00b30 en 07 de Octubre de 2015, 17:34:35
Buenas a todos, yo tenía el mismo problema de que no conectaba (ni enviaba ni recibía nada por el RS232) y he podido solucionarlo, buscando por otros foros para buscar un ejemplo de comunicación serie con un 18F4550, hasta dar con un ejemplo que me funcionase.  He realizado unos cambios al código fuente y he conseguido que el soft comunique con el PC sin problemas, ahora el problema que tengo es que no termino de entender como funciona la sonda y el programa. Alguien podría poner un tutorial pequeñito para burros como yo, que no saben realizar un sampleo?  :oops:. Con tal de que me ponga sobre la pista, me sirve...

En principio, para que me funcione la comunicación serie hay varios puntos importantes:

Los fuses:

Código: [Seleccionar]
#fuses HS,NOMCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN

#FUSES CPUDIV1         //DIVISION DE FRECUENCIA DEL OSCILADOR: 1

La inicialización de la uart:

Código: [Seleccionar]
#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7,stream=PC,bits=8)

Y para imprimir (o enviar, como se quiera llamar) el texto por el puerto serie del PIC, sustituir todos los printf, por la orden fprintf, de acuerdo a este esquema:

Printf original:

Código: [Seleccionar]
printf("Telnet format:\r\n\n");

Sentencia fprintf:

Código: [Seleccionar]
fprintf(PC,"Telnet format:\r\n\n");

En principio, como se ve, se trata de añadir el stream sobre el que queremos que se envien los datos, en este caso "PC", que se definió en la sentencia de inicialización de la UART, mas arriba.

Posteo el código completo para que lo vayáis probando y espero que os solucione los problemas. Yo estoy haciendo las pruebas con la tarjeta entrenadora de Mikroeletronika, la EasyPic v6, y me ha funcionado, con cristal de 20Mhz y CCS C v4.130. Ahora me queda probar que realice las capturas correctamente, que es donde de momento me he quedado estancado y necesito un empujoncito.

El código:

Código: [Seleccionar]
// RR Logical Analyzer v.1.2.2d
#include <18F4550.h>

#fuses HS,NOMCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN

#FUSES CPUDIV1         //DIVISION DE FRECUENCIA DEL OSCILADOR: 1

#use delay(clock=20000000)
#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7,stream=PC,bits=8)

int  const NMUESTRAS=192;

char const SOFT_COMMAND_RESET    = 'r';
char const SOFT_COMMAND_FIRMWARE = 'w';
char const SOFT_COMMAND_DATA     = 'x';
char const SOFT_COMMAND_CONFIG   = 'c';
char const SOFT_COMMAND_EEPROM   = 'e';

char const HARD_COMMAND_RESET    = 'R';
char const HARD_COMMAND_FIRMWARE = 'W';
char const HARD_COMMAND_DATA     = 'X';
char const HARD_COMMAND_CONFIG   = 'C';
char const HARD_COMMAND_CONFIG1  = '1';
char const HARD_COMMAND_CONFIG2  = '2';
char const HARD_COMMAND_CONFIG3  = '3';
char const RESPONSE_ACK          = '^';

int  const DIR_C1_SETTINGS       =  0;
int  const DIR_C2_SETTINGS       =  1;
int  const DIR_C3_SETTINGS       =  2;

// Variables en RAM /////////////////////////////////////////////////

char Version[]="1.2.2d\0";
char CharRcv=0;
char Command=0;

int  i=0x00;
int  uTimeUp=0;
int  uTimeDown=0;
int  nTintext=0;
int  tUpC[NMUESTRAS];
long tUpT[NMUESTRAS];
long tUpI[NMUESTRAS];
int  tDownC[NMUESTRAS];
long tDownT[NMUESTRAS];
long tDownI[NMUESTRAS];
long nTimer1Overflow;
int1 fedge1=0;
int1 fedge2=0;
int1 fedge3=0;
int1 flag_recibe_config1=0;
int1 flag_recibe_config2=0;
int1 flag_recibe_config3=0;

// Settings x CANAL /////////////////////////////////////////////////

int  C1_Settings= 0;
int1 C1_Active  = 0;
int1 C1_Raising = 0;
int1 C1_Falling = 0;
int1 C1_Trigger = 0;
int1 C1_Invert  = 0;

int  C2_Settings= 0;
int1 C2_Active  = 0;
int1 C2_Raising = 0;
int1 C2_Falling = 0;
int1 C2_Trigger = 0;
int1 C2_Invert  = 0;

int  C3_Settings= 0;
int1 C3_Active  = 0;
int1 C3_Raising = 0;
int1 C3_Falling = 0;
int1 C3_Trigger = 0;
int1 C3_Invert  = 0;

// Definicion de funciones //////////////////////////////////////////

void menu_trans(void);
void friendly_eeprom_trans(void);
void friendly_firmware_trans(void);
void hardy_firmware_trans(void);
void friendly_data_trans(void);
void hardy_data_trans(void);
void friendly_config_trans(void);
void hardy_config_trans(void);
void on_reset(int1 verbose);
void ack_trans(void);
void set_channel1(void);
void set_channel2(void);
void set_channel3(void);
void config_channels(int1 verbose);

#int_rda
void rda_handler() {

   CharRcv=0;
   if(kbhit()){
      CharRcv=getc();
      if(CharRcv!=0){
         Command=CharRcv;
      }
   }
}

#int_ext
ext_handler() {

   long t;
   long n;

   disable_interrupts(int_timer1);
   disable_interrupts(int_ext1);
   disable_interrupts(int_ext2);
   ++nTintext;
   if(nTintext==1){
      set_timer1(0);
      nTimer1Overflow=0;
   }
   n=nTimer1Overflow;
   t=get_timer1();

   if(fedge1==0){
      ext_int_edge(0,L_TO_H);
      tDownI[uTimeDown]=n;
      tDownT[uTimeDown]=t;
      tDownC[uTimeDown]=1;
      ++uTimeDown;
   }else
   {
      ext_int_edge(0,H_TO_L);
      tUpI[uTimeUp]=n;
      tUpT[uTimeUp]=t;
      tUpC[uTimeUp]=1;
      ++uTimeUp;
   }
   ++fedge1;
   if(bit_test(C2_SETTINGS,7)==1){
      enable_interrupts(int_ext1);
   }
   if(bit_test(C3_SETTINGS,7)==1){
      enable_interrupts(int_ext2);
   }
   enable_interrupts(int_timer1);
}

#int_ext1
ext1_handler() {

   long t;
   long n;

   disable_interrupts(int_timer1);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext2);
   ++nTintext;
   if(nTintext==1){
      set_timer1(0);
      nTimer1Overflow=0;
   }
   n=nTimer1Overflow;
   t=get_timer1();

   if(fedge2==0){
      ext_int_edge(1,L_TO_H);
      tDownI[uTimeDown]=n;
      tDownT[uTimeDown]=t;
      tDownC[uTimeDown]=2;
      ++uTimeDown;
   }else
   {
      ext_int_edge(1,H_TO_L);
      tUpI[uTimeUp]=n;
      tUpT[uTimeUp]=t;
      tUpC[uTimeUp]=2;
      ++uTimeUp;
   }
   ++fedge2;
   if(bit_test(C1_SETTINGS,7)==1){
      enable_interrupts(int_ext);
   }
   if(bit_test(C3_SETTINGS,7)==1){
      enable_interrupts(int_ext2);
   }
   enable_interrupts(int_timer1);
}

#int_ext2
ext2_handler() {

   long t;
   long n;

   disable_interrupts(int_timer1);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext1);
   ++nTintext;
   if(nTintext==1){
      set_timer1(0);
      nTimer1Overflow=0;
   }
   n=nTimer1Overflow;
   t=get_timer1();

   if(fedge3==0){
      ext_int_edge(2,L_TO_H);
      tDownI[uTimeDown]=n;
      tDownT[uTimeDown]=t;
      tDownC[uTimeDown]=3;
      ++uTimeDown;
   }else
   {
      ext_int_edge(2,H_TO_L);
      tUpI[uTimeUp]=n;
      tUpT[uTimeUp]=t;
      tUpC[uTimeUp]=3;
      ++uTimeUp;
   }
   ++fedge3;
   if(bit_test(C1_SETTINGS,7)==1){
      enable_interrupts(int_ext);
   }
   if(bit_test(C2_SETTINGS,7)==1){
      enable_interrupts(int_ext1);
   }
   enable_interrupts(int_timer1);
}

#int_timer1
timer1_handler(){
   ++nTimer1Overflow;
}

// ON_RESET /////////////////////////////////////////////////////////

void on_reset(int1 verbose){

   disable_interrupts(global);
   disable_interrupts(int_timer1);
   disable_interrupts(int_rda);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext1);
   disable_interrupts(int_ext2);

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_psp(PSP_DISABLED);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   setup_timer_0(RTCC_OFF);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

 
   port_b_pullups(FALSE);
   set_tris_b(0b00000111);

   for(i=0;i<NMUESTRAS;i++){ tUpT[i]=0; tUpI[i]=0; tUpC[i]=0; tDownT[i]=0; tDownI[i]=0; tDownC[i]=0;}

   nTintext=0;
   uTimeUp=0;
   uTimeDown=0;
   flag_recibe_config1=0;
   flag_recibe_config2=0;
   flag_recibe_config3=0;

   config_channels(verbose);

   delay_ms(100);
   // Habilito Canal 1
   if(bit_test(C1_SETTINGS,7)==1){
      enable_interrupts(int_ext);
      if(verbose){ fprintf(PC,"\r\nint_ext enabled\r\n");}
   }
   // Habilito Canal 2
   if(bit_test(C2_SETTINGS,7)==1){
      enable_interrupts(int_ext1);
      if(verbose)fprintf(PC,"\r\nint_ext1 enabled\r\n");}
   }
   // Habilito Canal 3
   if(bit_test(C3_SETTINGS,7)==1){
      enable_interrupts(int_ext2);
      if(verbose){ fprintf(PC,"\r\nint_ext2 enabled\r\n");}
   }
   // Habilito Recepción RS232
   enable_interrupts(int_rda);
   
   // Habilito Interrupciones Global
   enable_interrupts(global);
}

// MAIN //////////////////////////////////////////////////////////////////

void main() {

   
   on_reset(0);

   do{

      if(Command!=0){

         // Accepta byte de configuracion para Channel 1
         if(flag_recibe_config1==1){
            set_channel1();
         }
         // Accepta byte de configuracion para Channel 2
         if(flag_recibe_config2==1){
            set_channel2();
         }
         // Accepta byte de configuracion para Channel 3
         if(flag_recibe_config3==1){
            set_channel3();
         }

         // Procesa cxommandos
         switch(Command){

            // Commands Telnet  - SOFT COMMANDS ---------------------

            case '?': menu_trans();
                      break;
            case SOFT_COMMAND_RESET :
                      on_reset(1);               // Reset
                      break;
            case SOFT_COMMAND_FIRMWARE:
                      friendly_firmware_trans(); // Send Firmaware
                      break;
            case SOFT_COMMAND_DATA :
                      friendly_data_trans();     // Send Data
                      break;
            case SOFT_COMMAND_CONFIG :
                      friendly_config_trans();   // Send Config
                      break;
            case SOFT_COMMAND_EEPROM :
                      friendly_eeprom_trans();   // Send EEPROM
                      break;

            // Commands Soft PC - HARD COMMANDS ---------------------

            case HARD_COMMAND_RESET :
                      on_reset(0);               // Reset
                      ack_trans();
                      break;
            case HARD_COMMAND_FIRMWARE:
                      hardy_firmware_trans();    // Send Firmaware
                      break;
            case HARD_COMMAND_DATA :
                      hardy_data_trans();        // Send Data
                      break;
            case HARD_COMMAND_CONFIG :
                      hardy_config_trans();      // Send Config
                      break;
            case HARD_COMMAND_CONFIG1 :          // Atento : siguiente recepción de Cfg Channel 1
                      flag_recibe_config1=1;
                      ack_trans();
                      break;
            case HARD_COMMAND_CONFIG2 :          // Atento : siguiente recepción de Cfg Channel 2
                      flag_recibe_config2=1;
                      ack_trans();
                      break;
            case HARD_COMMAND_CONFIG3 :          // Atento : siguiente recepción de Cfg Channel 3
                      flag_recibe_config3=1;
                      ack_trans();
                      break;
         }
         Command=0;
      }

   } while (TRUE);
}

// menu_trans ///////////////////////////////////////////////////////

void menu_trans(void){

   friendly_firmware_trans();

   fprintf(PC,"Telnet format:\r\n\n");
   fprintf(PC,"  %c  reset tables\r\n",     SOFT_COMMAND_RESET);
   fprintf(PC,"  %c  version firmware\r\n", SOFT_COMMAND_FIRMWARE);
   fprintf(PC,"  %c  config transmit\r\n",  SOFT_COMMAND_CONFIG);
   fprintf(PC,"  %c  data transmit\r\n",    SOFT_COMMAND_DATA);
   fprintf(PC,"  %c  eeprom transmit\r\n",  SOFT_COMMAND_EEPROM);
   fprintf(PC,"\r\n");
   fprintf(PC,"Hardware format:\r\n\n");
   fprintf(PC,"  %c  reset tables\r\n",     HARD_COMMAND_RESET);
   fprintf(PC,"  %c  version firmware\r\n", HARD_COMMAND_FIRMWARE);
   fprintf(PC,"  %c  data transmit\r\n",    HARD_COMMAND_DATA);
   fprintf(PC,"  %c  config transmit\r\n",  HARD_COMMAND_CONFIG);
   fprintf(PC,"  %cb config Channel1\r\n",  HARD_COMMAND_CONFIG1);
   fprintf(PC,"  %cb config Channel2\r\n",  HARD_COMMAND_CONFIG2);
   fprintf(PC,"  %cb config Channel3\r\n",  HARD_COMMAND_CONFIG3);
   fprintf(PC,"\r\n");

}

// Set Canal ////////////////////////////////////////////////////////

void set_channel1(void){

   flag_recibe_config1=0;
   C1_Settings=Command;
   Command=0;
   write_eeprom(DIR_C1_SETTINGS,C1_SETTINGS);
   delay_ms(10);
   ack_trans();
}

void set_channel2(void){

   flag_recibe_config2=0;
   C2_Settings=Command;
   Command=0;
   write_eeprom(DIR_C2_SETTINGS,C2_SETTINGS);
   delay_ms(10);
   ack_trans();
}

void set_channel3(void){

   flag_recibe_config3=0;
   C3_Settings=Command;
   Command=0;
   write_eeprom(DIR_C3_SETTINGS,C3_SETTINGS);
   delay_ms(10);
   ack_trans();
}

void config_channels(int1 verbose){

   // Recupero configuracion desde la EEPROM
   C1_SETTINGS = read_eeprom(DIR_C1_SETTINGS);
   C2_SETTINGS = read_eeprom(DIR_C2_SETTINGS);
   C3_SETTINGS = read_eeprom(DIR_C3_SETTINGS);
   if(verbose){ fprintf(PC,"\r\Config 1=%u 2=%u 3=%u\r\n",C1_SETTINGS,C2_SETTINGS,C3_SETTINGS);}
   // Configuro Channel1 Flanco inicial
   if(bit_test(C1_SETTINGS,7)==1){
     if(bit_test(C1_SETTINGS,5)==1){
        fedge1=0;
        ext_int_edge(0,H_TO_L);
        if(verbose){ fprintf(PC,"\r\nint_ext 0 H_to_L\r\n");}
     }
     if(bit_test(C1_SETTINGS,6)==1){
        fedge1=1;
        ext_int_edge(0,L_TO_H);
        if(verbose){ fprintf(PC,"\r\nint_ext 1 L_to_H\r\n");}
     }
   }
   // Configuro Channel2 Flanco inicial
   if(bit_test(C2_SETTINGS,7)==1){
     if(bit_test(C2_SETTINGS,5)==1){
        fedge2=0;
        ext_int_edge(1,H_TO_L);
        if(verbose){ fprintf(PC,"\r\nint_ext1 0 H_to_L\r\n");}
     }
     if(bit_test(C2_SETTINGS,6)==1){
        fedge2=1;
        ext_int_edge(1,L_TO_H);
        if(verbose){ fprintf(PC,"\r\nint_ext1 1 L_to_H\r\n");}
     }
   }
   // Configuro Channel3 Flanco inicial
   if(bit_test(C3_SETTINGS,7)==1){
     if(bit_test(C3_SETTINGS,5)==1){
        fedge3=0;
        ext_int_edge(2,H_TO_L);
        if(verbose){ fprintf(PC,"\r\nint_ext2 0 H_to_L\r\n");}
     }
     if(bit_test(C3_SETTINGS,6)==1){
        fedge3=1;
        ext_int_edge(2,L_TO_H);
        if(verbose){ fprintf(PC,"\r\nint_ext2 1 L_to_H\r\n");}
     }
   }
}

// ack_trans ////////////////////////////////////////////////////////

void ack_trans(void){

   fprintf(PC,"%c\r\n",RESPONSE_ACK);
}

// eeprom_trans /////////////////////////////////////////////////////

void friendly_eeprom_trans(void){

   int i,j,u;

   fprintf(PC,"\r\n");
   for(i=0;i<16;i++) printf("%X ",i);
   fprintf(PC,"\r\n");
   for(i=0;i<16;i++) printf("== ");
   fprintf(PC,"\r\n");
   j=0;
   for(i=0;i<255;i++){
     u=read_eeprom(i);
     fprintf(PC,"%X ",u);
     if(++j>15){
       j=0;
       fprintf(PC,"\r\n");
     }
   }
   u=read_eeprom(255);
   fprintf(PC,"%X ",u);
   fprintf(PC,"\r\n\r\n");
}

// firmware_trans ///////////////////////////////////////////////////

void friendly_firmware_trans(void){

   fprintf(PC,"\r\nLogical Analyzer v.%s by Redpic\r\n\n",Version);
}

void hardy_firmware_trans(void){

   fprintf(PC,"{%s}\r\n",Version);
   delay_ms(10);
   ack_trans();
}

// data_trans ///////////////////////////////////////////////////////

void friendly_data_trans(void){

   disable_interrupts(int_timer1);

   fprintf(PC,"\r\nResults Table:\r\n\n");

   fprintf(PC,"Total INT_EXT detected %2u\r\n",nTintext);

   fprintf(PC,"\r\nFalling edges Table\r\n\n");
   fprintf(PC,"Nº C   Overflows  Timer\r\n");
   fprintf(PC,"=======================\r\n");
   for(i=0;i<NMUESTRAS;i++){
      printf("%2u %1u       %5lu  %5lu\r\n",i,tDownC[i],tDownI[i],tDownT[i]);
   }
   fprintf(PC,"\r\n\nRising edges Table\r\n\n");
   fprintf(PC,"Nº C   Overflows  Timer\r\n");
   fprintf(PC,"=======================\r\n");
   for(i=0;i<NMUESTRAS;i++){
      fprintf(PC,"%2u %1u       %5lu  %5lu\r\n",i,tUpC[i],tUpI[i],tUpT[i]);
   }
}

void hardy_data_trans(void){

   disable_interrupts(int_timer1);

   for(i=0;i<NMUESTRAS;i++){
      fprintf(PC,"{ %3u %1u %5lu %5lu %1u %5lu %5lu }\r\n",i+1,tUpC[i],tUpI[i],tUpT[i],tDownC[i],tDownI[i],tDownT[i]);
   }
   delay_ms(10);
   ack_trans();
}

// config_trans /////////////////////////////////////////////////////

void friendly_config_trans(void){

   disable_interrupts(int_timer1);

   fprintf(PC,"\r\nConfig Channels :\r\n\n");

   fprintf(PC,"Channel 1 = %2u\r\n\n",C1_Settings);
   fprintf(PC,"Channel 2 = %2u\r\n\n",C2_Settings);
   fprintf(PC,"Channel 3 = %2u\r\n\n",C3_Settings);
}

void hardy_config_trans(void){

   disable_interrupts(int_timer1);

   fprintf(PC,"{ %3u %3u %3u }\r\n",C1_Settings,C2_Settings,C3_Settings);
   delay_ms(10);
   ack_trans();
}
///////////////////////////////////////////////////////////////////////////////////////////////////


He modificado el código lo mínimo imprescindible para que funcione la comunicación serie. Por favor, si algún maestro pudiera confirmar que no afecta al buen funcionamiento de la sonda, se lo agradecería muchísimo. (aunque no lo parezca, estoy muy muy verde aún en esto de los PICs).

Gracias a todos y en especial a RedPic, por este fantástico programa y para agradecerle su esfuerzo.

Un saludo!!!

actualmente estoy probando este circuito y solo habia que acorregir esta linea:
Código: [Seleccionar]
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,MCLR,CPUDIV1, PLL1 
Este tema es algo viejo pero actualmente estoy tratando de decifrar un codigo y e intentado con este programa pero no e podido hacer que funcione del todo bien, hay alguna actualizacion?

Saludos!