Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > АЦП pic16f877+LCD


Автор: Baton2007 6.11.2010, 19:29
На порт А подается напряжение как его преобразовать через АЦП и вывести на LCD???? Где почитать или пример глянуть???
Пытался написать сам но что-то вывод не коректный.
То что отображается на вольтметре нужно вывести на LCD
http://imglink.ru/show-image.php?id=e29e710469724288ffaf09c4c37b1e39
 Инициализация порта А. PORTA0 - вход АЦП
Код

; Инициализация порта А. PORTA0 - вход АЦП
; Set ADCON0
         movlw   0x01
         movwf   ADCON0
; Set ADCON1
         BANKSEL ADCON1
         movlw   B'10001110'
         movwf   ADCON1
         BANKSEL ADCON0
        return

Read_ADC
         bsf    ADCON0, GO_DONE        ;initiate conversion
         btfsc   ADCON0, GO_DONE
         goto    $-1            ;wait for ADC to finish

         movf    ADRESH,W
         andlw   0x03
         movwf   NumH
         BANKSEL ADRESL
         movf    ADRESL,W
         BANKSEL    ADRESH
        movwf    NumL            ;return result in NumL and NumH
        return

Преобразование результата
Код

Convert:
bin2bcd         movlw .16 
                movwf ctr 
                clrf bcd1 
                clrf bcd2 
                clrf bcd3 
                goto start 

adjdec          movlw 0x33 
                addwf bcd1,f 
                addwf bcd2,f 
                addwf bcd3,f 

                movlw 0x03 
                btfss bcd1,3 
                subwf bcd1,f 
                btfss bcd2,3 
                subwf bcd2,f 
                btfss bcd3,3 
                subwf bcd3,f 

                movlw 0x30 
                btfss bcd1,7 
                subwf bcd1,f 
                btfss bcd2,7 
                subwf bcd2,f 
                btfss bcd3,7 
                subwf bcd3,f 

start           rlf NumL,f 
                rlf NumH,f 
                rlf bcd3,f 
                rlf bcd2,f 
                rlf bcd1,f 
                decfsz ctr,f 
                goto adjdec 
                return
    


Весь код целиком
http://webfile.ru/4877930

Автор: Mazzi 7.11.2010, 21:11
К сожалению не пишу на асме для пиков, но вот тебе кусочек листинга сгенерированый сишным компилятором. Может пригодится?
Код

; обработчик прерывания от АЦП
.................... void AD_isr() { 
.................... unsigned int8 ttt; 
....................      ttt++; 
*
01D7:  INCF   58,F
....................    if ( n_ch_adc == 1 ) { 
01D8:  DECFSZ 34,W
01D9:  GOTO   1F1
....................         ttt = read_adc( ADC_READ_ONLY ); 
01DA:  BTFSC  1F.2
01DB:  GOTO   1DA
01DC:  MOVF   1E,W
01DD:  MOVWF  58
....................         if ( ttt < 193 ) term_l_real = temperature[ttt]; 
01DE:  MOVF   58,W
01DF:  SUBLW  C0
01E0:  BTFSS  03.0
01E1:  GOTO   1E7
01E2:  MOVF   58,W
01E3:  CALL   04E
01E4:  MOVWF  21
01E5:  MOVWF  31
....................         else term_l_real = 0; 
01E6:  GOTO   1E8
01E7:  CLRF   31
....................         n_ch_adc = 0; 
01E8:  CLRF   34
....................         set_adc_channel( 0 ); 
01E9:  MOVLW  00
01EA:  MOVWF  21
01EB:  MOVF   1F,W
01EC:  ANDLW  C7
01ED:  IORWF  21,W
01EE:  MOVWF  1F
....................         read_adc( ADC_START_ONLY ); 
01EF:  BSF    1F.2
....................         } 
....................    else{ 
01F0:  GOTO   208
....................         ttt = read_adc( ADC_READ_ONLY ); 
01F1:  BTFSC  1F.2
01F2:  GOTO   1F1
01F3:  MOVF   1E,W
01F4:  MOVWF  58
....................         if ( ttt < 193 ) term_r_real  = temperature[ttt]; 
01F5:  MOVF   58,W
01F6:  SUBLW  C0
01F7:  BTFSS  03.0
01F8:  GOTO   1FE
01F9:  MOVF   58,W
01FA:  CALL   04E
01FB:  MOVWF  21
01FC:  MOVWF  33
....................         else term_r_real = 0; 
01FD:  GOTO   1FF
01FE:  CLRF   33
....................         n_ch_adc = 1; 
01FF:  MOVLW  01
0200:  MOVWF  34
....................         set_adc_channel( 1 );    
0201:  MOVLW  08
0202:  MOVWF  21
0203:  MOVF   1F,W
0204:  ANDLW  C7
0205:  IORWF  21,W
0206:  MOVWF  1F
....................         read_adc( ADC_START_ONLY ); 
0207:  BSF    1F.2
....................         } 
....................         } 
....................  


Код

; инициализация АЦП
....................    setup_adc_ports(AN0_AN1_AN3); 
*
0273:  BSF    03.5
0274:  BCF    1F.0
0275:  BCF    1F.1
0276:  BSF    1F.2
....................    setup_adc(ADC_CLOCK_DIV_32); 
0277:  BCF    03.5
0278:  BCF    1F.6
0279:  BSF    1F.7
027A:  BSF    1F.0
....................    set_adc_channel ( 0 ); 
027B:  MOVLW  00
027C:  MOVWF  21
027D:  MOVF   1F,W
027E:  ANDLW  C7
027F:  IORWF  21,W
0280:  MOVWF  1F



Автор: remax 1.12.2010, 20:35
Вот, например (правда с, а не асм)

Код

/*
 *    LCD interface example
 *    Uses routines from delay.c
 *    This code will interface to a standard LCD controller
 *    like the Hitachi HD44780. It uses it in 4 bit mode, with
 *    the hardware connected as follows (the standard 14 pin 
 *    LCD connector is used):
 *    
 *    PORTB bits 0-3 are connected to the LCD data bits 4-7 (high nibble)
 *    PORTA bit 2 is connected to the LCD RS input (register select)
 *    PORTA bit 3 is connected to the LCD EN bit (enable)
 *    
 *    To use these routines, set up the port I/O (TRISA, TRISB) then
 *    call lcd_init(), then other routines as required.
 *    
 */

#include    <pic.h>
#include    "lcd.h"
#include    "delay.h"
 
static bit LCD_RS    @ ((unsigned)&PORTA*8+2);    // Register select
static bit LCD_EN    @ ((unsigned)&PORTA*8+3);    // Enable

#define    LCD_STROBE    ((LCD_EN = 1),(LCD_EN=0))


/* write a byte to the LCD in 4 bit mode */

void
lcd_write(unsigned char c)
{
    PORTB = (PORTB & 0xF0) |  (c >> 4);
    LCD_STROBE;
    PORTB = (PORTB & 0xF0) |  (c & 0x0F);
    LCD_STROBE;
    DelayUs(40);
}

/*
 *    Clear and home the LCD
 */

void
lcd_clear(void)
{
    LCD_RS = 0;
    lcd_write(0x1);
    DelayMs(2);
}

/* write a string of chars to the LCD */

void
lcd_puts(const char * s)
{
    LCD_RS = 1;    // write characters
    while(*s)
        lcd_write(*s++);
}

/* write one character to the LCD */

void
lcd_putch(char c)
{
    LCD_RS = 1;    // write characters
    PORTB = (PORTB & 0xF0) |  (c >> 4);
    LCD_STROBE;
    PORTB = (PORTB & 0xF0) |  (c & 0x0F);
    LCD_STROBE;
    DelayUs(40);
}


/*
 * Go to the specified position
 */

void
lcd_goto(unsigned char pos)
{
    LCD_RS = 0;
    lcd_write(0x80+pos);
}
    
/* initialise the LCD - put into 4 bit mode */

void
lcd_init(void)
{
    LCD_RS = 0;    // write control bytes
    DelayMs(15);    // power on delay
    PORTB = 0x3;    // attention!
    LCD_STROBE;
    DelayMs(5);
    LCD_STROBE;
    DelayUs(100);
    LCD_STROBE;
    DelayMs(5);
    PORTB = 0x2;    // set 4 bit mode
    LCD_STROBE;
    DelayUs(40);
    lcd_write(0x28);    // 4 bit mode, 1/16 duty, 5x8 font
    lcd_write(0x08);    // display off
    lcd_write(0x0F);    // display on, blink curson on
    lcd_write(0x06);    // entry mode
}




и к нему хеадер 


Код

/*
 *    LCD interface header file
 *    See lcd.c for more info
 */

/* write a byte to the LCD in 4 bit mode */

extern void lcd_write(unsigned char);

/* Clear and home the LCD */

extern void lcd_clear(void);

/* write a string of characters to the LCD */

extern void lcd_puts(const char * s);

/* Go to the specified position */

extern void lcd_goto(unsigned char pos);
    
/* intialize the LCD - call before anything else */

extern void lcd_init(void);

extern void lcd_putch(char);

/*    Set the cursor position */

#define    lcd_cursor(x)    lcd_write(((x)&0x7F)|0x80)



а из доков -
1. есть методичка  ПРОЕКТИРОВАНИЕ СРЕДСТВ КОНТРОЛЯ И ДИАГНОСТИКИ 
С ЭЛЕМЕНТАМИ ВЫСОКОЙ ИНТЕГРАЦИИ  
 
Даны методические указания к выполнению практических заданий по 
курсу «Проектирование средств контроля и диагностики с элементами 
высокой  интеграции»,  которая  ориентирована  на  изучение 
жидкокристаллических символьных индикаторов фирмы POWERTIP с 
встроенным контролером типа HDD44780. 
 
Методические указания предназначены для студентов специальности
190200 – «Приборы и методы контроля качества и диагностики». 
Подготовлены кафедрами электротехники и информационных систем 
и  рекомендованы  к  изданию  редакционно-издательским  советом 
государственного образовательного учреждения высшего профессионального 
образования «Санкт-Петербургский  государственный  университет 
аэрокосмического приборостроения». 
 
2. Предко. Справочник по PIC-микроконтроллерам.

Могу отправить на мыло....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)