Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> АЦП pic16f877+LCD 
:(
    Опции темы
Baton2007
Дата 6.11.2010, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



На порт А подается напряжение как его преобразовать через АЦП и вывести на LCD???? Где почитать или пример глянуть???
Пытался написать сам но что-то вывод не коректный.
То что отображается на вольтметре нужно вывести на LCD
 user posted image
 Инициализация порта А. 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
PM MAIL   Вверх
Mazzi
Дата 7.11.2010, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



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

; обработчик прерывания от АЦП
.................... 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





--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
remax
Дата 1.12.2010, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



Вот, например (правда с, а не асм)

Код

/*
 *    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-микроконтроллерам.

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

Это сообщение отредактировал(а) remax - 1.12.2010, 20:42


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0443 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.