Misschien nog eens naar mijn voorbeeld kijken
Misschien nog eens naar mijn voorbeeld kijken
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.)
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.
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?
Ok nu met tabs en commentaar
Het principe is dat elke led een tijdlijn heeft:
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
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')
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.
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.
Silicon Member
open collector poorten ? zet eens een weerstand van 1k van die poort naar de 5 volt.