Podprogram za PIC
Moderators: pedja089, stojke369, [eDo], trax
- dejanmaksa
- Napredujem
- Posts: 159
- Joined: 28-10-2008, 22:15
- Location: Velika Plana
Podprogram za PIC
Interesuje me da li je moguce da PIC radi dve operacije nezavisno jedna od druge.
Naime, ako napisem neki program u MicroCode studiju i treba da se odvija odvojeno tj. nezavisno jedan od drugog kako bih to mogao napraviti. Treba mi kao da imam dva programa u jednom.
Naime, ako napisem neki program u MicroCode studiju i treba da se odvija odvojeno tj. nezavisno jedan od drugog kako bih to mogao napraviti. Treba mi kao da imam dva programa u jednom.
- dejanmaksa
- Napredujem
- Posts: 159
- Joined: 28-10-2008, 22:15
- Location: Velika Plana
Re: Podprogram za PIC
Na ovako nesto sam mislio.
Da li ovako moze?
treba mi da prikazuje brojeve necekajuci tu 1 sekundu koliko traje brojanje na pinu senzor.
brojenje:
count senzor,1000,broj1
BROJ=BROJ1*60
brojac1=broj dig 3
brojac2=broj dig 2
brojac3=broj dig 1
brojac4=broj dig 0
gosub blinkanje
BLINKANJE:
FOR I=1 TO 50
portb=bROJAC1
high portb.4
pause 100
low portb.4
pause 100
portb=bROJAC2
high portb.5
pause 100
low portb.5
pause 100
portb=bROJAC3
high portb.6
pause 100
low portb.6
pause 100
portb=bROJAC4
high portb.7
pause 100
low portb.7
pause 100
NEXT I
return
end
Da li ovako moze?
treba mi da prikazuje brojeve necekajuci tu 1 sekundu koliko traje brojanje na pinu senzor.
brojenje:
count senzor,1000,broj1
BROJ=BROJ1*60
brojac1=broj dig 3
brojac2=broj dig 2
brojac3=broj dig 1
brojac4=broj dig 0
gosub blinkanje
BLINKANJE:
FOR I=1 TO 50
portb=bROJAC1
high portb.4
pause 100
low portb.4
pause 100
portb=bROJAC2
high portb.5
pause 100
low portb.5
pause 100
portb=bROJAC3
high portb.6
pause 100
low portb.6
pause 100
portb=bROJAC4
high portb.7
pause 100
low portb.7
pause 100
NEXT I
return
end
Re: Podprogram za PIC
Mislim da bi u ovom tvom primjeru PIC samo jednom izvrsio brojanje pa bi onda uletio u beskonacnu petlju sa prikazom vrijednosti (labela blinkanje).
A sa onim primjerom iz kursa to bi se odradjivalo tako da bi samo prvu sekundu po startanju imao prazan displej a kasnije pri ponovnom brojanju (count) na displeyu bi tu sekundu imao poslednju prikazanu vrijednost. Znaci nekako ovako:
Brojenje:
x
x
x
goto blinkanje
end
Blinkanje:
x
x
x
goto brojenje
Nadam se da sam pomogao
A sa onim primjerom iz kursa to bi se odradjivalo tako da bi samo prvu sekundu po startanju imao prazan displej a kasnije pri ponovnom brojanju (count) na displeyu bi tu sekundu imao poslednju prikazanu vrijednost. Znaci nekako ovako:
Brojenje:
x
x
x
goto blinkanje
end
Blinkanje:
x
x
x
goto brojenje
Nadam se da sam pomogao
Ako kaniš pobijediti, ne smiješ izgubiti
- dejanmaksa
- Napredujem
- Posts: 159
- Joined: 28-10-2008, 22:15
- Location: Velika Plana
Re: Podprogram za PIC
Mislim da ne mogu na kraj prve labele da stavim end onda mi se tu zakoci i ne mrda dalje.
Problem ne bi bio ako bih koristio lcd ali koristim 7-seg displeje u multipleks modu pa zbog one labele blinkanje moram da imam tu labelu konstanto jer dok cekam tu jednu sekundu displeji su mi pogaseni.
Ne mogu da prevazidjem taj problem.
Problem ne bi bio ako bih koristio lcd ali koristim 7-seg displeje u multipleks modu pa zbog one labele blinkanje moram da imam tu labelu konstanto jer dok cekam tu jednu sekundu displeji su mi pogaseni.
Ne mogu da prevazidjem taj problem.
Re: Podprogram za PIC
Prije tog end-a imas goto,
u stvari nisam bas siguran moze umjesto end-a i goto brojenje
a u labeli blinkanje promijeni kod .........
a mozda i nemoze (multiplex) , vjerovatno to i nemoze tako kao sto sam u prvi mah mislio posto se radi o multipleksiranju,
mozda neko drugi ima neku bolju ideju..
u stvari nisam bas siguran moze umjesto end-a i goto brojenje
a u labeli blinkanje promijeni kod .........
a mozda i nemoze (multiplex) , vjerovatno to i nemoze tako kao sto sam u prvi mah mislio posto se radi o multipleksiranju,
mozda neko drugi ima neku bolju ideju..
Ako kaniš pobijediti, ne smiješ izgubiti
Re: Podprogram za PIC
da se to resiti ali je komplikovano...
pic ima jedan procesor tako da ne postoji mogucnost paralelnog izvrsavanja programa...
ono sto se moze uraditi je da se istovremeno broje impulsi i prikaz na displeju, ali je to malo komplikovano i nezgodno...
pic ima jedan procesor tako da ne postoji mogucnost paralelnog izvrsavanja programa...
ono sto se moze uraditi je da se istovremeno broje impulsi i prikaz na displeju, ali je to malo komplikovano i nezgodno...
- dejanmaksa
- Napredujem
- Posts: 159
- Joined: 28-10-2008, 22:15
- Location: Velika Plana
Re: Podprogram za PIC
Najverovatnije cu iskoristiti LCD posto na njemu mogu to da uradim, a ujedno cu da ubacim i merenje temperature ili da uzmem neki PIC sa vise pinova pa da ne koristim multipleksiranje.
-
- Penjem se :)
- Posts: 58
- Joined: 23-02-2005, 14:13
- Location: Hrvatska - Cakovec
- Contact:
Re: Podprogram za PIC
Ovakve probleme u pravilu rješava korištenje interupta - timera - countera. Pošto s PIC kontrolerima nisam baš na ti kao s 8051 serijom kontrolera opisati ću samo konceptualno riješenje. Iz navedenog sam zaključio da se radi o nekakvom multipleksiranom displeju koji pokazuje stanje brojača (s znamenkama 1 do 4) na portu b i to niži nibl je znamenka a gornji bitovi su segmenti.
broj=vrijednost koju želiš prikazati na displeju (0...9999) i definirana je u glavnoj beskonačnoj petlji programa
znamenka=jedna znamenka broja1
segment= segment 1...4
;1. treba podesiti nekakav timer na izvršavanje svakih npr. 10ms (ovo je trajanje svjetljenja jednog
;segmenta i ovisno o tom vremenu i broju segmenata može se vidjeti treperenje ili ne)
main:
;glavna petlja programa koja definira vrijednost broj1
...
goto main
timer:
broj=broj1*60 ;ovoj je tvoj dio računice koji sam prepisao
portb=0 ;isključi sve
segment=segment+1 ;novi segment
if segment=1 then ;za jedinice
znamenka=broj dig 0
portb=znamenka ;postavi donji nibl
high portb.7 ;"1" na PB7 uključuje segment jedinica
end if
if segment=2 then ;za desetice
znamenka=broj dig 2
portb=znamenka ;postavi donji nibl
high portb.6 ;"1" na PB6 uključuje segment desetica
end if
if segment=3 then ;za stotice
znamenka=broj dig 3
portb=znamenka ;postavi donji nibl
high portb.5 ;"1" na PB5 uključuje segment stotica
end if
if segment>3 then ;za tisučicice ili bilo što drugo
znamenka=broj dig 4
portb=znamenka ;postavi donji nibl
high portb.4 ;"1" na PB4 uključuje segment tisučica
segment =0 ;ispočetka
end if
return
Kod ispred nemožeš doslovno prepisati i ovisan je o programu koji koristiš. Navedeno je samo nekakav BASIC okvir za riješenje problema. Nadam se da če PIC korisnici dopuniti ovo s potrebnim djelovima koda (definiranje timer interupta ...). Interupt dio se umjesto s if..then da bolje riješiti matematikom i logikom ali trebao bi bolje poznavati korišteni BASIC.
broj=vrijednost koju želiš prikazati na displeju (0...9999) i definirana je u glavnoj beskonačnoj petlji programa
znamenka=jedna znamenka broja1
segment= segment 1...4
;1. treba podesiti nekakav timer na izvršavanje svakih npr. 10ms (ovo je trajanje svjetljenja jednog
;segmenta i ovisno o tom vremenu i broju segmenata može se vidjeti treperenje ili ne)
main:
;glavna petlja programa koja definira vrijednost broj1
...
goto main
timer:
broj=broj1*60 ;ovoj je tvoj dio računice koji sam prepisao
portb=0 ;isključi sve
segment=segment+1 ;novi segment
if segment=1 then ;za jedinice
znamenka=broj dig 0
portb=znamenka ;postavi donji nibl
high portb.7 ;"1" na PB7 uključuje segment jedinica
end if
if segment=2 then ;za desetice
znamenka=broj dig 2
portb=znamenka ;postavi donji nibl
high portb.6 ;"1" na PB6 uključuje segment desetica
end if
if segment=3 then ;za stotice
znamenka=broj dig 3
portb=znamenka ;postavi donji nibl
high portb.5 ;"1" na PB5 uključuje segment stotica
end if
if segment>3 then ;za tisučicice ili bilo što drugo
znamenka=broj dig 4
portb=znamenka ;postavi donji nibl
high portb.4 ;"1" na PB4 uključuje segment tisučica
segment =0 ;ispočetka
end if
return
Kod ispred nemožeš doslovno prepisati i ovisan je o programu koji koristiš. Navedeno je samo nekakav BASIC okvir za riješenje problema. Nadam se da če PIC korisnici dopuniti ovo s potrebnim djelovima koda (definiranje timer interupta ...). Interupt dio se umjesto s if..then da bolje riješiti matematikom i logikom ali trebao bi bolje poznavati korišteni BASIC.
- dejanmaksa
- Napredujem
- Posts: 159
- Joined: 28-10-2008, 22:15
- Location: Velika Plana
Re: Podprogram za PIC
Iskopao sam na netu jednu schemu sa PIS16F84A sa 7-seg pokazivacem u multiplex modu i lepo radi.(probao sam u proteusu.)
- Attachments
-
- TACHO_84(2).rar
- (27.93 KiB) Downloaded 153 times
- dejanmaksa
- Napredujem
- Posts: 159
- Joined: 28-10-2008, 22:15
- Location: Velika Plana
Re: Podprogram za PIC
Evo i ASM .
Code: Select all
LIST P=16C84,R=HEX
;
; TACHOMETER FOR R/C MODEL ENGINE
; SUN, PU-NENG
; MAY/02/2004
;
;
; VERSION 1.2: (09/12/2004) ;CALIBRATE ACCURACY
; VERSION 1.1: (MAY/02/2004)
; VERSION 1.0: (NOV/16/2002)
;
;
; DEFINE RAM
;----- SYSTEM ---------
__CONFIG H'3FF1'
TMR0 EQU 1 ;TIMER 0
PC EQU 2 ;PROGRAM COUNTER
STATUS EQU 3
FSR EQU 4 ;BUFFER OF INDIRECT ADDR
RA EQU 5
RB EQU 6
EEDATA EQU 8 ;EEPROM DATA
EEADR EQU 9 ;EEPROM ADDR
PCLATH EQU H'A'
INTCON EQU H'B' ;INTERRUPT CONTROL
OPTIONF EQU 1 ;0X81
TRISA EQU 5 ;0X85
TRISB EQU 6 ;0X86
EECON1 EQU 8 ;0X88 IS EEPROM CONTROL1
EECON2 EQU 9 ;0X89 IS EEPROM CONTROL2
;---- USER DEFINE ------
TCNT0 EQU H'C' ;= (0.6SEC /INT* PRESCAL*CLOCK)
INTR0 EQU H'D' ;AFTER INT, SAVE W VALUE
INTR1 EQU H'E' ;AFTER INT, SAVE STATUS
DD1 EQU H'F' ;DATA FOR INPUT RPM
DD2 EQU H'10'
DD3 EQU H'11'
DS1 EQU H'12' ;DTAT FOR DISPLAY
DS2 EQU H'13'
DS3 EQU H'14'
;
;
; DEINE VARIABLES
;
TMR EQU H'B5' ;(PRESCALE 64*1uS) * 75 = 4800 uS
TCNT EQU H'7D' ;(256-125),4.8mS*125=600mS
;
; DEFINE BIT
;
W EQU 0 ;d VALUE FOR INCF......
F EQU 1 ;d VALUE
OFF EQU 0 ;FLAG BIT 0,
RP0 EQU 5 ;STATUS BIT 5 & 6 =REGISTER BANK SELECT
RP1 EQU 6
INPUT EQU 7 ;RB7 AS INPUT PORT
TOIF EQU 2 ;INTCON TMR0 OVERLOW INT FLAG
TOIE EQU 5 ;INTCON TOIF ENABLE
GIE EQU 7 ;INTCON GLOBAL INT ENABLE
;
;
;========== MAIN PROGRAM =========
;
;
ORG 0
GOTO START
;
;----------------------------------------
;
ORG 4 ;INTERRUPT BEGIN
INTB MOVWF INTR0 ; SAVE W
MOVF STATUS,W ; SAVE STATUS
MOVWF INTR1
BCF STATUS,RP0 ; MAKE SURE SELECT BANK0
MOVLW TMR ; RESTORE TIMER0
MOVWF TMR0 ;
DECFSZ TCNT0,F ;SKIP IF ZERO
GOTO SWEEP
RELOAD MOVLW TCNT ;RELOAD TCNT0
MOVWF TCNT0
MOVF DD3,W ;MOVE COUNTER DATA TO DISPLAY
MOVWF DS3
MOVF DD2,W
MOVWF DS2
MOVF DD1,W
MOVWF DS1
CLRF DD1
CLRF DD2
CLRF DD3
;---------------------------------------------------
SWEEP MOVLW H'FF'
MOVWF RB ;OFF ALL DIGITALS
BTFSS RA,1 ;IS RA1 LIGHT ON?
GOTO RA1 ;IF YES GOTO RA1
BTFSS RA,2
GOTO RA2
RA3 BSF RA,3 ;RA,1 & 2 ARE OFF, MUST BE RA,3
BCF RA,2 ;NEXT TIME SHOULD BE RA,2
MOVF DS2,W
CALL TABLE ;HEX TO BCD CODE
GOTO DISP ;PISPLAY DS3
RA2 BSF RA,2
BCF RA,1 ;NEXT TIME SHOULD BE RA,1
MOVF DS1,W
CALL TABLE
GOTO DISP
RA1 BSF RA,1
BCF RA,3 ;NEXT TIME SHOULD BE RA,3
MOVF DS3,W
CALL TABLE
DISP MOVWF RB
;-------------------------------------
INTE MOVF INTR1,W ; RESTORE STATUS
MOVWF STATUS
MOVF INTR0,W ; RESTORE W
BCF INTCON,TOIF ; RESET FLAG OF INT T0
RETFIE
;
;
;-------------------------------------------------
;
TABLE ADDWF PC,F ; REMEBER PCH=00000B
RETLW H'C0' ; 0
RETLW H'F9' ; 1
RETLW H'A4' ; 2
RETLW H'B0' ; 3
RETLW H'99' ; 4
RETLW H'92' ; 5
RETLW H'82' ; 6
RETLW H'F8' ; 7
RETLW H'80' ; 8
RETLW H'90' ; 9
;
;
;=======================================
;---------- PROGRAM BEGIN -----------
;----------------------------------------
;
START BSF STATUS,RP0 ;SET 3,5 ENABLE BANK1
MOVLW H'80'
MOVWF TRISB ;SET PORTB 0-6 OUTPUT, 7 INPUT
MOVLW 0
MOVWF TRISA ;SET RA0-RA4 TO BE OUTPUT
MOVLW B'10000101'
MOVWF OPTIONF ;INTERNAT CLOCK,TRM0,1:64
BCF STATUS,RP0 ;ENABLE BANK0
MOVLW H'F7'
MOVWF RA ;RA,3=0, OTHERS=1
MOVLW H'7F'
MOVWF RB ;SET DISPLAY 000
CLRF DD1 ;DISPLAY DATA
CLRF DD2
CLRF DD3
MOVLW TMR ;75
MOVWF TMR0
MOVLW TCNT ;128
MOVWF TCNT0
BCF INTCON,TOIF
BSF INTCON,TOIE
BSF INTCON,GIE ;ENABLE INT
;----------
MOVLW 1
MOVWF DS1
MOVLW 2
MOVWF DS2
MOVLW 3
MOVWF DS3
;----------------------------------
MAIN1 BTFSC RB,7 ;IF INPUT=0, SKIP
GOTO MAIN1
MAIN2 BTFSS RB,7 ;IF INPUT=1, SKIP
GOTO MAIN2
MAIN3 INCF DD3,F
MOVLW H'0A'
SUBWF DD3,W
SKPZ ;DIGITAL 1 =A, MUST AJUST
GOTO MAIN1
CLRF DD3
INCF DD2,F
MOVLW H'0A'
SUBWF DD2,W
SKPZ ;DIGITAL 1 =A, MUST AJUST
GOTO MAIN1
CLRF DD2
INCF DD1,F ;DIGITAL 3 WILL NOT >9, SO NO CHECK
GOTO MAIN1
END
;==============================================
Re: Podprogram za PIC
@dejanmaksa hajde pogledaj PM, imas poruku vise od mesec dana koju nisi procitao
- dejanmaksa
- Napredujem
- Posts: 159
- Joined: 28-10-2008, 22:15
- Location: Velika Plana
Re: Podprogram za PIC
Nisam obracao paznju. Vazi za na dalje.