[ บทความ : ตัวอย่างสำหรับ AVR ตอนที่ 10 ] ทดสอบ ADC ของ ET-AVR V1/2

ตัวอย่างซอร์สโค้ดสำหรับติดต่อกับ ADC ของบอร์ด ET-AVR V1/2 (ตัวอย่างที่นำมานี้ติดต่อกับ Ch1,3 และ 8 เท่านั้น แต่ในดิสค์จะมีมาให้ครบ) เป็นดังนี้



;***************************************************************************
;* A P P L I C A T I O N   N O T E   F O R   T H E   A V R   F A M I L Y
;* 
;* Number		:  ET-AVR V1/V2
;* File Name		:"ADC1.asm"
;* Title		:READ ADC chanel 1 to RS232
;* Date                 :2/3/42
;* Version              :1.0
;* Support telephone	:712 1120-1 (ETT)
;* Support fax		:3917216 (ETT)
;* Support www          :www.etteam.com,www.ett.co.th
;* Target MCU		:AT90S8535/AT90LS8535
;*
;***************************************************************************
;
.include "8535def.inc"

	    .org   $000 
             rjmp  RESET	        ;Reset Handle

            .org   $00E                 ;interrupt vector for ADC                  
             rjmp  ATOD 

;****************************************************************************
;*
;* Test/Example Program
;*
;****************************************************************************
;
.def	    temp  = r19   
;

RESET:      ldi     temp,low(RAMEND)
            out     SPL,temp           ;init Stack Pointer Low     

            ldi     temp,high(RAMEND)
            out     SPL+1,temp         ;init Stack Pointer High

            sei                        ;clear golbal interrupt
            cbi     UCR,RXCIE          ;clesr rx interrupt
            cbi     UCR,TXCIE          ;clesr tx interrupt
            cbi     UCR,UDRIE          ;clesr data empty interrupt
            cbi     UCR,CHR9           ;send 8 data 

            ldi     r17,51
            out     UBRR,r17           ;baud 9600 at 8MHz Xtal 
  
            sbi     UCR,TXEN           ;set pin tx as serial TX 
       
            ldi     r17,0x00           ;set porta as Hi impledance
            out     DDRA,r17            
            out     PORTA,r17   

            ldi     r17,0x00           ;set chanl 1 ADC
            out     ADMUX,r17

            ldi     r17,0b00011000     ;set sampling rate
            out     ADCSR,r17 
  
            sbi     ADCSR,ADEN         ;enable ADC

adcloop1:   sbi     ADCSR,ADSC         ;start conversion 
            rjmp    adcloop1
  
;***************************************************
;*   program for interrupt service routine  ADC    *  
;***************************************************
ATOD:       in      r21,ADCL           ;read low byte
            in      r22,ADCH           ;read high byte
            mov     r23,r21 
                               
            andi    r22,0x03           ;detect 3 bit low of ADCH 
            ldi     ZH,high(HEXTBL*2)  ;get high of pointer 
            ldi     ZL,low(HEXTBL*2)   ;get low of pointer  
            add     r30,r22          
            ldi     r22,0
            adc     r31,r22          
            lpm                        ;get data from program memory 
            mov     r20,r0             ;put data to rs232
            rcall   TX232

            swap    r21                
            andi    r21,0x0F           ;detect 4 bit high of ADCL 
            ldi     ZH,high(HEXTBL*2)  ;get high of pointer
            ldi     ZL,low(HEXTBL*2)   ;get low of pointer  
            add     r30,r21
            ldi     r21,0
            adc     r31,r21          
            lpm                        ;get data from program memory
            mov     r20,r0             ;put data to rs232
            rcall   TX232
                         
            andi    r23,0x0F           ;detect 4 bit low of ADCL
            ldi     ZH,high(HEXTBL*2)  ;get high of pointer
            ldi     ZL,low(HEXTBL*2)   ;get low of pointer  
            add     r30,r23
            ldi     r23,0
            adc     r31,r23          
            lpm                        ;get data from program memory
            mov     r20,r0             ;put data to rs232              
            rcall   TX232
           
            ldi     r20,0x0A           ;send 0AH to rs232
            rcall   TX232
            ldi     r20,0x0D           ;send 0DH to rs232
            rcall   TX232
            reti

  
    
TX232:      sbis    USR,UDRE           ;wait until UDRE = 1
            rjmp    TX232 
            out     UDR,r20            ;send data to serial  
            ret 
            
RX232:      sbis    USR,RXC            ;wait until have data in buffer
            rjmp    RX232
            in      r20,UDR            ;read data from buffer
            rcall   TX232  
            ret 
        
CSEG:
HEXTBL:    .db     0x30,0X31           ;table for convert hex to ascii
           .db     0X32,0X33
           .db     0X34,0X35
           .db     0X36,0X37
           .db     0X38,0X39
           .db     0X41,0X42
           .db     0X43,0X44
           .db     0X45,0X46
               
                            



;***************************************************************************
;* A P P L I C A T I O N   N O T E   F O R   T H E   A V R   F A M I L Y
;* 
;* Number		:  ET-AVR V1/V2
;* File Name		:"ADC3.asm"
;* Title		:READ ADC chanel 3 to RS232
;* Date                 :2/3/42
;* Version              :1.0
;* Support telephone	:712 1120-1 (ETT)
;* Support fax		:3917216 (ETT)
;* Support www          :www.etteam.com,www.ett.co.th
;* Target MCU		:AT90S8535/AT90LS8535
;*
;***************************************************************************
;
.include "8535def.inc"

	    .org   $000 
             rjmp  RESET	        ;Reset Handle

            .org   $00E                 ;interrupt vector for ADC                  
             rjmp  ATOD 

;****************************************************************************
;*
;* Test/Example Program
;*
;****************************************************************************
;
.def	    temp  = r19   
;

RESET:      ldi     temp,low(RAMEND)
            out     SPL,temp           ;init Stack Pointer Low     

            ldi     temp,high(RAMEND)
            out     SPL+1,temp         ;init Stack Pointer High

            sei                        ;clear golbal interrupt
            cbi     UCR,RXCIE          ;clesr rx interrupt
            cbi     UCR,TXCIE          ;clesr tx interrupt
            cbi     UCR,UDRIE          ;clesr data empty interrupt
            cbi     UCR,CHR9           ;send 8 data 

            ldi     r17,51
            out     UBRR,r17           ;baud 9600 at 8MHz Xtal 
  
            sbi     UCR,TXEN           ;set pin tx as serial TX 
       
            ldi     r17,0x00           ;set porta as Hi impledance
            out     DDRA,r17            
            out     PORTA,r17   

            ldi     r17,0x02           ;set chanl 3 ADC
            out     ADMUX,r17

            ldi     r17,0b00011000     ;set sampling rate
            out     ADCSR,r17 
  
            sbi     ADCSR,ADEN         ;enable ADC

adcloop1:   sbi     ADCSR,ADSC         ;start conversion 
            rjmp    adcloop1
  
;***************************************************
;*   program for interrupt service routine  ADC    *  
;***************************************************
ATOD:       in      r21,ADCL           ;read low byte
            in      r22,ADCH           ;read high byte
            mov     r23,r21 
                               
            andi    r22,0x03           ;detect 3 bit low of ADCH 
            ldi     ZH,high(HEXTBL*2)  ;get high of pointer 
            ldi     ZL,low(HEXTBL*2)   ;get low of pointer  
            add     r30,r22          
            ldi     r22,0
            adc     r31,r22          
            lpm                        ;get data from program memory 
            mov     r20,r0             ;put data to rs232
            rcall   TX232

            swap    r21                
            andi    r21,0x0F           ;detect 4 bit high of ADCL 
            ldi     ZH,high(HEXTBL*2)  ;get high of pointer
            ldi     ZL,low(HEXTBL*2)   ;get low of pointer  
            add     r30,r21
            ldi     r21,0
            adc     r31,r21          
            lpm                        ;get data from program memory
            mov     r20,r0             ;put data to rs232
            rcall   TX232
                         
            andi    r23,0x0F           ;detect 4 bit low of ADCL
            ldi     ZH,high(HEXTBL*2)  ;get high of pointer
            ldi     ZL,low(HEXTBL*2)   ;get low of pointer  
            add     r30,r23
            ldi     r23,0
            adc     r31,r23          
            lpm                        ;get data from program memory
            mov     r20,r0             ;put data to rs232              
            rcall   TX232
           
            ldi     r20,0x0A           ;send 0AH to rs232
            rcall   TX232
            ldi     r20,0x0D           ;send 0DH to rs232
            rcall   TX232
            reti

  
    
TX232:      sbis    USR,UDRE           ;wait until UDRE = 1
            rjmp    TX232 
            out     UDR,r20            ;send data to serial  
            ret 
            
RX232:      sbis    USR,RXC            ;wait until have data in buffer
            rjmp    RX232
            in      r20,UDR            ;read data from buffer
            rcall   TX232  
            ret 
        
CSEG:
HEXTBL:    .db     0x30,0X31           ;table for convert hex to ascii
           .db     0X32,0X33
           .db     0X34,0X35
           .db     0X36,0X37
           .db     0X38,0X39
           .db     0X41,0X42
           .db     0X43,0X44
           .db     0X45,0X46
               



;***************************************************************************
;* A P P L I C A T I O N   N O T E   F O R   T H E   A V R   F A M I L Y
;* 
;* Number		:  ET-AVR V1/V2
;* File Name		:"ADC8.asm"
;* Title		:READ ADC chanel 8 to RS232
;* Date                 :2/3/42
;* Version              :1.0
;* Support telephone	:712 1120-1 (ETT)
;* Support fax		:3917216 (ETT)
;* Support www          :www.etteam.com,www.ett.co.th
;* Target MCU		:AT90S8535/AT90LS8535
;*
;***************************************************************************
;
.include "8535def.inc"

	    .org   $000 
             rjmp  RESET	        ;Reset Handle

            .org   $00E                 ;interrupt vector for ADC                  
             rjmp  ATOD 

;****************************************************************************
;*
;* Test/Example Program
;*
;****************************************************************************
;
.def	    temp  = r19   
;

RESET:      ldi     temp,low(RAMEND)
            out     SPL,temp           ;init Stack Pointer Low     

            ldi     temp,high(RAMEND)
            out     SPL+1,temp         ;init Stack Pointer High

            sei                        ;clear golbal interrupt
            cbi     UCR,RXCIE          ;clesr rx interrupt
            cbi     UCR,TXCIE          ;clesr tx interrupt
            cbi     UCR,UDRIE          ;clesr data empty interrupt
            cbi     UCR,CHR9           ;send 8 data 

            ldi     r17,51
            out     UBRR,r17           ;baud 9600 at 8MHz Xtal 
  
            sbi     UCR,TXEN           ;set pin tx as serial TX 
       
            ldi     r17,0x00           ;set porta as Hi impledance
            out     DDRA,r17            
            out     PORTA,r17   

            ldi     r17,0x07           ;set chanl 8 ADC
            out     ADMUX,r17

            ldi     r17,0b00011000     ;set sampling rate
            out     ADCSR,r17 
  
            sbi     ADCSR,ADEN         ;enable ADC

adcloop1:   sbi     ADCSR,ADSC         ;start conversion 
            rjmp    adcloop1
  
;***************************************************
;*   program for interrupt service routine  ADC    *  
;***************************************************
ATOD:       in      r21,ADCL           ;read low byte
            in      r22,ADCH           ;read high byte
            mov     r23,r21 
                               
            andi    r22,0x03           ;detect 3 bit low of ADCH 
            ldi     ZH,high(HEXTBL*2)  ;get high of pointer 
            ldi     ZL,low(HEXTBL*2)   ;get low of pointer  
            add     r30,r22          
            ldi     r22,0
            adc     r31,r22          
            lpm                        ;get data from program memory 
            mov     r20,r0             ;put data to rs232
            rcall   TX232

            swap    r21                
            andi    r21,0x0F           ;detect 4 bit high of ADCL 
            ldi     ZH,high(HEXTBL*2)  ;get high of pointer
            ldi     ZL,low(HEXTBL*2)   ;get low of pointer  
            add     r30,r21
            ldi     r21,0
            adc     r31,r21          
            lpm                        ;get data from program memory
            mov     r20,r0             ;put data to rs232
            rcall   TX232
                         
            andi    r23,0x0F           ;detect 4 bit low of ADCL
            ldi     ZH,high(HEXTBL*2)  ;get high of pointer
            ldi     ZL,low(HEXTBL*2)   ;get low of pointer  
            add     r30,r23
            ldi     r23,0
            adc     r31,r23          
            lpm                        ;get data from program memory
            mov     r20,r0             ;put data to rs232              
            rcall   TX232
           
            ldi     r20,0x0A           ;send 0AH to rs232
            rcall   TX232
            ldi     r20,0x0D           ;send 0DH to rs232
            rcall   TX232
            reti

  
    
TX232:      sbis    USR,UDRE           ;wait until UDRE = 1
            rjmp    TX232 
            out     UDR,r20            ;send data to serial  
            ret 
            
RX232:      sbis    USR,RXC            ;wait until have data in buffer
            rjmp    RX232
            in      r20,UDR            ;read data from buffer
            rcall   TX232  
            ret 
        
CSEG:
HEXTBL:    .db     0x30,0X31           ;table for convert hex to ascii
           .db     0X32,0X33
           .db     0X34,0X35
           .db     0X36,0X37
           .db     0X38,0X39
           .db     0X41,0X42
           .db     0X43,0X44
           .db     0X45,0X46
               
                            

สามารถ download ไฟล์ตัวอย่างของบอร์ด พร้อม assembler ได้เลยครับ


เขียนโดย : ETT
Author : ETT team
e-mail : sales@etteam.com
วันที่ทำการปรับปรุง : ๑๖ พ.ย. ๒๕๔๓