
Veja a página da tarefa em grupo
Falando sério agora, acho mesmo que esta tarefa é uma das mais difíceis. Estou travado por causa deste datasheet.
Vou pular para a programação e usar o datasheet só para consulta. Enquanto isso, vou destacar abaixo as seções importantes:
Como eu estava meio confuso sobre como fazer, resolvi listar todos os passos em detalhe e ter uma espécie de modelo para os meus próximos projetos. Onde se aplica, preencho as lacunas depois de cada passo e vou fazendo enquanto documento, e é isso que vem abaixo:
- avrdude ou Atmel Studio 7 (só Windows)
- Para isso, começo deixando claro que quero programar um ATTINY44A
- Baixe o makefile
- O bootloader não vai ser usado aqui, porque não tem USB
- Não se aplica
- Nada
- Nada
- Tem este código do Prof. Neil
- Com todos os arquivos baixados antes numa mesma pasta, no Linux renomeio o arquivo para makefile e rodo o script para criar o firmware (vou repetir este passo toda vez que quiser mudar o código):
mv hello.ftdi.44.echo.c.make makefile make
- Feito no passo anterior
Rode:
make program-usbasp
- Isso já estava feito no makefile
Rode:
make program-usbasp-fuses
Resolvi testar também a Arduino IDE para programar a minha placa.
Para isso, tem alguns passos que devem funcionar em qualquer sistema operacional
Cole o seguinte em (Preferences)-(Additional Boards Manager URLs:)
https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json






Aqui, em vez de usar o terminal e o avrdude, usei a Arduino IDE, porque ela tem um monitor serial embutido.
Os resultados estão no vídeo
Agora vou tentar programar a placa para piscar quando eu apertar o botão.

Olhando o esquemático da PCB, descobri que o botão está ligado no pino 10
Olhando o esquemático da PCB, descobri que o LED está ligado no pino 6
Em linguagem de gente, quero algo assim:
O problema é que eu nunca programei de verdade do zero, só alterei código, então vai ser um desafio...
Primeiro tentei adaptar o código Blink da Arduino IDE com os meus números de pino. Não funcionou
O código sem comentários abaixo:
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
O primeiro código não funcionou porque eu estava usando um código feito para a plataforma Arduino, mas numa placa feita por mim. As placas Arduino normalmente têm um LED embutido ligado no pino 13, a minha placa não! A constante que a plataforma Arduino usa para o LED embutido é:
LED_BUILTIN
No primeiro código tentei usar essa constante e não deu certo. No segundo código descobri, na tentativa, que colocar um número no lugar da constante fazia o LED acender.
O código certo para o ATtiny44 precisaria ter o pino declarado no começo com o seguinte código:
const int ledPin = 07;
Percebi isso na tentativa e erro. Agora entendo que o número do pino no datasheet não corresponde ao número do pino no Arduino, que também não é o mesmo da constante da plataforma Arduino. Claro, afinal esta é uma placa customizada, mas esse é o preço de ser noob!
Então, depois de achar na tentativa o número certo do pino, programei a placa e consegui fazer ela piscar!
Aqui está o código customizado sem comentários:
const int ledPin = 07;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
Chega de achar pino na tentativa. Aqui está o diagrama de pinagem do ATtiny44 no Arduino

Para a placa reconhecer o botão, também precisei inicializá-lo, com o seguinte código no começo do sketch:
const int buttonPin = "the pin number here"
Depois tive que declarar uma variável para guardar o estado do pino, com o seguinte código:
int buttonState = 0;
O <0> no código acima também poderia ser escrito como <LOW>, outra constante da programação Arduino. Veja o site do Arduino sobre constantes.
Depois de pesquisar os pinos do ATtiny44 no Arduino, e com os números certos dos pinos em mãos, troquei os pinos no código e funcionou! Aqui está o código. (Corrigido depois: o arquivo original tinha if (buttonState, HIGH) e chaves no lugar errado, e não compilava.)
const int buttonPin = 3;
const int ledPin = 7;
int buttonState = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
Esquema
Como perdi esta placa há muitos anos, só posso mostrar como ligar o programador numa placa parecida, igual fiz na semana de Projeto Eletrônico.
Programadores FabISP e USBaspAqui mostro como usei os programadores em Dispositivos de Saída. Para outro método sem a Arduino IDE, veja Programação Embarcada
USBasp
Programando uma placa com ATtiny44 pela Arduino IDE usando um FabTinyISP ou USBtinyISP que eu fiz.
FabISP
Para mudar o comportamento do botão, simplesmente troquei a constante <HIGH> pela constante <LOW> aqui:
if (buttonState == LOW) {
Assim a lógica do código fica invertida, ou seja, quando o botão está solto o LED fica apagado.
Agora inverti quando o LED acende e apaga. Aqui está o código sem comentários:
const int buttonPin = 3;
const int ledPin = 7;
int buttonState = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
digitalWrite(ledPin, HIGH);
}else {
digitalWrite(ledPin, LOW);
}
}
Vamos ver a prova...
Com um acréscimo simples no código, mudei o comportamento para ele piscar 3 vezes.
Baixe o código (Corrigido depois: o loop só ligava o LED três vezes, sem apagar, e ele nunca piscava; agora ele apaga e espera entre as piscadas. A imagem mostra o código original.)
Eu estava meio incomodado porque a minha placa não me avisava quando estava ligada, então resolvi soldar um LED vermelho e um resistor de 22 Ohms, assim, se eu ligasse errado, eu saberia e inverteria as ligações. (Nota: a 5 V, 22 Ohms deixam passar uns 145 mA pelo LED, muito acima dos 20-30 mA que ele aguenta; o certo seria uns 150 Ohms.)
Aqui está o antes e depois
← (18 mar) Usinagem Controlada por Computador · todas as semanas · Dispositivos de Entrada (01 abr) →