Temporizadores son una de las funciones mas usadas en microcontroladores y por esta razon es importante conocer como se pueden implimentar de una manera optimizada. La mayoria de compiladores para microcontroladores traen funciones para hacer temporizaciones por delay, pero estos interrunpen la ejecucion principal del programa y no son muy practicos.

Casi todos los proyectos electrónicos con microcontrolador hacen uso de los temporizadores para su funcionamiento. Una de las técnicas más comunes, es usar un Timer físico (TIM) del microcontrolador para generar una interrupción a cada milisegundo y a partir de esta interrupción, incrementar o decrementar contadores para generar los tiempos de los temporizadores. Este método tiene un inconveniente cuando el proyecto usa muchos temporizadores, pues la rutina de interrupción puede usar mucho tiempo de la CPU. Otra técnica es usar temporizadores por delay, pero estos tienen el inconveniente de no poder estar leyendo las entradas del microcontrolador mientras se esté ejecutando el delay. En este artículo describiremos como usar y codificar temporizadores dinámicos que eliminan los anteriores inconvenientes.

 

TEMPORIZADOES DINAMICOS

Este método usa solo un contador en la interrupción del timer físico (TIM) y a partir de este contador, generar todas las temporizaciones necesarias. El código presentado en este artículo puede ser adaptado a cualquier microcontrolador ARM de cualquier marca/fabricante o cualquier microcontrolador de 8/16 bits con buena memoria RAM. El código fuente presentado en este artículo, fue testado en el microcontrolador STM32L152RB, un ARM de 32 bit del fabricante ST. En la figura 1 podemos observar un diagrama de archivos fuentes para el código presentado en este artículo.

 

Figura 1
Figura 1

 

 

El código para la interrupción es el siguiente:

extern uint32_t systemTimer;

void TIM3_IRQHandler()

{

if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)

{

TIM_ClearITPendingBit(TIM3, TIM_IT_Update);

 systemTimer++;

}

}

 

El código para este artículo usa el Timer 3 (TIM3) del microcontrolador, pero puede ser usado cualquier Timer que este configurado para ejecutar una interrupción a cada 1 milisegundo.

Ahora, se debe implementar un archivo SystemTimer.c que use el contador systemTimer. El código para el archivo seria:

#include "SystemTimer.h"

uint32_t systemTimer;

 

******************************************************************/

uint32_t SystemTimer_GetTime()

{

return systemTimer;

}

 

******************************************************************/

void SystemTimer_Init()

{

systemTimer = 0;

}

 

Este archivo fuente usa dos funciones: SystemTimer_GetTime() que retorna el valor del contador systemTimer y la función SystemTimer_Init() que inicializa el contador systemTimer a cero. Esta última función es llamada en el reset del microcontrolador.

 

El archivo cabecera SystemTimer.h seria:

 

uint32_t SystemTimer_GetTime(void);

void SystemTimer_Init(void);

 

Ahora, debemos implementar un archivo que use las funciones del archivo fuente SystemTimer.c, para crear los temporizadores dinámicos. A este archivo le podemos dar el nombre Timer.c y su código seria:

 

#include "Timer.h"

#include "SystemTimer.h"

 

******************************************************************/

uint32_t Timer_GetTime(Timer *p)

{

uint32_t systemTimer;

uint32_t timeSpan;

 

if(p->enabled == false)

return 0;

 

if(p->enabled != true)

return 0;

 

systemTimer = SystemTimer_GetTime();

 

if(systemTimer < p->startTime)

{

timeSpan = (0xFFFFFFFF - p->startTime) + systemTimer;

}

else

{

timeSpan = systemTime - p->startTimer;

}

 

return timeSpan;

}

 

******************************************************************/

void Timer_SetInterval(Timer *p, uint32_t interval)

{

p->interval = interval;

}

 

******************************************************************/

void Timer_Start(Timer *p)

{

p->startTime = SystemTimer_GetTime();

p->enabled = true;

}

 

******************************************************************/

void Timer_Stop(Timer *p)

{

p->enabled = false;

}

 

******************************************************************/

boolean Timer_Elapsed(Timer *p)

{

uint32_t timeSpan = Timer_GetTime(p);

 

if(timeSpan == 0)

return false;

 

if(timeSpan < p->interval)

return false;

 

Timer_Stop(p);

return true;

}

 

******************************************************************/

void Timer_Init(Timer *p, uint32_t interval)

{

p->startTime = 0;

p->interval = interval;

p->enabled = false;

}

 

La función Timer_Start() es usada para arrancar el Temporizador dinámico y la función Timer_Stop() es usada para parar el Temporizador. La función Timer_Init() es usada para inicializar el temporizador y es llamadas en el reset del microcontrolador.

La función Timer_SetInterval() es usada para programar el intervalo en microsegundos del Temporizador. Este intervalo también puede ser programado en la función Timer_Init().

Para saber cuándo el Temporizador llego a su tiempo programado, se usa la función Timer_Elapsed(), la cual retorna verdadero cuando el tiempo elapso. Para usar el Timer del sistema que creamos anteriormente con la interrupción del Timer físico 3 y el archivo fuente SystemTimer.c, usamos la función Timer_GetTime().

 

El archivo cabecera Timer.h seria:

 

typedef struct

{

uint32_t startTime;

uint32_t interval;

boolean enabled;

}Timer;

 

uint32_t Timer_GetTime(Timer *p);

void Timer_SetInterval(Timer *p, uint32_t interval);

void Timer_Start(Timer *p);

void Timer_Stop(Timer *p);

boolean Timer_Elapsed(Timer *p);

void Timer_Init(Timer *p, uint32_t interval);

 

La figura 2 muestra el diagrama en bloques de un hardware típico con microcontrolador, donde tenemos varias entradas y salidas. En la figura 3 podemos observar que usando estos temporizadores dinámicos, podemos leer las entradas y ejecutar las temporizaciones, sin detener el programa principal.

 

Figura 2
Figura 2

 

 

Figura 3
Figura 3

 

En el siguiente archivo fuente main.c, podemos ver cómo utilizar los temporizadores dinámicos.

#include "Timer.h"

 

Timer salida_1_Timer;

Timer salida_2_Timer;

Timer salida_3_Timer;

 

int main()

{

Init_IO();

 

Timer_Init(&salida_1_Timer, 3000);

Timer_Init(&salida_2_Timer, 1000);

Timer_Init(&salida_3_Timer, 200);

 

 

while(1)

{

if(Timer_Elapsed(&salida_1_Timer))

{

Toggle_Saladia_1();

}

 

if(Timer_Elapsed(&salida_2_Timer))

{

Toggle_Saladia_2();

}

 

if(Timer_Elapsed(&salida_3_Timer))

{

Toggle_Saladia_3();

}

}

}

 

En próximos artículos utilizaremos estos temporizadores dinámicos para ejemplos de proyectos con microcontroladores.

 

 

 

19.035MBMemory Usage43.27msRequest 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:49 [ "USER" => "apache" "HOME" => "/usr/share/httpd" "PATH_TRANSLATED" => "redirect:/ind...
session
array:3 [ "counter" => 1 "timer" => array:3 [ "start" => 1751697985 "last" => 1751697985...
registry
array:3 [ "data" => [] "initialized" => false "separator" => "." ]
user
array:21 [ "id" => 0 "name" => null "username" => null "email" => null "password" => "***r...
  • afterLoad (85.66KB) (213μs)
  • afterInitialise (1.14MB) (3.16ms)
  • afterRoute (179.16KB) (1.06ms)
  • beforeRenderComponent com_content (100.7KB) (387μs)
  • Before Access::preloadComponents (all components) (33.45KB) (159μs)
  • After Access::preloadComponents (all components) (107.06KB) (371μs)
  • Before Access::preloadPermissions (com_content) (1.57KB) (7μs)
  • After Access::preloadPermissions (com_content) (16.22MB) (20.39ms)
  • Before Access::getAssetRules (id:8 name:com_content) (480.08KB) (2.85ms)
  • After Access::getAssetRules (id:8 name:com_content) (7.36KB) (46μs)
  • afterRenderComponent com_content (451.64KB) (6.67ms)
  • afterDispatch (2.25KB) (62μs)
  • beforeRenderRawModule mod_articles_category (Banco de Circuitos) (422.53KB) (1.67ms)
  • afterRenderRawModule mod_articles_category (Banco de Circuitos) (15.43KB) (349μs)
  • beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (94μs)
  • afterRenderRawModule mod_finder (Busca_inteligente) (63.02KB) (1.19ms)
  • beforeRenderModule mod_articles_category (Banco de Circuitos) (9.27KB) (566μs)
  • afterRenderModule mod_articles_category (Banco de Circuitos) (5.47KB) (77μs)
  • beforeRenderModule mod_finder (Busca_inteligente) (6.21KB) (199μs)
  • afterRenderModule mod_finder (Busca_inteligente) (4.44KB) (54μs)
  • afterRender (304.17KB) (3.6ms)
  • 1 x After Access::preloadPermissions (com_content) (16.22MB) (47.12%)
    20.39ms
    1 x afterRenderComponent com_content (451.64KB) (15.41%)
    6.67ms
    1 x afterRender (304.17KB) (8.31%)
    3.60ms
    1 x afterInitialise (1.14MB) (7.3%)
    3.16ms
    1 x Before Access::getAssetRules (id:8 name:com_content) (480.08KB) (6.58%)
    2.85ms
    1 x beforeRenderRawModule mod_articles_category (Banco de Circuitos) (422.53KB) (3.86%)
    1.67ms
    1 x afterRenderRawModule mod_finder (Busca_inteligente) (63.02KB) (2.76%)
    1.19ms
    1 x afterRoute (179.16KB) (2.45%)
    1.06ms
    1 x beforeRenderModule mod_articles_category (Banco de Circuitos) (9.27KB) (1.31%)
    566μs
    1 x beforeRenderComponent com_content (100.7KB) (0.89%)
    387μs
    1 x After Access::preloadComponents (all components) (107.06KB) (0.86%)
    371μs
    1 x afterRenderRawModule mod_articles_category (Banco de Circuitos) (15.43KB) (0.81%)
    349μs
    1 x afterLoad (85.66KB) (0.49%)
    213μs
    1 x beforeRenderModule mod_finder (Busca_inteligente) (6.21KB) (0.46%)
    199μs
    1 x Before Access::preloadComponents (all components) (33.45KB) (0.37%)
    159μs
    1 x beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (0.22%)
    94μs
    1 x afterRenderModule mod_articles_category (Banco de Circuitos) (5.47KB) (0.18%)
    77μs
    1 x afterDispatch (2.25KB) (0.14%)
    62μs
    1 x afterRenderModule mod_finder (Busca_inteligente) (4.44KB) (0.12%)
    54μs
    1 x After Access::getAssetRules (id:8 name:com_content) (7.36KB) (0.11%)
    46μs
    1 x Before Access::preloadPermissions (com_content) (1.57KB) (0.02%)
    7μs
23 statements were executed, 5 of which were duplicates, 18 unique11.8ms1.58MB
  • SELECT @@SESSION.sql_mode;32μs968B/libraries/src/Session/MetadataManager.php:184Copy
  • SELECT `session_id` FROM `incbmx_session` WHERE `session_id` = :session_id LIMIT 166μ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)123μs944BParams/libraries/src/Session/MetadataManager.php:260Copy
  • SELECT `id`,`rules` FROM `incbmx_viewlevels`47μ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` = :guest64μ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`402μ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)217μ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` = 07.66ms1.48MBParams/libraries/src/Access/Access.php:301Copy
  • SHOW FULL COLUMNS FROM `incbmx_assets`385μs2.02KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • SELECT * FROM `incbmx_assets` WHERE `name` = 'com_content.article.1581'109μs912B/libraries/src/Table/Table.php:780Copy
  • SHOW FULL COLUMNS FROM `incbmx_content`333μs1.77KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • UPDATE `incbmx_content` SET `hits` = (`hits` + 1) WHERE `id` = '1581'230μ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)201μs22.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`237μ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)271μ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`177μ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 ASC420μs6.06KBParams/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`202μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `name`,`element` FROM `incbmx_extensions` WHERE `type` = 'plugin' AND `folder` = 'finder' AND `enabled` = 1151μs656B/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)95μs648B/administrator/components/com_finder/src/Indexer/Taxonomy.php:325Copy
  • SELECT * FROM `incbmx_schemaorg` WHERE `itemId` = :itemId AND `context` = :context65μ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)241μs22.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` = 172μs1.37KBParams/administrator/components/com_scheduler/src/Model/TasksModel.php:465Copy
  • warningassets - No asset found for com_content.article.1581, falling back to com_content
  • warningassets - No asset found for com_content.article.1581, falling back to com_content
  • warningassets - No asset found for com_content.article.1581, falling back to com_content
  • warningassets - No asset found for com_content.article.1581, falling back to com_content
  • warningassets - No asset found for com_content.article.1581, falling back to com_content
  • warningassets - No asset found for com_content.article.1581, falling back to com_content
  • warningassets - No asset found for com_content.article.1581, falling back to com_content
  • warningassets - No asset found for com_content.article.1581, falling back to com_content
  • warningassets - No asset found for com_content.article.1581, falling back to com_content
  • warningassets - No asset found for com_content.article.1581, falling back to com_content