interrupt ger upp.nu behövs nya ide och förslag tror jag

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Markus
Inlägg: 105
Blev medlem: 4 november 2005, 02:35:06
Kontakt:

ok, stopwatch

Inlägg av Markus »

Jag andvänder stop watch. men jag fattar inte hur jag andvänder detta verktyg. Jag sätter en breakpoint i slutet av subrutien init sedan en i början av interrupt subrutien isr_start_hog. Det är mellan dessa två brytpunkter vill jag mäta tiden för programmet att ta sig dit. Med andra ord kollar jag så att när huvudprogrammet börjar att köras dröjer det 50 ms innan subrutien kommer in i bilden. Hur simulerar och mäter jag detta med hjälpa av stop watch, hur gör jag. För om du går in i breakpoints menyn under debugger f12 så sätter den ett frågeteken på breakpoint i subrutinen på någon sludig anledning. Varför är min fråga. Och sedan hur mäter jag denna tid.



här kommer koden

list P=18F452
#include <P18F452.INC>

CONFIG OSC=HS ; Sätt in det som stämmer överens med din miljö !!
; CONFIG isrOSCS=OFF, PWRT=ON, BOR=OFF, WDT=OFF, LVP=OFF, DEBUG=OFF
CONFIG CP1=OFF, CP2=OFF, CP3=OFF, CPB=OFF, CPD=OFF
CONFIG WRT1=OFF, WRT2=OFF, WRT3=OFF, WRTB=OFF, WRTC=OFF, WRTD=OFF
CONFIG EBTR1=OFF, EBTR2=OFF, EBTR3=OFF, EBTRB=OFF

;******************************************************************************
;Variable definitions
; These variables are only needed if low priority interrupts are used.
; More variables may be needed to store other special function registers used
; in the interrupt routines.
;
;UDATA
;
;WREG_TEMP RES 1 ;variable in RAM for context saving
;STATUS_TEMP RES 1 ;variable in RAM for context saving
;BSR_TEMP RES 1 ;variable in RAM for context saving
;
; OVANSTÅENDE BEHÖVS INTE...
; **************Variabler***********************************************
UDATA
Rotation res 1
Input res 1

UDATA_ACS
;**************************Konstanter**************************************

; Definiera upp några konstanter

#define STOPPA_VARDE 1
#define RULLA_ENA_HALLET 2
#define RULLA_ANDRA_HALLET 4




;******************Reset_start*************************************************
;Reset and interrupt vectors

code h'0000'
goto Main


ISR_hog code h'8'
goto isr_start_hog

ISR_log code h'18'
goto isr_start_log


;**************************************************************************



;***************interrupt_låg****************************************************
isr_log_code code

isr_start_log
bcf INTCON3,INT1IF ;Clear INT1 external interrupt flag.

nop
nop
nop


retfie



;**************interrupt_hög**************************************************************
isr_hog_code code
isr_start_hog





nop
nop
nop
nop
nop
movlw h'0B'
movwf TMR0H
movlw h'DC'
movwf TMR0L

bcf INTCON,TMR0IF

retfie


;***************interrupt_konfig***********************************************
;här ställer jag in konfigruerar jag pic:en EX ställer in Out/in defineras och register ställs in.


;init_code code
init
;****************************Konfig portA*********************************************
movlw H'06'
movwf ADCON1
movlw B'11111111'
movwf TRISA ;Sätter PortB till ingångar bit 0-7
;****************************Generella Interrupts inställningar*************
bsf RCON,IPEN ;Enable priority levels on interrupts
bsf INTCON,PEIE ;Enables all unmasked peripheral interrupts
bsf INTCON,GIE ;Enable global interrupts.

;**************************Interrupt overflow*************************

bcf T0CON,T0CS
bcf T0CON,T08BIT
bsf T0CON,TMR0ON
bcf T0CON,PSA
bcf T0CON,T0PS2
bsf T0CON,T0PS1
bsf T0CON,T0PS0
clrf TMR0L
clrf TMR0H
movlw h'0B'
movwf TMR0H
movlw h'DC'
movwf TMR0L
bsf INTCON2,TMR0IP
bsf INTCON,TMR0IE





;********************************************************************




return
;*********************Main********************************************
; Start of main program



Main
call init
movlw STOPPA_VARDE ; Rotation = Stoppa_Värde
movwf Rotation


MAIN_LOOP
clrf PORTA
movf PORTA ; Input = PORTA & 0x03
andlw 0x03
movwf Input

; switch(Input)
CASE_1
btfss Input,0 ; Bit 0 satt?
goto CASE_2 ; Nix, hoppa vidare
movlw RULLA_ENA_HALLET ; Japp! Rotation = Rulla_Ena_Hållet
movwf Rotation
goto MAIN_LOOP ; break;

CASE_2
btfss Input,1 ; Bit 1 satt?
goto CASE_3 ; Nix, hoppa vidare
movlw RULLA_ANDRA_HALLET ; Japp!
movwf Rotation ; Rotation = Rulla_Andra_Hållet
goto MAIN_LOOP ; break;

CASE_3
btfss Input,2 ; Bit 2 & satt?
goto MAIN_LOOP ; Nix, hoppa vidare
movlw STOPPA_VARDE ; Japp! Rotation = Stoppa_Värde
movwf Rotation
goto MAIN_LOOP





;******************************************************************************
;End of program

END
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

För att mäta tiden mellan två breakpoints (BP) :

1. Kör till BP 1.
2. Nollställ stoppuret.
3. Kör till BP 2.
4. Läs av stoppuret.

Simple as that....

Naturligtvis måste du sätta rätt hastighet i MPSIM så att stoppuret visar "rätt" tid
i sekunder. Antal instruktions cykler kommer dock att vara rätt i alla fall...

Notera även att du bara kan sätta BP's på rader som har en riktig instruktion, inte label, direktiv eller något annat.
Det brukar bli ett frågetecken om man är på en ogiltig rad...

> För det är precis vad dom inte blir. trm0h blir FF inte 0F sedan blir TRM0L 00 inte 0F...

Som jag sa tidigare, detta besvaradas i ett tidigare inlägg. Så här skrev (helt korrekt) Chribbe76 :

> Med den pic du använder så ska den höga byten lagras i TMR0H först
> (värdet lagras inte i själva räknaren utan bara i registret TMR0H)
> Sen lagrar du låga byten i TMR0L (då uppdateras låg och hög samtidigt)

Så du ser ingen ändring i "Watch" förren *efter* skrivningen till TMR0L.

Samma sak står i databladet (så klart).

Det betyder ochså att om du sätta TMR0 till h'0000', så går det inte med :

> clrf TMR0L
> clrf TMR0H

utan det måste vara :

> clrf TMR0H
> clrf TMR0L

Chribbe76> "En sak som jag stör mig på är att den inte uppdaterar
register-innehåll när man kör programmet (eller har jag missat något)."

Inte när du kör "Run", men när du kör med "Animate". Kör du "Run" så
uppdateras Watch vid nästa BP. Eller hur menar du ? Det skulle slöa ner
processeringen betydligt om Watch skulle uppdateras hela tiden...
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Animate är bra för korta program-förlopp men har man mycket kod så kan man inte få den att köra tillräckligt snabbt (man vill ju inte simulera hela dan).

Men nu ser jag att det går att ställa in hur ofta den ska uppdatera när man kör "RUN", även om jag ställer in den på kortaste tid så rusar simuleringen väldigt snabbt (tack sodjan även om du inte direkt hjälpte mig).
Nu vill jag ha möjlighet att ställa in hur snabbt det går när man kör "RUN" för den är lite väl snabb i vissa fall (man får väl lägga in tillfälliga delayer när man simulerar eller skaffa slöare dator :lol: ).
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Run *ska* köra så snabbt som din PC klarar av !
Bättre ju snabbare det går. Jag förstår inte varför vill du slöa ner det !?

Om du vill veta vad som har hänt på vissa ställen i koden
så är det breakpoints du ska använda. Mellan breakpoints
vill man att det skall gå så snabbt söm möjligt, så klart.

Varför skulle man inte vilja komma fram så snabbt som möjligt
till nästa breakpoint ?
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Ibland vill man köra run i ett visst tempo och samtidigt titta på register och portar så att man får en visuell uppfattning av "realtidsförloppet".
Med breakpoints så brakar det ju bara till så är man framme.

Det är inte ofta jag vill göra så men det händer.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Ibland vill man köra run i ett visst tempo och samtidigt titta på register
> och portar så att man får en visuell uppfattning av "realtidsförloppet".

Helt OK. Och i MPLAB kallas det "Animate"... :-)

Du kan ju köra Animate så snabbt att du inte hinner med
att kolla register, så jag ser faktiskt inte riktigt problemet.
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Nu kanske man inte är intresserad av den lägsta nivån(vilket animate är bra till) utan snarare vill se ett förlopp som är 10000 cycler.
Då är animate för långsam och run för snabb för att man ska kunna uppfatta vad som händer.
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Inlägg av arvidb »

Conditional breakpoints? D.v.s. break if register det-eller-det är lika med det-eller-det värdet.

Finns i många IDE:er, men jag har inte använt den som ni pratar om så vet inte om det finns där.

Arvid
Skriv svar