Autor Tema: Jugando con el ADCH y ADCL  (Leído 6663 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Leral

  • PIC10
  • *
  • Mensajes: 17
Jugando con el ADCH y ADCL
« en: 13 de Marzo de 2009, 07:51:19 »
Hola a todos. Soy nuevo con los Atmega y aun mas con AVRstudio. TEngo que programar una aplicacion con el ATmega8 usando el AVRstudio. Y tengo una duda. Despues de leer varios tutoriales y post mas o menos tengo una idea de lo que tengo que hacer. Pero tengo ciertas dudas.La que quiero preguntaros es la siguiente.

Tengo que leer la señal de un potenciometro, con lo cual uso la opcion ADC del ATmega8. Esta opcion escribe en los registros ADCH y ADCL los diferentes valores que va tomando. Aqui entra mi duda...como puedo hacer para ir jugando con estos valoes, es decir, quiero comprarlos con otros y segun sea la comparacion hacer una cosa u otra. Este es el cacho de codigo que he escrito, se que esta mal, pero si es posible ayudenme a encontrar los errores:

n r16, ADCL
in r17, ADCH ; Ya tengo los valores


;Esto es un ejemplo de los posibles valores que podria tomar el potenciometro.
;0v -----> 0x000 (0d)
;5v -----> 0x0FF (255d)
;10v ----> 0x1FF (511d)
;15v ----> 0x2FF (767d)
;20v ----> 0x3FF (1023d)


Start:

cpi r16, 0x00   ; primera comparacion, si no coinciden comparo con el siguiente y en caso contrario, es decir que coincidan me voy a la funcion first_case
brne next_1
cpi r17, 0x00
brne first_case

next_1:

cpi r16, 0x03  ; segunda comparacion, mas de lo mismo.
brne next_2
cpi r17, 0x3f
brne second_case

next_2:

cpi r16, 0x07
brne next_3
cpi r17, 0x3f
brne third_case

next_3:


cpi r16, 0x0B
brne next_4
cpi r17, 0x3f
brne quarter_case

next_4:

cpi r16, 0x0F
brne Start
cpi r17, 0x3f
brne fifth_case


Desconectado FuYiVape

  • PIC12
  • **
  • Mensajes: 69
    • Electronica y Sistemas
Re: Jugando con el ADCH y ADCL
« Respuesta #1 en: 13 de Marzo de 2009, 12:27:50 »
en C te puedo dar una mano si queres.
tengo hecho algo parecido.

Saludos.

Desconectado Leral

  • PIC10
  • *
  • Mensajes: 17
Re: Jugando con el ADCH y ADCL
« Respuesta #2 en: 13 de Marzo de 2009, 17:38:09 »
HOla FuYiVape

 Puff....no se nada de C.  Ya tengo suficiente con aprender el ensamblador como para ponerme con C ahora.....pero muchisimas gracias por tu ayuda.

Hay mucha diferencia entre el C y el esambrador?? sera dificil entender el codigo partiendo desde cero!!

Desconectado FuYiVape

  • PIC12
  • **
  • Mensajes: 69
    • Electronica y Sistemas
Re: Jugando con el ADCH y ADCL
« Respuesta #3 en: 14 de Marzo de 2009, 09:17:52 »
Hay mucha diferencia entre el C y el esambrador?? sera dificil entender el codigo partiendo desde cero!!

Hay mucha diferencia desde la programacion, pero en el fondo son muy parecidos.
Si estas empezando a ver el assembler, te recomiendo que te tomes el tiempo para aprender C.
PARECE COMPLICADO... pero no lo es.

La diferencia fundamental esta en el orden, la estructura, la legibilidad y la comprension del codigo C.
Es mucho mas legible un codigo C que uno assembler.

Código: [Seleccionar]
cpi r17, 0x00
brne first_case

if(a==0x00)
{
   codigo first_case;
}

Y cuando tenes que implementar estructuras, arrays o hacer calculos de punto flotante etc. el C es mucho mas amigable.
La ventaja?
Al tratarse de un lenguaje tan basico y tan cercano al bajo nivel, los compiladores resuelven el codigo con un muy buen codigo assembler.
Como el C en su esencia son punteros y direcciones, al compilador no le resulta complicado traducir las sentencias a codigo assembler.
Y al ser tan cercano al bajo nivel, hasta podes incluir codigo assembler dentro del codigo C.

Tenes que tomarte el tiempo en comprender la esencia del C. y despues vas disfrutarlo.
Para empezar si queres, te recomiendo que leas la "BIBLIA" del C. El libro de sus creadores "El Lenguaje de Programacion C por Kernighan & Ritchie"

LINK ELIMINADO NO SE PERMITE SUBIR AL FORO MATERIAL CON COPYRIGHT. Atte. Migsantiago Reglas del Foro.


Insisto, PARECE COMPlICADO, pero no lo es.

Saludos

« Última modificación: 14 de Marzo de 2009, 12:57:15 por migsantiago »

Desconectado Leral

  • PIC10
  • *
  • Mensajes: 17
Re: Jugando con el ADCH y ADCL
« Respuesta #4 en: 14 de Marzo de 2009, 11:20:07 »
Ok. Mcuhas gracias intentare hacerlme con una copia!!

Desconectado Belgitaes

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: Jugando con el ADCH y ADCL
« Respuesta #5 en: 14 de Marzo de 2009, 16:14:35 »
Código: [Seleccionar]
quiero comprarlos con otros y segun sea la comparacion hacer una cosa u otra.

Se Me Occurio Hacer Esta Routina En AvrStudio  :g)
Para Comparar Los diferentes Valores Del Potenciometro
No Sé Si Te Valdra
Esta Routina La Podras Simular Con El AvrStudio
Y Luego AcoplarLa A Tu Codigo
; ;0v -----> 0x000
; Desde 0 Voltios  Hasta 5 Voltios  = Desde 1....Hasta 64  Decimales = 40 Hex
; Desde 5 Voltios  Hasta 10 Voltios = Desde 65...Hasta 128 Decimales = 80 Hex
; Desde 10 Voltios Hasta 15 Voltios = Desde 129..Hasta 192 Decimales = C0 Hex
; Desde 15 Voltios Hasta 20 Voltios = Desde 193..Hasta 255 Decimales = FF Hex
Luego Ya La Puedes Adaptar A Tu Gusto

Código: [Seleccionar]

; Preuba ASM
;-------------------------------------------------------
; Declaraciones estandar para este micro Atmega8:
.include "m8def.inc" 
;-------------------------------------------------------
; Definicion de constantes y variables
; ------------------------------------------------------
; Pila
  .equ          PILA                   =0x0FF
;-----------------------------------------------------           
.DSEG       
; MEMORIA RAM       
    .ORG                (PILA+1)
;----------------------------------------------------
;            Vectores de interrupcion
;----------------------------------------------------           
.CSEG       
    .ORG     0x0000         
Rjmp        RESET                        ; RESET
; --------------------------------------------------------
;                       RUTINA DE RESET
; --------------------------------------------------------
RESET: 
 Cli
 Ldi        r16,HIGH ( PILA )         
 Out        SPH,r16         
 Ldi        r16,LOW (PILA )                         
 Out        SPL,r16         

;*******DESDE AQUÍ VUESTRO CODIGO*****
; ;0v -----> 0x000
; Desde 0 Voltios  Hasta 5 Voltios  = Desde 1....Hasta 64  Decimales = 40 Hex
; Desde 5 Voltios  Hasta 10 Voltios = Desde 65...Hasta 128 Decimales = 80 Hex
; Desde 10 Voltios Hasta 15 Voltios = Desde 129..Hasta 192 Decimales = C0 Hex
; Desde 15 Voltios Hasta 20 Voltios = Desde 193..Hasta 255 Decimales = FF Hex

ComparaZero:

 Ldi ZH,HIGH(2*ZeroVoltios)
 Ldi ZL,LOW(2*ZeroVoltios)
 Rjmp Intro

ComparoCincoVoltios:

 Ldi ZH,HIGH(2*CincoVoltios)
 Ldi ZL,LOW(2*CincoVoltios)
 Rjmp Sigo

ComparoDiezVoltios:

 Ldi ZH,HIGH(2*DiezVoltios)
 Ldi ZL,LOW(2*DiezVoltios)
 Rjmp Sigo1

ComparoQuinzeVoltios:

 Ldi ZH,HIGH(2*QuinzeVoltios)
 Ldi ZL,LOW(2*QuinzeVoltios)
 Rjmp Sigo2

ComparoVeinteVoltios:

 Ldi ZH,HIGH(2*VeinteVoltios)
 Ldi ZL,LOW(2*VeinteVoltios)
 Rjmp Sigo3


;********************
; Comparo Valores
;********************
Intro:
 Lpm
 Tst R0
 Breq Retorna 

Sigo:
 Lpm
 Tst R0
 Breq Retorna1
 Adiw ZL,1
 brne Sigo
 nop

Sigo1:
 Lpm
 Tst R0
 Breq Retorna2
 Adiw ZL,1
 brne Sigo1

Sigo2:
 Lpm
 Tst R0
 Breq Retorna3
 Adiw ZL,1
 brne Sigo2

Sigo3:
 Lpm
 Tst R0
 Breq Stop
 Adiw ZL,1
 brne Sigo3
 
Retorna: Rjmp ComparoCincoVoltios
Retorna1:    Rjmp ComparoDiezVoltios
Retorna2:    Rjmp ComparoQuinzeVoltios
Retorna3:    Rjmp ComparoVeinteVoltios

Rjmp stop

;****HASTA AQUÍ VUESTRO CODIGO********

STOP:        rjmp        STOP   ;FIN DEL PROGRAMA
 
;*******************
;Tabla De Voltage
;*******************

ZeroVoltios:

.DB 0x00

CincoVoltios:; Hasta Llegar Hasta 40Hex = ( 64 Decimal)

.DB 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08
.DB 0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10
.DB 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18
.DB 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20
.DB 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28
.DB 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30
.DB 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38
.DB 0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x40
.DB 0x00

DiezVoltios:; Hasta Llegar Hasta 80Hex = ( 128 Decimal)
.DB 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48
.DB 0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50
.DB 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58
.DB 0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60
.DB 0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68
.DB 0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70
.DB 0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78
.DB 0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80
.DB 0x00

QuinzeVoltios:; Hasta Llegar Hasta C0Hex = ( 192 Decimal)
.DB 0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88
.DB 0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90
.DB 0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98
.DB 0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0
.DB 0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8
.DB 0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0
.DB 0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8
.DB 0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,0xC0
.DB 0x00


VeinteVoltios:; Hasta Llegar Hasta FFHex = ( 255 Decimal)
.DB 0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8
.DB 0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0
.DB 0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8
.DB 0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0
.DB 0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8
.DB 0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0
.DB 0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8
.DB 0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x00



Desconectado Leral

  • PIC10
  • *
  • Mensajes: 17
Re: Jugando con el ADCH y ADCL
« Respuesta #6 en: 16 de Marzo de 2009, 05:56:58 »
Un pregunta porque haces esto;

ComparaZero:

 Ldi ZH,HIGH(2*ZeroVoltios)
 Ldi ZL,LOW(2*ZeroVoltios)
 Rjmp Intro


No veo lo de ese 2 multiplicando a ZeroVoltios


De todas formas decir que es mas de lo que esperaba. Muchas gracias.

Hasta ahora solo habia encontrado manuales y tutoriales que a pesar de ser bueno carecian de ejemplos suficientes, y lo que necesito mas es cosas como este codigo para hacerme una idea de lo que tengo que hacer y como hacerlo.

Estoy muy agradecido.
Saludos.
« Última modificación: 16 de Marzo de 2009, 07:58:32 por Leral »

Desconectado Belgitaes

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: Jugando con el ADCH y ADCL
« Respuesta #7 en: 16 de Marzo de 2009, 13:40:49 »

Código: [Seleccionar]
No veo lo de ese 2 multiplicando a ZeroVoltios

Lo De Multiplicar Por 2 (Tabla*2) O El Nombre Que Sea (Pepe*2)
Debido A La Estructura De La Memoria Interna La Multiplicacion Es Obligatorio Para Alinear La Direccion
Es Decir Veras Abajo La Misma Tabla Reflejada Con El Mismo Nombre En Este Caso Como Se Llama ZeroVoltios

ZeroVoltios:

.DB 0x00 

Lo Primero Que Hace El Code Es

ComparaZero:

 Ldi ZH,HIGH(2*ZeroVoltios)
 Ldi ZL,LOW(2*ZeroVoltios)
 Rjmp Intro

Es Decir Señala La Direcion De La Tabla Y La Tabla Marca .DB 0x00 Este Valor
Luego veras Que Hace Un Salto  A Intro (Rjmp Intro)
 
Intro:      
 Lpm                      ; Aqui Grabara El Valor De La Tabla En Este Caso 0x00 En R0
 Tst   R0         ; Testea Si Es 0 Que Es Lo Mismo Que Compara Si Es 0
 Breq   Retorna  ; Aqui Salta a Retorna si R0=0

Como R0 Es Igual A 0x00 Sigue El Code  Es Decir A Saltado A Retorna

Retorna:    Rjmp ComparoCincoVoltios

Ahora Volvemos A Empezar Ya Que Desde Retorna Se Ve Que Hace Otro Salto A Rjmp ComparoCincoVoltios

Y Vuelta A Empezar Pero Esta Vez Desde La Tabla CincoVoltios:; Hasta Llegar Hasta 40Hex

Intenta Simularlo Con El AvrStudio Tal Como Te Lo Puse Lo Podias Simular
Te Paso El Code Ya Compilado Solo Tendras Que Ticar Encima Del Archivo APS.File
Y Se Ejecutara Con El AvrStudio Y Simulalo Lo Entenderas Mejor
Te Pongo Tambien Una Pelicula Avi De Como Se Ve Simulando

http://rapidshare.com/files/209939555/Simulacion_ASM.zip.html

Desconectado Leral

  • PIC10
  • *
  • Mensajes: 17
Re: Jugando con el ADCH y ADCL
« Respuesta #8 en: 17 de Marzo de 2009, 11:40:01 »
Gracias, creo que en una mañana he aprendido mas que en toda la semana pasada.

En tu codigo donde esta el registro de salida que te dice que la tension es 2,11 0 17 voltios.

En mi caso a parte de saber que tension esta leyendo el micro tengo que sacar una señal de reloj con un periodo de 20ms. El pulso de salida debe variar entre 1ms y 5ms en funcion del potenciometro.

Habia pensado usar un ADC para leer el potenciometro, aunque tambien puedo usar tu codigo y luego ir comparando ese valor y en funcion de el sacar una señal de reloj u otra. De manera sencilla, solo tengo presente 5 casos: 1ms(0v) 2ms(4v)......5ms(20v) y despreciando a los demas porque seria un poco infierno hacer todos los caso posibles. Se que si quiero contar con todos los valores deberia usar un PWM pero no se muy bien como configurar esto.

Que me recomiendas hacer la primera opcion o la segunda.

Desconectado Belgitaes

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 215
Re: Jugando con el ADCH y ADCL
« Respuesta #9 en: 20 de Marzo de 2009, 18:30:37 »
Código: [Seleccionar]
no se muy bien como configurar esto

A Ver Esta Dificilio Este Codigo
Y Teniendo En Cuenta Que Soy Principiante 
Pero Bueno Yo E Puesto Mi Grano de Arena
Seguro Que Aprendes Algo Mas Hoy

Mira Ver Este Ejemplo Que Te Pongo
te Subo La Simulacion En Avi Y El Code Completo Aqui

can now be downloaded 10 times
http://rapidshare.com/files/211577283/Leral.zip.html

Código: [Seleccionar]
; Preuba ASM
;-------------------------------------------------------
; Declaraciones estandar para este micro Atmega8:
.include "m8def.inc" 
;-------------------------------------------------------
; Definicion de constantes y variables
; ------------------------------------------------------
; Pila
  .equ          PILA                   =0x0FF
;-----------------------------------------------------           
.DSEG       
; MEMORIA RAM       
    .ORG                (PILA+1)
;----------------------------------------------------
;            Vectores De Interrupcion
;----------------------------------------------------           
.CSEG       
  .ORG     0x0000 RJMP  RESET ; RESET
       
  .ORG     0x0006 RJMP  OC1A  ; Output Compare1A Interrupt Vector Address
; --------------------------------------------------------
;                       RUTINA DE RESET
; --------------------------------------------------------
RESET:cli

 Ldi R16,low(RAMEND)
 Out SPL,R16
 Ldi R16,high(RAMEND)
 Out SPH,R16

 Ser R16 ;R16=FF
 Out DDRB,R16 ;Configuro Salida En Puerto B

 Ldi R16,$14 ;OCIE1A=1 Interrupcion Timer1 Comparacion Autorizada
                ;TOEI1=1  interruption Timer1 Overflow autorisée
 Out TIMSK,R16
 
 Sei                ;Autorizacion Interrupcion General

Test:
   
 Sbis PinB,0   ;Si PinB 0 Esta Pulsado =(Sbis) Salto A PinB 1
              ;Sino Esta Pulsado Salto A Test
 rjmp Test      ;

 Sbic PinB,1   ;Si PinB 1 NO Esta Pulsado =(Sbic) Salto A PinB 2
 rjmp Aporte10    ;Si SI Esta Pulsado Salto A Aporte10
 Sbic PinB,2   ;Si PinB 2 NO Esta Pulsado =(Sbic) Salto A PinB 3
 rjmp Aporte25    ;Si SI Esta Pulsado Salto A Aporte25
 Sbic PinB,3   ;Si PinB 2 NO Esta Pulsado =(Sbic) Salto A PinB 3
 rjmp Aporte75    ;Si SI Esta Pulsado Salto A Aporte75
 Sbic PinB,4   ;Si PinB 2 NO Esta Pulsado =(Sbic) Salto A PinB 3
 rjmp Aporte100   ;Si SI Esta Pulsado Salto A Aporte100
;..................................................................
;     Aporte Ciclico =10% 
;...................................................................
Aporte10:
 
 Rcall InicioTimer  ; Limpio Mi Timer Y Lo Pongo A Zero

 Clr r17
 Out OCR1AH,R17
 Ldi R17,$19 ;Registro De Comparacion A  $0019=25 Decimal
                    ;$0019 = 25,5 Decimal= 10% de 255 (FF)
 Out OCR1AL,r17 ;Aporte Cyclico =10%

 Ldi R16,$81 ;PWM Non Invertido Sobre PB1 (1<<COM1A1)|(1<<WGM10)
 Out TCCR1A,R16 ;PWM Sobre 8 Bits
 Ldi R16,$42     ;Ftck1=CK/8 (1<<ICES1)|(1<<CS11)
 Out TCCR1B,R16 ;Lanzo El Contador

 Rcall Salto
;..................................................................
;      Aporte Ciclico =25%
;..................................................................
Aporte25:
 
 Rcall InicioTimer ; Limpio Mi Timer Y Lo Pongo A Zero

 Clr r17
 Out OCR1AH,R17
 Ldi R17,$40 ;Registro De Comparacion A  $0019=25
                    ;$0040 = 63,75 Decimal = 25% de 255 (FF)
 Out OCR1AL,r17 ;Aporte Cyclico =25%

 Ldi R16,$81 ;PWM Non Invertido Sobre PB1 (1<<COM1A1)|(1<<WGM10)
 Out TCCR1A,R16 ;PWM Sobre 8 Bits
 Ldi R16,$42      ;Ftck1=CK/8 (1<<ICES1)|(1<<CS11)
 Out TCCR1B,R16 ;Lanzo El Contador

 Rcall Salto

;..................................................................
;      Aporte Ciclico =75%
;..................................................................
Aporte75:
 
 Rcall InicioTimer ; Limpio Mi Timer Y Lo Pongo A Zero

 Clr r17
 Out OCR1AH,R17
 Ldi R17,$BF ;Registro De Comparacion A  $0019=25
                    ;$00BF = 191,25 Decimal = 75% de 255 (FF)
 Out OCR1AL,r17 ;Aporte Cyclico =75%

 Ldi R16,$81 ;PWM Non Invertido Sobre PB1 (1<<COM1A1)|(1<<WGM10)
 Out TCCR1A,R16 ;PWM Sobre 8 Bits
 Ldi R16,$42      ;Ftck1=CK/8 (1<<ICES1)|(1<<CS11)
 Out TCCR1B,R16 ;Lanzo El Contador

 Rcall Salto
;..................................................................
;      Aporte Ciclico =100%
;..................................................................
Aporte100:
 
 Rcall InicioTimer ; Limpio Mi Timer Y Lo Pongo A Zero

 Clr r17
 Out OCR1AH,R17
 Ldi R17,$FF ;Registro De Comparacion A  $0019=25
                    ;$00FF = 255 Decimal = 100% de 255 (FF)
 Out OCR1AL,r17 ;Aporte Cyclico =100%

 Ldi R16,$81 ;PWM Non Invertido Sobre PB1 (1<<COM1A1)|(1<<WGM10)
 Out TCCR1A,R16 ;PWM Sobre 8 Bits
 Ldi R16,$42      ;Ftck1=CK/8 (1<<ICES1)|(1<<CS11)
 Out TCCR1B,R16 ;Lanzo El Contador

 Rcall Salto
;.............................................................
Sigo:
 clr r17
 out TimsK,r17 ;Deshabilito Interrupcion
 rjmp STOP

;..........................................................
;Routina De Tratamiento De La Interupcion
;............................................................

OC1A:
out PORTB,R17
rjmp Sigo

;****HASTA AQUÍ VUESTRO CODIGO********

STOP:        rjmp        STOP   ;FIN DEL PROGRAMA


;********************************************************************

InicioTimer:  ;. Limpio Mi Timer Y Lo Pongo A Zero................

 Clr r16
 Out TCCR1B,R16 ;Stop Del Timer
 Out TCNT1H,R16      ;Cargo El Contador A Zero
 Out TCNT1L,R16 ;
 Ret
;...................................................

 Salto:
 Rjmp Salto
 Ret
;...................................................


« Última modificación: 21 de Marzo de 2009, 08:54:29 por Belgitaes »

Desconectado Leral

  • PIC10
  • *
  • Mensajes: 17
Re: Jugando con el ADCH y ADCL
« Respuesta #10 en: 25 de Marzo de 2009, 06:56:00 »
Muchisimas gracias por tu ayuda. 

Estos codigos me vienen muy bien para asentar conociemientos. Avanzo muy lento pero poco a poco voy haciendome con las cosas.

Desconectado danytehyy89

  • PIC10
  • *
  • Mensajes: 2
Re: Jugando con el ADCH y ADCL
« Respuesta #11 en: 23 de Septiembre de 2011, 03:35:12 »
necesito configurar en asembler el adc para convertir unas distancias que tienen un valor de voltaje en una señal digital como hago para 20cm 2.3 y para 150cm 0.25v, e inicializar una lcd como hago tienes idea?



Código: [Seleccionar]
quiero comprarlos con otros y segun sea la comparacion hacer una cosa u otra.

Se Me Occurio Hacer Esta Routina En AvrStudio  :g)
Para Comparar Los diferentes Valores Del Potenciometro
No Sé Si Te Valdra
Esta Routina La Podras Simular Con El AvrStudio
Y Luego AcoplarLa A Tu Codigo
; ;0v -----> 0x000
; Desde 0 Voltios  Hasta 5 Voltios  = Desde 1....Hasta 64  Decimales = 40 Hex
; Desde 5 Voltios  Hasta 10 Voltios = Desde 65...Hasta 128 Decimales = 80 Hex
; Desde 10 Voltios Hasta 15 Voltios = Desde 129..Hasta 192 Decimales = C0 Hex
; Desde 15 Voltios Hasta 20 Voltios = Desde 193..Hasta 255 Decimales = FF Hex
Luego Ya La Puedes Adaptar A Tu Gusto

Código: [Seleccionar]

; Preuba ASM
;-------------------------------------------------------
; Declaraciones estandar para este micro Atmega8:
.include "m8def.inc" 
;-------------------------------------------------------
; Definicion de constantes y variables
; ------------------------------------------------------
; Pila
  .equ          PILA                   =0x0FF
;-----------------------------------------------------           
.DSEG       
; MEMORIA RAM       
    .ORG                (PILA+1)
;----------------------------------------------------
;            Vectores de interrupcion
;----------------------------------------------------           
.CSEG       
    .ORG     0x0000         
Rjmp        RESET                        ; RESET
; --------------------------------------------------------
;                       RUTINA DE RESET
; --------------------------------------------------------
RESET: 
 Cli
 Ldi        r16,HIGH ( PILA )         
 Out        SPH,r16         
 Ldi        r16,LOW (PILA )                         
 Out        SPL,r16         

;*******DESDE AQUÍ VUESTRO CODIGO*****
; ;0v -----> 0x000
; Desde 0 Voltios  Hasta 5 Voltios  = Desde 1....Hasta 64  Decimales = 40 Hex
; Desde 5 Voltios  Hasta 10 Voltios = Desde 65...Hasta 128 Decimales = 80 Hex
; Desde 10 Voltios Hasta 15 Voltios = Desde 129..Hasta 192 Decimales = C0 Hex
; Desde 15 Voltios Hasta 20 Voltios = Desde 193..Hasta 255 Decimales = FF Hex

ComparaZero:

 Ldi ZH,HIGH(2*ZeroVoltios)
 Ldi ZL,LOW(2*ZeroVoltios)
 Rjmp Intro

ComparoCincoVoltios:

 Ldi ZH,HIGH(2*CincoVoltios)
 Ldi ZL,LOW(2*CincoVoltios)
 Rjmp Sigo

ComparoDiezVoltios:

 Ldi ZH,HIGH(2*DiezVoltios)
 Ldi ZL,LOW(2*DiezVoltios)
 Rjmp Sigo1

ComparoQuinzeVoltios:

 Ldi ZH,HIGH(2*QuinzeVoltios)
 Ldi ZL,LOW(2*QuinzeVoltios)
 Rjmp Sigo2

ComparoVeinteVoltios:

 Ldi ZH,HIGH(2*VeinteVoltios)
 Ldi ZL,LOW(2*VeinteVoltios)
 Rjmp Sigo3


;********************
; Comparo Valores
;********************
Intro:
 Lpm
 Tst R0
 Breq Retorna 

Sigo:
 Lpm
 Tst R0
 Breq Retorna1
 Adiw ZL,1
 brne Sigo
 nop

Sigo1:
 Lpm
 Tst R0
 Breq Retorna2
 Adiw ZL,1
 brne Sigo1

Sigo2:
 Lpm
 Tst R0
 Breq Retorna3
 Adiw ZL,1
 brne Sigo2

Sigo3:
 Lpm
 Tst R0
 Breq Stop
 Adiw ZL,1
 brne Sigo3
 
Retorna: Rjmp ComparoCincoVoltios
Retorna1:    Rjmp ComparoDiezVoltios
Retorna2:    Rjmp ComparoQuinzeVoltios
Retorna3:    Rjmp ComparoVeinteVoltios

Rjmp stop

;****HASTA AQUÍ VUESTRO CODIGO********

STOP:        rjmp        STOP   ;FIN DEL PROGRAMA
 
;*******************
;Tabla De Voltage
;*******************

ZeroVoltios:

.DB 0x00

CincoVoltios:; Hasta Llegar Hasta 40Hex = ( 64 Decimal)

.DB 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08
.DB 0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10
.DB 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18
.DB 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20
.DB 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28
.DB 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30
.DB 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38
.DB 0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x40
.DB 0x00

DiezVoltios:; Hasta Llegar Hasta 80Hex = ( 128 Decimal)
.DB 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48
.DB 0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50
.DB 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58
.DB 0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60
.DB 0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68
.DB 0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70
.DB 0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78
.DB 0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80
.DB 0x00

QuinzeVoltios:; Hasta Llegar Hasta C0Hex = ( 192 Decimal)
.DB 0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88
.DB 0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90
.DB 0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98
.DB 0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0
.DB 0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8
.DB 0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0
.DB 0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8
.DB 0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,0xC0
.DB 0x00


VeinteVoltios:; Hasta Llegar Hasta FFHex = ( 255 Decimal)
.DB 0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8
.DB 0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0
.DB 0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8
.DB 0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0
.DB 0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8
.DB 0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0
.DB 0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8
.DB 0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x00