Olá Fábio,
Desculpe pelo tópico extenso.
Realmente é a diretiva
#pragma interrupt que faz com que o compilador automatize o salvamento dos registradores, porém já percebi que não funciona bem da forma que eu estava imaginando. Dessa forma vou salvar o conteúdo de R0 e R1 e restaurar os valores durante a interrupção.
Quanto à ocupação permanente dos registradores R0 e R1, são apenas estes dois que o registrador modificador M01 libera para utilização como buffer circular.
A minha idéia era criar um buffer circular de amostras obtidas com o AD. Com a utilização de M01, R0 e R1 isso se torna praticamente automático, eu não teria que me preocupar com valores de incremento e coisa e tal.
Como uma dúvida puxa a outra ... consegui fazer o buffer para 16 amostras, funcionou perfeitamente. Defino uma tabela na memória RAM com 16 posições, passo o endereço do primeiro elemento para R0, 0x230 por exemplo, vou incrementando R0 e quando este chega em 0x23f automaticamente R0 volta para 0x230, tudo certo.
Porém acho que vou precisar de 32 amostras, daí o negócio complicou.
Defino uma tabela na memória RAM com 32 posições, passo o endereço do primeiro elemento para R0, 0x230 por exemplo, vou incrementando R0 e quando este chega em 0x23f o valor R0 passa para 0x220, sendo que a tabela foi alocada de 0x230 até 0x24F.
Pelo que entendi lendo os datasheets, o valor que deve ser passado para R0 deve ser o endereço do meio da tabela. Mas porque será que funcionou com a tabela de 16 posições? Bom, se passo o endereço + 16 posições da tabela de 32 posições (procurando o valor central), o valor de R0 vai sendo incrementado de 0x240 e, ao invés de voltar para 0x230 quando chega em 0x24F, vai embora até 0x25F ... é mole?
Bom, sei que é complicada essa questão e sei também que é uma coisa fácil de fazer por soft. Só achei que se o DSC possui essa funcionalidade, seria interessante utiliza - lá.
Bom Fábio, se você, ou mais alguém, tiver alguma sugestão do que fazer .... eu agradeço muito. Passei o dia inteiro fuçando sobre isso e já estou quase desistindo.
Mais uma vez obrigado.
[]'s
Jean Paul