TODOPIC

Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: shakziel en 17 de Julio de 2009, 19:04:46

Título: Manejo de Teclas, Display 7 Sgmentos y ATMega8
Publicado por: shakziel en 17 de Julio de 2009, 19:04:46
Hola a todos :)

Necesito de su ayuda urgentemente, mi proyecto consiste en utilizar un ATMega8, manejar tres teclas y que dichas teclas envien el dato de la tecla pulsada a un display de 7 segmentos y que ademas sea transmitido de manera serial por el puerto PD0 (TxD).

Pues bien este es mi programa el cual lo compile en AVRStudio y segun esto no tiene errores, el problema es que los datos no estan siendo transmitidos y al momento de manejar el teclado tampoco se ve nada en el display de 7 segmentos, espero me puedan ayudar a resolver este problema. Tengo muchas dudas en la parte del manejo de la USART y no se si fue iniciada y configurada adecuadamente. De antemano muchas gracias.

;******************************************************************************************
.include "m8def.inc"
 
;variable global registro temporal
.def temp=r16
.def datoascii=r17
.def datodisp=r18

;Vector de Interrupciones
.org 0x00

; configuración del stack (pila)   
   ldi temp,low(ramend)
   out spl,temp
   ldi temp,high(ramend)
   out sph,temp
   rjmp main

main:
   
; configuración del micro
   ser temp      ; Para inizializar puerto B como salida
   out DDRB,temp
   out PORTB,temp   ; Para borrar el puerto al inicio
   ldi temp,0x00
   out DDRC,temp  ; Se habilita el puerto C como entrada
   ser temp       ; Habilita las resistencias de Pull up
   out PORTC,temp
   rcall USART_Ini
detdato:
   in temp,pinc
   //rcall delay
   out PORTB,temp
   rjmp detdato

   rcall loop
   out PORTB,datodisp
   rcall USART_Tx
   rjmp detdato
loop:
   clr temp
   rcall delay
   in temp,PINC   
   cpi temp,0b00000001 ;prueba si es tecla 1
       breq uno
    cpi temp,0b00000010 ;prueba si es tecla 2
       breq dos
    cpi temp,0b00000100 ;prueba si es tecla 3
       breq tres
    nop
    rcall loop

uno:
   ldi datoascii,0x31   
   ldi datodisp,0b00000110
   ret
dos:
   ldi datoascii,0x32
   ldi datodisp,0b01011011
   ret
tres:
   ldi datoascii,0x33
   ldi datodisp,0b01001111
   ret
delay:
   ldi  R20,$10
   WGLOOP0:
      ldi  R21,$FF
   WGLOOP1:
      ldi  R22,$FF
   WGLOOP2:
      dec  R22
      brne WGLOOP2
      dec  R21
      brne WGLOOP1
      dec  R20
      brne WGLOOP0   
ret

USART_Ini:
   ; Set baud rate
   ldi temp,0x00
   out UBRRH,temp
   ldi temp,0x12
   out UBRRL,temp
   ldi temp, 0b00000010
   out UCSRA,temp
   ; Habilita Tx y Rx así como petición de interrupción Rx completa
   ldi temp,(1<<RXEN)|(1<<TXEN)|(1<<RXCIE)
   out UCSRB,temp
   ; Modo asincrono, sin paridad, 1 bit de parada, 8 bits
   ldi temp,(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
   out UCSRC,temp
ret

USART_Tx:
   ;Transmision de un caracter
   ;Espere a transmitir buffer vacío
   ldi temp,
   sbis UCSRA,UDRE
   rjmp USART_Tx
   cbi UCSRB,TXB8
   sbrc temp,0
   sbi UCSRB,TXB8
   ;Coloca el dato LSB (r16) dentro del buffer, envio de datos
   out UDR,temp
ret
;Fin del programa