Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ASM][PIC16F74] włączanie i wyłączanie diody co 5s

Mikhaił 25 Sty 2010 18:46 1439 2
  • #1 25 Sty 2010 18:46
    Mikhaił
    Poziom 16  

    Witam, potrzebuje zmienic ten program zeby dioda zapalała sie i gasła co 5s a ktoś ma jakies propozycje? Aktualnie jest co 0,5s a mi potrzebne 5s

    ProgramGlowny

    Code:
    ; Inicjalizacja
    
    ; Przelacz
    ; DziesiecMS
    ;
    ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    list C=160, N=80, ST=OFF, MM=OFF
    include "P16F74.INC"
    __config(_CP_OFF& _PWRTE_ON & _XT_OSC & _WDT_OFF & _BODEN_OFF)
    errorlevel -302
    ;////////////////Stale////////////////////////////////////////////////////////////////////////////////////////////////////////////
    Bank0RAM equ H'20'
    MaksLicz equ 50
    Dioda3 equ B'00000001'
    DziesMsH equ 13
    DziesMsL equ 247
    ;/////////Zmienne//////////
    cblock Bank0RAM
    LICZPETLE
    LICZNIKH
    LICZNIKL
    endc


    org H'000'
    goto ProgramGlowny
    org H'004'
    Stop
    goto Stop

    ;/////////////Program Glowny///////////////////////////////////////////////////////////////////////////////////////////////

    ProgramGlowny
    call Inicjalizacja
    nop
    PetlaGlowna
    call DziesiecMs
    call Przelacz
    goto PetlaGlowna
    ;////////////Procedura Inicjalizacja//////////////////////////////////////////////////////////////////////////////////////
    Inicjalizacja
    movlw MaksLicz
    movwf LICZPETLE
    movlw Dioda3
    movwf PORTD
    bsf STATUS,RP0
    clrf TRISD
    bcf STATUS,RP0
    return
    ;////////////Procedura Przelacz//////////////////////////////////////////////////////////////////////////////////////////////

    Przelacz
    decfsz LICZPETLE,F
    goto PrzelaczKoniec
    call Opozn47
    movlw MaksLicz
    movwf LICZPETLE
    movlw Dioda3
    xorwf PORTD,F
    PrzelaczKoniec
    return

    ;////////////petla 47///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    Opozn47
    movlw 14
    movwf LICZNIKH
    Petla
    decfsz LICZNIKH,F
    goto Petla
    return
    ;////////////Procedura DziesiecMs/////////////////////////////////////////////////////////////////////////////////

    DziesiecMs

    ; nop
    movlw DziesMsH
    movwf LICZNIKH
    movlw DziesMsL
    movwf LICZNIKL
    Dziesiec_1
    Decfsz LICZNIKL,F
    goto Dziesiec_1
    decfsz LICZNIKH,F
    goto Dziesiec_1
    return
    end


    Proszę używać znaczników code. Proszę poprawić pisownię.
    Przeniesiono z Programowanie Ogólne. - arnoldziq

    0 2
  • Pomocny post
    #2 25 Sty 2010 19:41
    _Robak_
    Poziom 33  

    Zmien wartosc DziesMsH na 130 :>

    0
  • #3 25 Sty 2010 19:47
    Mikhaił
    Poziom 16  

    dzieki, a w takim kodzie napisanym w C co trzeba zrobic zeby dioda migała co 0,5s?
    ten sam uC...

    Code:
    #include "htc.h"
    
    #include "lcd.h"

    __CONFIG(BORDIS&PWRTDIS&WDTDIS&XT&UNPROTECT);

    #define   XTAL_FREQ   4MHZ
    #define Freq 4
    #include "delay.h"

    #define bitset(var,bitno) ((var) |= 1UL < < (bitno))
    #define bitclr(var,bitno) ((var) &= ~(1UL < < (bitno)))

    extern void Initialize(void);
    extern void Toogle(int ind);
    extern char bin2str(unsigned char vector);

    #define Toogle_Period 250

       unsigned char FirstState = 0b10000001;

       unsigned char portStates[6];
       unsigned char licznik_tpt2 = Toogle_Period;
       unsigned char index = 0;

    void main(void) {

       char i;
       unsigned char channel;
       unsigned char ch0_value;

       portStates[0] = FirstState;   //0b10000001;
       portStates[1] = 0b01000010;
       portStates[2] = 0b00100100;
       portStates[3] = 0b00011000;
       portStates[4] = 0b01000010;
       portStates[5] = 0b00100100;

       Initialize();

       while(1) {
       //main loop is empty
          
       }
    }

    void Initialize() {
       PORTD = 0;
       lcd_init();               //lcd_clear() included
       lcd_clear();
       lcd_goto(0x80);
       lcd_puts("Dioda07 LCD T2");
       T2CON = 4*Freq - 3;         //Tpt2 = 2ms
       PR2 = 249;
       TMR2IE = 1;
       INTCON = 0b11000000;      //GIE = 1, PEIE = 1;
    }

    //#pragma interrupt_level 1
    void Toogle(index) {
       PORTD = portStates[index];
    }

    //#pragma interrupt_level 1
    void interrupt ProcObsPrzerwania(void) {

       if(TMR2IF) {
          TMR2IF = 0;
          if (--licznik_tpt2 == 0) {
             if (index == 5) index = 0;
             Toogle(index++);
             licznik_tpt2 = Toogle_Period;
             //lcd_goto(0x80);
          }
       }
    }

    0