Hallo allemaal.
Ik zit met het volgende probleem:
Ik wil graag een softwarematige interruptroutine in assembler maken voor de pic16f870. Deze moet ik in mijn programma kunnen starten (dus niet op een ingang) en moet ik ook weer in het programma uit kunnen zetten. De interrupt moet om de 12,5ms gegenereerd worden.
Ik heb alle waarden die ik voor deze tijd moet invullen al berekend (prescaler en standaard waarde van timer0)
Ik heb een klein testprogrammatje gemaakt die ik in PIC simulator probeer te testen. Timer 0 begint wel te lopen, maar doet dit maar 1 keer. Ook springt mijn programma niet naar de interrupt routine. Ik weet zeker dat ik iets fout doe, of vergeet. Ik weet alleen niet wat. Van de datasheet(s) wordt ik ook niet veel wijzer.
Dit is het programma dat ik nu heb (20Mhz klok):
ORG 00h ; Start programma
CLRF PORTB ; Clear Poort B
BSF STATUS,RP0 ; Selecteer bank 1
MOVLW B'00000000' ; PortB = output
MOVWF TRISB ;
MOVLW B'11000000' ; Configureer timer0 13ms
MOVWF OPTION_REG ;
BCF STATUS,RP0 ; Selecteer bank 0
BSF INTCON, T0IE ; Enable TMR0 interrupt
BSF INTCON, GIE ; Enable all interrupts
LOOP BCF PORTB,0
GOTO LOOP
END
ORG 0004h
BSF PORTB,0 ; maak B0 hoog (test)
RETFIE
Joszs
Eindelijk mijn site doet het http://home.concepts.nl/~pc106181/Jos/Index.html
Het is een envoudig foutje als we even de adderessen er bij zetten
ORG 00h ; Start programma dus de eerstvolgende programma regel begint op 00h
00h CLRF PORTB ; Clear Poort B
01h BSF STATUS,RP0 ; Selecteer bank 1
02h MOVLW B'00000000' ; PortB = output
03h MOVWF TRISB ;
04h!!MOVLW B'11000000' ; Configureer timer0 13ms
05h!!MOVWF OPTION_REG ;
05h BCF STATUS,RP0 ; Selecteer bank 0
07h BSF INTCON, T0IE ; Enable TMR0 interrupt
08h BSF INTCON, GIE ; Enable all interrupts
09h LOOP BCF PORTB,0
0Ah GOTO LOOP
END
ORG 0004h ;dus de eerst volgende prog regel wordt over 04h geschreven en hier gaat het dus fout
04h!!BSF PORTB,0 ; maak B0 hoog (test)
05h!!RETFIE
je kunt beter een programma beginnen met
Org 00h
Goto _main
Org 04h
goto _ISR
Org 08h
_main ;begin programma
_ISR ;interupt service routine
zo gebruik je iets meer geheugen(6 platsen) en prosessor tijd(4 instructie cycles Goto neemt er 2 in beslag) maar je kunt altijd nog moeilijk gaan doen als je daarmee in de knoop raakt
Overegens nog een dingetje je zou haast niet merken dat portB,0 geset wordt want hij wordt gelijk weer op nul gezet door de hooft lus
Al wil je hem om de 12,5ms laten knipperen(block spanning opwekken ) kun je beter de XOR-functie gebruiken
Bedankt voor je reactie Joszs.
Is eigenlijk wel logisch wat je zegt. Ik ga het meteen proberen!
btw: Die uitgang die ik nu gebruik is slechts een testuitgang die in de simulator wel goed waarneembaar is.
Ik heb de interrupt tijd van 12,5ms strax nodig als acceleratie-interval voor en motor.
k.p.meinesz
Een schizofreen is nooit alleen!
Op 18 mei 2004 15:58:28 schreef Joszs:
Het is een envoudig foutje als we even de adderessen er bij zettenORG 00h ; Start programma dus de eerstvolgende programma regel begint op 00h
00h CLRF PORTB ; Clear Poort B
01h BSF STATUS,RP0 ; Selecteer bank 1
02h MOVLW B'00000000' ; PortB = output
03h MOVWF TRISB ;
04h!!MOVLW B'11000000' ; Configureer timer0 13ms
05h!!MOVWF OPTION_REG ;
05h BCF STATUS,RP0 ; Selecteer bank 007h BSF INTCON, T0IE ; Enable TMR0 interrupt
08h BSF INTCON, GIE ; Enable all interrupts09h LOOP BCF PORTB,0
0Ah GOTO LOOPEND
ORG 0004h ;dus de eerst volgende prog regel wordt over 04h geschreven en hier gaat het dus fout
04h!!BSF PORTB,0 ; maak B0 hoog (test)
05h!!RETFIEje kunt beter een programma beginnen met
Org 00h
Goto _main
Org 04h
goto _ISR
Org 08h
_main ;begin programma
_ISR ;interupt service routine
zo gebruik je iets meer geheugen(6 platsen) en prosessor tijd(4 instructie cycles Goto neemt er 2 in beslag) maar je kunt altijd nog moeilijk gaan doen als je daarmee in de knoop raaktOveregens nog een dingetje je zou haast niet merken dat portB,0 geset wordt want hij wordt gelijk weer op nul gezet door de hooft lus
Al wil je hem om de 12,5ms laten knipperen(block spanning opwekken ) kun je beter de XOR-functie gebruiken
je hebt gelijk wat betreft de fout maar niet kwa geheugen gebruik
01h bsf
02h status,3
03h movlw
04h b´00000000´
zo tel je geheugen plaatsen
Op 18 mei 2004 16:56:47 schreef k.p.meinesz:
[...]
je hebt gelijk wat betreft de fout maar niet kwa geheugen gebruik
01h bsf
02h status,3
03h movlw
04h b´00000000´
zo tel je geheugen plaatsen
het is een beetje muggenziften, maar volgens mij heeft joszs toch gelijk. Als ik bij MPLAB bij program memory kjik, zie ik daar het volgende staan:
line address opcode disasembly
1 0000 019F CLRF 0x1F
hier staat dus dat hij zowel de instructie als de register plaats/destination bit etc. als 1 addres telt
Joszs
Eindelijk mijn site doet het http://home.concepts.nl/~pc106181/Jos/Index.html
Op 18 mei 2004 16:56:47 schreef k.p.meinesz:
[...]
je hebt gelijk wat betreft de fout maar niet kwa geheugen gebruik
01h bsf
02h status,3
03h movlw
04h b´00000000´
zo tel je geheugen plaatsen
bij de pic16* bestaat iedere programma geheugen plaats uit een 14-bits
woord en er zijn totaal 35 instructies dus genoeg ruimte in die 14-bits om nog allerlij andere data in op te slaan
dus iedere instructie gebruikt bij de pic16* een programmageheugen plaats (lekker makkelijk 
een oud topic maar wat nieuw leven ingeblazen:
Hersenkrakertje!
Ik heb hetvolgende probleem: ik krijg mijn interrupt routine op de PIC16F870 NIET werkend. Bij simulatie in MPLAB doet hij het wel maar de processor zelf doet het niet!
Hier is mijn code en die werkt dus in de simulator:
LIST P=16F870
TMR0 EQU 0x01
RA EQU 0x05
RB EQU 0x06
STATUS EQU 0x03
OPTREG EQU 0x81
ADCON1 EQU 0x9F
INTCON EQU 0x0B
RUN EQU 0x21
ORG 0x0000
GOTO main
ORG 0x0004
GOTO INT
ORG 0x0008
main BSF STATUS,5
BCF STATUS,6
MOVLW b'00000111' ;RA-> digital geen AD
MOVWF ADCON1
MOVLW 0
MOVWF 0x85 ;alle RA output
MOVWF 0x86 ; alle RB output
BCF STATUS,5 ; terug bank o
CLRF TMR0
CLRF INTCON
BSF STATUS,5
MOVLW b'11000011'
MOVWF OPTREG
BCF STATUS,5
BSF INTCON,5
BSF INTCON,7
CLRF RUN
loop BSF RA,1
nop
BCF RA,1
nop
GOTO loop
INT BTFSS INTCON,2
GOTO INTX
MOVF RUN,0
XORLW 0x01
MOVWF RUN
MOVWF RB
INTX BCF INTCON,2
RETFIE
END
Dus op RA zit een leuke blokgolf; dit werkt (ik gebruikte heel veel de 16F84 en daar gaat alles makkelijker omdat je geen rekening hoeft te houden met al die extra functies die je dus moet disablen vandaar dat ik dit ook even test). Maar op RB moet ik er ook een hebben, welliswaar een veel lagere in frequentie, maar toch en RB blijft constant laag.
Help!
logic
Maar dat is logisch ...
Is het dit misschien ?
INT BTFSS INTCON,2
+--<- GOTO INTX
| MOVF RUN,0 ; dit gedeelte
| XORLW 0x01 ; wordt
| MOVWF RUN ; volledig
| MOVWF RB ; overgeslagen
+---> INTX BCF INTCON,2
RETFIEJe zegt in het begin van je code: CLRF INTCON.
Alle INTCON-bits worden dan "0".
Daarna worden INTCON-bits 5 en 7 geset, maar bit 2 blijft "0".
De 1e opdracht in je ISR is dus niet waar: INTCON-bit 2 is niet geset. De skip vindt niet plaats, en "GOTO INTX" wordt uitgevoerd.
Dan wordt INTCON-bit 2 gecleared (terwijl die al "0" is, dus dat heeft geen effect)
Punt is: INTCON-bit 2 wordt nooit "1".
Ik denk dat je dit moet hebben:
INT BTFSC INTCON,2 ; if bit is clear
GOTO CLEAR_THE_BIT ; if bit is set ...
MOVF RUN,0 ; voer
XORLW 0x01 ; de
MOVWF RUN ; code
MOVWF RB ; uit
BSF INTCON,2 ; and set bit
RETFIE
CLEAR_THE_BIT BCF INTCON,2 ; ... clear it again
RETFIE[Bericht gewijzigd door logic op ]
Hoi Logic,
neen dat is het niet. Het werkt immers in de simulatie goed.
Ik clear de INTCON registers en zet later de 5 (TMR0) en de 7 aan (GIE). Die INTCON,2 is de flag die gezet wordt als de TMR0 overloopt (dus door de PIC zelf). Vandaar dat ik test in de interrupt op die vlag want anders kan het door een andere interrupt zijn dat ik in de subroutine terechtkom. Is inderdaad die INTCON 2 gezet dan mag hij gecleared worden tegen volgende interrupt en voert hij de interrupt code uit. Is INTCON 2 NIET de oorzaak dat ik in de INT routine terechtkom dan wil ik er ook gelijk weer uit (INTX).
Wel heel bedankt voor het meedenken.
logic
Maar dat is logisch ...
Je lijkt inderdaad gelijk te hebben.
Maar waarom werkt 't dan in de simulatie wel en in 't echt niet?
Laat 't me weten als je zelf de oplossing mocht vinden.
Ben ik wel benieuwd naar.
vraag ook gemaild naar support.microchip.com. Ook zij vinden de code OK en snappen het niet.
Ook nog gemaild naar een professionele PIC programmeur maar nog geen antwoord ontvangen.
Blijft dus een doordenkertje...
En ja, als ik het vind of iemand laat mij weten wat er fout is zal ik het zeker posten.