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
WEND

wie heeft er een oplossing?

Op 12 maart 2009 19:23:09 schreef BigDoom:

DIM stepwaarde AS BYTE

[...]

stepwaarde = -1

Daar gaat het fout. Bytes zijn unsigned.

wat zou het dan moeten worden?
word - dword?

sorry voor mn misschien niet zo slimme vraag

dword: die kan ook - aan ;)
word kan alleen + aan :(

Zag ik ff gauw in de help van proton ;)

[Bericht gewijzigd door Fredjuhh op (29%)]

heb stepwaarde dword assigned maar het wil nog steeds niet werken

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
WEND

als 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%)]

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 main

Het 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).

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.