Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: очень нужна помощь с пиком
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Mari-999
помогите, пожалуйста с пиком 16f84А, лаба заключается в следующем на любой вывод подключить светодиод, когда 0 светодид горит - 2 секунды, когда 1 светодиод не горит 1 секунду...и так цикл, прогу надо написать на ассемблере, и подробно опишите пожалуйста, чтоб разобраться, спасибо
Herz
Цитата(Mari-999 @ Oct 31 2006, 22:07) *
помогите, пожалуйста с пиком 16f84А, лаба заключается в следующем на любой вывод подключить светодиод, когда 0 светодид горит - 2 секунды, когда 1 светодиод не горит 1 секунду...и так цикл, прогу надо написать на ассемблере, и подробно опишите пожалуйста, чтоб разобраться, спасибо

Здесь спроси: http://www.microchip.ru/phorum/list.php?f=2
Там это часто повторяется...
Или вот: http://nag.ru/goodies/shema/prochee07.html
napper
Цитата(Mari-999 @ Nov 1 2006, 00:07) *
помогите, пожалуйста с пиком 16f84А, лаба заключается в следующем на любой вывод подключить светодиод, когда 0 светодид горит - 2 секунды, когда 1 светодиод не горит 1 секунду...и так цикл, прогу надо написать на ассемблере, и подробно опишите пожалуйста, чтоб разобраться, спасибо

Это делается очень просто. Сформулируй конкретно задание, помогу.
Что значит ?
Цитата(Mari-999 @ Nov 1 2006, 00:07) *
когда 0 светодид горит - 2 секунды, когда 1 светодиод не горит 1 секунду
Где эти нолики-единички?
upc2
Цитата(napper @ Nov 5 2006, 01:38) *
[
Что значит ?
Цитата(Mari-999 @ Nov 1 2006, 00:07) *
когда 0 светодид горит - 2 секунды, когда 1 светодиод не горит 1 секунду
Где эти нолики-единички?


0 -это значит светодиод надо включать катодом в ножку пика.
napper
Схема то хоть такая?
upc2
Цитата(napper @ Nov 6 2006, 15:27) *
Схема то хоть такая?


Ценный труд.Разберитесь когда светятся светодиоды.
napper
Действительно непонятно: если на ноге 0, то светодиод как раз светиться и НЕ будет!
upc2
Цитата(napper @ Nov 6 2006, 18:58) *
Действительно непонятно: если на ноге 0, то светодиод как раз светиться и НЕ будет!


Вас за язык никто не тянул.Если можете, то помогите студенту.2 секунды на ноге 0. 1 секунда
на ноге 1. Для меня это сложно.
napper
Условий Вашей задачи я не знаю, поэтому генератор взял 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
upc2
napper
Написана Си и компилятор выдал аsm- файл.Для начинающих сложновато.
Если все работает, то для этого примера подойдет ваша схема.Только светодиод
надо включить как я показал.
napper
Цитата(upc2 @ Nov 8 2006, 08:34) *
napper
Написана Си и компилятор выдал аsm- файл.

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

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

А куда пропал автор темы?
upc2
Тогда приношу свои извинения.
Куда делся автор не важно.Не ему, так другому понадобится.
Польза будет.Спасибо.
Edmundo
Цитата(napper @ Nov 7 2006, 19:14) *
Е-мое, форум не поддерживает форматирование, табуляция сбилась.

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

Код
    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
Mari-999
Цитата(napper @ Nov 8 2006, 08:42) *
Цитата(upc2 @ Nov 8 2006, 08:34) *

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 сек, чтоб мигал, а потом перестал!!!
napper
Код
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
napper
Я думаю подпрограмму мигания надо организовать вот так:
Код
R1_VD2M                  ;подпрограмма мигания светодиода
   BTFSS     TEMPA,4      
   GOTO      V1          ;перейти на V1
   MOVLW     0x09
   MOVWF     COUNT      
;СЧЕТЧИК МИГАНИЙ 9 РАЗ ГОРИТ, 9 - НЕ ГОРИТ, ИТОГО 18 СЕК (ЧАСТОТА МИГАНИЙ 1 ГЕРЦ, ЗНАЧИТ 1
;МИГАНИЕ/НЕМИГАНИЕ В СЕКУНДУ), ПОСЛЕДНЕЕ НЕМИГАНИЕ НЕ УЧИТЫВАЕМ - ПОЛУЧАЕМ 17 СЕК
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
   GOTO      V1          ;перейти на V1
   DECFSZ    COUNT,F
   GOTO      V0
V1
   BCF       VD2         ;
   RETURN                ;возврат из под программы

END


Надеюсь паузы в подпрограмме DELAY_E вы подобрали правильно

P.S. Не забудьте объявить переменную COUNT в начале программы!!!
dosikus
Цитата(Mari-999 @ Nov 10 2006, 22:39) *
а на RA1 (18 ножка) через резистор подключен диод, катодом в плюс питание.


Вы уверены?
Светодиод катодом к плюсу?
И чего вы ожидаете ?
Mari-999
Цитата(dosikus @ Nov 11 2006, 12:57) *
Цитата(Mari-999 @ Nov 10 2006, 22:39) *


Вы уверены?
Светодиод катодом к плюсу?


нет не уверена
Mari-999
[quote name='napper' date='Nov 10 2006, 23:36' post='174600']
Я думаю подпрограмму мигания надо организовать вот так:
Код
R1_VD2M                 ;подпрограмма мигания светодиода
   BTFSS     TEMPA,4      
   GOTO      V1         ;перейти на V1
   MOVLW     0x09
   MOVWF     COUNT      
;СЧЕТЧИК МИГАНИЙ 9 РАЗ ГОРИТ, 9 - НЕ ГОРИТ, ИТОГО 18 СЕК (ЧАСТОТА МИГАНИЙ 1 ГЕРЦ, ЗНАЧИТ 1
;МИГАНИЕ/НЕМИГАНИЕ В СЕКУНДУ), ПОСЛЕДНЕЕ НЕМИГАНИЕ НЕ УЧИТЫВАЕМ - ПОЛУЧАЕМ 17 СЕК
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
   GOTO      V1         ;перейти на V1
   DECFSZ    COUNT,F
   GOTO      V0
V1
   BCF       VD2        ;
   RETURN            ;возврат из под программы

END


Надеюсь паузы в подпрограмме DELAY_E вы подобрали правильно

P.S. Не забудьте объявить переменную COUNT в начале программы!!!
[/quot]
не работает даже не компилиться
napper
Цитата(Mari-999 @ Nov 14 2006, 15:31) *
не работает даже не компилиться

Читайте внимательнее, это ПОДпрограмма!
Замените в своей программе, начиная с метки R1_VD2M на мою.
Mari-999
Цитата(napper @ Nov 14 2006, 16:07) *
Цитата(Mari-999 @ Nov 14 2006, 15:31) *

не работает даже не компилиться

Читайте внимательнее, это ПОДпрограмма!
Замените в своей программе, начиная с метки R1_VD2M на мою.

Да, именно так и сделала (это то я поняла конечно, что это подпрограмма smile.gif ), заменила, она не работает и ругаеться на строчки MOVLW 0x09 и GOTO V0
napper
Полная версия программы:
Код
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
    COUNT1    EQU    0x0E
    COUNT2    EQU    0x0F

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

    ORG 0
INIT_PORTS            ;подпрограмма инициализации портов
    BSF        STATUS,RP0;переход на банк 1
    MOVLW        0x1C    ;настройка линий RA0 и RA1 на вывод, другие на ввод
    MOVWF        TRISA
    MOVLW        0x01    ;настройка линии RB0 на ввод, другие на вывод  
    MOVWF        TRISB
    BCF        STATUS,RP0;возврат в банк 0
;
LOOP
    MOVF        PORTA,W;чтение состояния порта A в W
    MOVWF        TEMPA    ;пересылка W в TEMPA
    BTFSS        TEMPA,4
    GOTO        LOOP    ;перейти на LOOP
    MOVLW        0x09
    MOVWF        COUNT
;СЧЕТЧИК МИГАНИЙ 9 РАЗ ГОРИТ, 9 - НЕ ГОРИТ, ИТОГО 18 СЕК
;(ЧАСТОТА МИГАНИЙ 1 ГЕРЦ, ЗНАЧИТ 1 МИГАНИЕ/НЕМИГАНИЕ В СЕКУНДУ),
;ПОСЛЕДНЕЕ НЕМИГАНИЕ НЕ УЧИТЫВАЕМ - ПОЛУЧАЕМ 17 СЕК;-)
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
    DECFSZ    COUNT,F
    GOTO        V0
    GOTO        LOOP    ;переход к метке LOOP

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

    MOVWF        COUNT2;загрузка W в регистр COUNT2
    CLRF        COUNT1;сброс содержимого регистра COUNT1
LOOPD
    NOP            ;пустая команда
    DECFSZ    COUNT1,F;декремент COUNT1
    GOTO        LOOPD    ;повторение цикла 256 раз
    DECFSZ    COUNT2,F;декремент COUNT2
    GOTO        LOOPD    ;повторение цикла
    RETURN        ;возврат из подпрограммы

END

О результатах сообщите
Mari-999
Цитата(napper @ Nov 14 2006, 22:06) *
О результатах сообщите

не работает две ошибки
Edmundo
Цитата(Mari-999 @ Nov 16 2006, 07:15) *
не работает две ошибки

Небось, компиляторы разные... В чем компилируете?
napper
Цитата(Mari-999 @ Nov 16 2006, 07:15) *
не работает две ошибки

Давайте разбираться. Что пишет компилятор, на что ругается?
Цитата(Edmundo @ Nov 16 2006, 08:20) *
Небось, компиляторы разные... В чем компилируете?

А причем здесь компилятор? Вроде это стандартный ассемблер для PICов...
Mari-999
Цитата(napper @ Nov 16 2006, 08:39) *
Цитата(Mari-999 @ Nov 16 2006, 07:15) *
не работает две ошибки

Давайте разбираться. Что пишет компилятор, на что ругается?
Цитата(Edmundo @ Nov 16 2006, 08:20) *
Небось, компиляторы разные... В чем компилируете?

А причем здесь компилятор? Вроде это стандартный ассемблер для PICов...

MPASM выдает 5 ошибок, одну нашла не объявлена переменная COUNT, остальные не знаю
napper
Цитата(Mari-999 @ Nov 16 2006, 09:53) *
MPASM выдает 5 ошибок, одну нашла не объявлена переменная COUNT, остальные не знаю

Что за ошибки? Я же не ясновидящий!.. Скопируйте их сюда
Edmundo
Цитата(napper @ Nov 16 2006, 08:39) *
А причем здесь компилятор? Вроде это стандартный ассемблер для PICов...

Для PICов не знаю, но для других МК бывает. Синтаксис макросов в частности разный.
upc2
MPASM старенький компилятор. Пора переходить на MPLAB или использовать
его MPASMWIN.
Mari-999
Цитата(napper @ Nov 16 2006, 10:46) *
Цитата(Mari-999 @ Nov 16 2006, 09:53) *

MPASM выдает 5 ошибок, одну нашла не объявлена переменная COUNT, остальные не знаю

Что за ошибки? Я же не ясновидящий!.. Скопируйте их сюда

У нас mpasmwin, он когда переводишь в hex выдает 5 ошибок, одну нашла не обьявлена перем.count, осталось три, он не указывает какие, но когда комментируешь те две строки MOVLW 0x09 и GOTO V0,
он выдает 0 ошибок, я посмотрела, но так прога не работает
Edmundo
Цитата(Mari-999 @ Nov 19 2006, 10:06) *
У нас mpasmwin, он когда переводишь в hex выдает 5 ошибок, одну нашла не обьявлена перем.count, осталось три, он не указывает какие, но когда комментируешь те две строки MOVLW 0x09 и GOTO V0,
он выдает 0 ошибок, я посмотрела, но так прога не работает

5 - 1 = 3, интересная арифметика...

2napper, сорри что влезаю smile.gif, но может быть так...

1. Объявите переменную COUNT, она там действительно не объявлена.
2. Переименуйте метку V0 во что-нибудь не буквенно-цифровое, например VZERO, и поставьте соответственно GOTO VZERO
napper
Цитата(Edmundo @ Nov 19 2006, 14:51) *
5 - 1 = 3, интересная арифметика...

2napper, сорри что влезаю smile.gif, но может быть так...

1. Объявите переменную COUNT, она там действительно не объявлена.
2. Переименуйте метку V0 во что-нибудь не буквенно-цифровое, например VZERO, и поставьте соответственно GOTO VZERO

Edmundo, нет проблем! smile.gif Я ведь тоже могу ошибаться, поэтому только за, если кто-то меня поправит. Вот про переменную забыл...
Код
    #include P16F84A.inc
TEMPA    EQU    0x0C
TEMPB    EQU    0x0D
COUNT    EQU    0x0E
COUNT1    EQU    0x0F
COUNT2    EQU    0x10

    #DEFINE    VD2    PORTA,1;светодиод VD2
    #DEFINE    R1    PORTA,4;резистор

    ORG 0
INIT_PORTS            ;подпрограмма инициализации портов
    BSF        STATUS,RP0;переход на банк 1
    MOVLW        0x1C    ;настройка линий RA0 и RA1 на вывод, другие на ввод
    MOVWF        TRISA
    MOVLW        0x01    ;настройка линии RB0 на ввод, другие на вывод  
    MOVWF        TRISB
    BCF        STATUS,RP0;возврат в банк 0
;
LOOP
    MOVF        PORTA,W;чтение состояния порта A в W
    MOVWF        TEMPA    ;пересылка W в TEMPA
    BTFSS        TEMPA,4
    GOTO        LOOP    ;перейти на LOOP
    MOVLW        0x09
    MOVWF        COUNT
;СЧЕТЧИК МИГАНИЙ 9 РАЗ ГОРИТ, 9 - НЕ ГОРИТ, ИТОГО 18 СЕК
;(ЧАСТОТА МИГАНИЙ 1 ГЕРЦ, ЗНАЧИТ 1 МИГАНИЕ/НЕМИГАНИЕ В СЕКУНДУ),
;ПОСЛЕДНЕЕ НЕМИГАНИЕ НЕ УЧИТЫВАЕМ - ПОЛУЧАЕМ 17 СЕК;-)
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
    DECFSZ    COUNT,F
    GOTO        V0
    GOTO        LOOP    ;переход к метке LOOP

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

    MOVWF        COUNT2;загрузка W в регистр COUNT2
    CLRF        COUNT1;сброс содержимого регистра COUNT1
LOOPD
    NOP            ;пустая команда
    DECFSZ    COUNT1,F;декремент COUNT1
    GOTO        LOOPD    ;повторение цикла 256 раз
    DECFSZ    COUNT2,F;декремент COUNT2
    GOTO        LOOPD    ;повторение цикла
    RETURN        ;возврат из подпрограммы
        END

Что я исправил:
1. Объявил переменную COUNT
2. Добавил команду "#include P16F84A.inc" вместо "LIST p=16F84" (У меня MPLAB на это ругается, а разбираться лень)
3. По поводу меток все нормально, имена допустимые.
4. Убрал объявление стандартных регистров.
Откомпилировал в MPLAB, все ОК, ошибок 0
P.S. Версия MPLAB 7.30
MariSev
Цитата(Mari-999 @ Oct 31 2006, 20:07) *
помогите, пожалуйста с пиком 16f84А, лаба заключается в следующем на любой вывод подключить светодиод, когда 0 светодид горит - 2 секунды, когда 1 светодиод не горит 1 секунду...и так цикл, прогу надо написать на ассемблере, и подробно опишите пожалуйста, чтоб разобраться, спасибо

Если нужна еще программа, я могу помочь..., (а вообще то это мой любимый ник tongue.gif)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.