На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > PIC16F84 , программирование
      Не могу разобраться почему всегда горит сегмент f, помогите разобраться
      ExpandedWrap disabled
        ;******************************************************
        ;*листинг исходной программы
        ;******************************************************  
        #include <P16F84.inc>
        __CONFIG _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF
            
           TEMPA     EQU         0x0C
           TEMPB     EQU         0x0D
           COUNT1    EQU         0x0E
           COUNT2    EQU         0x0F
           COUNT3    EQU         0x10
        ;******************************************************
        ;*определение меток замены текста
        ;******************************************************
           #DEFINE   BA1         PORTA,0   ;динамик BA1
           #DEFINE   VD2         PORTA,1   ;светодиод VD2
           #DEFINE   SA1         PORTA,2   ;тумблер SA1
           #DEFINE   SA2         PORTA,3   ;тумблер SA2
           #DEFINE   SB1         PORTA,4   ;кнопка SB1
           #DEFINE   SB2         PORTB,0   ;кнопка SB2
           #DEFINE   HL1_A       PORTB,1   ;индикатор-сегмент A
           #DEFINE   HL1_B       PORTB,2   ;индикатор-сегмент B
           #DEFINE   HL1_C       PORTB,3   ;индикатор-сегмент C
           #DEFINE   HL1_D       PORTB,4   ;индикатор-сегмент D
           #DEFINE   HL1_E       PORTB,5   ;индикатор-сегмент D
           #DEFINE   HL1_F       PORTB,6   ;индикатор-сегмент E
           #DEFINE   HL1_G       PORTB,7   ;индикатор-сегмент F
        ;******************************************************
        ;*исполняемая программа
        ;******************************************************
           ORG    0x000       ;установка начального адреса по
                              ;сбросу
           GOTO   BEGIN       ;переход на начало программы
           ORG    0x005       ;установка начального адреса
                              ;размещения программы
        BEGIN
          CALL   INIT_PORTS  ;вызов подпрограммы
                              ;инициализации портов МК            
           GOTO   Main
        ;*****************************************************
        ;*программа пользователя
        ;
        ;*****************************************************
         
         
        ;основная программа
         
        Main  
        m1      CLRF    PORTB
            MOVLW   0x00
            CALL    CodeTable  
                MOVWF   PORTB
            CALL    Pause
            MOVLW   0x01
            CALL    CodeTable
                MOVWF   PORTB
            CALL    Pause
            MOVLW   0x02
            CALL    CodeTable  
                MOVWF   PORTB
            CALL    Pause
            MOVLW   0x03
            CALL    CodeTable  
                MOVWF   PORTB
            CALL    Pause
            MOVLW   0x04
            CALL    CodeTable  
                MOVWF   PORTB
            CALL    Pause
            MOVLW   0x05
            CALL    CodeTable  
                MOVWF   PORTB
            CALL    Pause
            MOVLW   0x06
            CALL    CodeTable  
                MOVWF   PORTB
            CALL    Pause
            MOVLW   0x07
            CALL    CodeTable  
                MOVWF   PORTB
            CALL    Pause
            MOVLW   0x08
            CALL    CodeTable  
                MOVWF   PORTB
            CALL    Pause
            MOVLW   0x09
            CALL    CodeTable  
                MOVWF   PORTB
            CALL    Pause
            
            GOTO m1
         
        ;===============================================================
        CodeTable
           addwf      PCL,F; Содержимое счетчика команд PCL = PCL + W
          
           RETLW     0x80       ;возврат из подпрограммы с 80 в W
           RETLW     0xF2       ;возврат из подпрограммы с F2 в W
           RETLW     0x48       ;возврат из подпрограммы с 48 в W
           RETLW     0x60       ;возврат из подпрограммы с 60 в W
           RETLW     0x32       ;возврат из подпрограммы с 32 в W
           RETLW     0x25       ;возврат из подпрограммы с 25 в W
           RETLW     0x04       ;возврат из подпрограммы с 04 в W
           RETLW     0xF0       ;возврат из подпрограммы с F0 в W
           RETLW     0x00       ;возврат из подпрограммы с 00 в W
           RETLW     0x20       ;возврат из подпрограммы с 20 в W
          
        ;===============================================================
            
         
         
        ;Пауза 0.5 секунды
         
        Pause  
            MOVLW       0x01
            movwf       COUNT1
         m2     decfsz      COUNT1, F
                goto        m2
            return  
         
        INIT_PORTS                ;подпрограмма инициализации
                                  ;портов
           MOVLW    0xFF          ;установка линий портов
           MOVWF    PORTA         ;A и B в единичное
           MOVWF    PORTB         ;состояние
           BSF      STATUS,RP0    ;переход на банк 1
           MOVLW    0x1C          ;настройка линий RA0 и
           MOVWF    TRISA         ;RA1 порта A на вывод –
                                  ;остальных – на ввод
           MOVLW    0x01          ;настройка линии RB0
           MOVWF    TRISB         ;порта B на ввод -
                                  ;остальных – на вывод
           BCF      STATUS,RP0    ;возврат в банк 0
           RETURN
         
                
        end
        Цитата Desam @
        Не могу разобраться почему всегда горит сегмент f

        Потому, что состояние пина RB7 всегда активно (либо нуль, либо 1, неизвестно, какой индикатор) и не меняется со временем, или меняется на неактивное на столь малый промежуток времени, что глаз не успевает оценить гашение светодиода сегмента. :D
          ExpandedWrap disabled
            ;******************************************************
            ;*листинг исходной программы
            ;******************************************************  
            #include <P16F84.inc>
            __CONFIG _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF
             
             
                         cblock 0x0c
             
               TEMPA    
               TEMPB
               TEMPC    
               COUNT1
               COUNT2
               COUNT3
             
                         endc
            ;******************************************************
            ;*определение меток замены текста
            ;******************************************************
               #DEFINE   BA1         PORTA,0   ;динамик BA1
               #DEFINE   VD2         PORTA,1   ;светодиод VD2
               #DEFINE   SA1         PORTA,2   ;тумблер SA1
               #DEFINE   SA2         PORTA,3   ;тумблер SA2
               #DEFINE   SB1         PORTA,4   ;кнопка SB1
               #DEFINE   SB2         PORTB,0   ;кнопка SB2
               #DEFINE   HL1_A       PORTB,1   ;индикатор-сегмент A
               #DEFINE   HL1_B       PORTB,2   ;индикатор-сегмент B
               #DEFINE   HL1_C       PORTB,3   ;индикатор-сегмент C
               #DEFINE   HL1_D       PORTB,4   ;индикатор-сегмент D
               #DEFINE   HL1_E       PORTB,5   ;индикатор-сегмент D
               #DEFINE   HL1_F       PORTB,6   ;индикатор-сегмент E
               #DEFINE   HL1_G       PORTB,7   ;индикатор-сегмент F
             
            ;[Блок макросов]===========================================================
            bank0       macro           ;Включение банка 0
                bcf STATUS,RP0
                        endm
             
            bank1       macro           ;Включение банка 1
                bsf STATUS,RP0
                        endm
            ;******************************************************
            ;*исполняемая программа
            ;******************************************************
               ORG    0x0000       ;установка начального адреса по
                                  ;сбросу
               GOTO   BEGIN       ;переход на начало программы
              
               ORG    0x0004      ;пригодится, если будешь использовать прерывания
                    retfie
             
            ;===============================================================
            CodeTable
               andlw     0x0f
               addwf     PCL,F; Содержимое счетчика команд PCL = PCL + W
             
               RETLW     0x7e    ;0
               RETLW     0x0c    ;1
               RETLW     0xb6    ;2
               RETLW     0x9e    ;3
             
               RETLW     0xcc    ;4
               RETLW     0xda    ;5
               RETLW     0xfa    ;6
               RETLW     0x0e    ;7
             
               RETLW     0xfe    ;8
               RETLW     0xde    ;9
               RETLW     0xee    ;A
               RETLW     0xf8    ;b
             
               RETLW     0x72    ;C
               RETLW     0xbc    ;d
               RETLW     0xf2    ;E
               RETLW     0xe2    ;F
            ;===============================================================
             
            BEGIN
               CALL   INIT_PORTS  ;вызов подпрограммы
                                  ;инициализации портов МК
               movlw  0x00
               movwf  TEMPA                                  
               GOTO   Main
            ;*****************************************************
            ;*программа пользователя
            ;
            ;*****************************************************
             
             
            ;основная программа
             
            Main:  
                    movf    TEMPA, w
                    CALL    CodeTable
                    MOVWF   PORTB
                    CALL    Pause
                    incf    TEMPA, f
                    call    Beep
                    GOTO    Main
             
             
            Beep:
                    movlw   .300
                    movwf   TEMPC
            BEEP_TONE:
                    movlw   0xff
                    movwf   TEMPB
                    bcf     BA1
            DELAY_0:
                    decfsz  TEMPB, f
                    goto    DELAY_0
             
                    movlw   0xff
                    movwf   TEMPB
                    bsf     BA1
            DELAY_1:
                    decfsz  TEMPB, f
                    goto    DELAY_1
                    decfsz  TEMPC, f
                    goto    BEEP_TONE    
                    return
             
            ;Ждём нажатия кнопки SB2
             
            Pause:  
                    btfsc   PORTB,0
                    goto    Pause
            Pause1:
                    btfss   PORTB,0
                    goto    Pause1
                    return  
             
            INIT_PORTS                ;подпрограмма инициализации
                                      ;портов
               MOVLW    0xFF          ;установка линий портов
               MOVWF    PORTA         ;A и B в единичное
               MOVWF    PORTB         ;состояние
               bank1                  ;переход на банк 1
               MOVLW    0x1C          ;настройка линий RA0 и
               MOVWF    TRISA         ;RA1 порта A на вывод -[attach=#0][/attach]
                                      ;остальных - на ввод
               MOVLW    0x01          ;настройка линии RB0
               MOVWF    TRISB         ;порта B на ввод -
                                      ;остальных - на вывод
               bank0                  ;возврат в банк 0
               RETURN
             
             
            end
          [attach=#0][/attach] Прикреплённый файлПрикреплённый файл7seg.HEX (408 байт, скачиваний: 151)
            ExpandedWrap disabled
              ;******************************************************
              ;*листинг исходной программы
              ;******************************************************  
              #include <P16F84.inc>
              __CONFIG _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF
               
               
                           cblock 0x0c
               
                 TEMPA    
                 TEMPB
                 TEMPC    
                 COUNT1
                 COUNT2
                 COUNT3
               
                           endc
              ;******************************************************
              ;*определение меток замены текста
              ;******************************************************
                 #DEFINE   BA1         PORTA,0   ;динамик BA1
                 #DEFINE   VD2         PORTA,1   ;светодиод VD2
                 #DEFINE   SA1         PORTA,2   ;тумблер SA1
                 #DEFINE   SA2         PORTA,3   ;тумблер SA2
                 #DEFINE   SB1         PORTA,4   ;кнопка SB1
                 #DEFINE   SB2         PORTB,0   ;кнопка SB2
                 #DEFINE   HL1_A       PORTB,1   ;индикатор-сегмент A
                 #DEFINE   HL1_B       PORTB,2   ;индикатор-сегмент B
                 #DEFINE   HL1_C       PORTB,3   ;индикатор-сегмент C
                 #DEFINE   HL1_D       PORTB,4   ;индикатор-сегмент D
                 #DEFINE   HL1_E       PORTB,5   ;индикатор-сегмент D
                 #DEFINE   HL1_F       PORTB,6   ;индикатор-сегмент E
                 #DEFINE   HL1_G       PORTB,7   ;индикатор-сегмент F
               
              ;[Блок макросов]===========================================================
              bank0       macro           ;Включение банка 0
                  bcf STATUS,RP0
                          endm
               
              bank1       macro           ;Включение банка 1
                  bsf STATUS,RP0
                          endm
              ;******************************************************
              ;*исполняемая программа
              ;******************************************************
                 ORG    0x0000       ;установка начального адреса по
                                    ;сбросу
                 GOTO   BEGIN       ;переход на начало программы
                
                 ORG    0x0004      ;пригодится, если будешь использовать прерывания
                      retfie
               
              ;===============================================================
              CodeTable
                 andlw     0x0f
                 addwf     PCL,F; Содержимое счетчика команд PCL = PCL + W
               
                 RETLW     0x7e    ;0
                 RETLW     0x0c    ;1
                 RETLW     0xb6    ;2
                 RETLW     0x9e    ;3
               
                 RETLW     0xcc    ;4
                 RETLW     0xda    ;5
                 RETLW     0xfa    ;6
                 RETLW     0x0e    ;7
               
                 RETLW     0xfe    ;8
                 RETLW     0xde    ;9
                 RETLW     0xee    ;A
                 RETLW     0xf8    ;b
               
                 RETLW     0x72    ;C
                 RETLW     0xbc    ;d
                 RETLW     0xf2    ;E
                 RETLW     0xe2    ;F
              ;===============================================================
               
              BEGIN
                 CALL   INIT_PORTS  ;вызов подпрограммы
                                    ;инициализации портов МК
                 movlw  0x00
                 movwf  TEMPA                                  
                 GOTO   Main
              ;*****************************************************
              ;*программа пользователя
              ;
              ;*****************************************************
               
               
              ;основная программа
               
              Main:  
                      movf    TEMPA, w
                      CALL    CodeTable
                      MOVWF   PORTB
                      CALL    Pause
                      incf    TEMPA, f
                      call    Beep
                      GOTO    Main
               
               
              Beep:
                      movlw   .300
                      movwf   TEMPC
              BEEP_TONE:
                      movlw   0xff
                      movwf   TEMPB
                      bcf     BA1
              DELAY_0:
                      decfsz  TEMPB, f
                      goto    DELAY_0
               
                      movlw   0xff
                      movwf   TEMPB
                      bsf     BA1
              DELAY_1:
                      decfsz  TEMPB, f
                      goto    DELAY_1
                      decfsz  TEMPC, f
                      goto    BEEP_TONE    
                      return
               
              ;Ждём нажатия кнопки SB2
               
              Pause:  
                      btfsc   PORTB,0
                      goto    Pause
              Pause1:
                      btfss   PORTB,0
                      goto    Pause1
                      return  
               
              INIT_PORTS                ;подпрограмма инициализации
                                        ;портов
                 MOVLW    0xFF          ;установка линий портов
                 MOVWF    PORTA         ;A и B в единичное
                 MOVWF    PORTB         ;состояние
                 bank1                  ;переход на банк 1
                 MOVLW    0x1C          ;настройка линий RA0 и
                 MOVWF    TRISA         ;RA1 порта A на вывод -[attach=#0][/attach]
                                        ;остальных - на ввод
                 MOVLW    0x01          ;настройка линии RB0
                 MOVWF    TRISB         ;порта B на ввод -
                                        ;остальных - на вывод
                 bank0                  ;возврат в банк 0
                 RETURN
               
               
              end
            [attach=#0][/attach] Прикреплённый файлПрикреплённый файл7seg.HEX (408 байт, скачиваний: 151)
              Прикреплённый файлПрикреплённый файл7SEGMENT.rar (13,72 Кбайт, скачиваний: 117)
                Я додумал ВАШ проект и вот что получилось:
                1. Если удерживая SB1 включить питание девайс перейдет в тестовый режим, сигнализируя об этом высвечиванием сиввола "t" на индикаторе и троекратным попискиванием. Выход из этого режима SB2
                2. Тумблерами SA1 и SA2 задают режим работы 0, 1, 2, и 3 в двоичном коде. Режимы соответствуют
                частоте моргания светодиода VD2
                3. Нажатие на SB2 приводит к циклическому перебору на индикаторе чисел от 0 до F, сопровождая
                каждое нажатие писком динамика

                З.Ы. Никогда на ломайте рук или ног! :) Времени свободного много, а толку мало!

                Проект в аттаче. Исходник, Протеус модель и HEX Прикреплённый файлПрикреплённый файл7SEGMENT.rar (14,36 Кбайт, скачиваний: 129)
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0400 ]   [ 24 queries used ]   [ Generated: 3.05.24, 01:13 GMT ]