segunda-feira, 25 de julho de 2016


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/

Estudo Basico de MicroControladores