Em geral, passar de microcontroladores de 8 a 16 a 32 bits significa que você terá menos restrições de recursos, principalmente memória, e a largura de registros usados para operações aritméticas e lógicas. Os monikers de 8, 16 e 32 bits geralmente se referem ao tamanho dos barramentos de dados internos e externos e também ao tamanho do (s) registro (s) interno (s) usado (s) para operações aritméticas e lógicas (costumava ser apenas um ou dois chamados acumuladores , agora geralmente existem bancos de registro de 16 ou 32).
Os tamanhos das portas de E / S também geralmente seguem o tamanho do barramento de dados; portanto, um micro de 8 bits terá portas de 8 bits, um de 16 bits terá portas de 16 bits etc.
Apesar de possuir um barramento de dados de 8 bits, muitos microcontroladores de 8 bits têm um barramento de endereço de 16 bits e podem endereçar 2 ^ 16 ou 64K bytes de memória (isso não significa que eles tenham algo próximo ao implementado). Porém, alguns micros de 8 bits, como os PICs low-end, podem ter apenas um espaço de RAM muito limitado (por exemplo, 96 bytes em um PIC16).
Para contornar seu esquema de endereçamento limitado, algumas micros de 8 bits usam paginação, onde o conteúdo de um registro de página determina um dos vários bancos de memória a serem usados. Geralmente haverá alguma RAM comum disponível, independentemente do registro de página.
O microcontrolador de 16 bits geralmente é restrito a 64 K de memória, mas também pode usar técnicas de paginação para contornar isso. Os microcontroladores de 32 bits obviamente não têm essas restrições e podem endereçar até 4 GB de memória.
Juntamente com os diferentes tamanhos de memória, está o tamanho da pilha. Nas micros de extremidade inferior, isso pode ser implementado em uma área especial da memória e ser muito pequeno (muitos PIC16s têm uma pilha de chamadas profundas de 8 níveis). Nos micros de 16 e 32 bits, a pilha geralmente terá RAM geral e será limitada apenas pelo tamanho da RAM.
Também existem grandes diferenças na quantidade de memória - tanto no programa quanto na RAM - implementada nos vários dispositivos. Os micros de 8 bits podem ter apenas algumas centenas de bytes de RAM e alguns milhares de bytes de memória de programa (ou muito menos - por exemplo, o PIC10F320 possui apenas 256 palavras de flash de 14 bits e 64 bytes de RAM). Micros de 16 bits podem ter alguns milhares de bytes de RAM e dezenas de milhares de bytes de memória do programa. Os micros de 32 bits geralmente têm mais de 64 KB de RAM e talvez 1/2 MB ou mais de memória de programa (o PIC32MZ2048 possui 2 MB de flash e 512 KB de RAM; o PIC32MZ2064DAH176, recém-lançado, otimizado para gráficos, possui 2 MB de flash e impressionantes 32 MB de RAM no chip).
Se você estiver programando em linguagem assembly, as limitações de tamanho do registro serão muito evidentes, por exemplo, adicionar dois números de 32 bits é uma tarefa árdua em um microcontrolador de 8 bits, mas trivial em um de 32 bits. Se você estiver programando em C, isso será amplamente transparente, mas é claro que o código compilado subjacente será muito maior para os 8-amargos.
Eu disse em grande parte transparente, porque o tamanho de vários tipos de dados C pode ser diferente de um tamanho micro para outro; por exemplo, um compilador que visa um micro de 8 ou 16 bits pode usar "int" para significar uma variável assinada de 16 bits, e em um micro de 32 bits isso seria uma variável de 32 bits. Muitos programas usam #defines para dizer explicitamente qual é o tamanho desejado, como "UINT16" para uma variável de 16 bits não assinada.
Se você estiver programando em C, o maior impacto será o tamanho de suas variáveis. Por exemplo, se você souber que uma variável sempre será menor que 256 (ou no intervalo -128 a 127 se assinado), use um 8 bits (caracter não assinado ou caractere) em um micro de 8 bits (por exemplo, PIC16 ), pois usar um tamanho maior será muito ineficiente. Da mesma forma, re variáveis de 16 bits em um micro de 16 bits (por exemplo, PIC24). Se você estiver usando um micro de 32 bits (PIC32), isso realmente não fará diferença, pois o conjunto de instruções MIPS possui instruções de byte, palavra e palavra dupla. No entanto, em alguns micros de 32 bits, se eles não tiverem essas instruções, manipular uma variável de 8 bits pode ser menos eficiente do que uma variável de 32 bits devido ao mascaramento.
Como o membro do fórum vsz apontou, em sistemas nos quais você tem uma variável maior que o tamanho padrão do registro (por exemplo, uma variável de 16 bits em um micro de 8 bits), e essa variável é compartilhada entre dois threads ou entre o thread base e um manipulador de interrupção, é preciso fazer qualquer operação (incluindo apenas a leitura) na variável atômica , ou seja, fazer parecer que ela é executada como uma instrução. Isso é chamado de seção crítica. A maneira padrão de atenuar isso é cercar a seção crítica com um par de interrupção de desativação / ativação.
Portanto, passando de sistemas de 32 bits para 16 bits ou 16 bits para 8 bits, todas as operações em variáveis desse tipo que agora são maiores que o tamanho padrão do registro (mas não antes) precisam ser consideradas críticas seção.
Outra diferença principal, passando de um processador PIC para outro, é o manuseio de periféricos. Isso tem menos a ver com o tamanho da palavra e mais com o tipo e o número de recursos alocados em cada chip. Em geral, o Microchip tentou tornar a programação do mesmo periférico usado em chips diferentes o mais semelhante possível (por exemplo, timer0), mas sempre haverá diferenças. O uso de suas bibliotecas periféricas ocultará essas diferenças em grande parte. Uma diferença final é o tratamento de interrupções. Novamente, há ajuda aqui das bibliotecas do Microchip.