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


