Nao pretendo fazer uma introducao formal aos microcontroladores, minha experiencia com eles e limitada e essencialmente pratica. Alem disso, textos introdutorios de excelente qualidade sobre o assunto sao facilmente encontrados na internet. Aqui serao discutidos alguns topicos praticos relacionados a caracteristicas da programacao de microcontroladores que talvez os programadores acostumados a programar computadores nao estejam habituados. O codigo usado como exemplo usa a biblioteca do Wixel que contem o CC2511F32 da Texas Instruments. Mas mesmo para quem usar outro microcontrolador, penso que serao de muita ajuda para os iniciantes porque os conceitos sao basicamente os mesmo para qualquer microcontrolador.Antes de tratar sobre a programacao e importante conhecer alguns conceitos basicos usados na arquitetura dos microcontroladores entao sugiro enfaticamente uma pesquisa introdutoria sobre o assunto. Abaixo alguns links:Como funcionam os microcontroladoresIntroducao aos MicrocontroladoresIntroducao ao Microcontrolador.Microcontroladores industriais (apostila)Introducao aos Microcontroladores (apostila)Loop infinitoA primeira coisa a saber sobre programacao de microcontroladores e que o programa esta sempre rodando dentro de um loop infinito. Quando o microcontrolador e ligado um codigo de inicializacao e executado e em seguida o programa entra em um loop infinito que so termina quando a energia e cortada. Normalmente dentro do loop estao chamadas a funcoes que monitoram o estado de alguma porta, pino, timer ou qualquer periferico disponivel e conforme o caso executam alguma acao ou retornam sem fazer nada, E preciso lembrar que essas funcoes serao chamadas uma vez a cada iteracao do loop, mas vao (ou deveriam) ocorrer milhares de iteracoes por segundo. O comportamento esperado e que na grande maioria das chamadas essas funcoes retornem sem nenhuma acao, entao e uma boa estrategia iniciar a funcao identificando o mais cedo possivel essa condicao e retornar executando o minimo de codigo possivel.Funcoes nao bloqueantesQuanto mais iteracoes por segundo o loop principal conseguir fazer, mais precisas serao as medidas feitas nos perifericos e mais imediatas serao as acoes de resposta do microcontrolador. Por isso e importante evitar escrever codigo que mantenha o fluxo de processamento preso em uma instrucao ou loop por muito tempo. Por exemplo, instrucoes que fazem o processamento "esperar" determinada quantidade de tempo ( do tipo delay(tempo) ), devem ser evitadas. Para entender o problema de usar usar funcoes bloqueantes, vamos considerar uma aplicacao bem simples que envolva alguns pinos. Suponha que o pino P1 deva ser monitorado e que o funcionamento normal do sistema exija este pino em nivel alto. Sempre que o pino P1 ficar em nivel baixo, um alarme conectado ao pino P2 tem que ser ligado e mantido assim ate o pino P1 voltar ao nivel alto. O programa para esta especificacao poderia ser algo como:#define mnPin P1#define pinAlarm P2 void main(){ // inicializacao setDigitalInput(mnPin, HIGH_IMPEDANCE); setDigitalOutput(pinAlarm, LOW); // loop principal while(1) { // monitoramento pinAlarm = !mnPin ; }} Apesar de simples e basico, o codigo acima e extremamente eficiente e preciso. No instante em que P1 estiver em nivel baixo, o pino de alarme e ativado. Isso sera verificado milhares de vezes por segundo, entao a reacao sera praticamente imediata.Entretanto, qualquer microcontrolador atual pode dar conta de muito mais codigo