PIC 16f84A časovač – Assembler – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

PIC 16f84A časovač – Assembler – Fórum – Programujte.comPIC 16f84A časovač – Assembler – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
micha4074740
Newbie
18. 8. 2016   #1
-
0
-

Ahoj pokouším se v assembleru naprogramovat časovač. Bohužel se mi nedaří.  Mám 4 displeje na prvních dvou chci minuty a na druhém chci vteřiny, tlačítka zatím neřeším časovat začne odpočítávat od 0 do 59 minut a 59 sekund pak se resetuji. Používám multiplexní režim a BCD dekoder.

Toto se mi podařilo naprogramovat jen kdyby měly displeje vlastní paměť na poslední hodnotu kterou dostaly, to ale nemají, takže potřebuji poradit. Vůbec mě nejde dohromady cyklus pro zpoždění a zároveň vysílat data na display ( když probíhá zpožďovací cyklus tak se na displeji nic nezobrazuje- takže většinu času).

Nějaká nastavení PIC na výstupy, WDT atd. tu řešit nechci. Chci řešit jen program.

Dávám sem zkrácenou ukázku

Vysvětlivky:

zobrazX= vyšle číslo x do BCD překladače který je před displejem.

cekej1= časová smyčka 1 sekunda

PORTA,0 až 3= výstup na tranzistor který aktivuje požadovaný displej.               

                        

                               CALL                         zobraz0                              
                               BSF                        PORTA,0                             
                               CALL                      zobraz0
                               BSF                        PORTA,1
                               CALL                         zobraz0                              
                               BSF                        PORTA,2                             
                               CALL                      zobraz0
                               BSF                        PORTA,3
                               cekej1
                               CALL                         zobraz1                              
                               BSF                        PORTA,0                             
                               CALL                      zobraz0
                               BSF                        PORTA,1
                               CALL                         zobraz0                              
                               BSF                        PORTA,2                             
                               CALL                      zobraz0
                               BSF                        PORTA,3
                               cekej1
                               CALL                         zobraz2                              
                               BSF                        PORTA,0                             
                               CALL                      zobraz0
                               BSF                        PORTA,1
                               CALL                         zobraz0                              
                               BSF                        PORTA,2                             
                               CALL                      zobraz0
                               BSF                        PORTA,3
                               cekej1
zobraz0              MOVLW                                b'00000000'
                               MOVWF                              PORTB
                               RETURN
zobraz1              MOVLW                                b'00000001'
                               MOVWF                              PORTB
                               RETURN
zobraz2              MOVLW                                b'00000010'
                               MOVWF                              PORTB
                               RETURN

atd..

Předem děkuji za vaše rady.

Nahlásit jako SPAM
IP: 86.63.207.–
KIIV
~ Moderátor
+43
God of flame
18. 8. 2016   #2
-
0
-

Ja takove veci obvykle resim timerem nastavenym na N*50 preruseni za sekundu, polem o velikosti N, pocitadlem pro indexovani pole. V obsluze preruseni vypnu tranzistor pro aktualni cislici, posunu se na dalsi, poslu na port hodnotu, zapnu dalsi tranzistor. Pokud tam budou "duchove", tak prodlouzit mezeru mezi vypnutim tranzistoru a zmenou dat.

Nahlásit jako SPAM
IP: 94.112.107.–
Program vždy dělá to co naprogramujete, ne to co chcete...
micha4074740
Newbie
18. 8. 2016   #3
-
0
-

#2 KIIV
Jak čtu tak to asi jednoduše jak bych si představoval nejde.

Nedokážu si představit jaké bych příkazy z instrukční sady měl podle tebe použít. Instrukční sadu už poměrne ovládám, ale jen to co je v ní napsané.

Nešlo by to jednodušeji. Například přes aritmetické operace + BTFSC, BTFSC,DECFSZ,INCFSZ.

Vytvořit nějaké proměnné od kterých odečítat po každém zobrazení čísel na displeji a pak to vnořit do časové smyčky.

lze to vlastně napsat nějak takto nebo je to nemožné.

Nahlásit jako SPAM
IP: 86.63.207.–
KIIV
~ Moderátor
+43
God of flame
18. 8. 2016   #4
-
0
-

#3 micha407474
idealni je to preruseni. Bude ti to prerusovat i ty cekani (presne jak si predstavujes)

dalsi moznosti je mit cekani po mensich intervalech a prokladat prepinanim segmentu a zobrazovanych dat.

Nahlásit jako SPAM
IP: 94.112.107.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
18. 8. 2016   #5
-
+1
-
Zajímavé

#3 micha407474
kazdopadne bych to videl nejak takto (bez hlavniho programu, netestovano - uz jsem v tom nedelal nejmene dekadu):

            list  p=16f84
            #include p16f84.inc

count       equ     0x0C            ; counter
backup_st   equ     0x0D            ; backup for status register
backup_w    equ     0x0E            ; backup for w register
array0      equ     0x10            ; first segment (reserved up to 0x13)
array1      equ     0x11            ; 
array2      equ     0x12            ; 
array3      equ     0x13            ; 
            
            org     0x00
            goto    start

            org     0x04            ; interrupt handler

            movwf   backup_w        ; backup of W register
            movf    STATUS, W 
            movwf   backup_st       ; backup of STATUS register
            
            bcf     STATUS, RP0     ; make sure we are in Bank 0
            bcf     INTCON, T0IF    ; clear interrupt flag

            movlw   0xF0
            andwf   PORTA, F        ; disable all transistors
            andwf   PORTB, F        ; reset output for bcd decoder to 0

            movlw   array
            movwf   FSR             ; set indirect address to the first item of array
                        
            incf    count, W        ; increment counter and get result in W
            andlw   0x3             ; we wan't only values from 0 to 3
            movwf   count           ; store back into counter
            
            addwf   FSR, F          ; add correct offset from w to point which data should be showed right now
            movf    INDF, W         ; load current digit to show
            andlw   0xF             ; mask higher bits to not mess with another pins
            irowf   PORTB, F        ; set current digit value
            
            movf    count, W        ; reload actual counter into w
            call    map             ; which transistor should be turned on?
            iorwf   PORTA           ; and do it

            movf    backup_st, W    ; restore STATUS and W register
            movwf   STATUS
            movf    backup_w, W
           
            retfie                  ; return from interrupt

map         addwf   PCL             ; W contains values 0 to 3, jump to corresponding retlw
            retlw   0b00000001
            retlw   0b00000010
            retlw   0b00000100
            retlw   0b00001000
    
start       bcf     STATUS, RP0     ; bank 0
            clrf    TMR0
            clrf    PORTA
            clrf    PORTB
            bsf     STATUS, RP0     ; bank 1
            movlw   0xF
            movwf   TRISA
            movwf   TRISB
            movlw   4
            movwf   OPTION_REG      ; set prescaler to 1:32 amd assign it to T0
            bcf     STATUS, RP0     ; bank 0
            bcf     INTCON, TOIE    ; timer overflow interrupt enable
            bcf     INTCON, GIE     ; global interrupt enable

main                                ; main program

            goto main

            
Nahlásit jako SPAM
IP: 94.112.107.–
Program vždy dělá to co naprogramujete, ne to co chcete...
micha4074740
Newbie
23. 8. 2016   #6
-
0
-

OK děkuji za rady

Nahlásit jako SPAM
IP: 86.63.207.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 215 hostů

Podobná vlákna

časovač — založil xeonikx

Časovač — založil aTTix

Časovač — založil zgerbiak

Casovac — založil Odin

časovač — založil Pikin88

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý