Shock Media

Navigatie

rgb interrupt led blijft aan?

Forum > Software & Interfacing > rgb interrupt led blijft aan?
Naam Bericht
crazyhellos

Goededag mensen,

Ik heb een stukje software geschreven voor mijn 16f628a waarin in ik case gebruik en interrupt zodat het programma later groter kan worden, maar eerst moet de basis goed zijn.

De software werkt inprinciepe goed, maar het vreemde is dat de pic start met de groene led aan te zetten terwijl volgens mij door de case else dit vol alle kleuren aan zou moeten zijn. Tijden het circuleren in de kleuren blijft de groen led ook meebranden. Er is dus iets fout maar wat weet ik nog niet. Nu wou ik weten of jullie iets vinden wat verkeerd is wat ik dus als redelijke leek over het hoofd zie. Hiernaast werkt de ontdender ook nog niet goed, maar daar heb ik me nog niet in verdiept, dus eventuele ideeen daarover zijn ook welkom.

Ik gebruik een rgb fluxled met common + en op de interrupts heb ik een 4k7 naar de plus zitten. Ik heb ook al gekeken of het verschil maakte of ik de groene led op een andere picpoort zet, maar dit verhelpt niet het probleem.

Hier de code, de tabs kunen misschien vreemd zijn maar in mijn programma zijn ze goed.

code:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 17-8-2008                                         *
'*  Version : 1.0                                               *
'*  Notes   : Hoe hoger de waarde hoe minder licht er vrij komt *
'*          : Voor rgbled met common +                          *
'****************************************************************
Device 16F628A                ;Gebruik een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

;Variabele declareren
Dim Dutyblauw As Byte           ;'Duty' is de variabele die de snelheid v.d. motor bepaalt
Dim Dutyrood  As Byte           ;'Duty' is de variabele die de snelheid v.d. motor bepaalt
Dim Dutygroen As Byte           ;'Duty' is de variabele die de snelheid v.d. motor bepaalt
Dim teller    As Byte           ;Teller voor het bijhouden van de kleur selectie
Dim ontdender As Byte           ;Aantalloops dat overblijft na controle van ontdenderloops

;Poorten variabelen
Symbol blauw = PORTA.0 
Symbol rood  = PORTA.7 
Symbol groen = PORTA.2 
Symbol Ontdenderloops = 10				;Aantal keren dat de loop doorlopen 
					        			;moet worden voor interrupts weer 
										;enabled worden

PORTB_PULLUPS On              

Clear                                   ;Wis alle RAM geheugen
teller = 1
DelayMS 2000
PORTA = %11111111             			;Alle niveaus hoog

ON_INTERRUPT GoTo Interrupt_Handler
 
;Soorten interrupten en flags die benaming krijgen  
Symbol RBIF = INTCON.0 ' RB Port Interrupt Flag
Symbol INTF = INTCON.1 ' RB0 External Interrupt Flag
Symbol T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
Symbol RBIE = INTCON.3 ' RB Port Change Interrupt Enable
Symbol INTE = INTCON.4 ' RB0 External Interrupt Enable
Symbol T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
Symbol PEIE = INTCON.6 ' Peripheral Interrupt Enable
Symbol GIE = INTCON.7  ' Global Interrupt Enable

;Waarden van de interrupten en flags
RBIF = 0
INTF = 0
T0IF = 0
RBIE = 1
INTE = 0
T0IE = 0
PEIE = 0
GIE = 1

GoTo hoofdprogramma


'Interrupt routine start 
Interrupt_Handler:
   Context SAVE	   		  	   			  ;Alle geheugen opslaan
   If PORTB.5 = 0 Then
      Inc teller                   		  ;Teller verhogen
      RBIE = 0							  ;Interrupt uitzetten
	  ontdender = Ontdenderloops 		  ;Ontdender instellen
   ElseIf PORTB.6 = 0 Then
      Dec teller	  	  	  			  ;Teller verlagen
	  RBIE = 0							  ;Interrupt uitzetten
	  ontdender = Ontdenderloops		  ;Ontdender instellen
   EndIf
	  
      RBIF = 0	  						  ;Interruptflag legen
	  
   While RBIF = 1						  ;Zolang interruptflag nog de
         RBIF = 0						  ;waarde een heeft hier blijven
   Wend	 	  							  ;tot deze echt leeg is

   
Context Restore

;Hoofdprogramma
hoofdprogramma:

If teller > 3 Then						  ;Als de waarde hoger is dan 4 van
   teller = 0 							  ;teller deze toch weer 4 maken
ElseIf teller < 1 Then					  ;Als de waarde lager is dan 1 van
   teller = 1   	 					  ;teller deze toch weer 1 maken
EndIf

While 1 = 1

PWM blauw, Dutyblauw, 1
PWM rood, Dutyrood, 1
PWM groen, Dutygroen, 1

;Selectie van de kleurduty's
Telleruitlezen:

Select teller
Case 1                          ;blauw
    Dutyblauw = 0
    Dutyrood  = 255
    Dutyblauw = 255
Case 2
    Dutyblauw = 255             ;rood
    Dutyrood  = 0
    Dutyblauw = 255
Case 3
    Dutyblauw = 255             ;groen
    Dutyrood  = 255
    Dutyblauw = 0
Case Else 
    Dutyblauw = 0               ;alles aan
    Dutyrood  = 0
    Dutyblauw = 0    
EndSelect

If ontdender > 1 Then				      ;Als ontdender nog geen 1 is dan
		Dec ontdender					  ;min 1 
	ElseIf ontdender = 1 Then			  ;Als ontdender 1 is dan de 
		RBIF = 0		 				  ;interruptflag 0 maken en de 
		RBIE = 1		   				  ;interrupt weer inschakelen
	EndIf
    
Wend

GoTo hoofdprogramma
End


Ik ben niet ver gevorderd in programmeren, maar probeer te leren. Als er dus domme fouten in zitten niet te hard reageren
klein is fijn
Moderator

Ik zou 1 van de 2 'dutyblauw' in iedere case veranderen in 'dutygroen'.
kif is in weer terug uit Japan. Lees meer op http://www.kleinisfijn.nl/?page=japan
crazyhellos

quote:
Op 19 augustus 2008 00:04:03 schreef klein is fijn:
Ik zou 1 van de 2 'dutyblauw' in iedere case veranderen in 'dutygroen'.


Echt een hele domme fout van me, toppie voor het erop wijzen. Kan ik weer verder met het project
Zoeken in topic