Todo lector que se ocupa de los microcontroladores sabe la importancia de mantener una rica biblioteca con los más variados esquemas y programas para su uso. Con esto en mente, hemos desarrollado tres circuitos prácticos con el microcontrolador PIC16F628A para que el lector pueda aumentar su biblioteca y también aprender a usar algunos aparatos importantes con el microcontrolador sugerido, que incluyen: teclado matricial, display de cristal líquido y motor paso a paso.

 

Nota: El artículo es de una Electrónica Total de 2004

 

 

EL MICROCONTROLADOR PIC16F628A

Este microcontrolador no es nada nuevo para la mayoría de los lectores. Pero para aquellos que no lo conocen, a continuación, describiremos sus principales características:

- Memoria de programa com 2 kbytes de FLASH

- 224 bytes de RAM - 128 de EEPROM

- 15 pinos de I/O con drenaje de corriente del orden de 20 mA

- Dos comparadores analógicos

- Dos "timers" de 8 bits y uno de 16 bits

- Um canal CCP (Capture, Compare y PWM)

- Un canal USART para comunicación RS-232 o SPI

- Varias opciones para oscilador incluyendo 4 MHz interno

- Watch Dog Timer (perro de guardia) interno

- Controle de "Power-on Reset" y "Power-up Timer"

- Protección de código contra copia

- Código de instrucción reducido (35 instrucciones)

- Paquete DIP con 18 pinos.

Para aquellos que quieren más información sobre este microcontrolador, recomendamos “downloads” del "data book" del sitio web del fabricante, www.microchip.com.

 

 

CONTROL DE TECLADO MATRICIAL

 

En algunos circuitos de microcontroladores es necesario recopilar datos del "usuario". La mejor forma de hacerlo es, sin duda, utilizando un teclado matricial.

Estos teclados se componen básicamente de botones de tipo "normalmente abiertos" intercalados entre columnas y filas (figura 1). Para saber exactamente qué tecla se presionó, es necesario analizar línea y columna, a través de una operación muy conocida en el mundo de los microcontroladores como escaneo. note la figura 2.

 

Figura 1 - Matriz de teclas
Figura 1 - Matriz de teclas | Clique na imagem para ampliar |

 

 

 Figura 2 - Escaneo en el teclado
Figura 2 - Escaneo en el teclado

 

 

El lector notará que forzamos un valor fijo en las "líneas". Este valor generalmente equivale a la lógica "1" (5V). Esto se hace a través de resistores "pull-up". Entonces el microcontrolador ejecuta un"enlace" insertando un "0" lógico (GND) en la columna que debe leerse y un "1" lógico en las columnas que no desea leer. Así, cuando se presiona una tecla en la columna donde existe el "0" lógico, la línea que hace referencia a la tecla también asume inmediatamente el valor "0". Al leer los bits de puerto responsables de las líneas, es posible saber cuál de ellos cambió su valor inicial. Cómo sabemos qué columna estaba en "0" en ese momento, podemos determinar a través de una tabla qué tecla se presionó.

El lector debe estar preguntándose: Pero, ¿cómo podemos garantizar que la tecla presionada era realmente la que queríamos leer? Simple. El escaneo hace eso. El escaneo inserta el valor "O" en las columnas mucho más rápido de lo que una persona presiona una tecla. Este valor "O" se inserta en la primera columna, luego en la segunda y así sucesivamente hasta llegar a la última columna. Si no se presiona ninguna tecla, se iniciará un nuevo escaneo en la búsqueda de una clave y, por lo tanto, el microcontrolador estará en un "enlace" eterno en la búsqueda de una clave.

En la figura 3 el lector dispone del esquema eléctrico para las pruebas con el escáner de teclado que puede construir el lector, utilizando teclas tipo "pulsadores" normalmente abiertas o desde aparatos en desuso. Es importante tener en cuenta que la disposición de filas y columnas durante el montaje del circuito puede cambiar la decodificación de las claves.

 

 Figura 3 - PIC16F628A con teclado matricial.
Figura 3 - PIC16F628A con teclado matricial. | Clique na imagem para ampliar |

 

 

Los altavoces del teclado están conectados al PIC en el puerto B, en la parte menos significativa (RBO a RB3). Los diodos D y D4 brindan protección contra cortocircuitos entre columnas y filas. Las líneas también estaban conectadas al PIC del puerto B, en la parte más significativa (RB4 a RB7).

Los LEDs D5 a D5 son del tipo común y sirven para "mostrar" qué tecla se presionó (valor de 0 a 15 en binario; solo se muestra la parte menos significativa del byte). La decodificación se realiza a través de una tabla en el programa. Si la decodificación aparece invertida o fuera de orden, verifique la posición de las filas y columnas o cambie el programa (tabla) para que sea exhibiendo el valor deseado.

El programa "PIC_TEC_F628. ASM" se puede obtener de forma gratuita desde el sitio de la revista www.electronicatotal.com,br en la sección "downloads". Su funcionamiento es sumamente sencillo. Cuando se presiona una tecla, mostrará su valor en los LEDs en representación "binaria", como se detalla en el texto. Le recomendamos que lo estudie para comprender mejor cómo funciona el circuito. Para ello comentamos todo el programa, para facilitar su comprensión.

 

 

CONTROL DE DISPLAY DE CRISTAL LÍQUIDO (LCD)

 

Un display de cristal líquido, a pesar de parecer complejo, es muy sencillo de operar. La mayoría de los displays que se encuentran en el mercado tienen características integradas para que sea más fácil para los usuarios max-o controlarlas, proporcionando una interfaz con cualquier microcontrolador. Así que no tenemos que preocuparnos por el funcionamiento interno de un display, sino únicamente con los comandos necesarios para escribir un carácter, borrar una línea, encender el cursor, y muchos otros comandos posibles (según cada modelo).

En la figura 4, tenemos algunos ejemplos y tipos de "LCDs" (Liquid Crystal Displays) que se encuentran fácilmente en el mercado especializado (tiendas de componentes electrónicos). Estos LCDs son del tipo “character”, es decir, no son gráficos. Los displays gráficos tienen su control más complejo y se realizan de manera diferente y no se discutirán en este artículo. Por ahora, solo nos ocuparemos del tipo "personaje".

 


 

 

 

Los LCDs de caracteres tienen algunas subdivisiones importantes que vale la pena conocer. Se refieren principalmente a la cantidad de caracteres que cada uno puede mostrar. Esta cantidad generalmente se expresa en "filas x columnas". En la tabla 1 el lector podrá ver algunos patrones utilizados con sus divisiones en relación a filas y columnas.

 


 

 

 

Siempre recordando que el número total de caracteres se refiere al número total de elementos que se puede demostrar de una vez, incluyendo espacios en blanco. También es importante señalar que existen muchas otras normas referentes al número total de caracteres, siendo recomendable una consulta con fabricantes Siempre que sea posible, el lector debe consultar los "databooks" proporcionados por el fabricante.

Los displays disponen de comandos específicos para cada operación deseada: lectura, escritura, configuración, etc. Estos comandos se pasan a través de una línea de datos (pinos DO a D7) de 8 bits (1 byte) y una línea de control compuesta por tres pinos más: EN (ENABLER), RDNVR (lectura/escritura) y RS (entrada de datos o instrucciones). En la figura 5 el lector puede observar un display y su respectivo pinaje.

 

 

 Figura 5 - Display y su pinaje.
Figura 5 - Display y su pinaje.

 

 

 

Algunos displays tienen más de 14 pinos para las conexiones. Los pinos sobrantes se suelen utilizar en el control "Backlight". El "Backlight" no es más que un conjunto de "leds" colocados en la parte posterior del display. Cuando están "encendidos" permiten la visualización de los datos incluso en la oscuridad. Cada teléfono celular tiene "Backlight" en su display.

Es importante que el lector sepa que la mayoría de los "backlight" disponibles en los displays tienen un alto consumo de corriente y no deben conectarse directamente a los pinos 1/0 de un microcontrolador. Esto quemaría el puerto de I/O e incluso el propio microcontrolador. Si es necesario utilizar el circuito de "back light", utilice un circuito de "drive" como se muestra en la figura 6.

 

Figura 6 - Drive para backlight.
Figura 6 - Drive para backlight.

 

 

Los displays con cuatro o más líneas deben tratarse como una "unión" de dos o más displays de dos líneas. Por lo general, tienen dos pinos de habilitación (EN) para seleccionar qué conjunto de líneas se utilizará. En este caso, el pino 15 habilita las dos líneas superiores y el pino 16 las dos líneas inferiores. El pino "6" no está conectado. Sin embargo, ya es posible encontrar displays con cuatro líneas y sólo un pino de habilitación. En esta situación, el cambio de línea se realiza mediante un comando específico. Si el lector tiene un display de este tipo, consulte el manual del fabricante para saber cuáles son estos comandos.

A estas alturas, el lector debe haber notado que un "LCD" tiene un pequeño microcontrolador dedicado internamente, que interpretará los "datos" recibidos y los transformará en "comandos" internos en el display (no entraremos en más detalles sobre esto, ya que está más allá del propósito de este artículo).

En la tabla 2 el lector tiene un conjunto de instrucciones compatibles con la mayoría de los displays disponibles en el mercado. Esta tabla también muestra los datos que se le enviarán y el estado de sus pinos de control.

Hay otros comandos, pero los más importantes y más usados ​​se dan en esta tabla. Para el lector que esté interesado en saber más sobre todos los comandos posibles de un display determinado, siempre es recomendable consultar "Databook" del mismo fabricante.

Observando la tabla 2, el lector nota que para enviar un determinado comando al display, el pino RS se lleva al estado lógico "O", y cada vez que queremos enviar un carácter para escribir, el mismo pino se lleva al estado lógico "1". El pino "EN" habilita el display y debe establecerse en "1" para habilitar y en "O" para deshabilitar. El pino RD/WR debe establecerse en "O" para escribir datos en el display y en "1" para leer datos de ella.


| Clique na imagem para ampliar |

 

 

 

En la figura 7 el lector dispone del esquema eléctrico para las pruebas con un LCD tipo 16x2. Este display se encuentra fácilmente en el mercado especializado e incluso en "chatarra" fuera de uso. El circuito también tiene un 'trimpot' para regular el contraste del display.

 

Figura 7 - Circuito eléctrico 2 - PIC16F628A con LCD.
Figura 7 - Circuito eléctrico 2 - PIC16F628A con LCD. | Clique na imagem para ampliar |

 

 

 

El programa "PIC_DISP_F628.ASM" se puede obtener de forma gratuita en la web de la revista www.electronicatotal.com.br en la sección "downloads". Escriba una oración y una secuencia de caracteres. Una vez más, recomendamos estudiar el programa para comprender mejor el funcionamiento del circuito, aprovechando los comentarios insertados en el programa.

 

 

CONTROL DE MOTORES PASO A PASO

 

Los motores paso a paso están muy extendidos en el mundo de la electrónica/mecatrónica/microrobótica. Su precisión, aliada a su fuerza (torque), hacen de este motor un excelente "posicionador". Están presentes en impresoras, pequeños CNCs, mesas "XY", etc.

Para operar un motor paso a paso, tenemos que "encender" y "apagar" sus bobinas en una secuencia correcta. La frecuencia con que estas las bobinas están "conectadas" (on/off) determinarán la velocidad de rotación del motor. Para hacerlo girar en la dirección opuesta, debemos invertir la secuencia de conmutación. Vea la tabla 3, en él describimos la secuencia para operar un motor paso a paso "unipolar" de seis hilos (dos bobinas independientes).


| Clique na imagem para ampliar |

 

 

Los valores iguales a "1" equivale a bobina encendida y los valores iguales a "0" equivale a bobina apagada. El análisis de la tabla se realiza desde el "paso 1" hasta el "paso 4". A partir de ese momento, la operación se repite para mantener el motor en marcha.

Los motores paso a paso están inclinados en grados. Por ejemplo, un motor de 7,52 por paso necesita 48 pasos para completar una revolución completa.

 

 

Número de pasos = 3609/número de grados por paso

 

 

Para hacer que el motor gire en sentido contrario, debemos hacer el análisis inverso en la tabla. El primer paso pasa a ser el número "4" y el último de número 1". Esta operación es repetida hasta obtener el número deseado de vueltas.

Desafortunadamente, no existe una estandarización entre los fabricantes de motores paso a paso que nos permita (a través de un código de colores) identificar internamente las conexiones de sus bobinas. Para ello, el lector puede elegir entre dos soluciones:

- Consultar el "data book" del fabricante

- Con un multímetro en posición de lectura de resistencia, hacer un análisis de su motor. En la figura 8 demuestra cómo se hace esto.

 

Figura 8 - Identificando las bobinas de un motor de paso.
Figura 8 - Identificando las bobinas de un motor de paso. | Clique na imagem para ampliar |

 

 

 

Figura 9 - Circuito eléctrico 3 - PIC16F628A controlando un motor de paso.
Figura 9 - Circuito eléctrico 3 - PIC16F628A controlando un motor de paso. | Clique na imagem para ampliar |

 

 

 

En la figura 9 el lector dispone del esquema eléctrico para pruebas con motor paso a paso unipolar de 6 hilos. Las teclas "S", "S2",``S3' son del tipo "push-button" normalmente abierto mini. Los transistores "Q"1", "Q2", "Q3" y "Q4: son transistores tipo "Darlington" NPN con corriente de trabajo del orden de 2 A continua y 4 A de pico. Es recomendable utilizar radiadores de calor para los transistores.

En la misma figura el lector tiene un esquema de una fuente. El punto de 12V servirá para alimentar el motor paso a paso y el punto de 5v alimentar el PIC. El LM7805 también debe tener un radiador de calor para evitar el sobrecalentamiento.

El programa "PIC_STEP_F628.ASM" se puede obtener de forma gratuita en la web de la revistawww.electronicatotal.com.br en la sección "downloads". Permite controlar el motor en ambos sentidos a través de las teclas "S1" y "S2" y también detenerlo a través de "S3". Estudie el programa para una mejor comprensión de cómo funciona el circuito.

El lector habrá notado que en este artículo no proporcionamos ningún "layout" para hacer placas de circuito impreso. Eso es porque ninguno de ellos es necesariamente un proyecto específico. Como se dijo al principio del artículo, su uso debe hacerse mediante estudios con el microcontrolador PIC16F628A y también en otros circuitos lectores. Para probar los circuitos y programas, utilice una matriz de contacto para los montajes.

 

 

CONCLUSIÓN

En este artículo, el lector aprendió lo importante que es mantener una biblioteca de información sobre un microcontrolador dado. Esta puede ser la clave del éxito para un proyecto comercial que, como muchos otros, tiene un plazo algo corto. Estudiar y cambiar los programas presentados ayudará a fijar el aprendizaje, además de que el lector también podrá mezclar los circuitos y programas para buscar nuevas alternativas. Esperamos haber contribuido a todos aquellos que buscaban soluciones prácticas con microcontroladores y pretendemos traer otros circuitos prácticos en próximos artículos para la biblioteca del lector. ¡Estén atentos y hasta la próxima!

 

 

 

18.991MBMemory Usage50.69msRequest Duration
Joomla! Version5.2.3
PHP Version8.3.20
Identityguest
Response200
Templatecassiopeia
Database
Server
mysql
Version
10.5.22-MariaDB
Collation
latin1_swedish_ci
Conn Collation
utf8mb4_general_ci
$_GET
[]
$_POST
[]
$_SESSION
array:1 [ "joomla" => "***redacted***" ]
$_COOKIE
[]
$_SERVER
array:51 [ "USER" => "apache" "HOME" => "/usr/share/httpd" "SCRIPT_NAME" => "/index.php" "RE...
session
array:3 [ "counter" => 1 "timer" => array:3 [ "start" => 1750115583 "last" => 1750115583...
registry
array:3 [ "data" => [] "initialized" => false "separator" => "." ]
user
array:21 [ "id" => 0 "name" => null "username" => null "email" => null "password" => "***r...
  • afterLoad (85.42KB) (1.26ms)
  • afterInitialise (1.14MB) (5.93ms)
  • afterRoute (179.16KB) (1.43ms)
  • beforeRenderComponent com_content (100.7KB) (527μs)
  • Before Access::preloadComponents (all components) (33.45KB) (333μs)
  • After Access::preloadComponents (all components) (107.06KB) (582μs)
  • Before Access::preloadPermissions (com_content) (1.57KB) (7μs)
  • After Access::preloadPermissions (com_content) (16.22MB) (26.49ms)
  • Before Access::getAssetRules (id:26970 name:com_content.article.30611) (514.65KB) (807μs)
  • After Access::getAssetRules (id:26970 name:com_content.article.30611) (7.38KB) (35μs)
  • afterRenderComponent com_content (433KB) (5.93ms)
  • afterDispatch (2.25KB) (43μs)
  • beforeRenderRawModule mod_articles_category (Banco de Circuitos) (358.53KB) (1.53ms)
  • afterRenderRawModule mod_articles_category (Banco de Circuitos) (15.86KB) (289μs)
  • beforeRenderRawModule mod_finder (Busca_inteligente) (1.51KB) (137μs)
  • afterRenderRawModule mod_finder (Busca_inteligente) (128.99KB) (1.31ms)
  • beforeRenderModule mod_articles_category (Banco de Circuitos) (9.27KB) (601μs)
  • afterRenderModule mod_articles_category (Banco de Circuitos) (5.47KB) (61μs)
  • beforeRenderModule mod_finder (Busca_inteligente) (6.64KB) (182μs)
  • afterRenderModule mod_finder (Busca_inteligente) (4.44KB) (46μs)
  • afterRender (282.06KB) (3.06ms)
  • 1 x After Access::preloadPermissions (com_content) (16.22MB) (52.26%)
    26.49ms
    1 x afterRenderComponent com_content (433KB) (11.69%)
    5.93ms
    1 x afterInitialise (1.14MB) (11.69%)
    5.93ms
    1 x afterRender (282.06KB) (6.04%)
    3.06ms
    1 x beforeRenderRawModule mod_articles_category (Banco de Circuitos) (358.53KB) (3.01%)
    1.53ms
    1 x afterRoute (179.16KB) (2.82%)
    1.43ms
    1 x afterRenderRawModule mod_finder (Busca_inteligente) (128.99KB) (2.57%)
    1.31ms
    1 x afterLoad (85.42KB) (2.49%)
    1.26ms
    1 x Before Access::getAssetRules (id:26970 name:com_content.article.30611) (514.65KB) (1.59%)
    807μs
    1 x beforeRenderModule mod_articles_category (Banco de Circuitos) (9.27KB) (1.19%)
    601μs
    1 x After Access::preloadComponents (all components) (107.06KB) (1.15%)
    582μs
    1 x beforeRenderComponent com_content (100.7KB) (1.04%)
    527μs
    1 x Before Access::preloadComponents (all components) (33.45KB) (0.66%)
    333μs
    1 x afterRenderRawModule mod_articles_category (Banco de Circuitos) (15.86KB) (0.57%)
    289μs
    1 x beforeRenderModule mod_finder (Busca_inteligente) (6.64KB) (0.36%)
    182μs
    1 x beforeRenderRawModule mod_finder (Busca_inteligente) (1.51KB) (0.27%)
    137μs
    1 x afterRenderModule mod_articles_category (Banco de Circuitos) (5.47KB) (0.12%)
    61μs
    1 x afterRenderModule mod_finder (Busca_inteligente) (4.44KB) (0.09%)
    46μs
    1 x afterDispatch (2.25KB) (0.08%)
    43μs
    1 x After Access::getAssetRules (id:26970 name:com_content.article.30611) (7.38KB) (0.07%)
    35μs
    1 x Before Access::preloadPermissions (com_content) (1.57KB) (0.01%)
    7μs
21 statements were executed, 5 of which were duplicates, 16 unique18.24ms1.64MB
  • SELECT @@SESSION.sql_mode;37μs968B/libraries/src/Session/MetadataManager.php:184Copy
  • SELECT `session_id` FROM `incbmx_session` WHERE `session_id` = :session_id LIMIT 195μs1.3KBParams/libraries/src/Session/MetadataManager.php:187Copy
  • INSERT INTO `incbmx_session` (`session_id`,`guest`,`time`,`userid`,`username`,`client_id`) VALUES (:session_id, :guest, :time, :user_id, :username, :client_id)261μs944BParams/libraries/src/Session/MetadataManager.php:260Copy
  • SELECT `id`,`rules` FROM `incbmx_viewlevels`52μs656B/libraries/src/Access/Access.php:955Copy
  • SELECT `b`.`id` FROM `incbmx_usergroups` AS `a` LEFT JOIN `incbmx_usergroups` AS `b` ON `b`.`lft` <= `a`.`lft` AND `b`.`rgt` >= `a`.`rgt` WHERE `a`.`id` = :guest77μs1.64KBParams/libraries/src/Access/Access.php:868Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`279μs20.2KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `incbmx_assets` WHERE `name` IN (:preparedArray1,:preparedArray2,:preparedArray3,:preparedArray4,:preparedArray5,:preparedArray6,:preparedArray7,:preparedArray8,:preparedArray9,:preparedArray10,:preparedArray11,:preparedArray12,:preparedArray13,:preparedArray14,:preparedArray15,:preparedArray16,:preparedArray17,:preparedArray18,:preparedArray19,:preparedArray20,:preparedArray21,:preparedArray22,:preparedArray23,:preparedArray24,:preparedArray25,:preparedArray26,:preparedArray27,:preparedArray28,:preparedArray29,:preparedArray30,:preparedArray31,:preparedArray32,:preparedArray33,:preparedArray34,:preparedArray35,:preparedArray36,:preparedArray37,:preparedArray38,:preparedArray39)423μs7.44KBParams/libraries/src/Access/Access.php:357Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `incbmx_assets` WHERE `name` LIKE :asset OR `name` = :extension OR `parent_id` = 014.52ms1.48MBParams/libraries/src/Access/Access.php:301Copy
  • SHOW FULL COLUMNS FROM `incbmx_content`360μs2.39KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • UPDATE `incbmx_content` SET `hits` = (`hits` + 1) WHERE `id` = '30611'118μs48B/libraries/src/Table/Table.php:1348Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `incbmx_content` AS `a` INNER JOIN `incbmx_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `incbmx_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `incbmx_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `incbmx_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `incbmx_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)155μs54.13KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`180μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `m`.`tag_id`,`t`.* FROM `incbmx_contentitem_tag_map` AS `m` INNER JOIN `incbmx_tags` AS `t` ON `m`.`tag_id` = `t`.`id` WHERE `m`.`type_alias` = :contentType AND `m`.`content_item_id` = :id AND `t`.`published` = 1 AND `t`.`access` IN (:preparedArray1,:preparedArray2)223μs3.97KBParams/libraries/src/Helper/TagsHelper.php:388Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`211μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT DISTINCT a.id, a.title, a.name, a.checked_out, a.checked_out_time, a.note, a.state, a.access, a.created_time, a.created_user_id, a.ordering, a.language, a.fieldparams, a.params, a.type, a.default_value, a.context, a.group_id, a.label, a.description, a.required, a.only_use_in_subform,l.title AS language_title, l.image AS language_image,uc.name AS editor,ag.title AS access_level,ua.name AS author_name,g.title AS group_title, g.access as group_access, g.state AS group_state, g.note as group_note FROM incbmx_fields AS a LEFT JOIN `incbmx_languages` AS l ON l.lang_code = a.language LEFT JOIN incbmx_users AS uc ON uc.id=a.checked_out LEFT JOIN incbmx_viewlevels AS ag ON ag.id = a.access LEFT JOIN incbmx_users AS ua ON ua.id = a.created_user_id LEFT JOIN incbmx_fields_groups AS g ON g.id = a.group_id LEFT JOIN `incbmx_fields_categories` AS fc ON fc.field_id = a.id WHERE ( (`a`.`context` = :context AND (`fc`.`category_id` IS NULL OR `fc`.`category_id` IN (:preparedArray1,:preparedArray2,:preparedArray3)) AND `a`.`access` IN (:preparedArray4,:preparedArray5)) AND (`a`.`group_id` = 0 OR `g`.`access` IN (:preparedArray6,:preparedArray7)) AND `a`.`state` = :state) AND (`a`.`group_id` = 0 OR `g`.`state` = :gstate) AND `a`.`only_use_in_subform` = :only_use_in_subform ORDER BY a.ordering ASC453μs4.81KBParams/libraries/src/MVC/Model/BaseDatabaseModel.php:164Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`245μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `name`,`element` FROM `incbmx_extensions` WHERE `type` = 'plugin' AND `folder` = 'finder' AND `enabled` = 1211μs1.89KB/administrator/components/com_finder/src/Helper/LanguageHelper.php:135Copy
  • SELECT `title` FROM `incbmx_finder_taxonomy` WHERE `parent_id` = 1 AND `state` = 1 AND `access` IN (1,5)89μs648B/administrator/components/com_finder/src/Indexer/Taxonomy.php:325Copy
  • SELECT * FROM `incbmx_schemaorg` WHERE `itemId` = :itemId AND `context` = :context59μs1.55KBParams/plugins/system/schemaorg/src/Extension/Schemaorg.php:403Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `incbmx_content` AS `a` INNER JOIN `incbmx_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `incbmx_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `incbmx_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `incbmx_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `incbmx_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)135μs54.17KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT SUM(CASE WHEN `a`.`next_execution` <= :now THEN 1 ELSE 0 END) AS due_count,SUM(CASE WHEN `a`.`locked` IS NULL THEN 0 ELSE 1 END) AS locked_count FROM `incbmx_scheduler_tasks` AS `a` WHERE `a`.`state` = 157μs1.37KBParams/administrator/components/com_scheduler/src/Model/TasksModel.php:465Copy