minuut wachten voordat de buzzer aanspringt

Beste mensen,

Ik loop vast op het simpele feit dat ik een pauze wil creëren voordat een buzzer gaat zoemen. Wie kan mij een douw in de rug geven? Alvast bedankt.

Hieronder mijn geschreven basic programma. Alles functioneert goed behalve dat ik een vertraging wil inbouwen voordat de buzzer gaat zoemen bij een hoog signaal. Dus na "if spanning > 200 then" wil ik een vertraging hebben van bijvoorbeeld 1 minuut voordat de buzzer gaat zoemen.

Ik heb overigens gezocht in het forum maar kon niks van oplossingen vinden. Ik hoor graag van jullie.

pic basic code:



DEVICE 12F675                       ;Gebruik een 12F675 type
XTAL = 4
CONFIG INTRC_OSC_NOCLKOUT,_         ;INTerne RC OSCillator van de PIC gebruiken
       WDT_OFF,_                    ;Watch Dog Timer uitgeschakeld
       PWRTE_ON,_                   ;PoWeR up Timer Enable ingeschakeld
       BODEN_OFF,_                  ;Brown Out Detection ENable uitgeschakeld (minder stroomopname)
       MCLRE_OFF                    ;Master CLeaR Enable uitgeschakeld (resetpin GPIO.3 op OFF)
ALL_DIGITAL true                    ;alle poorten digitaal
       
;Parameters analoge ingang. 
Declare ADIN_RES   = 8              ;resolutie 8 bits      
Declare ADIN_TAD   = frc            ;Set rc osc     
Declare ADIN_STIME = 50             ;sample tijd 5 

;Logische constanten
SYMBOL UIT  = 0                     ;Uit = laag (0)
SYMBOL AAN  = 1                     ;Aan = hoog (1)

;Algemene constanten 
SYMBOL LedTijd      = 1             ;mSec, Knipper snelheid van de IRLED
SYMBOL BuzzerTijd   = 10             ;Vertraging tijd

;Poortnamen
SYMBOL IRLED    = gpio.4            ;Op poort GP.4 zit de IRLED aangesloten
SYMBOL LED      = gpio.5            ;Op poort GP.5 zit de LED aangesloten
SYMBOL IRFILTER = gpio.2            ;Op poort GPIO.2 zit het IR filter aangesloten
symbol BUZZER   = gpio.1            ;Op poort GPIO.3 zit de BUZZER

;Variabelen declareren
DIM Spanning    AS byte             ;Spanning als variabele "WORD" (hier staat de gemeten waarde)
DIM Timer       AS BYTE             ;Maak variabele Timer aan

CLEAR                               ;Wis alle RAM geheugen 

;          543210
GPIO    = %000000                   ;Uitgangen bij opstart een laag niveau
TRISIO  = %001101                   ;GPIO.1 , GPIO.4 GPIO.5 zijn uitgangen

;          76543210
ADCON0  = %00000100                 ;Analoog steeds aan, poort 2 als A/D geselecteerd
 
;Hoofdprogramma
timer = buzzertijd * 2                  ;Stel eerst de teller in
WHILE 1 = 1                             ;Herhaal onderstaande lus...
    
    TOGGLE irled                        ;Aan moet uit, uit moet aan
    DELAYMS ledtijd                     ;1 milliseconden
    
    spanning = ADIn 2                   ;Lees IRfilter in en schrijf waarde
    IF spanning < 60 THEN led = aan     ;Als spanning kleiner is dan...
    IF spanning > 200 THEN led = uit    ;Als spanning groter is dan...
    if spanning < 60 then buzzer = uit    
    if spanning > 200 then
        REPEAT                          ;Herhaal onderstaande lus...
        DEC Timer                       ;Teller met 1 verlagen
        UNTIL timer = 0                 ;...totdat LedTeller op 0 staat                         
     toggle buzzer
     endif         
     
wend

END                                     ;Einde programma

M-i-c-h-e-l

Golden Member

Werkt dit commando wel:
DELAYMS ledtijd ;1 milliseconden
?

De DELAYMS heeft als het goed is ook een grote broer DELAYS (weet het niet zeker hoe dat in basic zit).
Ze zou dus een commando DELAYS 60 kunnen gebruiken oid.

/EDIT
Je kunt ook een interrupt routine maken.
Als je in die routine een variabele verhoogt, kun je in je programma controleren of die variabele een bepaalde waarde heeft bereikt.
Mocht intussen je spanning weer veranderen, dan kun je de waarde van die variabele weer aanpassen.

[Bericht gewijzigd door M-i-c-h-e-l op zaterdag 30 augustus 2014 16:38:58 (37%)

Hoi Michel,

Ja, die delayms werkt prima. geen probleem. Even voor de duidelijkheid dit delay gebruik ik voor een IR Led.

Het probleem met delay "in het algemeen" zal zijn dat het programma stil staat. Dat kan ik niet gebruiken. Ik had gehoopt dat ik het op deze manier kon oplossen maar dat kan ik wel vergeten.

Zo te zien zal ik het dan moeten oplossen met interrupts. Probleem is dat ik daar geen ervaring mee heb. Hoe zet je zoiets op? Maar je beschrijving geeft exact aan wat ik wil. Heb je wellicht een voorbeeld voor mij?

M-i-c-h-e-l

Golden Member

Kant en klaar heb ik hem niet bij de hand, maar ik denk dat je hiermee ook uit de voeten kunt.
Daar had je zowieso ook zelf even kunnen kijken natuurlijk :)

Uiteraard had ik dit kunnen googelen. Maar moest eerst een andere mening hebben hoe het aan te pakken. Daarvoor die duw in de rug. Het feit dat ik nu met interrupts aan de slag moet dat helpt. Ik ga er nu een studie van maken. Bedankt zover.

M-i-c-h-e-l

Golden Member

Ah kijk, dat noem ik een positieve instelling!
Succes met de studie en laat maar weten of het is gelukt.

Beste Michel en iedereen die er iets over kan zeggen.

Zojuist het volgende stuk geschreven! (zie hieronder) Inspiratie opgedaan op de website van PIC Basic. Ik zou mijn probleem eigenlijk gaan oplossen met interrupts maar deze oplossing leek mij ook aantrekkelijk. Natuurlijk werkt het niet, de vraag is alleen waarom? Want dat houdt mij bezig.
Ik hoor de buzzer wel geluid maken de rest van de schakeling werkt verder ook naar behoren. Maar er is geen sprake van een minuut pauze tussen "if spanning > 200 then" en de start van de buzzer.
Dat wat ik wil bereiken dus.
Het lijkt mij dat met een GOSUB commando mijn probleem wel te tackelen moet zijn. In principe kom ik toch met de BREAK terug waar ik gebleven ben. Of niet?
P.S. Timer staat nu op 6 seconden wachttijd ingesteld!

Als iemand mij weer die duw in de rug kan geven graag!

pic basic code:


DEVICE 12F675                           ;Gebruik een 12F675 type
XTAL = 4
CONFIG INTRC_OSC_NOCLKOUT,_             ;INTerne RC OSCillator van de PIC gebruiken
       WDT_OFF,_                        ;Watch Dog Timer uitgeschakeld
       PWRTE_ON,_                       ;PoWeR up Timer Enable ingeschakeld
       BODEN_OFF,_                      ;Brown Out Detection ENable uitgeschakeld (minder stroomopname)
       MCLRE_OFF                        ;Master CLeaR Enable uitgeschakeld (resetpin GPIO.3 op OFF)
ALL_DIGITAL true                        ;alle poorten digitaal
       
;Parameters analoge ingang. 
Declare ADIN_RES   = 8                  ;resolutie 8 bits      
Declare ADIN_TAD   = frc                ;Set rc osc     
Declare ADIN_STIME = 50                 ;sample tijd 5 

;Logische constanten
SYMBOL UIT  = 0                         ;Uit = laag (0)
SYMBOL AAN  = 1                         ;Aan = hoog (1)

;Algemene constanten 
SYMBOL LedTijd      = 1                 ;mSec, Knipper snelheid van de IRLED

;Poortnamen
SYMBOL IRLED    = gpio.4                ;Op poort GP.4 zit de IRLED aangesloten
SYMBOL LED      = gpio.5                ;Op poort GP.5 zit de LED aangesloten
SYMBOL IRFILTER = gpio.2                ;Op poort GPIO.2 zit het IR filter aangesloten
symbol BUZZER   = gpio.1                ;Op poort GPIO.3 zit de BUZZER

;Variabelen declareren
DIM Spanning    AS byte                 ;Spanning als variabele "WORD" (hier staat de gemeten waarde)
DIM Timer       AS BYTE                 ;Maak variabele "Timer" aan

CLEAR                                   ;Wis alle RAM geheugen 

;          543210
GPIO    = %000000                       ;Uitgangen bij opstart een laag niveau
TRISIO  = %001101                       ;GPIO.1 , GPIO.4 GPIO.5 zijn uitgangen

;          76543210
ADCON0  = %00000100                     ;Analoog steeds aan, poort 2 als A/D geselecteerd

GOTO HoofdProgramma                     ;Spring over de subroutine

;Subroutine
DelayMinuut:    

     FOR timer = 1 TO 6000              ;60.000 x 1 milliseconde = 1 minuut
        if spanning < 60 THEN BREAK     ;Als er een lage puls op PORTB.0 komt dan uit de FOR-NEXT lus 
        DELAYMS 1                       
     NEXT                               ;'Timer' verhogen en dan terug naar FOR
    return 
 
;Hoofdprogramma
HoofdProgramma:

WHILE 1 = 1                             ;Herhaal onderstaande lus...
    
    TOGGLE irled                        ;Infrarood LED aan moet uit, uit moet aan
    DELAYMS ledtijd                     ;Vertraging 1 milliseconden
    
    spanning = ADIn 2                   ;Lees IRfilter in en schrijf waarde
    IF spanning < 60 THEN led = aan     ;Als spanning kleiner is dan...
    IF spanning > 200 THEN led = uit    ;Als spanning groter is dan...
    if spanning > 200 then
        GOSUB DelayMinuut
        toggle buzzer
        delayms 5
    endif

wend

END
M-i-c-h-e-l

Golden Member

En als je de regel "toggle buzzer" ook in de subroutine plaatst?
De buzzer wordt nu altijd aangesproken, ook als de spanning tijdens je minuut pauze weer zakt.