'--------------------------------------------------------------------------'
'               ANALIZADOR LOGICO COM ATMEGA1284P                          '
'                                                                          '
' teste da rotina de captura em muito alta velocidade = 4 Megasample/seg !                          '
'--------------------------------------------------------------------------'


$regfile = "m1284PdefOK.dat"
$crystal = 20000000
$hwstack = 40
$swstack = 40
$framesize = 40


Dim Buffer(8193) As Byte At &H180
Dim Bcounter As Word
Bcounter = &H180
Dim Temp As Word

Config Pinb.2 = Input
Config Pind.0 = Input
Config Pinb.1 = Input
Config Pinb.4 = Input
Config Pinb.7 = Output
Config Porta = Input
Config Portd.5 = Output
Config Portb.6 = Output


' TESTE DA ROTINA DE CAPTURA EM ALTISSIMA VELOCIDADE






'ESSE VALOR DE TIMER1 É APENAS PARA COMEÇAR ... BASTA SER DIFERENTE DE 0 !
Timer1 = 1

'AGORA, VAMOS FAZER UMAS CONTAS. A ROTINA DE CAPTURA INICIALIZA NOVAMENTE O
'CONTADOR DO TIMER1, E QUANDO O CONTADOR CHEGAR A 65535 E VIRAR A 0, VAI GERAR
'UMA INTERRUPÇÃO. ENTRE ZERARMOS O CONTADOR E INICIALIZAR A LEITAR TEREMOS DOIS
'CICLOS DE CLOCK. DEPOIS DISSO, PARA CADA LEITURA TEREMOS MAIS 5 CICLOS.
'ASSIM, SE QUISERMOS LER 8192 VEZES, TEMOS DE MULTIPLICA POR 5 E
'SOMAR 2 AO NUMERO OBTIDO, O QUE VAI NOS DAR O NUMERO DE CICLOS QUE
'PRECISAMOS ESPERAR PARA TER A LEITURA. RESTA APENAS FAZER A CONTA DE
'65536 - ESSE NUMERO, E TEREMOS O NUMERO DE CONTAGENS A SER INICIALIZADO.

Temp = 5 * 8192
Temp = Temp + 2
Temp = 65536 - Temp

Config Timer1 = Timer , Prescale = 1 , Compare A = Disconnect , Compare B = Disconnect

On Timer1 Int1_sbr Nosave

Enable Timer1
Start Timer1
Enable Interrupts



' Agora, segue a rotina de captura :

$asm
'aqui vamos supor que tudo está inicializado, inclusive o timer.

'salva contexto
      push  r16
      in    r16, SREG
      push  r16
      push  r17
      push  r26
      push  r27

'pega o valor do inicio do buffer:
      ldS   r26, {bCounter}
      ldS   r27,{bcounter+1}

'vamos inicializar o timer1
      LDS    R17,{TEMP}
      LDS    R16,{TEMP+1}
      STS   TCNT1H,R16
      STS   TCNT1L,R17
'pronto, agora é só fazer as leituras em sequencia
Pode_ler:
      In    r16,PINA                                        'LE DADOS
      st    X+,r16                                          'ARMAZENA BUFFER E INCREMENTA
      RJMP PODE_LER


' buffer está cheio
Acabou:
      POP R27
      POP R26
      POP R17
      POP R16
      !out  sreg,r16
      pop   r16
$end Asm

Stop


Int1_sbr:

'esta rotina vai ser chamada quando termos lotado o buffer de leituras
'e entao fazemos uma troca do endereço de retorno, para que na saida desta interrupção
'o program counter aponte para o programa no label ACABOU:  !
'assim, saimos fora do loop de leitura de altíssima velocidade !



$asm
POP R16
POP R17
LDI R26, LOW(ACABOU *1)
LDI R27, HIGH(ACABOU *1)
PUSH R26
PUSH R27

$end Asm
Return





End