Fatec Eletrônica Automotiva: cluster, ECU monoponto e C no PIC18

O repositório FATEC-ELETRONICA-0731723003-Wilson é o caderno de curso — RA 0731723003 — da graduação em Eletrônica Automotiva na Fatec Santo André. Não é portfólio de produto e não é firmware de concessionária. É o lugar onde o PIC18F4550 deixa de ser só LED e vira metáfora de veículo: cluster, ECU monoponto de laboratório, LCD e um escalonador cooperativo de tarefas.

Versionado em 2020 sobre material de lab (ECU do prof. Edson Kitani; Config.h do Task Manager com autoria de Weslley Torres). E-E-A-T da Wilson Tecnologia começa aqui: tecnólogo que leu PIP e MAP no pino antes de montar painel com CLP e de mexer com Jetson.

O que o repositório de fato contém

Cinco entradas na raiz:

  • Cluster_Fatec/ — projeto MPLAB Cluster_Fatec.X e um notebook src_python/uart.ipynb.
  • ECU_gol_1.0_Fatec/ECU_gol_1.0_Fatec.X, C de ECU monoponto para Gol.
  • LCD_16x2_FATEC/LCD_16x2.X, driver e tela de teste.
  • Task_Manager/Task_Manager.X, firmware com várias unidades de tradução.
  • padrao_de_codificacao_estilo_linguagem_C.pdf — guia de estilo C do curso.

O README da raiz é só o título do repo. O conteúdo fala pelos .c e pelos cabeçalhos.

Ambiente recorrente nos arquivos que eu abri: MPLAB X v3.65, XC8 v1.45 Free, PIC18F4550, _XTAL_FREQ 48000000. É o mesmo trio do pic_mcu. A diferença é a aplicação.

LCD 16x2: o HMI do laboratório

LCD_16x2_FATEC é o exercício mais explícito. O main.c inicializa MCC e o display e, no laço, chama screen_1(): string "LCD Wilson", um inteiro, um char 0xAA e um float. Cursor endereçado por macros cursor_LxC_…. Data do cabeçalho: 29/08/2020, responsável Wilson Queiroz de Oliveira.

Isso não é cluster. É prova de driver. Sem essa prova, o cluster e a ECU escrevem no vazio. O HD44780 cobra inicialização, nibble/byte e delay; o XC8 cobra _XTAL_FREQ coerente com o config bit do PLL. Nos pragma config deste exercício (e do cluster) aparecem EC_EC, BOR ligado, WDT desligado, LVP ligado, proteção de código desligada — perfil de bancada, não de peça lacrada.

Nota de bancada. unsigned int integer = -100 no screen_1 é um detalhe que o professor de C marca com caneta vermelha: conversão signed/unsigned e o que o driver de inteiro realmente imprime. Deixo o fato no artigo porque o arquivo está assim. Em IHM de máquina, número errado de sinal é o tipo de bug que o operador acredita.

Cluster: UART, LCD e interrupção

Cluster_Fatec.X junta UART.c/.h, lcd_16x2.c/.h, map_lcd_16x2.h, Config.h/mcc.c e um main.c curto. O main configura MCU, LCD e UART e entra em while(1) vazio. O trabalho visível está na ISR de alta prioridade: chama screen_1(), incrementa LEDs (LATB), lê UART se houver dado e ecoa o caractere + a string "wilson".

Interpretação honesta: é um esqueleto de cluster didático — display + serial + LED como “tell-tale” — não um painel de instrumentos com stepper de velocímetro, CAN e rede de airbag. O notebook uart.ipynb no lado Python confirma a intenção: falar com a placa pela serial, do host.

Ponte industrial. Cluster de veículo e IHM de máquina resolvem o mesmo problema de confiança: o operador só acredita no processo se o HMI atualiza. Colocar o redesenho da tela dentro da ISR é didático e perigoso. ISR longa é o jeito de perder byte na UART e de atrasar a próxima interrupção. No CLP, o análogo é lotar a OB de tempo-cíclico com receita de tela. O hábito adulto — que este main ainda não pratica — é flag na ISR e pintura no laço.

ECU_gol_1.0: monoponto de laboratório, não ECU de rua

O config.h da ECU é o arquivo mais honesto do repositório. Cabeçalho do lab Fatec Santo André, processador PIC18F4550, MPLAB X 3.65 + XC8 1.45, autor original prof. Edson Kitani (12/02/2019), licença “somente para fins didáticos”, descrição: ECU de EFI monoponto para o veículo Gol, versão usada no lab para teste das placas, histórico 1.0 em 29/08/2019, update 2020 por Wilson Queiroz de Oliveira.

Os #define de I/O que o cabeçalho publica:

  • Saida_Bico — RB3, liga/desliga bico injetor.
  • Ocilador — RB2, sinal da interrupção de tempo.
  • Ent_MAP — RB1, interrupção do sinal do MAP.
  • Ent_PIP — RB0, interrupção do sinal PIP.
  • Botões em RE0, RE1, RE3.

PIP (Profile Ignition Pickup, vocabulário Ford que o material didático brasileiro herdou) é o pulso de rotação/fase que dispara a lógica de ignição/injeção no tempo do motor. MAP (Manifold Absolute Pressure) é pressão absoluta do coletor — carga. Bico é o atuador. Monoponto = um injetor no corpo de borboleta, não um injetor por cilindro. Gol 1.0 de aula é o motor que o lab tem, não uma declaração de homologação.

Modelo mental certo: sincronismo (PIP) + carga (MAP) + tempo + bico + HMI de bancada. Modelo errado: “posso reflashar o Gol da rua”. Placa de lab, WDT off, sem UDS/EEPROM/ISO 26262 neste cabeçalho. O arquivo diz: fins didáticos, teste de placas.

Nota de bancada. Injetor e bobina são atuadores de energia. Não descrevo instalação em veículo. Quem copiar o repo para um motor de rua sem o dossiê do lab está fora do escopo. No quadro, o análogo é o CLP que pulsa válvula a partir de encoder e pressão: física irmã, processo de segurança não.

Task_Manager: oito tarefas e o começo do “ciclo”

Task_Manager.X é o firmware mais fatiado: ADC, Hardware, I2C_SW (I²C por software), SHRC, UART, displayLCD, Config.h e um main.c de ~21 KB. O Config.h (autor no comentário: Weslley Torres) define clock 48 MHz, valor inicial de Timer0, oito tarefas com períodos em ms (10, 1000, 1000, 1, 100, 1, 1, 100) e TASK_TIMEOUT de 100 ms.

Isso é um escalonador cooperativo cíclico — o primo acadêmico do ciclo de varredura do CLP. Cada tarefa tem índice e prazo. Timeout de 100 ms é o germe de um watchdog de tarefa: se a rotina não devolve o controle, alguém precisa notar. Não afirmo a política exata do main.c que não fechei neste estudo; afirmo o que o cabeçalho declara.

O tree ainda traz ADC, I²C por software (I2C_SW, arquivo grande — start/stop/ACK no pino), UART, displayLCD, Hardware e SHRC (no vocabulário de bancada, em geral expansão por shift-register; não extraio pinos que não li).

Ponte industrial. CLP tem imagem de processo, ciclo livre ou cíclico, watchdog de scan e tarefas de tempo. O Task Manager é essa ideia em C no PIC, sem IEC 61131. Quem programa painel e depois abre este repo para de reconhecer TIME_TO_EXECUTE_TASKn. Quem só viu Arduino delay() encontra, enfim, a razão de o delay ser inimigo.

O PDF de estilo C

padrao_de_codificacao_estilo_linguagem_C.pdf é o documento de disciplina do curso. Não transcrevo o PDF. O fato de ele existir já é o recado: nome de arquivo, guarda de include, comentário de cabeçalho com ambiente e responsável — os .c do LCD e da ECU seguem esse ritual. Em item ASIL o ritual vira MISRA, HIS, directive de compilador e review obrigatório. No curso, vira hábito de não entregar main.c anônimo.

Armadilhas da toolchain MPLAB/XC8 nestes labs

O curso congela um trio antigo de propósito pedagógico: MPLAB X 3.65 + XC8 1.45 Free + PIC18F4550. Quem abre o .X em IDE nova sem migrar o projeto encontra o primeiro muro.

Versão de IDE versus formato de projeto. Arquivos de configuração do MPLAB X mudam entre major versions. Abrir e “deixar a IDE converter” sem commit intermediário é o jeito de perder o build que compilava no lab. Hábito: guardar o número da IDE/compilador no cabeçalho (já está nos arquivos) e, se migrar, migrar num branch com diff revisável.

_XTAL_FREQ versus config bit. Delay do XC8 e baud da UART assumem a frequência declarada. Se o pragma põe PLL/EC em 48 MHz e o #define mente, o LCD “funciona às vezes” e a serial vira lixo. Sintoma idêntico ao crystal errado na Blue Pill: o silício obedece à física, não ao comentário.

MCC gerado versus hand-written. Vários labs misturam mcc.c/Config.h gerados com drivers manuais de LCD/UART. Regenerar MCC por cima sem diff é apagar o que o aluno ajustou. Regra de bancada: MCC é ponto de partida; depois do primeiro ajuste manual, trate os arquivos gerados como código seu sob versionamento.

LVP ligado e WDT desligado. Bom para gravar e depurar no PK3/ICD. Ruim como hábito mental de “produto”. Em painel, watchdog desligado em runtime é o primo do Task Manager sem TASK_TIMEOUT. O lab ensina o pino; a fábrica exige a política.

Heap e printf no PIC18 Free. A edição Free do XC8 da época tinha limites conhecidos de otimização. Empilhar printf float no LCD ensina formato — e ensina a estourar stack se alguém copiar o padrão para ISR. O cluster que pinta tela na ISR de alta prioridade é o exemplo didático do anti-padrão.

Python uart.ipynb e porta serial no host. Notebook é ótimo para eco e gráfico rápido. Não é substituto de teste de regressão: kernel reiniciado, porta ocupada pelo MPLAB, baud divergente. Documentar a porta e o baud ao lado do notebook evita a sessão “não funciona” que na verdade é cabo/driver.

Analogias industriais: do Gol de lab ao quadro e à linha

A eletrônica automotiva de curso e a automação de fábrica compartilham vocabulário de sinal, mesmo quando o hardware muda:

  • PIP/encoder. Pulso de sincronismo no motor ↔ encoder incremental na esteira ou no eixo de um inversor. Perder borda é perder fase; debounce e prioridade de IRQ importam nos dois mundos.
  • MAP/transmissor de pressão. Carga do coletor ↔ 4–20 mA ou 0–10 V de processo. Escala, offset e falha de sensor (fio aberto) são o mesmo tipo de problema de confiança.
  • Bico/válvula. Atuador energizado por tempo ↔ válvula solenóide com tempo mínimo/máximo. Energia, diodo de roda livre e interlock de segurança não aparecem no #define — mas o técnico que só viu o define aprende a respeitar o bornes quando sobe ao quadro.
  • Cluster/IHM. Tell-tale e LCD 16x2 ↔ sinótico e alarme. Atualizar display dentro da ISR ↔ atualizar tela dentro da OB crítica: ambos ensinam o que não fazer em produção.
  • Task Manager/ciclo de CLP. Oito tarefas com período ↔ programas cíclicos e TON/TOF. Timeout de tarefa ↔ watchdog de scan. A Fatec entrega a metáfora em C; o CLP entrega a metáfora em IEC 61131 — o reflexo de “não bloquear o ciclo” é o mesmo.

Nenhuma dessas pontes transforma o ECU_gol_1.0 em item de linha. Elas explicam por que o tecnólogo que fez o lab lê um diagrama de esteira sem achar que “automação é outro universo”.

Roteiro de estudo para reler o caderno Fatec com olho de hoje

O repo já está populado; o roteiro abaixo é de releitura produtiva, não de feature inventada:

  1. Dia LCD. Compilar só LCD_16x2, validar _XTAL_FREQ, corrigir mentalmente o unsigned int = -100, anotar o que o driver de float realmente mostra. Critério: string estável sem flicker absurdo.
  2. Dia UART/cluster. Separar, no papel, o que está na ISR e o que deveria estar no while(1). Propor (sem obrigar commit) um refactor: flag na ISR, screen_1 no laço. Comparar com o hábito de OB de CLP.
  3. Dia ECU cabeçalho. Desenhar o diagrama de blocos só com os #define públicos: PIP, MAP, bico, botões, oscilador de tempo. Escrever uma página: “o que este lab avalia na placa” versus “o que uma ECU de rua exigiria a mais” (EEPROM de calibração, diagnóstico, WDT, rede).
  4. Dia Task Manager. Listar as oito tarefas pelos períodos do Config.h. Marcar quais períodos competem entre si (várias em 1 ms). Relacionar com scan time e com a ideia de prioridade cooperativa.
  5. Dia estilo. Abrir o PDF de padrão C e checar um .c contra o guia — cabeçalho, nomes, includes. O exercício é disciplina, não burocracia.
  6. Dia ponte. Escolher um sinal do lab (ex.: pulso) e escrever o análogo em painel (encoder + CLP + válvula) em dez linhas. Sem inventar projeto entregue; só mapear conceitos.

Critério de fechamento do roteiro: você explica o repo a outro técnico sem usar a frase “é tipo uma ECU de verdade” sem o qualificativo de laboratório.

O que o curso ensina versus produção ASIL

Ensina (Fatec / este repo) Não é
EFI monoponto de laboratório: PIP, MAP, bico, LCD, botão ECU de produção, homologação, calibração de frota
Cluster didático: UART + LCD + ISR Instrument cluster CAN, stepper, tell-tale normativo
Scheduler de 8 tarefas e timeout no header AUTOSAR OS, OSEK, ASIL-D tasking
I²C software, ADC, shift, HMI 16x2 Rede veicular (CAN-FD, LIN, FlexRay, Ethernet)
Guia de estilo C de disciplina Compilador qualificado, cobertura MC/DC, FMEDA
WDT off, LVP on, CP off nos pragmas de bancada Peça lacrada, secure boot, anti-tamper

ISO 26262 começaria pelo item: o que é a ECU, quais hazards (injeção a mais, ignição fora de tempo), qual ASIL. Uma placa de lab com injetor no protoboard não tem HARA. Tratar o ECU_gol_1.0 como “já fiz ECU” em currículo sem essa frase de escopo é o tipo de exagero que o mercado automotivo detecta em dois minutos.

A ponte legítima: o tecnólogo que fez esse lab lê diagrama de Gol e ladder de esteira com o mesmo reflexo — sinal, tempo, atuador, diagnóstico na tela. CLP e inversor são outra ferramenta, não outro planeta.

Limites honestos

  • Não reexecutei cada build neste texto; a descrição segue leitura dos fontes e cabeçalhos versionados.
  • Não afirmo a política completa do main.c do Task Manager além do que o Config.h declara.
  • Não extraio pinouts de SHRC/Hardware que não abri linha a linha neste estudo.
  • Não há métrica de “rpm alcançado” nem captura de bancada inventada.
  • Material de professores (Kitani, Torres) permanece creditado; este artigo não republica o PDF de estilo.
  • Nenhuma afirmação de uso em veículo de rua ou de conformidade ASIL.

Fechamento

FATEC-ELETRONICA-0731723003-Wilson é curso versionado: LCD que prova o driver, cluster que prova a serial, ECU monoponto que prova o sincronismo de laboratório, Task Manager que prova o ciclo, PDF que prova que C sem estilo vira dívida. Nenhuma dessas pastas é firmware de rua e nenhuma carrega ASIL. Todas são o chão em que eu pisei antes de montar quadro e de escrever os outros artigos desta série.