pic multithreading

Misschien nog eens naar mijn voorbeeld kijken |:( :(

Volgend project: funcgen met ad9833 afmaken...

Dat had ik ook wel gezien, maar dat is zo'n data array. Maar hoe kan je er daar meer van doen? Dus met elk een andere naam

OK, array probleem is nu opgelost. Maar ik zit nu met een laatste probleem om te zorgen dat ik niet per aan of uit met 15 verschillende cases het poortnummer moet definiëren had ik het zo bedacht:

code:


FOR a = 0 TO x
IF 0 = nu[a] THEN
SELECT a
CASE 0 TO 6: LOW PORTA.a
CASE 7 TO 15: LOW PORTB.a
END SELECT
END IF

Waarbij alle variabele's byte's zijn.
Maar dat vind mijn compiler niet leuk...
Hoe moet ik dit doen?

NEXT er nog bij.

En wat jij zoekt moet je even hier lezen:
www.picbasic.nl/beginners10a.htm#CLEARBIT

(Ook SETBIT en LOADBIT even lezen.)

Ohm sweet Ohm | www.picbasic.nl

Dank!
ik heb nu alles het is alleen 47 regels. Ziet iemand nog een fout?

code:


DEVICE 16F628A
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE
DIM x AS BYTE
DIM a AS BYTE
DIM b AS BYTE
DIM rega AS BYTE
DIM regb ad BYTE
DIM d AS BYTE
DIM uo[3] AS BYTE
DIM ko[3] AS BYTE
DIM nu[3] AS BYTE
x = 2
uit:
DATA 20, 10, 10
klaar:
DATA 30, 10, 20
RESTORE uit
FOR d = 0 TO x
READ uo[d]
SETBIT rega, d
NEXT d
RESTORE klaar
FOR d = 0 TO x
READ ko[d]
SETBIT regb, d
NEXT d
begin:
FOR a = 0 TO x
IF 0 = nu[a] THEN
SELECT a
CASE 0 TO 6: CLEARBIT rega, a
CASE 7 TO 15: CLEARBIT regb, a
END SELECT
END IF
IF uo[a] = nu[a] THEN
SELECT a
CASE 0 TO 6: SETBIT rega, a
CASE 7 TO 15: SETBIT regb, a
END SELECT
END IF
IF ko[a] = nu[a] THEN nu[a] = -1
NEXT a
FOR b = 0 TO x
nu[b] = nu[b] + 1
NEXT b
PORTA = rega
PORTB = regb
DELAYMS 100
GOTO begin

Typo:

code:

DIM regb ad BYTE

Bedoel je toevallig:

code:


CASE 0 TO  7: CLEARBIT rega, a
CASE 8 TO 15: CLEARBIT regb, a - 8

Dus niet 0..6 maar 0..7.
En in de case 8 to 15 moet je met 8 corrigeren.

Idem bij SetBit.

Volgend project: funcgen met ad9833 afmaken...

Ik heb het programma aangepast en in mn pic gezet en er gebeurt .... niets
Hoe kan dit dit is de code:

code:


DEVICE 16F628A  ;device 16f628a
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF    ;config
ALL_DIGITAL TRUE    ;alles digitaal
DIM x AS BYTE   ;variabeles declareren
DIM a AS BYTE
DIM b AS BYTE
DIM rega AS BYTE
DIM regb AS BYTE
DIM d AS BYTE
DIM uo[3] AS BYTE   ;uit op array
DIM ko[3] AS BYTE   ;klaar op array
DIM nu[3] AS BYTE   ;huidige tijd array
x = 2   ;grote van de array's
uit:
    DATA 20, 10, 1  ;data voor uit op
klaar:
    DATA 39, 19, 5  ;data voor klaar op
RESTORE uit
FOR d = 0 TO x  ;data in array laden en in rega en regb alle gebruikte bits op 1 zetten (is uit)
    READ uo[d]
    SETBIT rega, d
NEXT d
RESTORE klaar
FOR d = 0 TO x
    READ ko[d]
    SETBIT regb, d
NEXT d
begin:  ;hooflus
    FOR a = 0 TO x
        IF 0 = nu[a] THEN ;als huidige tijd gelijk is aan 0(dus de led moet aan)
            SELECT a    ;verschil maken tussen porta en portb
                CASE 0 TO 7: CLEARBIT rega, a
                'CASE 8 TO 15: CLEARBIT regb, a - 8
            END SELECT
        END IF
        IF uo[a] = nu[a] THEN ;als huidige tijd gelijk is aan de tijd dat de led uit moet
            SELECT a
                CASE 0 TO 7: SETBIT rega, a
                'CASE 8 TO 15: SETBIT regb, a - 8
            END SELECT
        END IF
        IF ko[a] = nu[a] THEN nu[a] = -1 ;als de huidige tijd gelijk is aan het einde van de cyclus(dus de tijd weer op 0 zetten)
    NEXT a
    FOR b = 0 TO x  ;de huidige tijd 1 opschuiven
        nu[b] = nu[b] + 1
    NEXT b
    PORTA = rega    ;bewerkingen uitvoeren
    'PORTB = regb
    DELAYMS 100 ;wacht 100 ms
GOTO begin
END

Dus gewoon dezelfde als vorige post alleen dan de foutjes verbeterd en alles wat met portb te maken heeft geremarked om op 45 regel uit te komen.

Ik heb het schema van het picbasic knipperledje maar dan met drie ledjes. Ik heb ze op a0 - 2
aangesloten en op a5-7 Bij allebei niets.
Heeft iemand een idee?

[Bericht gewijzigd door pientertje op zondag 31 augustus 2008 18:51:08 (22%)

1. Commentaar ontbreekt, waardoor het moeilijk is om te bepalen wat een stuk code doet.
2. Leesbaarheid code (niet ingesprongen) is matig, waardoor je moeilijk kunt inschatten waar fouten zitten.

FWIW: waar dient array nu[3] voor?

Volgend project: funcgen met ad9833 afmaken...

Ok nu met tabs en commentaar
Het principe is dat elke led een tijdlijn heeft:
http://i33.tinypic.com/mwb0q9.jpg

Als de huidige tijd bij pijltje 1 is moet de led uit als die bij 2 is hoeft er niets te gebeuren, geen enkele if is daan waar. En als het pijltje bij 3 is moet de led uit en bij 4 moet het pijltje weer naar 0
Array nu is dus het pijltje

[Bericht gewijzigd door Henry S. op zondag 31 augustus 2008 19:10:19 (32%)

Je moet in elk geval nog ergens vooraan

code:

TRISA = 0

opnemen, anders zal het sowieso niet werken.

Dat van die tijdlijn was al duidelijk :-)

Je hoeft niet 3 verschillende variabelen (a,b,d) te definiëren. Je kunt dezelfde gebruiken voor je loopjes.

Ik zou het aantal boeien als een constante (Symbol) definiëren, niet als een variabele.

En het wordt eenvoudiger als je in de data-regels de uit- en aan-tijd meteen na elkaar zet.

Je hebt feitelijk maar één loop nodig, niet twee.
Jouw versie, iets aangepast:

code:


    Device 16F628A  ;device 16f628a
    Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF    ;config
    ALL_DIGITAL TRUE    ;alles digitaal
    
    'Constante: aantal boeien dat we willen aansturen
    Symbol AantalBoeien = 3

    'Simpel tellertje
    Dim a As Byte
    
    'Ter voorkoming van RMW: PORTAx placeholders
    Dim rega As Byte
    Dim regb As Byte
    
    Dim uo[AantalBoeien] As Byte   ;uit op array
    Dim ko[AantalBoeien] As Byte   ;klaar op array
    Dim nu[AantalBoeien] As Byte   ;huidige tijd array

UitAan:
    Data 20,39,  10,19,  1,5   ;data voor uit en aan op

Start:
    'Alle variabelen intialiseren
    Clear
    'Alle PORTA's als output
    TRISA = 0
    
    Restore 
    For a = 0 To AantalBoeien-1  ;data in array laden en in rega en regb alle gebruikte bits op 1 zetten (is uit)
        Read uo[a]
        Read ko[a]
        SetBit rega, a
    Next a
    
begin:  ;hoofdlus
    For a = 0 To aantalboeien-1
        If 0 = nu[a] Then ;als huidige tijd gelijk is aan 0(dus de led moet aan)
            Select a    ;verschil maken tussen porta en portb
                Case 0 To 7: ClearBit rega, a
                'CASE 8 TO 15: CLEARBIT regb, a - 8
            End Select
        End If
        If uo[a] = nu[a] Then ;als huidige tijd gelijk is aan de tijd dat de led uit moet
            Select a
                Case 0 To 7: SetBit rega, a
                'CASE 8 TO 15: SETBIT regb, a - 8
            End Select
        End If
        If ko[a] = nu[a] Then nu[a] = -1 ;als de huidige tijd gelijk is aan het einde van de cyclus(dus de tijd weer op 0 zetten)
        
        nu[a] = nu[a] + 1 ;de huidige tijd 1 opschuiven
    Next a
    
    PORTA = rega    ;bewerkingen uitvoeren
    'PORTB = regb
    DelayMS 100 ;wacht 100 ms
    
    GoTo begin
    
End
Volgend project: funcgen met ad9833 afmaken...
free_electron

Silicon Member

quick en dirty ( ik geef een generic oplossing hier : pas zelf aan naargelang je compiler. )

code:


dim boei(40)
dim offpoint(40)
dim cycle_end(40)

sub int_handler
for x = 0 to 40
  boei(x) = boei(x)+1
  if boei(x) < offpoint(x) then 
     setbit(ouptut_x)
  else
     clearbit(output_x)
  end if
  if boei(x) > cycle_end(x) then boei(x) = 0
next x
end sub

Voila. die int handler wordt elke seconde aangeroepen.
het enige wat je moet doen is die arrays vullen bij de start.

Stel je hebt ene ledje nodig wat 2 secondne aan is en dan 9 seconden af : cycle_end zet je op 11 ( 2 + 9 ) en offpoint zet je op 2.

Die dingen gaan allemaal compleet door elkaar lopen zonder problemen. ( bij powerup gaan alle leds gelijktijdig aan , maar daarna vervolgen ze allen hun eigen weg. Je kan het zien als een 'lamptest')

Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM

Ik heb nog een vraagje:
Stel ik sluit 10 ledjes aan op één pin. Dan moet ik ze toch parallel zetten? En is het erg als ik 1 pin met 28 mili ampère belast?

Gewoon even een torretje pakken, een bc547 is genoeg. Picpoort met 1K weerstand aan de tor. De emitter aan de massa en de leds in de collector.

Ik heb nu weer eens tijd om aan dit project verder te werken. Ik heb het schema met die ledjes en die bc547 even op breadboard gezet. Maar het ledje gaat niet meer uit :(

Basis weerstand gebruikt? Wat als je de tor er uit trekt en direct aan je voeding hangt (5V en 0V).

Je zegt parallel, en je tekent ze in serie.

In serie kan, maar dan moet de voedingsspanning omhoog, en waarschijnlijk moet je de serie weerstand opnieuw berekenen.

Parallel kan ook, maar dan moet elke LED een eigen serie weerstand krijgen vanwege de kleine verschillen in de spanningsval van elke LED, en je mag niet teveel stroom uit de pin van de microcontroller trekken.

Je kunt een BC547 of zo pakken, of een ULN2803, dan heb je 1 IC in plaats van 8 weerstanden en 8 transistors.

Als je de basis van de BC547 aan de emitter hangt (aan de ground, dus), zou deze moeten sperren.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Ja, hij blijft altijd zwakjes branden, en als ik 5 volt op de basis zet gaat ie aan. Maar als ik 5 volt op colector zet en het ledje tuusen emitter en ground werkt het wel naar behoren. Kan ik dit dan gebruiken?

Het kan wel. Maar de emitterspanning is afhankelijk van de basis spanning. Je basis is 5V, je emitter zit daar nog ongeveer 0.6V onder. Dus meerdere leds in serie zetten wordt moeilijk. En het vermogen dat verstook wordt in de tor is (collector spanning - emitterspanning) * stroom. Dus als je een 2e voeding gebruikt kan dat aardig oplopen.

Met leds de leds in de collector kan je schakelen wat je wilt. 12V van een andere voeding pakken en daar je leds op aansluiten en schakelen met de tor kan gewoon. En het verstookte vermogen is lager. Omdat Vce(sat) maar 0.2V oid is. Dus stroom * Vce(sat).

Heb je al een ander torretje gepakt? Hoe groot is je basis weerstand?

Ik heb nog een klein probleem met dit programma ik gebruik hem nu als haardvuur ;) (wat je niet met een programma kan)

code:


DEVICE 16F628A  ;device 16f628a
    CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF    ;config
    ALL_DIGITAL TRUE    ;alles digitaal
    
    'Constante: aantal boeien dat we willen aansturen
    SYMBOL AantalBoeien = 7

    'Simpel tellertje
    DIM a AS BYTE
    
    'Ter voorkoming van RMW: PORTAx placeholders
    DIM rega AS BYTE
    DIM regb AS BYTE
    
    DIM uo[AantalBoeien] AS BYTE   ;uit op array
    DIM ko[AantalBoeien] AS BYTE   ;klaar op array
    DIM nu[AantalBoeien] AS BYTE   ;huidige tijd array

UitAan:
    

Start:
    'Alle variabelen intialiseren
    CLEAR
    'Alle PORTA's als output
    TRISA = 0
    DATA 1,11, 1,16, 1,6, 1,21, 1,5, 1,32, 1,61   ;data voor uit en aan op
    RESTORE 
    FOR a = 0 TO AantalBoeien-1  ;data in array laden en in rega en regb alle gebruikte bits op 1 zetten (is uit)
        READ uo[a]
        READ ko[a]
        SETBIT rega, a
    NEXT a
    
begin:  ;hoofdlus
    FOR a = 0 TO aantalboeien-1
        IF 0 = nu[a] THEN ;als huidige tijd gelijk is aan 0(dus de led moet aan)
            SELECT a    ;verschil maken tussen porta en portb
                CASE 0 TO 7: CLEARBIT rega, a
                'CASE 8 TO 15: CLEARBIT regb, a - 8
            END SELECT
        END IF
        IF uo[a] = nu[a] THEN ;als huidige tijd gelijk is aan de tijd dat de led uit moet
            SELECT a
                CASE 0 TO 7: SETBIT rega, a
                'CASE 8 TO 15: SETBIT regb, a - 8
            END SELECT
        END IF
        IF ko[a] = nu[a] THEN nu[a] = -1 ;als de huidige tijd gelijk is aan het einde van de cyclus(dus de tijd weer op 0 zetten)
        
        nu[a] = nu[a] + 1 ;de huidige tijd 1 opschuiven
    NEXT a
    
    PORTA = rega    ;bewerkingen uitvoeren
    'PORTB = regb
    DELAYMS 100 ;wacht 100 ms
    
    GOTO begin
   
END

Maar poort a4 en a7 doen het niet. HOe kan dit. Ik heb al een andere pic gepakt.

free_electron

Silicon Member

open collector poorten ? zet eens een weerstand van 1k van die poort naar de 5 volt.

Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM