GIE bit nollas, varför?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

GIE bit nollas, varför?

Inlägg av Bola »

Hej!

Håller på och skriver en kod där interrupt sker med hjälp av timer 0. Får dock lite problem. När jag stegar igenom min kod så nollställs GIE biten när jag stegar över den första bsf instruktionen. Frågan är ju kort och gott varför?
Detta innebär ju att jag inte får några interrupt mer (dock är T0IE biten fortfarande 1:a och också flaggan T0IF blir också 1 när overflow sker som sig bör)

Kan det ha med programmiljön? (Mplab IDE v8.84)
Kan också tillägga att det är PIC16f690 och att jag bara simulerat det i MPLAB SIM än så länge

Kod: Markera allt

	#include p16f690.inc
	
	
    __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF) 

     cblock 0x20 
		PWM_Period
     endc 
          
 	 org 0 

main	call	init		;Initiering av PIC
		call 	init_timer0
		bsf		PORTB,5		;Ettställer RB6
		nop
		nop
		nop
		nop
		nop
		nop
end_lp 	goto 	end_lp


irq		nop
		bcf		INTCON,T0IF		;Nolla timer0 flagga
		
		movlw	b'11111110'		;Sätter timer0 räknare
		movwf	TMR0

		retfie	

init_timer0
		movlw	irq
		movwf	0x04

		banksel	OPTION_REG		
		movlw	b'00001000'		;Ställer intern klocka skala 1:256
		movwf	OPTION_REG

		banksel	INTCON
		bsf		INTCON,T0IE		;Sätter på interrupt från timer 0
		bsf		INTCON,GIE		; Sätter på interrupt globatl

		
		banksel	TMR0
		movlw	b'11111110'		;Sätter timer0 räknare
		movwf	TMR0

		bcf		INTCON,T0IF		;Nolla timer0 flagga
		
		return

init	
		banksel TRISB
		clrf	TRISB	;Gör alla B-portar till utgångar
		
		banksel OSCCON
		movf	OSCCON,W
		addwf	b'0111000',OSCCON	;Sätter 8Mhz klocka

		banksel	PORTB
		return
end
MrIzoard
Inlägg: 339
Blev medlem: 25 september 2011, 15:33:08
Ort: Göteborg

Re: GIE bit nollas, varför?

Inlägg av MrIzoard »

Hej Bola!

Jag vet inte om det är det, men du har ingen banksel innan du kör din bsf PORTB,5.
Du har en banksel PORTB i slutet av init men du borde ha den i slutet av din init_timer0

M.v.h.
Ulf L.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: GIE bit nollas, varför?

Inlägg av Swech »

Kod: Markera allt

      movlw   irq
      movwf   0x04
Vad är det du gör här?
Swech
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: GIE bit nollas, varför?

Inlägg av sodjan »

Kod: Markera allt

main   call   init          ;Initiering av PIC
      call    init_timer0
      banksel  portb        ; <<<===
      bsf      PORTB,5      ;Ettställer RB6  
      nop
> ;Ettställer RB6

Dels är det en onödig kommentar (den upprepar ju bara
instruktionen), dels är den felaktig och gör mer skada än nytta...
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Re: GIE bit nollas, varför?

Inlägg av Bola »

Det är väl kanske förvisso sant att det ser snyggare ut men å andra sidan så finns "banksel TMR0" i slutet av "init_timer0" och eftersom TMR0 ligger i samma bank som PORTB så borde väl rätt bank vara vald ändå?

Och vad egentligen har bankvalet att göra med GIE biten?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: GIE bit nollas, varför?

Inlägg av sodjan »

Nej, jag kollade i och för sig inte hela bank-logiken.
Det går lätt att göra i MPSIM, även av dig.
Hittar du det inte så kan jag kolla senare idag.

> så borde väl rätt bank vara vald ändå?

Kanske, kanske inte.
Använd BANKSEL så behöver du inte fundera på det.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: GIE bit nollas, varför?

Inlägg av sodjan »

En del annat...

Var ligger egentligen ISR'en ?
Den ska ligga på adress 4, men där verkar din BSF ligga !?
Det hela ser helkonstigt ut...
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Re: GIE bit nollas, varför?

Inlägg av Bola »

I första delen av init_timer0 ligger detta:
movlw irq
movwf 0x04
Här är tanken alltså att den skall lägga adressen till interrupt rutinen på adress 4. Men är det så att den skriver över värdet på adress 4 med "bsf PORTB,5"? Det ser ju onekligen ut så när jag tänker efter...
Ska kolla lite närmare på detta när jag kommer hem. Det känns som jag missat lite med adressen till interrupt rutinen och kanske är det också där det spökar lite (eller mycket).
Nerre
Inlägg: 27234
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: GIE bit nollas, varför?

Inlägg av Nerre »

Nu har jag inte så stor koll på PIC men det låter som om du gör helt fel.

Du ska normalt använda org för att lägga ett hopp till irq på adress 0x04. Se exemplet här
http://www.phanderson.com/PIC/16C84/int ... upt_1.html

(Det är visserligen inte samma PIC, men jag är rätt övertygad om att man gör på samma sätt i alla fall...)
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: GIE bit nollas, varför?

Inlägg av bearing »

Bola skrev:I första delen av init_timer0 ligger detta:
movlw irq
movwf 0x04
Här är tanken alltså att den skall lägga adressen till interrupt rutinen på adress 4. Men är det så att den skriver över värdet på adress 4 med "bsf PORTB,5"? Det ser ju onekligen ut så när jag tänker efter...
movwf 0x04 skriver till adress 4 i SRAM. Vid interrupt hoppar programpekaren till adress 4 i FLASH. SRAM är helt skiljt från FLASH. Data i FLASH kan inte skrivas över med en enkel instruktion.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: GIE bit nollas, varför?

Inlägg av sodjan »

> Här är tanken alltså att den skall...

Ja, som flera har sagt, den tanken är helt uppåt väggarna... :-)
Du behöver helt enkelt läsa på lite mer, specielt om "memory
architecture" (eller vad kapitlet nu kallades) i databladet.

Notera också att de exempelfiler (t.ex 16F690TMPO.ASM) som
följer med MPLAB ger en bra hint om hur det ska/kan se ut.
Skriv svar