Senhores(as),
Estes dias nosso amigo Eduardo (http://www.handmades.com.br/forum/index.php?action=profile;u=5367) me perguntou se poderia fazer um pdf sobre um estudo que ele estava realizando em cima do PIC10F200, e é claro que me propus a fazê-lo.
Ao criar a documentação me impressionou a muquiranice do autor, querendo sempre espremer mais o código. Claro, em um microcontrolador com limitada memória, isso é sempre desejável, mas quando se chega ao ponto de preferir o código X em vez do Y porque o X tem como resultado um código compilado um byte menor, então podemos chamar o autor de escovador de bits.
Algumas técnicas são apresentadas no documento, como multiplexação, explicada de uma forma que é possível compreender, embora a leitura não seja muito branda, principalmente para quem nunca programou.
Aqui está o documento. (http://www.altanatubes.com.br/downloads/FirstTest.pdf)
Alguém pode se perguntar "Porque tanto esforço pra isso?".
Eu penso que, além do próprio aprendizado, é bom ter alternativas. E já imagino até uma aplicação: contador para uma máquina de enrolar transformadores.
Parabéns ao Eduardo pelo estudo realizado e aqui mostrado.
Abraços a todos.
Realmente não é uma leitura branda. Eu "acompanhei" o desenvolvimento da coisa, e como disse ao Eduardo, no começo parecia grego pra mim. E no final continuou grego, mas com a impressão de que aprendi umas 2-3 palavras.
Plautz... Sua sugestão me deu outra ideia (bem similar). Contador para enrolador de captadores...
Muito legal ter um documento bem redigido e de fácil compreensão aos que adentram no mundo dos microcontroladores! ;)
Eu estava olhando o código rapidamente e uma parte me chamou atenção:
89. if (Sending==0) {Sending = Number0;} else
90. if (Sending==1) {Sending = Number1;} else
91. if (Sending==2) {Sending = Number2;} else
92. if (Sending==3) {Sending = Number3;} else
93. if (Sending==4) {Sending = Number4;} else
94. if (Sending==5) {Sending = Number5;} else
95. if (Sending==6) {Sending = Number6;} else
96. if (Sending==7) {Sending = Number7;} else
97. if (Sending==8) {Sending = Number8;} else
98. {Sending = Number9;}
Não seria melhor, em termos de memória utilizar uma construção "switch case"?
Ficaria algo assim:
switch (Sending)
{
case 0:
Sending = Number0;
break;
case 1:
Sending = Number1;
break;
case 2:
Sending = Number2;
break;
case 3:
Sending = Number3;
break;
case 4:
Sending = Number4;
break;
case 5:
Sending = Number5;
break;
case 6:
Sending = Number6;
break;
case 7:
Sending = Number7;
break;
case 8:
Sending = Number8;
break;
case 9:
Sending = Number9;
break;
}
Outro fato é forçar a comparação não com inteiros (0,1,2,3...) e sim com o valor em hexa (0x00, 0x01, 0x02, 0x03...) já que "Sending" é um char os tipos serão os mesmos...
Não sei se isso irá diminuir muito o código, já está bem "orange squeezer"... rs :D
Um abração!
Eduardo
Oi Ledod
Eu já esperava este comentário. Ele está respondido no último parágrafo da página 11.
E também não faz diferença comparar com o inteiro decimal 5 ou o hexa 0x05. O compilador se vira bem com isso e o código de máquina é a comparação com o hexadecimal correto.
Abraços
Eduardo
Eduardo e Plautz, só algumas correções e esclarecimentos que eu achei que deveria fazer sobre o documento e para quem já pegou o documento disponibilizado:
- pág 3 - "O PIC10F200 é o microcontrolador mais simples que encontrei. Ele conta com uma
memória RAM de apenas 16 bytes e uma ROM de 256 bytes, que pode conter 199 instruções."
Na verdade são 256 palavras (words) de 12 bits cada (o que daria mais do que 256 bytes de memória = 384 bytes) que podem sim armazenar até 255 instruções do programa (menos 1 para guardar a calibração do clock interno). A arquitetura das instruções do PIC incorpora o operando (valor, dado, número de registrador, etc) dentro do código de operação da instrução (opcode) de forma que cada palavra vale sempre por uma instrução completa a ser executada.
- pág 4 - "É importante que a tensão no pino 3 nunca exceda a de alimentação, ou o PIC entrará
em modo de programação.".
Na verdade o pino para acionar o modo de programação é o pino 8 (GP3 daí a confusão, que tem a função de Vpp). Mas precisa ser uma tensão de mais de 12Vdc.
- pág 9 - "Na linha 10 o compilador é instruído a desabilitar o temporizador interno do PIC10F200. Caso isso não seja feito, o microcontrolador irá reiniciar a intervalos regulares, perdendo a contagem."
Pra distinguir esse temporizador do temporizador/contador periférico TMR0, na verdade ele é chamado de Watch Dog Timer (WDT), o cão de guarda do microcontrolador. Ele funciona independentemente da execução do programa (paralelamente) e quando o contador dele estoura, reinicializa o microcontrolador. A função dele é restaurar o funcionamento do PIC se ocorrer um evento de travamento ou mau funcionamento do programa. Se quisermos utilizá-lo, no programa devem haver algumas instruções para limpar a contagem dele antes dele estourar (Clear Watch Dog Timer - CLRWDT) em posições chave do programa. Ou se não quisermos usar esse recurso, simplesmente desabilitar o reset pelo WDT.
- pág 10 - "O registrador TRIS define se um determinado pino é entrada ou saída. Na linha 45 GP3
é definido como entrada e os demais como saídas. Na verdade, GP3 é sempre saída, ..."
O correto seria "sempre entrada".
Oi Xformer
É sempre bom ter mais gente conferindo o trabalho. Sempre passa alguma bobagem. Muito obrigado pela meticulosa revisão! Já alteramos o PDF para conter suas observações.
Abraços
Eduardo
Quote from: Eduardo on 18 de December de 2015, as 15:59:03
É sempre bom ter mais gente conferindo o trabalho. Sempre passa alguma bobagem. Muito obrigado pela meticulosa revisão! Já alteramos o PDF para conter suas observações.
Revisão meticulosa não existe, sempre passa(m) alguma(s) coisa(s). :(
Agora sobre o projeto em si, depois que eu vi o vídeo dele que você me mandou aquele dia, eu pensei comigo mesmo que você tirou leite de pedra com esse PIC. Por isso o PDF foi bom para matar a curiosidade. Nem sabia que dava pra usar compilador com esse modelo de PIC, devido aos parcos recursos de RAM. Parabéns.
Quote from: xformer on 18 de December de 2015, as 16:20:01
... você tirou leite de pedra com esse PIC.
Não é a primeira vez que dizem coisa assim de algo que eu fiz. :D Eu gosto de usar os recursos de algo ao máximo. Sou do tipo que esmaga tubo de pasta de dentes com alicate!
Sobre a pouca RAM, na verdade isso praticamente obriga usar um compilador que gerencie bem a memória. Ao separar as variáveis em locais e globais, a memória pode ser reciclada e compartilhada entre as rotinas, permitindo uma programação mais sofisticada mesmo num PIC10F200.
Mais uma vez, grato pela contribuição!
Eduardo