Tarjeta Experimental - Software

Todo lo relacionado con la eléctronica en nuestros barcos
Responder
Avatar de Usuario
Hellmut1956
Miembro Leal
Miembro Leal
Mensajes: 1305
Registrado: Sab Nov 29, 2008 2:06 pm
Ubicación: Mammendorf, Alemania

Tarjeta Experimental - Software

Mensaje por Hellmut1956 »

Programa 1: Primer Test

El siguiente programa se puede copiar vía Copy&Paste al editor del programa BASCOM, descargarse y funcionar sin error alguno al primer intento. En un futuro próximo voy a traducir el código del programa al español para que aumente su utilidad, pero para aquellos que terminen la tarjeta con los módulos del regulador lineal y del RESET, así como con el LED y el pulsador presente puede así verificar su construcción hasta este punto!

Atención, también les pido considerar mi próxima contribución a este hilo que trata de los switches que hay que verificar. El mal uso de estos puede volver el mega8 inútil e inusable a pesar de no haberlo dañado!

Código: Seleccionar todo

 '******************************************************
'******************************************************
'Proyecto: Programación del Controlador Atmel para Novatos
'
'Controlador: ATMega 8-16
'Bascom-Versión: 1.11.9.5
'
'Programa 1: LED intermitente
'
'Hardware:
'LED conectado a Port D.0
'
'15.01.2006 T. Gietenbruch
'
'******************************************************

'======================================================
'Configuración del sistema
'======================================================
'Definiciones para el Mega 8
$regfile "m8def.dat"

'Definición del la frecuencia (1Mhz)
$crystal = 1000000

'======================================================
'Configuraciones
'======================================================
Config Portd.0 = Output

'======================================================
'Declaraciones
'======================================================
'

'======================================================
'Inicialización
'======================================================
Portd.0 = 1


'======================================================
'Bucle principal del Programa
'======================================================

Do

'Inversor del Port D.0
Toggle Portd.0

'esperar 500ms (experimenta cambiando el valor!)
Waitms 500

Loop



'Fin del programa
End
Última edición por Hellmut1956 el Mar Nov 17, 2009 5:51 pm, editado 1 vez en total.
--------------------
Saludos Hellmut
Avatar de Usuario
Hellmut1956
Miembro Leal
Miembro Leal
Mensajes: 1305
Registrado: Sab Nov 29, 2008 2:06 pm
Ubicación: Mammendorf, Alemania

Re: Tarjeta Experimental - Software

Mensaje por Hellmut1956 »

Configuraciones de los Lock & Fuse Bits

En el registro del mega8 “Lock and Fuse Bits” se establecen las configuraciones esenciales del mega8, por ejemplo determinar la frecuencia de oscilación a la que el controlador es sometido. El oscilador interno permite frecuencias de hasta 8 MHz, usando un cuarzo externo hasta 16MHz son posibles.
El valor de los parámetros se pueden leer con BASCOM y no tienen nada que ver con que este escrito en el programa, son completamente independientes de este pero deciden si el controlador puede ejecutar el programa con éxito o no!
Los valores de estos parámetros tampoco son grabados en el procesador cuando se graba el programa en la memoria no volátil del mega8.
Activando el “AVR ISP STK programmer” dentro de BACOM se abre esta ventana y indica los valores que este ha extraído de los registros correspondientes del mega8.

Repito, no “jugar” con los valores aquí pues pueden volver el controlador inútil y tendrían que reemplazarlo!

Imagen

Los valores estándar de los Lock&Fuses es recomendable dejarlos tal cual! De importancia para nosotros ahora es únicamente el “Fusebit M” con el valor “1:PIN PC6 is RESET” y la definición del “Fusebit A987” con el valor “0001:Internal RC oscillator 1 MHz”. Con estos 2 parámetros tal cual lo muestra la imagen, si ya estuvieran así, abandonar esta sección sin modificar cosa alguna, o, si fuera necesario cambiar algo escoger para estos dos parámetros los valores aquí indicados y luego escribirlos al mega8 tecleando el botón indicado en la pantalla tal cual lo muestra la flecha rosada en esta contribución mía!
Recuerda, si abandonas esta sección sin presionar tecla alguna en la pantalla, nada cambia!
Atención:
Dándole datos inadecuados a los parámetros aquí indicados inutiliza irrecuperablemente el controlador!

Imagen

Los valores para los parámetros también son escritos al registro correspondiente accionado la tecla ”Auto Program” de BASCOM, pero también pueden ser escritos al registro del controlador presionado la tecla “Write FS”.

El valor de la frecuencia que definimos en Fusebit M debe corresponder a la frecuencia definida bajo la directiva $Crystal en el programa! Si estos valores no corresponden, entonces ciertas funciones que requieren que un tiempo definido transcurra trabajarían de forma equivocada! (Por ejemplo Waitms, comandos que usen el “Timer”, accesos a la pantalla!)

Imagen
--------------------
Saludos Hellmut
Avatar de Usuario
Hellmut1956
Miembro Leal
Miembro Leal
Mensajes: 1305
Registrado: Sab Nov 29, 2008 2:06 pm
Ubicación: Mammendorf, Alemania

Leer valor en un pin configurado como entrada

Mensaje por Hellmut1956 »

Hola amigos

Finalmente tenemos amigos que están listos para iniciar los ejercicios de programación. Continuemos pues!

En este programa vamos a aprender a leer un pin configurado como "entrada".
Recuerden cualquier pregunta, sugerencia, comentario o problema favor poner aquí:

http://www.modelismonaval.com/foro/view ... =45&t=7402

Código: Seleccionar todo

'******************************************************
'Projekt: Atmel-Tarjeta Experimental
'
'Prozessor: ATMega 8-16
'Bascom-Version: 1.11.9.8
'
'Programm 2: Eingang abfragen
'
'Hardware:
'Interuptor conectado al Pin Port D.0
'LED al Pin Port D.7
'
'15.01.2006 T. Gietenbruch
'
'******************************************************

'======================================================
'Konfiguración de Sistema
'======================================================
'Definición del  Mega 8
$regfile "m8def.dat"

'Indicación de la frecuencia de operación del controlador (1Mhz)
$crystal = 1000000

'======================================================
'Configuraciones
'======================================================
Config Portd.0 = Input
Config Portd.7 = Output

'======================================================
'Declaraciones
'======================================================
'

'======================================================
'Inicialisaciones
'======================================================
Portd.0 = 1
Portd.7 = 1

'======================================================
'Programa principal
'======================================================

Do

'Lo que hay que considerar:
'El circuito del PIN ha sido negado por las resistencias Pullup!
'Interruptor en "ON" -> 0V en la entrada
'0V voltios en la salida -> LED ilumina

'Cuando .... entonces
If Pind.0 = 0 Then

   ' ...Cambio del estado del Pin Port D.7...
   Toggle Portd.7
   '...después esperar 3 segundos
   Wait 3

'...en otro caso...
Else
   'LED conectado a D.7 OFF
   Portd.7 = 1

'...y listo!
End If

Loop

'Fin del programa
End
Este programa se puede copiar e introducir en el compilador tal cual esta. Ha sido veríficado usando la versión 11.9.8 del compilador BASCOM!”
--------------------
Saludos Hellmut
Avatar de Usuario
Hellmut1956
Miembro Leal
Miembro Leal
Mensajes: 1305
Registrado: Sab Nov 29, 2008 2:06 pm
Ubicación: Mammendorf, Alemania

La Pantalla LCD

Mensaje por Hellmut1956 »

Hola amigos,

Seguimos mostrando el programa para poner datos en la pantalla:
Como pueden ver, estudiando el esquema de la tarjeta experimental, la pantalla LCD usa pines que también usamos en el bus ISP, que es el cual usamos para grabar datos en el controlador. Por eso, mientras grabamos algo en el controlador y la pantalla está conectada, entonces estos datos alteran el contenido de la pantalla. Ignórenlo, o desconecten la pantalla.

Para pode comunicarnos con la pantalla LCD he incluido en el programa la librería correspondiente.
Para que el programa funcione, la tarjeta experimental tiene que haber sido creada siguiendo fielmente el esquema!
Pero BASCOM también permite cambiar la asignación de los pines para conectar la pantalla LCD, permitiendo adaptarse a las necesidades de cada diseño. El uso de la librería aquí requiere usar los pines de la forma especificada en nuestro esquema, lo que corresponde con los requerimientos del compilador!

La variable "Dim ___lcde as Byte" tiene que ser declarada exactamente como lo mostramos aquí, pues se trata de una variable de sistema especial requerida para usar la pantalla conectada.

Muchos éxitos experimentando!

Código: Seleccionar todo

'******************************************************
'Proyecto: Programación del Controlador Atmel para Novatos
'
'Prozessor: ATMega 8-16
'Bascom-Version: 1.11.9.8
'
'Programm 3: test de la pantalla LCD
'
'Hardware:
'Pantalla LCD conectada al Port B
'
'19.01.2006 T. Gietenbruch
'
'******************************************************

'======================================================
'Configuración del sistema
'======================================================
'Definition für Mega 8
$regfile "m8def.dat"

'Definición del la frecuencia (1Mhz)
$crystal = 1000000

'Inclusión de la librería LCD para una pantalla con 2 controladores
$lib "lcd4e2.lbx"

'======================================================
'Configuracione
'======================================================
'Angabe der Display-Größe
'27x4 frisst der Compiler nicht - funktioniert aber auch so!
Config Lcd = 20 * 4

'======================================================
'Declaraciones
'======================================================
'Variable für Umschaltung der Displayhälfte - Namen so lassen!
Dim ___lcde As Byte

'======================================================
'Inicialización
'======================================================

'======================================================
'Crear la máscara en la pantalla LCD
'======================================================
'Pasar a la mitad superior de la pantalla
___lcde = 0

'Borrar el contenido de la pantalla
Cls
'Texto del primer renglón (max. 27 dígitos)
Locate 1 , 1
Lcd "*   Cursillo Eelectrónico    *"

'Texto en el segundo renglón
Locate 2 , 1
Lcd "**** TEST PANTALLA LCD  ****"

'Apagar la imagen del cursor
Cursor Off

'Pasar a la mitad inferior de la pantalla
___lcde = 1

'Apagar la imagen del cursor
Cursor Off

'======================================================
'Programa principal
'======================================================

Do

'La mitad inferior de la pantalla aún es la activa...
Cls
Locate 1 , 8
Lcd "Hola"
Waitms 1000
Cls
Locate 2 , 15
Lcd "Mundo!"
Waitms 1000

Loop



'Fin del programa
End
Programa verificado!
--------------------
Saludos Hellmut
Avatar de Usuario
Hellmut1956
Miembro Leal
Miembro Leal
Mensajes: 1305
Registrado: Sab Nov 29, 2008 2:06 pm
Ubicación: Mammendorf, Alemania

Programa 4 - Entradas Análogas

Mensaje por Hellmut1956 »

Y seguimos con el tema de las entradas análogas del controlador mega8!

Usando este programa se puede jugar con las entradas análogas del controlador! Para este propósito usamos los dos potenciómetros previstos en la tarjeta experimental conectando estos a sus respectivos pines del controlador Port C.0 y Port C.1.

Para aprovechar los pines que hemos previsto en la tarjeta experimental junto a los pines del controlador y en otras partes de esta nos fabricamos un cable para crear conexiones cuando experimentemos. El objetivo es un cable de cobre con aislante de otro color que no sea rojo (para los positivos) y negro (para los negativos) , le ponemos un poco de estaño en los dos cabos. Hagan el hilo de cobre de mínimo unos 10 cm de largo, para poder conectar pines que puedan estar en puntos opuestos de la tarjeta experimental! A ambos cabos del hilo les soldamos uno de los bujes (pines hembra) que pueden ser puestos sobre los pines macho en nuestra tarjeta experimental. Vale la pena hacer varios, unos con el aislante negro, otro con el aislante rojo y otros con otros colores!

El programa va crear dos barras negras en la pantalla en la mitad inferior, una en cada renglón, que van a alargarse o acortarse, según la variación que hagamos con los potenciómetros!
Ya ven, este programa nos capacita a aprender 2 cosas que siempre volveremos a usar!

La una es crear barras que reflejen por su longitud el valor de un dígito. Cuanto más grande el dígito, más larga la barra, y viceversa! Ya se imaginan otro uso: Moviendo el stick del transmisor, podemos modificar esta función, para crear una barra negra que se extienda del centro hacia uno de los lados, dependiendo si el stick se mueve hacia uno u otro extremo. Otro uso es reflejar el control de un variador de la misma forma según este gire en una dirección u otra!

La otra función es la de asignar el valor de un registro en el controlador a una variable.

Ojalá no tengan problemas de entender el programa que también ha sido verificado usando la versión actual del compilador 11.9.8!

Código: Seleccionar todo

'******************************************************
'Proyecto: Programación del Controlador Atmel para Novatos
'
'Controlador: ATMega 8-16
'Bascom-Version: 1.11.9.8
'
'Programa 4: Trabajar con las entradas análogas
'
'Hardware:
'Pantalla LCD conectada al Pin Port B
'Potenciómetro de 10k conectado al Pin Port C.0
'Potenciómetro de 10k conectado al Pin Port C.1
'
'20.01.2006 T. Gietenbruch
'
'******************************************************

'======================================================
'Configuración del sistema
'======================================================
'Definiciones para el Mega 8
$regfile "m8def.dat"

'Definición del la frecuencia (1Mhz)
$crystal = 1000000

'Inclusión de la librería LCD para una pantalla con 2 controladores
$lib "lcd4e2.lbx"

'======================================================
'Configuraciones
'======================================================
'Definición de la resolución de la pantalla
'Aunque la pantalla que usamos es de 27 * 4 se usa la indicada!
Config Lcd = 20 * 4

'Configuración de las entradas análogas
Config Adc = Single , Prescaler = Auto , Reference = Avcc

'======================================================
'Declaraciones
'======================================================
'Variable para pasar de una mitad de la pantalla a la otra - No cambiar los nombres!
Dim ___lcde As Byte

'Variables para los valores análogos
Dim Analogwert_0 As Word
Dim Balken_0 As Word
Dim Balken_0_alt As Word

Dim Analogwert_1 As Word
Dim Balken_1 As Word
Dim Balken_1_alt As Word

'Contador
Dim N As Byte

'======================================================
'Inicializaciónes
'======================================================
'Iniciar periferia análoga
Start Adc


'======================================================
'Crear la máscara en la pantalla LCD
'======================================================
'Pasar a la mitad superior de la pantalla
___lcde = 0

'Borrar el contenido de la pantalla
Cls
'Texto del primer renglón (max. 27 dígitos)
Locate 1 , 1
Lcd "*** Cursillo Eelectrónico  ***"

'Texto en el segundo renglón
Locate 2 , 1
Lcd "****  TEST VALOR ANÀLOGO  ****"

'Apagar la imagen del cursor
Cursor Off

'Pasar a la mitad inferior de la pantalla
___lcde = 1

Cls

'Apagar la imagen del cursor
Cursor Off

'======================================================
'Programa principal
'======================================================

Do

'Leer los valores análogos de los Pines Port C.0 y C.1
Analogwert_0 = Getadc(0)
Analogwert_1 = Getadc(1)

'Cálculo de la longitud de la barra
Balken_0 = Analogwert_0 / 37
Balken_1 = Analogwert_1 / 37

'La imagen en la pantalla es actualizada, si el dato
'ha cambiado:
If Balken_0 <> Balken_0_alt Then
   Balken_0_alt = Balken_0
   Locate 1 , 1
   'Borrar el contenido del renglon de 27 dígitos
   Lcd "                           "
   'Escribir el número de dígitos deseado
   For N = 1 To Balken_0
      Locate 1 , N
      Lcd "="
   Next N

End If

If Balken_1 <> Balken_1_alt Then
   Balken_1_alt = Balken_1
   Locate 2 , 1
   'Borrar el contenido del renglon de 27 dígitos
   Lcd "                           "
   'Escribir el número de dígitos deseado
   For N = 1 To Balken_1
      Locate 2 , N
      Lcd "="
   Next N

End If

Loop



'Fin del programa
End
--------------------
Saludos Hellmut
Avatar de Usuario
Hellmut1956
Miembro Leal
Miembro Leal
Mensajes: 1305
Registrado: Sab Nov 29, 2008 2:06 pm
Ubicación: Mammendorf, Alemania

Re: Tarjeta Experimental - Software

Mensaje por Hellmut1956 »

Aquí una versión tentativa del programa 3 para la pantalla JHD162Ade 16x2

Código: Seleccionar todo

'******************************************************
'Projekt: Programación del mega8 para el cursillo electtrónico
'
'Prozessor: ATMega 8-16
'Bascom-Version: 2.0.4.0
'
'Programa 3: test de pantalla 16x2
'
'Hardware:
'Pantalla LCD conectada al Port B
'
'19.01.2006 T. Gietenbruch
'10.02.2011 H. Kohlsdorf traducción y adaptacion
'
'******************************************************

'======================================================
'Iniciación del sistema
'======================================================
'Definiciónes para el Mega 8
$regfile "m8def.dat"

'Angabe der Taktfrequenz (1Mhz)
$crystal = 1000000

'uso de bibliteca genérica para pantallas
$lib "lcd4.lbx"

'======================================================
'Configuraciones
'======================================================
'Resolución de la pantalla
'16x2 para pantalla JHD 162A
Config Lcd = 16 * 2


'======================================================
'Inicialisaciones
'======================================================

'======================================================
'Crear pantalla inicial por 10 segundos
'======================================================

'Borrar todo de la pantalla
Cls
'Texto a aparecer en la primera línea
Locate 1 , 1
Lcd "* Cursillo AVR *"

'Texta aparecer en la segunda línea
Locate 2 , 1
Lcd "*TEST PANTALLA*"

'Apagar el cursor
Cursor Off

Wait 10

'======================================================
'Hauptprogramm-Schleife
'======================================================

Do

Cls
Locate 1 , 8
Lcd "HOLA"
Waitms 1000
Cls
Locate 2 , 15
Lcd "MUNDO"
Waitms 1000

Loop

End
--------------------
Saludos Hellmut
Avatar de Usuario
Hellmut1956
Miembro Leal
Miembro Leal
Mensajes: 1305
Registrado: Sab Nov 29, 2008 2:06 pm
Ubicación: Mammendorf, Alemania

Re: Tarjeta Experimental - Software

Mensaje por Hellmut1956 »

Programa 5: Control de Servos

Otro módulo que demuestra las posibilidades y capabilidades del compilador BASCOM en conjunto con el mega8 de Atmel. Para este módulo recurrimos también a lo aprendido en el módulo 4 sobre las entradas analógicas, pues usaemos los potenciómetros como control de servos. La sentencia clave que introducimos en este módulo se define como sigue:
“config Servos = n , Servo1 = Pin.Nr, … Servon=Pin.Nr , Reload 10”

Importante: Esta sentencia utiliza el contador Time0, por lo cual este no se puede utilizar para otros propósitos! Igualmente importante, el programa requiere que el controlador sea operado a 8 MHz, por los cual los Fusebits tienen que ser puestos en tal forma que el controlador use el reloj interno a 8 MHz!

“n” es utilizado para definir el número de Servos conectados que deseamos controlar, la sentencia permite controlar hasta 16 servos al mismo tiempo! Increible verdad!

Descripción del programa:

Con el potenciometro conectado a C.0 se le puede inidicar al servo que “posición” deseamos que tome. En la pantalla indicamos el valor análogo y el de la posición al igual que el estado del servo, (On/Off). El servo es conectado al conector para servos en la tarjeta experimental y el hilo con la señal de control del servo (PWM) es conectado por un hilo al portal D.0 del módulo de microinterruptores correspondiente.
Si el servo está en estado “On” entonces girará a la posición que le indicamos y si está en “Off” entonces retornará a la posición neutral, osea céntrica. Posible son 120 posiciones para el servo cubriendo su giro posible. La variable Servo_1_Offset permite modificar la posición céntrica del servo.
El estado del servo, (On/Off) se controla con el microinterruptor C.0 y lo interrogamos usando la sentencia “Debounce” que se encarga por medio de software que el controlador mega8 solo registre un cambio de posición del microinterruptor. Lo que ocurre y lo que la sentencia “Debounce” evita que nos crea un problema, es que al actuar un interruptor mecánico en controlador es tan rápido registrando este cambio de posición que registra varios impulsos que lo hacen creer que el interruptor mecánico ha sido activado varias veces.la sentencia Debounce lo que hace es que cuando registra un cambio de voltaje en un pin de entrada verifica si el cambio persiste después de cierto tiempo ignorando así este efecto no deseado.

El programa ya es mas sofisticado, pero no duden en preguntar por si necesitan ayuda para entenderlo. Recuerden, que se trata de aprender de forma detallada lo que hacemos y sería muy sorprendente en este momento que el programa pueda ser entendido completamente por un novato!

Recuerden, que este módulo es una de una serie de módulos que van usando lo aprendido anteriormente. En un módulo futuro el control del servo por potenciómetro será reemlasado por el control atraves del receptor de nuestro radio control!

'******************************************************
'Projecto: Atmel-Programación para Novatos!
'
'Controlador: ATMega 8-16
'Bascom-Version: 1.11.8.1
'
'Program5 5: Servo-Control
'
'Hardware:
'LCD-Display en Port B
'10k-Poti en C.0
'Microinterruptor en Pin C.1
'R/C-Servo en D.0

'
'28.01.2006 T. Gietenbruch
'
'******************************************************

'======================================================
'Systema-Iniciación
'======================================================
'Definition für Mega 8
$regfile "m8def.dat"

'Frecuencia en (8Mhz)
$crystal = 8000000

'Incluir el elemento de biblioteca, genaro trabaja sin y tiene que usar su sentencia de configuración!
$lib "lcd4e2.lbx"

'======================================================
'Konfigurationen
'======================================================
'Tamano de pantalla
Config Lcd = 20 * 4

'Configuración de los I/O-Ports
Config Portc.1 = Input
Ddrd = &B00000001

'Configuracion de microinterruptor->Debounce-Zeit 100ms
Config Debounce = 100

'Configuracion de entradas analógicas
Config Adc = Single , Prescaler = Auto , Reference = Avcc

'Configuracion de salidas para servos
Config Servos = 1 , Servo1 = Portd.0 , Reload = 10

'======================================================
'Declaraciones
'======================================================
'Variable para cambiar de pareja de lineas de pantalla!
'Genaro no tiene 4 renglones por lo que tiene que adaptar el programa
Dim ___lcde As Byte

'Variables para valor analógicos
Dim Analogwert_0 As Word
Dim Calc As Word

'Variables para posición de servos
Dim Servo_1_offset As Byte
Dim Servowert_1 As Byte
Dim Servowert_1_alt As Byte
Dim Servo_1_on As Bit
Dim Servo_1_on_alt As Bit

'Texto para indicar estado de servos
Dim Servo_1_status As String * 3

'======================================================
'Inicialisaciones
'======================================================
'Procesar los valores analógicos
Start Adc

'Activar las rutinas del Interrupt
Enable Interrupts

'Asignar valores
Servo_1_offset = 30

'======================================================
'Crear mensajes en la pantalla
'======================================================
'Cambio a la mitad superior
___lcde = 0

'Borrar contenido de pantalla
Cls
'Texto del primer renglón (max. 27 dígitos!)
Locate 1 , 1
Lcd "*** AVR Curso ***"

'Texto del segundo renglón
Locate 2 , 1
Lcd "**** SERVO-Control ****"

'Apagar el cursor
Cursor Off

'Cambio a la mitad inferior
___lcde = 1

Cls
Locate 1 , 1
Lcd "Valor Analog:"
Locate 2 , 1
Lcd "Valor Servo:"

'Apagar el Cursor
Cursor Off

'======================================================
'Programm-Principal
'======================================================

Do

'Usa Debounce
Debounce Pinc.1 , 0 , Statechange , Sub

'Leer valor analógico Port C.0
Analogwert_0 = Getadc(0)

'Valor temporal para calcular posición (Transformar en una de 120 posiciones)
Calc = Analogwert_0 / 8

'Calcular posición de servo
Servowert_1 = Calc + Servo_1_offset

'Poner valor en pantalla
If Servowert_1 <> Servowert_1_alt Or Servo_1_on <> Servo_1_on_alt Then
Servowert_1_alt = Servowert_1
Servo_1_on_alt = Servo_1_on
Locate 1 , 13
Lcd " "
Locate 1 , 13
Lcd Analogwert_0

Locate 2 , 13
Lcd " "
Locate 2 , 13
Lcd Servowert_1
Locate 2 , 20
Lcd Servo_1_status
End If

If Servo_1_on = 1 Then
Servo(1) = Servowert_1
Servo_1_status = "ON"
Else
Servo(1) = Servo_1_offset + 60
Servo_1_status = "OFF"
End If


Loop

'Subprograma para definir estado de servo On/Off (Usando Debounce)
Statechange:
Toggle Servo_1_on
Return

'Programmende (nur formal)
End
--------------------
Saludos Hellmut
Avatar de Usuario
Hellmut1956
Miembro Leal
Miembro Leal
Mensajes: 1305
Registrado: Sab Nov 29, 2008 2:06 pm
Ubicación: Mammendorf, Alemania

Re: Tarjeta Experimental - Software

Mensaje por Hellmut1956 »

Programa 6: Uso de Interrupt con Timer

El presente módulo introduce los primeros conceptos de la programación de interrupts.

Los interrupts son el mecanismo usado por eventos exteriores, como por ejemplo el pinchar un interruptor, informando así el programa que esta siendo ejecutado en el controlador. Este interrumpe su programa y pasa a ejecutar un programa de servicio relacionado con el interrupt usado, abreviado con ISR, o “Interrupt Service Routine”. Una vez completada la ejecución de la ISR el controlador continua ejecutando el programa anterior. Es por eso deseable que estas rutinas ISR sean lo mas cortas posibles, pues durante este tiempo el controlador no puede reacionar o un segundo evento exterior!

En el controlador mega8 existen varias funciones internas que tienen un Interrupt específico relacionado con ellas. Por ejemplo los Timers y los Counters o contadores (0..2)
Un interrupt es creado por el timer/counter cunado ha alcanzado su valor máximo y asi empieza otraves desde 0.

El Timer0 es de 8 bits o 256 valores posibles, 0 a 255, Timer 1 y 2 son de 16bits o 65535 valores posibles.

Es posible definir la velocidad con la cual estos contadores incrementan los valores, o sea corren de 0 a 255 por ejemplo. La función usada para este propósito es el tal llamado “Prescaler”:

Config Timer0 = Timer , Prescale = n

El valotr de “n” por decirlo aasí es un reductor de la velocidad con la cual se incrementan los valores del contador. Si elegimos por ejemplo un valor de “4” entonces el contador Timer0 aumentará de por ejemplo “0” a “1” despues de 4 ticks del reloj que en este programa esta coriendo a 8MHz! Es como si el reloj solo andara a 2MHz para el contador pero si a 8MHz para el resto del controlador mega8.

Otro mecanismo para definir cuanto tiempo toma para que el interrupt relacionado al Timer0 sea activado depende de donde dejamos que el Timer0 empieze a contar. Si lo dejamos empesar en “0”, entonces requerira que el contador Timer0 corra de “0” a “255” y recién entonces ocurrirá un interrupt. Si lo dejamos arrancar de “100” por ejemplo, entonces entonces solo tomará 155 incrementaciones del contador y no 256 logrando asaí que lo sintervalos entre los Interrupt sean mas breves.

Lo que hace nuestro programa:

El Timer0 cambia 2 LEDs de On a Off y viceversa, estamos otra vez blinqueando con LEDs, verdad que es increible en cuantos lugar4es se usa esto para hacer visible lo que hace un programa! El LED conectado a D.0 cambia de estado cada vez que el Timer0 ejecuta la ISR con su Interrupt por haber contado hasta 255 y y el LED conectado a D.1 cuando se alcanza un valor definido por la posición del potenciómetro. Así se puede modificar la frecuencia de blinqueo usando el potenciómetro. El valor usado para controlar el blinqueo definido por el potenciómetro es indicado en la pantalla.

Este uso de los interrupts también lo usaremos cuando decodificamos las señales provenientes del receptor! Como ven nos estamos acercando a nuestro ojetivo!

Todo esto ocurre de forma muy sencilla de programar, pues la sentencia de BASCOM se encarga de casi todo lo relacionado! Y repito, preguntar, preguntar, preguntar, pues no es probable que no existan preguntas!

'******************************************************
'Projecto: Atmel-Programación para Novatos
'
‘Controlador: ATMega 8-16
'Bascom-Version: 1.11.8.1
'
'Programm 6: Timer-Interrupt
'
'Hardware:
'LCD-Display en Port B
'10k-Poti en C.0
'LED en D.0
'LED en D.1
'
'29.01.2006 T. Gietenbruch
'
'******************************************************

'======================================================
'System-Inicialisaciones
'======================================================
'Definiciones para el Mega 8
$regfile "m8def.dat"

‘Frecuencia usada
$crystal = 1000000

‘Inclusión de la biblioteca para pantallas con 2 controladores
$lib "lcd4e2.lbx"

'======================================================
'Configuraciones
'======================================================

'Configuracion de I/O-Ports
Config Portd = Output

'Tipo de pantalla
Config Lcd = 20 * 4

'Configuraciones de entradas analogicas
Config Adc = Single , Prescaler = Auto , Reference = Avcc

'Configuraciones del Timer0 !!!Prescale posibles 1|8|64|256|1024!!!
Config Timer0 = Timer , Prescale = 64

'======================================================
'Declaraciones
'======================================================

'Variable para cambio de mitad de pantalla – No cambiar!
Dim ___lcde As Byte

Dim N As Word
Dim Calc As Word
Dim Speed As Word
Dim Speed_alt As Word

'======================================================
'Initialisierungen
'======================================================

'Angabe der Interrupt-Service-Routine für Timer0
On Timer0 T0_isr

'Timer-Freigabe
Enable Timer0

'Freigabe der Interrupt-Routinen
Enable Interrupts

'Anschaltung der Analogwert-Verarbeitung
Start Adc

'Ports initialisieren
Portd = &B11111111

'======================================================
'Aufbau der LCD-Maske
'======================================================
'Umschaltung auf die obere Hälfte
___lcde = 0

'Das Display löschen
Cls
'Text der ersten Zeile (max. 27 Zeichen!)
Locate 1 , 1
Lcd "*** AVR EINSTEIGERKURS ***"

'Text der zweiten Zeile
Locate 2 , 1
Lcd "**** TIMER-INTERRUPT ****"

'Den Cursor ausschalten
Cursor Off

'Umschaltung auf die untere Hälfte
___lcde = 1

Cls
Locate 1 , 1
Lcd "Geschwindigkeit:"

'Den Cursor ausschalten
Cursor Off

'======================================================
'Hauptprogramm-Schleife
'======================================================

Do

'Analogwert lesen und auf 0...100 Schritte wandeln
Calc = Getadc(0)
Speed = Calc / 10
If Speed > 100 Then Speed = 100

‘Mensaje puesto en pantalla
If Speed <> Speed_alt Then
Speed_alt = Speed
Locate 1 , 17
Lcd " "
Locate 1 , 17
Lcd Speed
End If

Loop

'Interrupt-Service-Routine (ISR) para Timer0
T0_isr:
'Timer0=127
Toggle Portd.0
Incr N
If N >= Speed Then
Toggle Portd.1
N = 0
End If
Return

'Fin del programa
End
--------------------
Saludos Hellmut
Avatar de Usuario
Hellmut1956
Miembro Leal
Miembro Leal
Mensajes: 1305
Registrado: Sab Nov 29, 2008 2:06 pm
Ubicación: Mammendorf, Alemania

Re: Tarjeta Experimental - Software

Mensaje por Hellmut1956 »

Programa 7: Decodificar canal del Receptor

En este programa decodificamos los impulsos provenientes de la transmisora y entregados por el receptor R/C! Convertimos el largo de un impulso del receptor en un valor digital.

Para medir la longitud del impulso de uno de los canales del receptor usamos el Interrupt disponible en el Pin D.2, el “INT0” y el contador Timer1. Las señales provenientes de los receptores del R/C tienen tensiones tales que es posible conectarlas directamente al controlador.

Para conectar la tarjeta experimental a un canal del receptor usamos los 3 pines macho previstos para este propósito y conectamos la tarjeta experimetal aasí al receptor. El receptor es alimentado atravez de esta conexión no requiriendo una batería propia! El pin de la señal es conectado usando, al igual que un programa anterior, un hilo para conectar esta señal al pin D.2 en el módulo correspondiente en nuestra tarjeta experimental. Es lo mismo que cuando escribimos el programa para controlar servos!

Es importante, como lo había dicho anteriormente, mantener la rutina de servicio del interrupt (ISR) lo mas breve posible, pues el controlador que estamos operando ahora a 4MHz puede ejecutar 4000 sentencias durante una milésima de segundo!

Descipción del programa:

Con la sentencia “Config Int0 = Change” definimos que la ISR es ejecutada cada vez que la señal del receptor cambia de voltaje, significa que entonces es activado un interrupt! En la rutina ISR correspondiente a este interrupt del programa el contador Timer1 es iniciado cada vez que el voltaje cambia de 0V a 5V, volviendose entonces inmediatamente a la rutina principal del programa. Apenas el voltaje vuelve de 5V a 0V, corresponde a la finalisación del impulso del receptor, es activado el mismo interrupt y la rutina ISR correspondiente. Esta ISR ahora para el contador y el valor del contador es asignado a la variable “Rc_value”.

Imaginémosnos que ocurra un problema de odo que el receptor no recibe valores, entonces puede ocurrir que el contador Timer1 llegue a su valor máximo activando entonces la ISR correspondiente. Esto es indicativo que el impulso del receptor es erróneo, lo queconduce a que la rutina ISR del contador Timer1 active un registro indicando este error. Nuestro programa continuará escaneando el canal del receptor hasta que vuelva a recibir una señal válida del receptor, continuando así decodificando la señal del receptor!

Como el Timer1 utilisado es de 16 bits o 65535 valores posibles, la resolución de la decodificación de la señal puede ser altísima! Por eso en este programa hemos limitado artificialmente la resolución a 3000 valores posibles lo que continua siendo una resolución altísima para un canal del radiocontrol!

Este programa todo lo que hace es presentar el resultado de la decodificación en la pantalla!

'******************************************************
'Projekt: Atmel-Programmierung für Einsteiger
'
'Prozessor: ATMega 8-16
'Bascom-Version: 1.11.8.1
'
'Programm 7: R/C_Kanal einlesen
'
'Hardware:
'R/C-Kanal an D.2 (INT0)
'LED an C.0
'LED an C.1
'LED an C.3
'
'10.02.2006 T. Gietenbruch
'
'******************************************************

'======================================================
'System-Einstellungen
'======================================================
'Definition für Mega 8
$regfile "m8def.dat"

'Angabe der Taktfrequenz (8Mhz)
$crystal = 4000000

'Einbindung der LCD-Bibliothek für ein 2-Prozessor-Display
$lib "lcd4e2.lbx"

'======================================================
'Konfigurationen
'======================================================

'Konfiguration der I/O-Ports´s
Config Portc = Output
Config Portd = Input

'Angabe der Display-Größe
Config Lcd = 20 * 4

'Konfiguration des Timer1
Config Timer1 = Timer , Prescale = 1

'Konfiguration des INT0
'Interrupt bei jedem Flankenwechsel (0->1 und 1->0)
Config Int0 = Change

'======================================================
'Deklarationen
'======================================================

'Variable für Umschaltung der Displayhälfte - Namen so lassen!
Dim ___lcde As Byte

Dim Reading As Bit
Dim Bargraph As Word
Dim Bargraph_old As Word
Dim Rc_value As Word
Dim Calc As Word
Dim Location As Word
Dim Error As Bit

'======================================================
'Initialisierungen
'======================================================

'Zuweisung der Interrupt-Service-Routinen
On Int0 Rc_read
On Timer1 Rc_error

'Timer-Freigabe
Enable Timer1
Stop Timer1

'Freigabe der Interrupt-Routinen
Enable Int0
Enable Interrupts

'Ports initialisieren
Portc = &B11111111


'======================================================
'Aufbau der LCD-Maske
'======================================================
'Umschaltung auf die obere Hälfte
___lcde = 0

'Das Display löschen
Cls
'Text der ersten Zeile (max. 27 Zeichen!)
Locate 1 , 1
Lcd "*** AVR EINSTEIGERKURS ***"

'Text der zweiten Zeile
Locate 2 , 1
Lcd "***** R/C-KANAL LESEN *****"

'Den Cursor ausschalten
Cursor Off

'Umschaltung auf die untere Hälfte
___lcde = 1

Cls
Locate 1 , 1
Lcd "Timerwert:"

'Den Cursor ausschalten
Cursor Off


'======================================================
'Hauptprogramm-Schleife
'======================================================

Do

'LED an bei Fehler (Timer-Überlauf)
Portc.2 = Not Error

'LCD-Ausgabe während der langen Lesepause...
If Reading = 0 Then

'Den Timerwert ausgeben
Locate 1 , 12
Lcd Rc_value ; " "

'Die Bargraph-Anzeige berechnen
If Rc_value > 7000 Then
Calc = Rc_value - 7000
Calc = Calc / 100
If Calc > 13 Then Calc = 13
Bargraph = 14 + Calc
Elseif Rc_value < 5500 Then
Calc = 5500 - Rc_value
Calc = Calc / 100
If Calc > 13 Then Calc = 13
Bargraph = 14 - Calc
Else
Bargraph = 14
End If

'Den Bargraph auf´s Display zaubern...
If Bargraph <> Bargraph_old Then
Bargraph_old = Bargraph
Locate 2 , 1
Lcd " "
If Bargraph < 14 Then
For Location = 14 To Bargraph Step -1
Locate 2 , Location
'!!!In der LCD-Tabelle stehen die CHR-Codes der Zeichen!!!
Lcd Chr(&Hdb)
Next Location
Elseif Bargraph > 14 Then
For Location = 14 To Bargraph Step 1
Locate 2 , Location
Lcd Chr(&Hdb)
Next Location
Else
Locate 2 , Bargraph
Lcd Chr(&Hdb)
End If
End If

End If
Loop

'Programmende (nur formal)
End

'======================================================
'ISR für INT0 - R/C-Kanal lesen
'======================================================
Rc_read:
'Den Timer starten mit steigender Flanke
If Reading = 0 Then
Start Timer1
Reading = 1
Toggle Portc.0
'Den Timer stoppen mit fallender Flanke
Else
Stop Timer1
Rc_value = Timer1
Timer1 = 0
Reading = 0
Toggle Portc.1
End If
'Error-Bit rücksetzen
Error = 0
Return

'======================================================
'ISR für Timer1 - Fehlerhandling
'======================================================
Rc_error:
'Error-Bit setzen
Error = 1
Reading = 0
Stop Timer1
Rc_value = 6300

Return
--------------------
Saludos Hellmut
Avatar de Usuario
Hellmut1956
Miembro Leal
Miembro Leal
Mensajes: 1305
Registrado: Sab Nov 29, 2008 2:06 pm
Ubicación: Mammendorf, Alemania

Re: Tarjeta Experimental - Software

Mensaje por Hellmut1956 »

Programa 8: Comunicación RS2332

El programa requiere entrar dos valores numéricos y como respuesta da el resultado de la adición y la multiplicación de estos. Para que el programa funcione de forma correcta se requiere igualar los parametros de la velocidad de comunicación en BASCOM y en el programa.

Imagen

Después se abre la ventana en BASCOM de la „Terminal“ y entonces se podra ver el texto en la pantalla.

Imagen

Código: Seleccionar todo

'******************************************************
'Projekt: Atmel-Programmierung für Einsteiger
'
'Prozessor: ATMega 8-16
'Bascom-Version: 1.11.8.1
'
'Programm 8: RS232-Kommunikation
'
'Hardware:
'MAX232 an Port D.0 und D.1
'Verbindung zur RS232 eines PC´s
'
'25.02.2006 T. Gietenbruch
'
'******************************************************

'======================================================
'System-Einstellungen
'======================================================
'Definition für Mega 8
$regfile "m8def.dat"

'Angabe der Taktfrequenz (8Mhz)
$crystal = 8000000

'Einbindung der LCD-Bibliothek für ein 2-Prozessor-Display
$lib "lcd4e2.lbx"

'Einstellung der Baudrate für RS232-Kommunikation
$baud = 19200

'======================================================
'Konfigurationen
'======================================================

'Konfigurationen für RS232-Kommunikation: I/O-Puffer
Config Serialin = Buffered , Size = 100
Config Serialout = Buffered , Size = 100


'======================================================
' Deklarationen
'======================================================

Dim Z_1 As Integer
Dim Z_2 As Integer
Dim Ergebnis_add As Integer
Dim Ergebnis_mul As Integer
Dim Taste As Byte

Enable Interrupts

'======================================================
'Hauptprogramm
'======================================================

Do
'Leerzeile
Print

'Eingabe von zwei Zahlenwerten über RS232
Input "Erste Zahl: " , Z_1
Input "Zweite Zahl: " , Z_2

'Berechnung der Addition und Multiplikation
Ergebnis_add = Z_1 + Z_2
Ergebnis_mul = Z_1 * Z_2

'Ausgabe der Ergebnisse über RS232
Print "      Addition: " ; Ergebnis_add
Print "Multiplikation: " ; Ergebnis_mul
Print

Print "Neue Rechnung? Y/N"

'Warten auf Tastatureingabe
Tastendruck:
Taste = Waitkey()

'Auswertung der Tastatureingabe
If Taste = 78 Or Taste = 110 Then
   Print "Und tschuess... weiter mit Chip-Reset!"
   Waitms 500
   End
Elseif Taste = 89 Or Taste = 121 Then
   Loop
Else
 Goto Tastendruck
End If
--------------------
Saludos Hellmut
Avatar de Usuario
Hellmut1956
Miembro Leal
Miembro Leal
Mensajes: 1305
Registrado: Sab Nov 29, 2008 2:06 pm
Ubicación: Mammendorf, Alemania

Re: Tarjeta Experimental - Software

Mensaje por Hellmut1956 »

Programa 9: El Bus I2C

Este programa requiere instalar en la tarjeta experimental el ampliador de puertos PCF8574P. El programa hace blinquear los LEDs conectados a los primeros 4 pins yn usa los proximimos 4 pins como entradas por lo que hay que poner los jumpers en el módulo correspondiente de la tarjeta experimental.

Adicionalmente supervisamos es estado de servicio des Bus I2C durante su uso y mostramos los resultados en la pantalla. Ahora algunas palabras sobre el Bus I2C.

Bus significa que es posible conectar múltiples componentes al bus y realizar la comunicación entre estos usaando direcciones de las componentes participantes. Las direcciones son como las de las casas en una calle y la calle es el bus. Así indicando cual “casa” quiere hablar con cual otra “casa” es lo equivalente. La casa que quiere iniciar la comunicación se llama el “Master” y aquella a la que se dirige es el “slave”.

En el caso de nuestros controladores mega8 por ejemplo, estos contienen la implementación de la función Bus I2C en hardware, tanto como master , que como slave. A razón de esto el uso de esta hardware en el controlador requiere el uso de pines específicos definidos en la hoja de datos del controlador. Por otro lado BASCOM nos ofrece la posibilidad de realizar la función Bus I2C en software. En este caso el controlador imita la funcionalidad de la hardware como resultado de la acción de la software y esto permite asignar pines al bus I2C a cualquier pin del controlador. Aquí vamos a utilizar la funcionalidad en hardware y la comunicación sera entre el controlador como “master” y el PCF8574P como slave. Pero recuerden que también existe la posibilidad de hacer que 2 controladores se comuniquen sobre este bus, lo que publicaré como resultado de mis trabajos en mi velero Carina.

En el PCF8574P la dirección de esta componente consiste de una dirección básica, que es “64” y una adición que se define por jumpers, ver esquema de la tarjeta experimental. A razón de este valor definido por jumpers es posible usar múltiples de estos PCF8574P conectados todos al mismo Bus I2C, asignandoles así direciones diferentes.

Código: Seleccionar todo

'******************************************************
'Projekt: Atmel-Programmierung für Einsteiger
'
'Prozessor: ATMega 8-16
'Bascom-Version: 1.11.8.1
'
'Programm 9: Der I2C-Bus
'
'Hardware:
'LCD-Display an Port B
'I2C-Bus an C.4 (SDA) und C.5 (SCL)
'PCF8574 8-Bit Port-Expander für I2C-Bus:
'-> Vier LED´s an P0 bis P3
'-> Vier Schalter an P4 bis P7
'
'11.03.2006 T. Gietenbruch
'
'******************************************************

'======================================================
'System-Einstellungen
'======================================================
'Definition für Mega 8
$regfile "m8def.dat"

'Angabe der Taktfrequenz (4Mhz)
$crystal = 8000000

'Einbindung der LCD-Bibliothek für ein 2-Prozessor-Display
$lib "lcd4e2.lbx"

'Einbindung der I2C-Bibliothek
$lib "i2c_twi.lbx"

'======================================================
'Konfigurationen
'======================================================
'Angabe der Display-Größe
Config Lcd = 20 * 4

'Angabe der I2C-Bus-PIN´s (mit i2c_twi.lbx nicht veränderbar!)
Config Sda = Portc.4
Config Scl = Portc.5

'Konfiguration der Ports
Config Portd = Output

'======================================================
'Deklarationen
'======================================================
'Variable für Umschaltung der Displayhälfte - Namen so lassen!
Dim ___lcde As Byte

Dim I2c_state As Bit
Dim Portpcf_in As Byte
Dim Portpcf_out As Byte
Dim Portpcf_old As Byte

Dim N As Byte

'======================================================
'Initialisierungen
'======================================================

'Schreib-Adresse für PCF8574P - einstellbar mit Jumpern
Const Pcf_w_adr = 64

'Lese-Adresse für PCF8574P - immer Schreib-Adresse + 1
Const Pcf_r_adr = Pcf_w_adr + 1


Portd = &B11111111
Portpcf_out = &B11111010

'Anschaltung des I2C-Busses
I2cinit

'======================================================
'Aufbau der LCD-Maske
'======================================================
'Umschaltung auf die obere Hälfte
___lcde = 0

'Das Display löschen
Cls
'Text der ersten Zeile (max. 27 Zeichen!)
Locate 1 , 1
Lcd "*** AVR EINSTEIGERKURS  ***"

'Text der zweiten Zeile
Locate 2 , 1
Lcd "*****  I2C-BUS-TEST   *****"

'Den Cursor ausschalten
Cursor Off

'Umschaltung auf die untere Hälfte
___lcde = 1

Cls

Lcd "I2C-Status: "

'Den Cursor ausschalten
Cursor Off



'======================================================
'Hauptprogramm-Schleife
'======================================================

Do

If I2c_state = 1 Then
   'Eingangsbyte vom PCF8574 lesen
   I2cstart
   I2cwbyte Pcf_r_adr
   I2crbyte Portpcf_in , Nack

   'Ausgangsbyte zum PCF8574P schreiben
   I2cstart
   I2cwbyte Pcf_w_adr
   I2cwbyte Portpcf_out
End If

'Der I2C-Bus liefert ein ERR-Bit bei Schreibfehler
If Err = 1 Or I2c_state = 0 Then Gosub I2c_statecheck

'Eingangsbyte aufs Display schreiben
If Portpcf_in <> Portpcf_old Then
   Portpcf_old = Portpcf_in
   Locate 2 , 1
   Lcd Bin(portpcf_in)
End If

'Statusänderung der PCF8574-Ausgänge
For N = 0 To 3
   Toggle Portpcf_out.n
Next N

'Status-Life-Bit für Hauptprogramm
Toggle Portd.0
Waitms 500

Loop



'Programmende (nur formal)
End



'======================================================
'Subroutine: I2C-Bus prüfen
'======================================================
I2c_statecheck:
   I2cstart
   I2cwbyte Pcf_w_adr
   If Err = 1 Then
      I2c_state = 0
      Portpcf_in = 0
      Locate 1 , 13
      Lcd "FEHLER   "
   Else
      I2c_state = 1
      Locate 1 , 13
      Lcd "OK       "
   End If
Return
--------------------
Saludos Hellmut
Avatar de Usuario
Hellmut1956
Miembro Leal
Miembro Leal
Mensajes: 1305
Registrado: Sab Nov 29, 2008 2:06 pm
Ubicación: Mammendorf, Alemania

Re: Tarjeta Experimental - Software

Mensaje por Hellmut1956 »

Programa 9: Realizar un PWM

Este programa en combinación con el circuito de potencia del módulo 6 de la hardware de la tarjeta experimental permite regular o la tensión de un bombillo halógeno o de regular un motor de poca potencia. Favor no conectar un motor grande pues esto destruiria los MOSFETs del circuito de potencia.

El program utiliza el circuito de PWM del Timer2 en nuestro controldor mega8, de lo que resulta que el PWM aparece en el pin B.3. este pin lo conectamos a la entrada 1 o 2 del IC UDN2981 de nuestra tarjeta experimental usando los cables de piente como siempre.

La variable del sistema “Ocr2” contiene el contenido del registro del controlador “Output-Compare-Register” del Timer 2. Apenas el Timer2, incrementando sus valores como lo hemos descrito en el módulo de los interupts, alcanza el valor grabado en la variable Ocr2, cambia el voltaje en la salida del pin OC2 (Pin B.3).

Quien desea aprender mas sobre PWN le recomiendo buscar con google.es en el internet, donde encontrará extensivas explicaciones. En este ejemplo el uso de la pantalla solo es posible asignando otros pines a la comunicación con la pantalla por lo que no la usamos en este ejemplo.
El Pin C.1 lo hemos declarado como entrada análoga, del Pin C.2 usaremos el switch el módulo de microinteruptores en la tarjeta experimental. Si le aplicamos 0V al pin C.0 apagamos el PWN forzando la salida b.3 a 0.

Código: Seleccionar todo

'******************************************************
'Projekt: Atmel-Programmierung für Einsteiger
'
'Prozessor: ATMega 8-16
'Bascom-Version: 1.11.8.1
'
'Programm 10: PWM-Erzeugung
'
'Hardware:
'UDN2981 mit MosFet IRF540
'Schalter an Port C.0
'10k-Poti an Port C.1
'PWM-Ausgang an Port B.3 (OC2)
'
'26.02.2006 T. Gietenbruch
'
'******************************************************

'======================================================
'System-Einstellungen
'======================================================
'Definition für Mega 8
$regfile "m8def.dat"

'Angabe der Taktfrequenz (8Mhz)
$crystal = 8000000

'Konfiguration der Analogeingänge
Config Adc = Single , Prescaler = Auto , Reference = Avcc

'Konfiguration Timer 2 für Hardware-PWM an OC2 (B.3)
Config Timer2 = Pwm , Prescale = 128 , Compare = Clear

'Konfiguration der Ports
Config Portb = Output
Config Portc = Input
Config Portd = Output

'======================================================
'Deklarationen
'======================================================

Dim Analogwert As Word
Dim Pwmwert As Byte

'======================================================
'Initialisierungen
'======================================================
'Anschaltung der Analogwert-Verarbeitung
Start Adc

Portb = &B00000000
Portd = &B00000000

'Start des PWM-Timers
Enable Timer2
Timer2 = 0
Start Timer2

'======================================================
'Hauptprogramm-Schleife
'======================================================
Do

'Analogwert vom Poti einlesen, umrechnen und formieren
Analogwert = Getadc(1)
Analogwert = Analogwert / 4
If Analogwert > 255 Then Analogwert = 255

'Erzeugung des PWM-Signals
If Pinc.0 = 0 Then
   Ocr2 = Analogwert
Else
   Ocr2 = 0
End If

Loop
--------------------
Saludos Hellmut
Responder