Перейти к содержанию
    

очень нужна помощь с пиком

помогите, пожалуйста с пиком 16f84А, лаба заключается в следующем на любой вывод подключить светодиод, когда 0 светодид горит - 2 секунды, когда 1 светодиод не горит 1 секунду...и так цикл, прогу надо написать на ассемблере, и подробно опишите пожалуйста, чтоб разобраться, спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

помогите, пожалуйста с пиком 16f84А, лаба заключается в следующем на любой вывод подключить светодиод, когда 0 светодид горит - 2 секунды, когда 1 светодиод не горит 1 секунду...и так цикл, прогу надо написать на ассемблере, и подробно опишите пожалуйста, чтоб разобраться, спасибо

Здесь спроси: http://www.microchip.ru/phorum/list.php?f=2

Там это часто повторяется...

Или вот: http://nag.ru/goodies/shema/prochee07.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

помогите, пожалуйста с пиком 16f84А, лаба заключается в следующем на любой вывод подключить светодиод, когда 0 светодид горит - 2 секунды, когда 1 светодиод не горит 1 секунду...и так цикл, прогу надо написать на ассемблере, и подробно опишите пожалуйста, чтоб разобраться, спасибо

Это делается очень просто. Сформулируй конкретно задание, помогу.

Что значит ?

когда 0 светодид горит - 2 секунды, когда 1 светодиод не горит 1 секунду
Где эти нолики-единички?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

[

Что значит ?

когда 0 светодид горит - 2 секунды, когда 1 светодиод не горит 1 секунду
Где эти нолики-единички?

 

0 -это значит светодиод надо включать катодом в ножку пика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Действительно непонятно: если на ноге 0, то светодиод как раз светиться и НЕ будет!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Действительно непонятно: если на ноге 0, то светодиод как раз светиться и НЕ будет!

 

Вас за язык никто не тянул.Если можете, то помогите студенту.2 секунды на ноге 0. 1 секунда

на ноге 1. Для меня это сложно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Условий Вашей задачи я не знаю, поэтому генератор взял RC и частоту 4 МГц, выводим на 0 ногу порта B:

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

 

LIST p=16F84A ;объявляем тип используемого МК

include "P16F877a.inc"

__CONFIG _RC_OSC & _CP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF

;_RC_OSC -тип генератора

;_CP_OFF -бит защиты отключен

;_BODEN_OFF -запретить МК делать сброс при снижении напряжения питания

;_PWRTE_ON -разрешаем таймер включения питания

;_WDT_OFF -запрещаем сторожевой таймер

 

CBLOCK 0x0C

Count1 ;старший байт счетчика

Count2 ;средний байт счетчика

Count3 ;младший байт счетчика

ENDC

 

ORG 0x0000

goto Start

 

Start

bsf STATUS,RP0

bcf STATUS,RP1 ;переключаемся на Банк 1

clrf OPTION_REG ;конфигурация МК

clrf TRISA

clrf TRISB ;все ноги на вывод

bcf STATUS,RP0 ;переключаемся на Банк 0

Blink1 ;метка 1

clrf PORTB ;выставляем 0 на всех ножках порта В

movlw 0xFF

movwf Count3 ;устанавливаем счетчик на 2 секунды

movlw 0x30

movwf Count2

movlw 0x0B

movwf Count1

Blink2 ;метка2

decfsz Count3,f

goto Blink2

decfsz Count2,f

goto Blink2

decfsz Count1,f

goto Blink2 ;декрементируем (уменьшаем) счетчик и проверяем, если он стал нулевым,

movlw b'00000001' ;то выставляем на нужной ноге 1

movwf PORTB

movlw 0xFF

movwf Count3 ;устанавливаем счетчик на 1 секунду

movlw 0x15

movwf Count2

movlw 0x06

movwf Count1

Blink3 ;метка 3

decfsz Count3,f ;опять декрементируем счетчик с той же целью

goto Blink3

decfsz Count2,f

goto Blink3

decfsz Count1,f

goto Blink3

goto Blink1 ;счетчик = 0, переходим на метку 1

 

end

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

 

P.S. Счетчик выставил не совсем точно - ноль на ноге 2,008 сек, единица - 1,002 сек

...Лень было подгонять

 

 

 

Е-мое, форум не поддерживает форматирование, табуляция сбилась.

Если программа все еще нужна, пишите, пришлю по e-mail

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

napper

Написана Си и компилятор выдал аsm- файл.Для начинающих сложновато.

Если все работает, то для этого примера подойдет ваша схема.Только светодиод

надо включить как я показал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

napper

Написана Си и компилятор выдал аsm- файл.

Ничего подобного!!! Я сам писал, ручками! Запускал в MPLAB, все работает.

Я изначально учился программировать пики в ассемблере, поэтому знаю что говорю.

И чего тут сложного? Куда уж проще? Как раз я и написал наиболее простой вариант, где все просто и понятно. Или вы можете предложить что-то лучше?

 

P.S. Насчет светодиода согласен...

 

А куда пропал автор темы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда приношу свои извинения.

Куда делся автор не важно.Не ему, так другому понадобится.

Польза будет.Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Е-мое, форум не поддерживает форматирование, табуляция сбилась.

Форум поддерживает форматирование, если использовать BB-тэг code (кнопка code.gif):

 

    LIST    p=16F84A;объявляем тип используемого МК
    include "P16F877a.inc"
        __CONFIG _RC_OSC & _CP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF    
;_RC_OSC -тип генератора
;_CP_OFF -бит защиты отключен
;_BODEN_OFF -запретить МК делать сброс при снижении напряжения питания
;_PWRTE_ON -разрешаем таймер включения питания
;_WDT_OFF -запрещаем сторожевой таймер

    CBLOCK 0x0C
Count1;старший байт счетчика
Count2;средний байт счетчика
Count3;младший байт счетчика
    ENDC

    ORG    0x0000
    goto    Start

Start
    bsf    STATUS,RP0
    bcf    STATUS,RP1;переключаемся на Банк 1
    clrf    OPTION_REG;конфигурация МК
    clrf    TRISA        
    clrf    TRISB;все ноги на вывод
    bcf    STATUS,RP0;переключаемся на Банк 0
Blink1    ;метка 1
    clrf    PORTB;выставляем 0 на всех ножках порта В
    movlw    0xFF
    movwf    Count3;устанавливаем счетчик на 2 секунды
    movlw    0x30
    movwf    Count2
    movlw    0x0B
    movwf    Count1
Blink2    ;метка2
    decfsz Count3,f
    goto    Blink2
    decfsz Count2,f
    goto    Blink2
    decfsz Count1,f
    goto    Blink2;декрементируем (уменьшаем) счетчик и проверяем, если он стал нулевым,
    movlw    b'00000001';то выставляем на нужной ноге 1
    movwf    PORTB
    movlw    0xFF
    movwf    Count3;устанавливаем счетчик на 1 секунду
    movlw    0x15
    movwf    Count2
    movlw    0x06
    movwf    Count1
Blink3    ;метка 3
    decfsz Count3,f;опять декрементируем счетчик с той же целью
    goto    Blink3
    decfsz Count2,f
    goto    Blink3
    decfsz Count1,f
    goto    Blink3
    goto    Blink1;счетчик = 0, переходим на метку 1
    
    end

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

napper

Написана Си и компилятор выдал аsm- файл.

Ничего подобного!!! Я сам писал, ручками! Запускал в MPLAB, все работает.

Я изначально учился программировать пики в ассемблере, поэтому знаю что говорю.

И чего тут сложного? Куда уж проще? Как раз я и написал наиболее простой вариант, где все просто и понятно. Или вы можете предложить что-то лучше?

 

P.S. Насчет светодиода согласен...

 

А куда пропал автор темы?

Добрый всем!

Спасибо за помощь!!!!!!!

Я здесь! Извиниюсь за не корректное задание. Задание состоит в следующем на RA4 (3 нога) повесили резистор, подключенный к питанию (если резистор подключен к питанию, то на RA4 будет 1), а на RA1 (18 ножка) через резистор подключен диод, катодом в плюс питание. Так вот когда на RA4 у нас единичка, то светодиод мигает с частотой 1 Гц, причем мигает 17 сек, а потом гаснет, если резистор отпаять, то на RA4 будет ноль и светодиод не горит.

Я набросала программку, но она работает не так 1-мигает с частотой 1 Гц, 0- светодиод горит и не смогла разобраться, как сделать, чтобы мигал 17 сек (кварц на 8МГц)

Вот программа

LIST p=16F84

INTCON EQU 0x0B

OPTION EQU 0x81

TMR0 EQU 0x01

INTF EQU 1

T0IF EQU 5

PCL EQU 0x02

STATUS EQU 0x03

RP0 EQU 5

PORTA EQU 0x05

PORTB EQU 0x06

TRISA EQU 0x05

TRISB EQU 0x06

W EQU 0

F EQU 1

TEMPA EQU 0x0C

TEMPB EQU 0x0D

 

 

 

#DEFINE Z STATUS,2 ;бит нулевого результата

#DEFINE VD2 PORTA,1 ;светодиод VD2

#DEFINE R1 PORTA,4 ;резистор

 

 

ORG 0

GOTO BEGIN

;

ORG 100h

BEGIN

CALL INIT_PORTS ;вызов подпрограммы

;инициализации портов

INIT_PORTS ;подпрограмма инициализации портов

 

MOVLW 0xFF ;установка линий портов А В в единичное состояние

MOVWF PORTA

MOVWF PORTB

BSF STATUS,RP0 ;переход на банк 1

MOVLW 0x1C ;настройка линий RA0 и RA1 на вывод, другие на ввод

MOVWF TRISA

 

MOVLW 0x01 ;настройка линии RB0 на ввод, другие на вывод

MOVWF TRISB

 

BCF STATUS,RP0 ;возврат в банк 0

;RETURN ;возврат из подпрограммы

;

LOOP

CLRWDT ;сброс сторожевого таймера

CALL GET_RA ;вызов подпрограммы GET_RA

CALL R1_VD2M ;вызов подпрограммы R1_VD2M мигание светодиода

 

GOTO LOOP ;переход к метке LOOP для

DELAY_E ;подпрограмма формирования задержки

 

MOVWF COUNT2 ;загрузка W в регистр COUNT2

CLRF COUNT1 ;сброс содержимого регистра COUNT1

LOOPD

NOP ;пустая команда

DECFSZ COUNT1,F ;декремент COUNT1

GOTO LOOPD ;повторение цикла 256 раз

CLRWDT ;сброс сторожевого таймера

DECFSZ COUNT2,F ;декремент COUNT2

GOTO LOOPD ;повторение цикла

RETURN ;возврат из подпрограммы

;

 

GET_RA ;подпрограмма чтения состояния порта А

 

MOVF PORTA,W ;чтение состояния порта A в W

MOVWF TEMPA ;пересылка W в TEMPA

RETURN ;возврат из подпрограммы

 

;

R1_VD2M ;подпрограмма мигания светодиода

;VD2 при при наличии резистора пропустить команду если TEMPA,4=0 резистор подключен

BTFSC TEMPA,4

 

GOTO V0 ;перейти на V0

BSF VD2 ;зажечь светодиод VD2

MOVLW 0xF3 ;пересылка константы

;H'F3' = .243 в W

CALL DELAY_E ;вызов подпрограммы DELAY_E

BCF VD2 ; светодиод мигает

MOVLW 0xF3 ;пересылка константы

;H'F3' = .243 в W

CALL DELAY_E ;вызов подпрограммы DELAY_E

V0

BTFSS TEMPA,4 ;пропустить команду, если TEMPA,4=1 резистор не подключен

 

GOTO V1 ;перейти на V1

BCF VD2 ;светодиод не горит -а он горит!!!!!

V1

RETURN ; возврат из под программы

 

 

END

и нужна подпрограмма на 17 сек, чтоб мигал, а потом перестал!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

LIST p=16F84
INTCON    EQU         0x0B
  OPTION    EQU         0x81
  TMR0      EQU         0x01
  INTF      EQU         1
  T0IF      EQU         5
   PCL       EQU         0x02
   STATUS    EQU         0x03
   RP0       EQU         5
   PORTA     EQU         0x05
   PORTB     EQU         0x06
   TRISA     EQU         0x05
   TRISB     EQU         0x06
   W         EQU         0
   F         EQU         1
   TEMPA     EQU         0x0C
   TEMPB     EQU         0x0D
    
   

   #DEFINE   Z           STATUS,2 ;бит нулевого результата
   #DEFINE   VD2         PORTA,1  ;светодиод VD2
   #DEFINE   R1          PORTA,4  ;резистор
   

        ORG     0
        GOTO    BEGIN
;
        ORG     100h
   BEGIN

CALL INIT_PORTS ;вызов подпрограммы

;инициализации портов

Здесь у вас дважды вызывается подпрограмма инициализации портов, поэтому либо уберите "CALL INIT_PORTS", либо перенесите саму подпрограмму в другое место

   INIT_PORTS                       ;подпрограмма инициализации портов 
                          
   MOVLW    0xFF         ;установка линий портов А В в единичное состояние
   MOVWF    PORTA         
   MOVWF    PORTB

Зачем нужны предыдущие 3 строки я что-то не понял

   BSF      STATUS,RP0   ;переход на банк 1
   MOVLW    0x1C         ;настройка линий RA0 и RA1 на вывод, другие на ввод
   MOVWF    TRISA         
                          
   MOVLW    0x01         ;настройка линии RB0 на ввод, другие на вывод  
   MOVWF    TRISB         
                          
   BCF      STATUS,RP0   ;возврат в банк 0                
  ;RETURN                ;возврат из подпрограммы
;
LOOP
   CLRWDT                ;сброс сторожевого таймера
   CALL      GET_RA      ;вызов подпрограммы GET_RA
   CALL      R1_VD2M     ;вызов подпрограммы R1_VD2M мигание светодиода
                          
   GOTO      LOOP        ;переход к метке LOOP для
   DELAY_E               ;подпрограмма формирования задержки
                          
   MOVWF      COUNT2     ;загрузка W в регистр COUNT2
   CLRF       COUNT1     ;сброс содержимого регистра COUNT1
   LOOPD
   NOP                   ;пустая команда
   DECFSZ     COUNT1,F   ;декремент COUNT1
   GOTO       LOOPD      ;повторение цикла 256 раз
   CLRWDT                ;сброс сторожевого таймера
   DECFSZ     COUNT2,F   ;декремент COUNT2
   GOTO       LOOPD      ;повторение цикла 
   RETURN                ;возврат из подпрограммы
; 

GET_RA                   ;подпрограмма чтения состояния порта А
                          
   MOVF     PORTA,W      ;чтение состояния порта A в W
   MOVWF    TEMPA        ;пересылка W в TEMPA
   RETURN               ;возврат из подпрограммы

;
R1_VD2M                  ;подпрограмма мигания светодиода
                         ;VD2 при при наличии резистора пропустить команду если TEMPA,4=0 резистор подключен
   BTFSC     TEMPA,4

Если TEMPA,4=1, то выполняется следующая команда! Нам надо зажечь VD2!

  GOTO      V0          ;перейти на V0

А у вас здесь наоборот!

   BSF       VD2         ;зажечь светодиод VD2
   MOVLW     0xF3        ;пересылка константы
                         ;H'F3' = .243 в W
   CALL      DELAY_E     ;вызов подпрограммы DELAY_E
   BCF       VD2         ; светодиод мигает
   MOVLW     0xF3        ;пересылка константы
                         ;H'F3' = .243 в W
   CALL      DELAY_E     ;вызов подпрограммы DELAY_E
V0
   BTFSS     TEMPA,4     ;пропустить команду, если TEMPA,4=1 резистор не подключен
                          
   GOTO      V1          ;перейти на V1
   BCF       VD2         ;светодиод не горит -а он горит!!!!!
V1
   RETURN                ; возврат из под программы


END

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...