Tengo el siguiente código en mi microcontroler programa:
int analogValue = ADCH; // ADC Data Register
//
// Simple analog comparator.
// If analogValue lower than threshold then toggle output high,
// Otherwise toggle it low.
//
if ( analogValue > 128 ) {
PORTB = 0; // Port B Data Register
} else {
PORTB = _BS( outputPin ); // Port B Data Register
}
Donde:
- ADCH es el registro que contiene el valor de la ADC
- PORTB es un dital puerto de salida que activa un LED
Mirando el resultado de la asamblea de código, me di cuenta de que se está haciendo un 16 bits comparar (líneas 40-44) donde, estrictamente hablando, sólo 8 bits habría sido suficiente:
40: 90 e0 ldi r25, 0x00 ; 0
42: 81 38 cpi r24, 0x81 ; 129
44: 91 05 cpc r25, r1
46: 14 f0 brlt .+4 ; 0x4c <__SREG__+0xd>
48: 18 ba out 0x18, r1 ; PORTB
4a: f5 cf rjmp .-22 ; 0x36 <__CCP__+0x2>
4c: 28 bb out 0x18, r18 ; PORTB
4e: f3 cf rjmp .-26 ; 0x36 <__CCP__+0x2>
Me doy cuenta de que declaró analogValue como int, que de hecho es de 16 bits en AVR, pero ...
¿Cómo puedo indicar al compilador a utilizar 8 bits comparación? El Arduino IDE me permite utilizar byte, pero avr-gcc por defecto no.
Revise esta página para completar el programa y sus desmontado código resultante.
EDIT1:
Cambiando int
a char
cambios en el código ensamblador:
14: 11 24 eor r1, r1 ; r1 = 0
3e: 18 ba out 0x18, r1 ; PORTB
Básicamente saltarse la prueba en su totalidad.
EDIT2: (Thnx: Wouter van Ooijen)
Cambiando int
a unsigned char
cambios en el código ensamblador:
3c: 85 b1 in r24, 0x05 ; ADCH
3e: ...
40: 87 fd sbrc r24, 7 ; compare < 128 (well optimized)
42: 02 c0 rjmp .+4 ; 0x48 <__SREG__+0x9>
44: 18 ba out 0x18, r1 ; 24
46: f7 cf rjmp .-18 ; 0x36 <__CCP__+0x2>
48: 98 bb out 0x18, r25 ; 24
4a: f5 cf rjmp .-22 ; 0x36 <__CCP__+0x2>