# Cristal externo y oscilador interno para atmega16



## dielan (Ene 6, 2009)

Hola haber si me pueden ayudar, en la universidad me han dejando un proyecto en el cual necesito, tener como variable de tiempo segundos, exactos porque es un proceso de medida, entonces diseñe el sistema en base del atmega16, entonces para obtener los segundos utilice el timer dos con la entrada de cristal de 32768hz cargando el prescaler con 128 obtengo un segundo, y para el resto de programa lo configure para un el oscilador de 8mhz, entonces ahi va mi gran duda, no se si se puede hacere esto, de trabajar con un cristal externo para el timer2 y y lo demas con oscilador interno, y si hay como tengo un gran inconveniente al quemar el micro nose si en el programador debo configurar eso... trabajo con el programador progisp, bueno y si no hay como trabajar con las dos fuentes de oscilacion simultaneas, que puedo hacer para obtener el segundo exacto y trabajar con lo demas de programa.

Ojala me haya hecho entender, y ojala me puedan ayudar

De ante mano gracias


----------



## Chico3001 (Ene 6, 2009)

Si puedes trabajar con ambos osciladores... solo coloca el cristal en los pines TOSC1 y TOSC2 y configura el bit ASSR:AS2 a 1


----------



## dielan (Ene 7, 2009)

listo pero al colocarlo en esos pines el cristal debo configurar la interrupcion 2 y eso ya lo hice pero no funciona y no se que mas debo hacer..... o a su vez otra manera de gerar un segundo

aqui anexo el programa.

$crystal = 8000000

Config Timer0 = Counter , Edge = Falling
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Prescale = 1
Config Timer2 = Timer , Async = On , Prescale = 128

Config Portb = Input
Portb = 255
Config Portd.2 = Input
Set Portd.2

'Config Kbd = Porta , Delay = 100

Enable Interrupts
On Timer2 Segundo
Enable Timer2



Tcnt0 = 0

Dim Revoluciones As Byte
Dim Tempo As Byte
'Dim Minuto As Byte
Dim Setpoint As Byte
Dim Teclado As Byte
Dim Seguro As Byte
Dim Real As Byte
Dim Vmax As Byte
Dim Vmin As Byte
Dim Valor As Word
Valor = 511
Vmax = 60
Vmin = 5
Cursor Off

Start Counter0

Inicio:
'Enable Interrupts
Cls
Locate 1 , 1
Lcd "Medidor de flujo"
Waitms 200

Do

   If Portb.1 = 0 Then Goto Set_point
   If Real < 0 Then
      If Valor = 1 Then
         Cls
         Home Up
         Lcd "IMPOSIBLE COMPENSAR"
         Locate 2 , 1
         Lcd "VELOCIDAD MAXIMA"
      End If
      Valor = Valor - 1
   End If

   If Real > 0 Then
      If Valor = 1023 Then
         Cls
         Home Up
         Lcd "SISTEMA DETENIDO"
         Locate 2 , 1
         Lcd "VELOCIDAD MINIMA"
      End If
      Valor = Valor + 1
   End If

   Pwm1a = Valor
   Locate 2 , 1
   Lcd "Actual:"
   Locate 2 , 8
   Lcd Revoluciones ; " RPS"
Loop
End                                                         'end program

Segundo:
   Revoluciones = Tcnt0
   'Minuto = Revoluciones * 60
   Tcnt0 = 0
Return


----------



## Chico3001 (Ene 7, 2009)

Que raro lenguaje... no lo conozco es C ?

Viendo la pagina 131 del manual hay un procedimiento para tener en cuenta a la hora de configurar el TIMER 2 con un cristal externo 



> When Timer/Counter2 operates asynchronously, some considerations must be taken.
> • Warning: When switching between asynchronous and synchronous clocking of
> Timer/Counter2, the Timer Registers TCNT2, OCR2, and TCCR2 might be corrupted. A
> safe procedure for switching clock source is:
> ...



Tambien hay ciertas advertencias.... verifica que las tomes en cuenta



> • The Oscillator is optimized for use with a 32.768 kHz watch crystal. Applying an external
> clock to the TOSC1 pin may result in incorrect Timer/Counter2 operation. The CPU main
> clock frequency must be more than four times the Oscillator frequency.
> • When writing to one of the registers TCNT2, OCR2, or TCCR2, the value is transferred to a
> ...


----------



## dielan (Ene 7, 2009)

gracias amigo ya lo pude solucionar y si es lenguaje C , he problema a radicado que bascom tiene problemas para llegar a ciertos registros del micro al programarlo, y nada esa parte me toco programarla en assembler y se soluciono el problema, te agradezco por el tiempo prestado


----------



## Cark86 (May 24, 2009)

dielan dijo:
			
		

> gracias amigo ya lo pude solucionar y si es lenguaje C , he problema a radicado que bascom tiene problemas para llegar a ciertos registros del micro al programarlo, y nada esa parte me toco programarla en assembler y se soluciono el problema, te agradezco por el tiempo prestado


Hola haber si me pueden ayudar con un problema que tengo  en tratar de variar la señal pwm del atmega16 el codigo que he hecho es el siguiente:

$regfile = "m16def.dat"
$crystal = 8000000

Ddrd.1 = 1
Portd.1 = 0
Ddrd.5 = 1
Portd.5 = 0
Config Porta.0 = Input
Config Porta.1 = Input
Set Porta.0
Set Porta.1
Dim Frec As Byte
Dim Bandera As Bit , W As Word
Frec = 128
Btn_subir Alias Porta.0
Btn_bajar Alias Porta.1
Aviso1 Alias Portd.1
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1024

Inicio:
Reset Aviso1
Reset Pwm1a
Do
W = Timer1
Pwm1a = Frec
  If Btn_subir = 1 Then
 Goto Subir
 End If
 If Btn_bajar = 1 Then
 Goto Bajar
 End If
 Bandera = 0
 Loop

Bajar:
If Frec < 1 Then
Goto Aviso
End If
If Bandera = 1 Then
Goto Inicio
End If
Set Aviso1
Bandera = 1
Frec = Frec - 5
Goto Inicio

Subir:
If Frec > 254 Then
Goto Aviso
End If
If Bandera = 1 Then
Goto Inicio
End If
Set Aviso1
Bandera = 1
Frec = Frec + 5
Goto Inicio

Aviso:
Set Aviso1

Goto Inicio

End

de antemano muchas gracias por su colaboración.....


----------

