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 MPLABCluster_Fatec.Xe um notebooksrc_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:
- Dia LCD. Compilar só
LCD_16x2, validar_XTAL_FREQ, corrigir mentalmente ounsigned int = -100, anotar o que o driver de float realmente mostra. Critério: string estável sem flicker absurdo. - 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_1no laço. Comparar com o hábito de OB de CLP. - Dia ECU cabeçalho. Desenhar o diagrama de blocos só com os
#definepú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). - 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. - Dia estilo. Abrir o PDF de padrão C e checar um
.ccontra o guia — cabeçalho, nomes, includes. O exercício é disciplina, não burocracia. - 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.cdo Task Manager além do que oConfig.hdeclara. - Não extraio pinouts de
SHRC/Hardwareque 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.