Se desejar ver os dados técnicos do 74HC595 -
O resultado da compilação acusou:
O sketch usa 936 bytes (13%) de espaço de armazenamento para programas. O máximo são 7.168 bytes.
Variáveis globais usam 10 bytes (0%) de memória dinâmica, deixando 1.014 bytes para variáveis locais. O máximo são 1.024 bytes.
Foi ensaiado o mesmo soft com pequenas modificações para ser compilado no AStudio4.
Não dependeu em nada da plataforma Arduino, veja como ficou e funcionou perfeitamente:
O resultado da compilação "BUILD" diz que ocupou 102 bytes 2,2% da memória flash, 0,1% da RAM e sem erros.
Observações:
O espaço ocupado pelos dois compiladores o Arduino 13% e o GCC 2,2%. Não temos muita demora no ASTUDIO, o Arduino demora demais.
Uma parte muito importante que ajuda muito é que o Astudio4 gerar o arquivo.lss que vem mostrar como ele fez o código em assembler, parte dele passo abaixo.
Para quem começou a desenvolver em assembler ou tem noção deste, este arquivo é uma luz no fim túnel.
veja por exemplo:
PORTB ^= 1<<PB5; // instrução em C
70: 88 b3 in r24, 0x18 ; 24 // ler a PORTAB
72: 90 e2 ldi r25, 0x20 ; 32 // R25 0b00100000 bit5=1
74: 89 27 eor r24, r25 // faz o xor trocando
76: 88 bb out 0x18, r24 ; 24 //o bit 5 e sai PORTB
a gente se sente mais pisando em chão firma, porque participa da operação que o "core" vai fazer. E também é bom para gente que vai sempre recordando o digital PURO, bit a bit...
Este arquivo esta dentro da pasta "default" que o compilador GCC cria, junto com arquivo.hex que vai ser usado no gravador de AVR.
Exempo de um pedaço do arquivo.LSS
..........
void setup() {
// put your setup code here, to run once:
DDRD = 0b00011100;
48: 8c e1 ldi r24, 0x1C ; 28
4a: 81 bb out 0x11, r24 ; 17
DDRB = 1<<PB5; //pinMode(13, OUTPUT);
4c: 80 e2 ldi r24, 0x20 ; 32
4e: 87 bb out 0x17, r24 ; 23
conta=0;
50: 10 92 60 00 sts 0x0060, r1
}
54: 08 95 ret
00000056 <outSerie>:
void outSerie(unsigned char d){
56: 90 e0 ldi r25, 0x00 ; 0
for(unsigned char i = 0; i<8; i++){
if( (d & 0x80)==0) PORTD &= ~(1<<PD2);//digitalWrite(2,LOW);
58: 87 fd sbrc r24, 7
5a: 02 c0 rjmp .+4 ; 0x60 <outSerie+0xa>
5c: 92 98 cbi 0x12, 2 ; 18
5e: 01 c0 rjmp .+2 ; 0x62 <outSerie+0xc>
else PORTD |= 1<<PD2; //digitalWrite(2,HIGH);
60: 92 9a sbi 0x12, 2 ; 18
PORTD |= 1<<PD3; //digitalWrite(3,HIGH);
62: 93 9a sbi 0x12, 3 ; 18
PORTD &= ~(1<<3); //digitalWrite(3,LOW);
64: 93 98 cbi 0x12, 3 ; 18
DDRD = 0b00011100;
DDRB = 1<<PB5; //pinMode(13, OUTPUT);
conta=0;
}
void outSerie(unsigned char d){
for(unsigned char i = 0; i<8; i++){
66: 9f 5f subi r25, 0xFF ; 255
68: 98 30 cpi r25, 0x08 ; 8
6a: 11 f0 breq .+4 ; 0x70 <outSerie+0x1a>
if( (d & 0x80)==0) PORTD &= ~(1<<PD2);//digitalWrite(2,LOW);
else PORTD |= 1<<PD2; //digitalWrite(2,HIGH);
PORTD |= 1<<PD3; //digitalWrite(3,HIGH);
PORTD &= ~(1<<3); //digitalWrite(3,LOW);
d = d<<1;
6c: 88 0f add r24, r24
6e: f4 cf rjmp .-24 ; 0x58 <outSerie+0x2>
}
PORTB ^= 1<<PB5;
70: 88 b3 in r24, 0x18 ; 24
72: 90 e2 ldi r25, 0x20 ; 32
74: 89 27 eor r24, r25
76: 88 bb out 0x18, r24 ; 24
}
78: 08 95 ret
0000007a <main>:
int main(void){ //void loop() {
7a: cf 93 push r28
7c: df 93 push r29
//#define Latch 4
unsigned char conta;
void setup() {
// put your setup code here, to run once:
DDRD = 0b00011100;
7e: 8c e1 ldi r24, 0x1C ; 28
80: 81 bb out 0x11, r24 ; 17
DDRB = 1<<PB5; //pinMode(13, OUTPUT);
82: 80 e2 ldi r24, 0x20 ; 32
84: 87 bb out 0x17, r24 ; 23
conta=0;
86: 10 92 60 00 sts 0x0060, r1
milliseconds can be achieved.
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
8a: c9 e1 ldi r28, 0x19 ; 25
8c: d0 e0 ldi r29, 0x00 ; 0
}
int main(void){ //void loop() {
// put your main code here, to run repeatedly:
setup();
while(1){
outSerie(conta);
8e: 80 91 60 00 lds r24, 0x0060
92: e1 df rcall .-62 ; 0x56 <outSerie>
conta++;
94: 80 91 60 00 lds r24, 0x0060
98: 8f 5f subi r24, 0xFF ; 255
9a: 80 93 60 00 sts 0x0060, r24
PORTD |= 1<<4; //digitalWrite(4,HIGH);
9e: 94 9a sbi 0x12, 4 ; 18
PORTD &= ~(1<<4); //digitalWrite(4,LOW);
a0: 94 98 cbi 0x12, 4 ; 18
a2: 80 e3 ldi r24, 0x30 ; 48
a4: 95 e7 ldi r25, 0x75 ; 117
a6: fe 01 movw r30, r28
a8: 31 97 sbiw r30, 0x01 ; 1
aa: f1 f7 brne .-4 ; 0xa8 <main+0x2e>
__ticks = (uint16_t) (__ms * 10.0);
........
http://alvaroluiz.com/Kazuma/ArduinoBook/