domingo, novembro 17, 2019

Crítica: Introducing Python

Algumas décadas atrás, quando eu tive o meu primeiro contato prático com programação, eu queria aprender todas as linguagens a que tivesse acesso. Com o passar dos anos, fui ficando mais seletivo e passando a apresentar resistência a algumas linguagens.

De forma meio inesperada, Python é uma destas linguagens. A importância dos espaços na linguagem conflita com o meu aprendizado inicial numa época em que se afastava dos cartões perfurados e a liberdade de forma era uma vantagem apregoada por tudo que era novo. A impossibilidade de declarar o tipo das variáveis se choca com a minha forma habitual de desenvolvimento e levanta preocupações sobre a detecção de erros somente em campo (não estou sozinho nisto). E tem uma série de incômodos, entre os quais a incompatibilidade da versão 3 com a versão 2 (o fato de ainda estar falando isto 10 anos depois do lançamento da versão 3 mostra como o problema é grave).

Mas eu insisto em aprender Python. Já escrevi diversos pequenos programas (principalmente no Raspberry), mas estou longe de saber de cor a sintaxe e meu código certamente não é "pitônico". "Introducing Python" veio como parte de um monte de livros em uma oferta do Humble Bundle e é a minha tentativa mais recente.



domingo, outubro 27, 2019

Resenha: Understanding the Linux Kernel

Qual programador não tem o interesse em saber como funciona (por dentro) um sistema operacional? "Understanding the Linux Kernel", de Daniel Bovet e Marco Cesati se propõe a ser um passeio guiado pelas principais estruturas de dados, algorítimos e truques de programação do Linux, explicando como ele trabalha e porque "funciona tão bem em uma grande variedade de sistemas".



quarta-feira, outubro 23, 2019

Timer1 do ATmega328 - Parte 5

Para fechar esta série de posts vamos falar das interrupções que podem ser geradas pelo Timer. Lembrando, uma interrupção é algo que interrompe o fluxo normal do programa para executar uma rotina específica (de preferência curta e rápida, para não impactar o processamento normal.


quarta-feira, outubro 16, 2019

Timer1 do ATmega328 - Parte 4

Nesta quarta parte vamos examinar um uso muito comum do timer: a geração de sinais do  tipo PWM (Pulse Width Modulation). Em um sinal PWM temos um pulso sendo repetido periodicamente; o tempo em que ele se repete é o seu período (cujo inverso é a frequência). A largura do pulso é o tempo que o sinal permanece em nível alto. É comum falarmos também no duty cycle, que é a relação entre a largura e o período (ou seja, a porcentagem do tempo que o sinal fica em nível alto).


Por exemplo, vamos considerar um pulso de 25 microssegundos (us) que se repete a cada 100 microssegundos. O período é 100 us, a frequência é 10KHz, a largura é 25uS e o duty cycle é 25%.

Embora os princípios sejam simples, os detalhes são complicados. Recomendo ler e reler o manual do ATmega  para ver todos os detalhes da programação destes modos.


quarta-feira, outubro 09, 2019

Timer1 do ATmega328 - Parte 3

Nesta parte vamos falar na função de Captura do Timer1. A figura abaixo (extraída do datasheet) é o diagrama de blocos da Unidade de Captura (troque "n" por "1" nos nomes dos registradores e dos pinos).



quarta-feira, outubro 02, 2019

(Mini) Avaliação: Raspberry Pi 4 Modelo B

Mais uma geração da Raspberry Pi, desta vez com algumas mudanças significativas, e mais uma mini-avaliação (como eu fiz com as Raspberry 3, 2 e 1B+). Entre a 3 e a 4 tivemos a 3B+ que eu não cheguei a colocar a mão.


quarta-feira, setembro 25, 2019

Timer1 do ATmega328 - Parte 2

Continuando o nosso estudo do funcionamento e programação do Timer1, vamos examinar o modo de operação. Como vimos na primeira parte, o coração do Timer1 é um contador, que é atualizado conformes os pulsos de um clock. O modo de operação define a sequência de contagem e o que acontece com os pinos controlados pelo Timer1. Neste post vamos nos concentrar nos modos "não PWM" (que ficam para para um post específico).