... Arranque con los pic y en ASM y me está costando, pero si cambio ahora es como volver a empezar. Prefiero quedarme y darle hasta donde llegue,
Pensamiento de viejo... Y eso que sos menor que yo

Para nada es volver a empezar, ni cerca. Yo también empecé programando en assembler y por mas ahora prefiero C toda la vida lo sigo usando. Cada vez que ocurren "cosas raras", recurro al listado en assembler generado por el compilador para ver qué %&$# está pasando.
... Seguiré buscando y pretendo no parar hasta lograr comunicar el pic con el max.
Cuando no se consiguen ejemplos en ASM, un truco es "fabricarlo" a partir de uno en C, simplemente analizando los bloques de código que te interesan.
Por ejemplo, se escribe un programa corto como éste para un 16F88:
#include <16F88.h>
#FUSES NOWDT // No Watch Dog Timer
#FUSES INTRC_IO // >>> Oscilador interno, no CLKOUT
#FUSES PUT // Power Up Timer
#FUSES NOMCLR // Master Clear pin used for I/O
#FUSES NOBROWNOUT // Reset when brownout detected
#FUSES PROTECT // Code not protected from reading
#FUSES NOCPD // No EE protection
#use delay(int=8000000) // Especifica al compilador que hace uso del OSC interno
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=8)
#use STANDARD_IO( B )
union { int8 by[4]; struct{signed int16 lo , hi ;};} Data ;
void ReadMAX(void){
output_low(PIN_B0) ;
delay_us(10) ;
Data.by[3] = spi_read(0);
Data.by[2] = spi_read(0);
Data.by[1] = spi_read(0);
Data.by[0] = spi_read(0);
output_high(PIN_B0) ;
}
void main(void){
float t_amb, t_ext ;
set_tris_b(1) ;
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_64);
delay_ms(500);
while(TRUE)
{
ReadMAX() ;
t_amb = Data.lo/256. ;
t_ext = Data.hi/16. - t_amb ;
printf("TCK: %f | TAmb: %f\n\r",t_ext,t_amb);
delay_ms(1000);
}
}
De acá lo único que interesa es el setup del SPI:
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_64);y cuando lee el MAX:
Data.by[3] = spi_read(0); El ASM generado para esas instrucciones es:
.................... setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_64);
04A0: BCF 03.5
04A1: BCF 14.5
04A2: BSF 03.5
04A3: BCF 06.2
04A4: BSF 06.1
04A5: BCF 06.4
04A6: MOVLW 22
04A7: BCF 03.5
04A8: MOVWF 14
04A9: MOVLW 00
04AA: BSF 03.5
04AB: MOVWF 14
Esto se repite 4 veces pues son 32 bits a leer y va guardando en posiciones de memoria consecutivas (23,22,21,20)
.................... Data.by[3] = spi_read(0);
002C: MOVF 13,W
002D: CLRF 13
002E: BSF 03.5
002F: RRF 14,W
0030: BTFSS 03.0
0031: GOTO 02F
0032: BCF 03.5
0033: MOVF 13,W
0034: MOVWF 23
Claro que esto es un plan B cuando no se consigue un ejemplo en ASM, pues como el compilador no te pone las etiquetas el paso siguiente es agarrar el datasheet y ver a qué variables corresponden los números.