Mijn bedoeling is om een getal te generen, en dan vervolgens te faden van het vorige getal naar het nieuwe getal. (code hier onder) maar het probleem is dat mn ledje alleen maar 'omhoog' fade en niet naar beneden fade wanneer het nieuwe getal kleiner is dan het oude.
kom er niet uit weet iemand een oplossing of ziet wat ik verkeerd doe.
ben nog maar net bezig met pictjes.
DEVICE 16F628A ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
;Logische constanten
SYMBOL OFF = 0 ;UIT
SYMBOL ON = 1 ;AAN
;variabele declareren
DIM Dutyrandom AS WORD
DIM stepwaarde AS BYTE
DIM Dutyprevious AS BYTE
DIM Duty AS BYTE
Dutyprevious = 0
;Poortnamen
SYMBOL LED1 = PORTA.0 ;Poort waar de pulsjes voor de led uitkomt
; 76543210
PORTA = %00000100 ;Maak alle poorten van PORTA laag behalve PORTA.2
TRISA = %11111110 ;PORTA.0 is uitgang voor de LED1
PORTB_PULLUPS ON ;On-chip pull-up weerstanden actief (voor de toetsen)
CLEAR ;Wis alle RAM geheugen
WHILE 1 = 1 ;Oneindige lus
Dutyrandom = RANDOM ;Genereer een willekeurig getal en zet het in dutyrandom
IF Dutyrandom >= Dutyprevious THEN ; is getal groter dan de vorige
stepwaarde = 1 ;step waarde +1
ELSEIF Dutyrandom <= Dutyprevious THEN ;is getal kleiner dan de vorige
stepwaarde = -1 ;step waard -1
ENDIF
FOR Duty = Dutyprevious TO Dutyrandom STEP stepwaarde ; van vorige naar nieuwe waarde met de bijbehoorende stepwaarde
PWM PORTA.0, Duty, 1 ;zet pwm op porta.0
NEXT
Dutyprevious = Dutyrandom ;zet het nieuwe getal op de plaats van het oude
WENDwie heeft er een oplossing?
klein is fijn
Moderator
Op 12 maart 2009 19:23:09 schreef BigDoom:
DIM stepwaarde AS BYTE [...] stepwaarde = -1
Daar gaat het fout. Bytes zijn unsigned.
Fredjuhh
"Ben nog een N00B, maar dat is al aan het veranderen ;)
dword: die kan ook - aan 
word kan alleen + aan 
Zag ik ff gauw in de help van proton 
[Bericht gewijzigd door Fredjuhh op (29%)]
Gerwin
An amplifier is just a modulator for a power supply |Toffe Gebruiker
Op 12 maart 2009 19:23:09 schreef BigDoom:
wie heeft er een oplossing?
Mischien een beetje ranzig maar:
WHILE 1 = 1 ;Oneindige lus
Dutyrandom = RANDOM ;Genereer een willekeurig getal en zet het in dutyrandom
IF Dutyrandom >= Dutyprevious THEN ; is getal groter dan de vorige
stepwaarde = 1 ;step waarde +1
ELSEIF Dutyrandom <= Dutyprevious THEN ;is getal kleiner dan de vorige
stepwaarde = 2 ;step waard 2
ENDIF
if stepwaarde = 1 then
FOR Duty = Dutyprevious TO Dutyrandom STEP
1 ; van vorige naar nieuwe waarde met de bijbehoorende stepwaarde
PWM PORTA.0, Duty, 1 ;zet pwm op porta.0
NEXT
elseif stepwaarde = 2 then
FOR Duty = Dutyprevious TO Dutyrandom STEP
1 ; van vorige naar nieuwe waarde met de bijbehoorende stepwaarde
PWM PORTA.0, Duty, 1 ;zet pwm op porta.0
NEXT
endif
Dutyprevious = Dutyrandom ;zet het nieuwe getal op de plaats van het oude
WEND
kost wat meer code maar het werkt denk ik wel
k geloof dat er een vloek op rust ofzo want wil nog steeds niet werken.
het ledje blijft alleen omhoog faden en niet naar beneden
/edit
heb even dit geprobeerd:
stepwaarde = -1
;Poortnamen
SYMBOL LED1 = PORTA.0 ;Poort waar de pulsjes voor de led uitkomt
; 76543210
PORTA = %00000100 ;Maak alle poorten van PORTA laag behalve PORTA.2
TRISA = %11111110 ;PORTA.0 is uitgang voor de LED1
PORTB_PULLUPS ON ;On-chip pull-up weerstanden actief (voor de toetsen)
CLEAR ;Wis alle RAM geheugen
WHILE 1 = 1 ;Oneindige lus
FOR Duty = 255 TO 0 STEP stepwaarde ; van vorige naar nieuwe waarde met de bijbehoorende stepwaarde
PWM PORTA.0, Duty, 1 ;zet pwm op porta.0
NEXT
WENDals ik dit inlaad dan doet de pic helemaal niets. het lijkt erop dat de stepwaarde niet goed word gelezen ofzo
[Bericht gewijzigd door BigDoom op (75%)]
klein is fijn
Moderator
Ik zit toevallig al een tijdje met hetzelfde te prutsen, en ik heb het zo opgelost:
Dim Red_old as Byte, Red_new as Byte
Dim R_fade_up as Bit
Red_old = Red ' save old
Red_new = Rnd(256) ' pick new
Reset R_fade_up
If Red_new > Red_old Then Set R_fade_up ' 0 = down, 1 = up
While Red_new <> Red_old
If R_fade_up = 1 Then
Incr Red_old
Else
Decr Red_old
End If
pwm_red = red_old ' write to pwm register
Waitms 10
Wend
Goto mainHet is dan wel Bascom ipv PICbasic, maar het principe is universeel.
k heb het naar basic omgezet:
DEVICE 16F628A ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
;Logische constanten
SYMBOL OFF = 0 ;UIT
SYMBOL ON = 1 ;AAN
;variabele declareren
DIM Dutynieuw AS WORD
DIM Dutyoud AS BYTE
Dutyoud = 0
;Poortnamen
SYMBOL LED1 = PORTA.0 ;Poort waar de pulsjes voor de led uitkomt
; 76543210
PORTA = %00000100 ;Maak alle poorten van PORTA laag behalve PORTA.2
TRISA = %11111110 ;PORTA.0 is uitgang voor de LED1
PORTB_PULLUPS ON ;On-chip pull-up weerstanden actief (voor de toetsen)
CLEAR ;Wis alle RAM geheugen
WHILE 1 = 1 ;Oneindige lus
Dutynieuw = RANDOM
IF Dutynieuw >= Dutyoud THEN
WHILE Dutynieuw <> Dutyoud
INC Dutyoud
PWM PORTA.0, Dutyoud, 1
WEND
ELSE
WHILE Dutynieuw <> Dutyoud
DEC Dutyoud
PWM PORTA.0, Dutyoud, 1
WEND
ENDIF
Dutyoud = Dutynieuw
WEND
meer het werkt nig steeds niet
k word er gek van
Misschien vind je deze routine handig.
Hij zorgt ervoor dat het fade voor alle 3 de kleuren op het zelfde moment klaar is.
Als je normaal R=20, B=30, G=40 zou doen dan zal rood het eerst klaar zijn en groen het laatste.
Tevens kun je het aantal stappen meegeven tussen de 2 te faden punten en de delay per stap.
Is wel in Bascom gechreven.
Gebruik:
Call Redim R , G , B , Stap , Delay
Blauw Alias Compare2
Groen Alias Pwm1a
Rood Alias Pwm1b
Sub Redim(newrood As Byte , Newgroen As Byte , Newblauw As Byte , Stappen As Byte , Stapdelay As Byte)
Local Staprood As Single , Stapgroen As Single , Stapblauw As Single
Local Roodw As Single , Blauww As Single , Groenw As Single
Local Temps As Single , Tempint As Integer
Roodw = Rood : Groenw = Groen : Blauww = Blauw
Temps = Newrood - Rood
Staprood = Temps / Stappen
Temps = Newgroen - Groen
Stapgroen = Temps / Stappen
Temps = Newblauw - Blauw
Stapblauw = Temps / Stappen
Do
Roodw = Roodw + Staprood
Groenw = Groenw + Stapgroen
Blauww = Blauww + Stapblauw
Tempint = Round(roodw)
Rood = Tempint
Tempint = Round(blauww)
Blauw = Tempint
Tempint = Round(groenw)
Groen = Tempint
Waitms Stapdelay
Decr Stappen
Loop Until Stappen = 0
End Sub
Op 13 maart 2009 10:59:51 schreef BigDoom:
meer het werkt nig steeds niet
k word er gek van
RTFM, je doet iets wat niet logisch is:
Als je de beginwaarde kleiner is dan je eindwaarde waarom zou een stapwaarde dan negatief zijn?
Stepval - is an optional constant or variable by which the variable increases or decreases with each trip through the for...next loop. If startcount is larger than endcount, then a minus sign must precede stepval.
Anders dus niet!
Er staan meer fouten in je code, assingment die je niet gebruikt, verkeerde tris (overbodig voor pwm btw).
Fredjuhh
"Ben nog een N00B, maar dat is al aan het veranderen ;)
aha, dus die step moet je weglaten, en dan naar een nieuwe functie gaan b.v. eerst een goto, en daar dan de telling doen
Dan zou het wel werken 
Ben ook nog maar een beginneling 
Als je zowel een positieve als negatieve step hebt moet je van te voren daarop testen met een if then else structuur.
@de INC/DEC variatie: Als je van een WORD variabele ineens een BYTE maakt dan wordt die maximaal 255... Logisch dat dit niet lekker werkt.