;;******************************************************************************** ;; @file ;; @brief DHT22 driver (WIP) ;; @ingroup driver ;; @details ;; @depends IO-W65C22N ;; ;;******************************************************************************** ;;TODO EVERYTHING ;DHT_REQUEST_L = $00 ;DHT_REQUEST_H = %01010000 ; = 20480 PHI2 pulses = 20,5 ms at 1 MHz ;DHT_RECV_H = %10011100 ;DHT_RECV_L = %01000000 ; = 40000 PHI2 = 40ms ;; Status Variables, Used to determine what is sent by temp module ;DHT_STATUS = $400 ;DHT_NONE = 0 ;DHT_WAIT_REQ = 1 ;DHT_WAIT_RESP = 2 ;DHT_RECV = 3 ;DHT_DONE = 4 ;DHT_BIT = $401 ;DHT_BIT_ROT = $402 ;DHT_VALUES = $405 ; ;DHT_OFFSET = $403 ;DHT_OFF_RH_HIGH = 0 ; offsets to DHT_VALUES ;DHT_OFF_RH_LOW = 1 ;DHT_OFF_T_HIGH = 2 ;DHT_OFF_T_LOW = 3 ;DHT_OFF_CHECKSUM = 4 ;DHT_OFF_DONE = 5 ;message_dht: .asciiz "DHT-Request gesendet." ;dht_wait: ; ldx #$00 ;dht_wait_: ; lda message_dht,x ; sta TO_PRINT,x ; inx ; bne dht_wait_ ; jsr lcd_print_clear ;dht_wait_loop: ; check after every interrpt if dht program is done and then return home ; lda #'.' ; jsr _lcd::print_char ; wai ; lda DHT_STATUS ; cmp #DHT_DONE ; bne dht_wait_loop ;dht_exit: ; jsr kb_read ; cmp #'*' ; jeq home ; bra dht_exit ; jmp return_home ;dht_request: ; send request to sensor ; sei ; lda #%00000001 ; set PA1-0 to output 0 ; ora IO2 + IO_DDRA ; sta IO2 + IO_DDRA ; lda #(LCD_CLEAR | $00) ; sta IO2 + IO_RA ; ; start timer ; lda #DHT_REQUEST_L ; sta IO2 + IO_T1CL ; lda #DHT_REQUEST_H ; sta IO2 + IO_T1CH ; lda #DHT_WAIT_REQ ; sta DHT_STATUS ; cli ; jmp dht_wait ;dht_request_end: ; lda #%10000010 ; sta IO2 + IO_IER ; enable Interrupt for CA1 ; lda #%11111110 ; and IO2 + IO_DDRA ; sta IO2 + IO_DDRA ; set PA1-0 to input ; lda #DHT_WAIT_RESP ;dht_response: ; receive response from sensor ; lda #DHT_RECV ; sta DHT_STATUS ; stz DHT_OFFSET ; lda #7 ; sta DHT_BIT ;dht_recv: ; ; start timer ; lda #DHT_RECV_L ; sta IO2 + IO_T1CL ; lda #DHT_RECV_H ; sta IO2 + IO_T1CH ; rts ;dht_recv_read: ; ; read PA2 ; lda IO2 + IO_RA ; and #%00000001 ; ldx DHT_BIT ; beq dht_recv_end ;dht_recv_rot: ; rol ; dex ; bne dht_recv_rot ;dht_recv_end: ; ldy DHT_OFFSET ; ora DHT_VALUES,y ; sta DHT_VALUES,y ; ; determine if 8 bits are done ; ldx DHT_BIT ; beq dht_recv_next ; rts ;dht_recv_next: ; lda #7 ; sta DHT_BIT ; inc DHT_OFFSET ; cmp DHT_OFF_DONE ; beq dht_display ; rts ;dht_display: ; ldx #0 ;dht_display_: ; lda DHT_VALUES,x ; sta TO_PRINT,x ; inx ; cpx #5 ; bne dht_display_ ; jsr lcd_print_clear ; rts ;dht_irq: ; lda DHT_STATUS ; cmp #DHT_WAIT_REQ ; beq dht_request_end ; cmp #DHT_WAIT_RESP ; beq dht_response ; cmp #DHT_RECV ; beq dht_recv ; rts