interrupts en hun problemen

ok eerst maar eens opsommen wat er nu werkt en dan kunnen we verder kijken

software hoeft geen probleem te zijn het gaat eerst om het principe

een ontvanger hangt aan de pic en ik lees een paar kanalen uit
het eerste kanaal kan 3 standen aan nemen met een pwm op 50 Hz
midden is waar we van uitgaan als we opstarten
dan naar boven die verhoogd een teller maar om steeds een verder te tellen met de pwm terug naar de midden stand anders loopt het heel snel op en dat is niet de bedoeling
naar onder bevestig je het gekozen kanaal

dus we tellen BV tot 2 en dan naar onder dan gaan de standlichten aan (een poort word laag) maakt niet uit nu welke
de teller staat terug op nul
tellen we tot 3 dan bv de kruislichten aan
op 4 de groot lichten en op 5 de grootlichten maar als je naar onder drukt knipperen ze net zoals je zelf met je auto zou doen
op 6 bv de mistlampen enz.
ga je terug naar 2 en je bevestigd door weer naar onder dan gaan de standlichten terug uit en eventueel ook de mistlampen naar gelang de configuratie van de auto

de gas is ook mee aangesloten en als je vooruit gaat blijft alles bij het zelfde
achteruit gaat de achteruitrijlamp aan

dit zou ik dus met een timer interrupt willen doen
ga je naar neutraal dan gaan de rem lichten kort aan
dit werkt nu met een loop

en dan probleem geval de pinkers
deze moeten dus links /rechts en sos kunnen pinken

deze hebben een aparte schakelaar net zoals in een auto
mijn idee van die Hpwm werkt niet omdat deze geen pulstijd van 1 seconde kan maken
het zou te gemakkelijk zijn geweest
het idee was
de hpwm op poort B.3 doet alle leds knipperen
alleen poort B.2 zou links zijn en poort B.1 zou rechts zijn
door dan de betreffende poort hoog te maken knippert de linker,rechter of sos
maar mis poes de hpwm komt op 4 Mhz tot 245 Hz

heel het gedeelte met de teller en dergelijke werkt reeds zonder enig probleem
blijft juist dus dat ik voor die knipper lichten een interrupt moet gaan gebruiken

of een aparte 12f629 met een eigen klein progje kan ook nog

ik hoor het wel wat mogelijk is

gr raf

Gr Raf
High met Henk

Special Member

Beste Raf....

Meest vage starterspost die ik lang niet gezien heb.

Wat wil je?

Een interrupt onderbreekt je normale programma en gaat dus voor op de rest.
Dus als je continu interrupts hebt gebeurt er niets. Ik heb zelf ooit eens in een avr een pulsgenerator gemaakt.

Knopuitlezing zat in normale programma.
Bij 0 deed ik bit set
de eerste compare (instelbaar) van de timer toggelde in de pin,
Bij de tweede trok ik de ingestelde waarde eraf en toggelde weer...

Leuke is dat ik op een bepaalde freq alleen maar interrupts aan het afhandelen was en dus geen tijd had om de knop nog in te lezen...

EDIT: inmiddels aangevuld, terwijl ik typte...

E = MC^2, dus de magnetische compatibiliteit doet kwadratisch mee???

Welke controller en welke taal?
Laat je programma eens zien.

Lambiek

Special Member

Op 1 november 2019 17:15:32 schreef raf janssens:
een ontvanger hangt aan de pic en ik lees een paar kanalen uit
het eerste kanaal kan 3 standen aan nemen met een pwm op 50 Hz
midden is waar we van uitgaan als we opstarten
dan naar boven die verhoogd een teller maar om steeds een verder te tellen met de pwm terug naar de midden stand anders loopt het heel snel op en dat is niet de bedoeling
naar onder bevestig je het gekozen kanaal...........

Wat je wil maken kan toch met een keuze menu.

Bij tellerstand 2 doe dit, bij tellerstand 5 doe dat. Heb je helemaal geen interrupts bij nodig.

Hoe lees je je ontvanger in, met het PULSIN commando?

Als je haar maar goed zit, GROETEN LAMBIEK.

Vallen we hier halverwege een oude discussie of mogen we de hele context zelf verzinnen?

Ik gok op modelbouw, maar wat en hoe.

Damn the torpedoes, full speed ahead!
Lambiek

Special Member

Op 1 november 2019 17:30:28 schreef Hunter:
Vallen we hier halverwege een oude discussie of mogen we de hele context zelf verzinnen?

Komt hier vandaan.

https://www.circuitsonline.net/forum/view/146792/7

Misschien dat een MOD het een beetje begrijpelijker kan maken. :)

Als je haar maar goed zit, GROETEN LAMBIEK.

Lambiek heel dat keuze menu werkt reeds
het is alleen als ik de pinkers mee programmeer in het hoofd programma dat het in via timing in de knoei komt

inderdaad met pulsin lees ik de ontvanger in
de processor is een 16f628A
volgens sommige een oud beestje maar ach een oldtimer rijd ook nog

keuze van pinkers doe ik met een pulsin en lees ik het kanaal uit als ik links of rechts wil
de sos gaat via de eerste pulsin waarmee ik de verlichting aan en uit zet

zet ik nu het knipperen mee in het hoofd programma dan moet ik een delayms 500 zetten om elke seconde de led aan of uit te zetten
en dan komt het niet goed met de pulsin uit te lezen

@ zonnepaneeltje
het programma is picbasic maar dit is volgens anderen niet relevant aan het werken met interrupts

Gr Raf

het programma met de pinkers er in maar dat geeft ellende

pic basic code:


Device 16F628



Declare  Xtal 4                      
 
Config INTRC_OSC_NOCLKOUT,_  ; Interne oscilator aan
       WDT_OFF,_             ; WatchDog Timer uit
       PWRTE_ON,_            ; Power-up Timer Enable aan
       MCLRE_Off,_            ; Externe Master Reset Enable aan     
       CP_Off                 ; Code Protection aan
       
Declare PortB_Pullups On 
Declare All_Digital TRUE             ; Alle poorten digitaal
          ;76543210              ; Hulpregel Poort poort_A 
PORTA   = %00000000              ; Zet poort_A laag
TRISA   = %00011100              ; Poort_A als ingang
PORTB   = %00000000
TRISB   = %00000000
Symbol ledwit  = PORTB.0      ;controle ledje status 
Symbol link    = PORTB.1      ;uitgang naar achter modulle
Symbol stuur   = PORTA.4      ;servostuur ingang
Symbol gas     = PORTA.2      ;servo gas ingang
Symbol schakel = PORTA.3      ;servo schakelaar
Symbol setting = PORTB.5      ;setknopje
Symbol pinkl   = PORTB.0      ;pinker links
Symbol pinkr   = PORTB.1      ;pinker rechts
Symbol standl  = PORTA.0      ;standlicht
Symbol grootl  = PORTA.1      ;grootlicht
Symbol fare    = PORTB.7      ;verstralers
Symbol mistl   = PORTB.6      ;mistlampen
Dim midstuur As Word
Dim midgas As Word
Dim midschakel As Word
Dim stuurrechts As Word
Dim stuurlinks As Word
Dim a As Byte
Dim b As Word
Dim c As Byte
Dim d As Byte    ;stuur links
Dim e As Byte     ;stuur rechts
Dim f As Byte
Dim g As Word
Dim h As Word
Dim a1 As Byte
Dim b1 As Byte
Dim c1 As Byte
Dim d1 As Byte
DelayMS 500                   ;LCD stabilisering
stuurrechts = midstuur - 20
stuurlinks = midstuur + 20
f = 0
For a = 1 To 5
     ledwit = 0
        DelayMS 800
     ledwit = 1

       Next
       
 Cls

 midstuur =  ERead 0  ;puls waarde die weg geschreven is terug inlezen
 If midstuur = 0 Then GoSub  schrijven   ;b2 is ingang setten ewrite
 If setting = 0 Then GoSub schrijven 
  DelayMS 100
 
 midgas = ERead 0
 midstuur = ERead 2
 midschakel = ERead 4
 
DelayMS 800

start:  

 While 1 = 1
  PulsIn PORTA.2,1,gas
  PulsIn PORTA.3,1,stuur
  PulsIn PORTA.4,1,schakel
 
  If e = 0 And stuur = stuurrechts Then  GoSub rechts
  If e = 1 And stuur = stuurrechts Then  GoSub rechts1
  If d = 0 And stuur = stuurlinks Then GoSub links
  If d = 1 And stuur = stuurlinks Then GoSub links1      
  If e = 1 Then Toggle  pinkr
  If d = 1 Then Toggle  pinkl
  If e = 0 Then pinkr = 1
  If d = 0 Then pinkl = 1
  If f = 1 And gas = midgas Then GoSub remmen
  If f = 0 And gas > midgas Then GoSub vooruit 
  If h > 0 Then h = h - 1
     If schakel > midschakel Then GoSub teller
   If schakel < midschakel Then GoSub setten
  DelayMS 100
 Wend
vooruit:

  f = 1 
  Return
  remmen:

  f = 0
  h = 100
   PulseOut PORTB.1, 10 , High     ;link
 While 1 = 1
 DelayMS 200
 h = h - 1
 If h = 0 Then PulseOut PORTB.1 , 12 , High  ;link
 If h = 0 Then Return 
  Wend
  
  
 teller:

 If  a < 6 Then a = a + 1
      While 1 = 1
       PulsIn PORTA.3,1,schakel
       If schakel = midschakel Then Return
       Wend
  setten:

     If a1 = 1 Then GoTo setten2
     If b1 = 1 Then GoTo setten2
     If d1 = 1 Then GoTo setten2
     If a = 1 Then standl = 0       ;standlicht
     If a = 1 Then PulseOut PORTA.1 , 14 , High
     If a = 1 Then a1 = 1 
     If a = 2 Then grootl = 0       ;grootlicht
     If a = 2 Then b1 = 1
     If a = 3 Then fare =  0       ;verstralers
     If a = 3 Then PulseOut PORTA.1 , 18 , High 
     If a = 4 Then mistl = 0        ;mistlampen
     If a = 4 Then d1 = 1
     DelayMS 200
     a = 0 
     Return 
     setten2:
        

     If a = 1 Then standl = 1       ;standlicht
     If a = 1 Then PulseOut PORTA.1 , 20 , High
     If a = 1 Then a1 = 0
     If a = 2 Then grootl = 1       ;grootlicht
     If a = 2 Then b1 = 0
     If a = 3 Then fare =  1       ;verstralers
     If a = 3 Then PulseOut PORTA.1 , 24 , High 
     If a = 4 Then mistl = 1        ;mistlampen
     If a = 4 Then d1 = 0
     DelayMS 200
     a = 0 
     Return     
rechts:

 If e = 0 Then e = 1
 PulseOut PORTB.1 , 14 , High  ;link
  While stuur = stuurrechts 
 PulsIn PORTA.4,1,stuur
 Wend
 Return 
 rechts1:

 If e = 1 Then e = 0
 PulseOut PORTB.1 , 16 , High  ;link
  While stuur = stuurrechts 
 PulsIn PORTA.4,1,stuur
 Wend
 Return 
links:

If d = 0 Then d = 1
PulseOut PORTB.1 , 18 , High  ;link
While stuur = stuurlinks
PulsIn PORTA.4,1,stuur 
Wend 
links1:

If d = 1 Then d = 0 
PulseOut PORTB.1 , 20 , High  ;link
While stuur = stuurlinks
PulsIn PORTA.4,1,stuur 
Wend 
schrijven:

        ledwit = 1
        DelayMS 500
   
    PulsIn PORTA.2,1,midgas       ;leeswaarde vol
           EWrite 0, [midgas]       
           DelayMS 100
           For a = 1 To 10
           Toggle ledwit
           Next
    PulsIn PORTA.3,1,midstuur       ;leeswaarde middenstand  
           EWrite 2, [midstuur]    
           DelayMS 100
           For a = 1 To 10
           Toggle ledwit
           Next
    PulsIn PORTA.4,1,midschakel       ;leeswaarde leeg     
           EWrite 4, [midschakel]  
           DelayMS 100
           For a = 1 To 10
           Toggle ledwit
           Next
     Return 
Gr Raf
Lambiek

Special Member

Op 1 november 2019 17:57:52 schreef raf janssens:
zet ik nu het knipperen mee in het hoofd programma dan moet ik een delayms 500 zetten om elke seconde de led aan of uit te zetten
en dan komt het niet goed met de pulsin uit te lezen

Kijk nu komen we ergens, je wil van je delayms af voor het knipperen.

Als je haar maar goed zit, GROETEN LAMBIEK.

yep

zat weer in de knoei om de listing hier te posten maar dat is wat er tot nu toe geschreven is
de lichten werken en het stop licht ook alleen het knipperen geeft ellende

gr raf

Gr Raf

PORTA2 wordt gebruikt als ingang, klopt dit dan?

pic basic code:

TRISA = %111000 ; Poort_A als uitgang
Damn the torpedoes, full speed ahead!

@hunter
ja dat is de ingang van het gas
deze word gebruikt om de rem lichten een bepaalde tijd te laten oplichten

maar ik zie wat je bedoeld de tris is verkeerd
TRISA = %00011100
die moet zo zijn
het probleem wat ik heb staat in de link die lambik gepost heeft
dit is reeds een tijdje geleden geschreven en nu terug de draad opgepakt met programmeren
bijna 2 jaar gewerkt aan de modellen voor de film torpedo
dan is er niet veel tijd meer over om iets anders te doen

Gr Raf

Wat ik standaard doe is een timer instellen zodat hij interrupts geeft op 1kHz, en in die ISR (interrupt service routine, de functie die door de interrupt wordt uitgevoerd) hoog ik een teller TickCount op.

Op andere plaatsen in het programma kun je dan de waarde van TickCount lezen, en bepalen of een bepaalde tijd al verstreken is.

code:

if( TickCount - StartTime >= 500 )
{
  StartTime = TickCount;
  ToggleLED();
}

Voor het aansturen van lampjes is één milliseconde meer of minder niet belangrijk.

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

Ik ben het met de denkwijze van SparkyGSX eens en heb daar niets aan toe te voegen.

Damn the torpedoes, full speed ahead!
benleentje

Golden Member

pic basic code:

links1:


If d = 1 Then d = 0 
PulseOut PORTB.1 , 20 , High  ;link
While stuur = stuurlinks
PulsIn PORTA.4,1,stuur 
Wend 

Volgens mij ben je hier return vergeten.
Echter begrijp ik de Wend instructie niet. Ik dacht dat het While-End betekend maar er staat in de functieblok helemaal geen While.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
Arco

Special Member

Is toch een gewone WHILE...WEND loop?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
benleentje

Golden Member

JA sorry ik heb er overheen gekeken. Maar de return mist wel.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
Arco

Special Member

Zonder indentatie is er ook gauw overheen te kijken...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

@benleentje,
Staat er echt wel. Laatste regel! Anders zou je compilerfouten krijgen.

pic basic code:


links:


If d = 0 Then d = 1
PulseOut PORTB.1 , 18 , High  ;link
While stuur = stuurlinks
PulsIn PORTA.4,1,stuur 
Wend 
links1:


If d = 1 Then d = 0 
PulseOut PORTB.1 , 20 , High  ;link
While stuur = stuurlinks
PulsIn PORTA.4,1,stuur 
Wend 
schrijven:


        ledwit = 1
        DelayMS 500
   
    PulsIn PORTA.2,1,midgas       ;leeswaarde vol
           EWrite 0, [midgas]       
           DelayMS 100
           For a = 1 To 10
           Toggle ledwit
           Next
    PulsIn PORTA.3,1,midstuur       ;leeswaarde middenstand  
           EWrite 2, [midstuur]    
           DelayMS 100
           For a = 1 To 10
           Toggle ledwit
           Next
    PulsIn PORTA.4,1,midschakel       ;leeswaarde leeg     
           EWrite 4, [midschakel]  
           DelayMS 100
           For a = 1 To 10
           Toggle ledwit
           Next
     Return                           ; Hier staat RETURN!!!!!! 

@ SparkyGSX

ok je maakt dus dat een timerinterrupt loopt en elke keer tel je als deze afloopt deze bij een teller op
indien deze teller een ingestelde waarde bereikt heeft dan led aan of uit

ok inderdaad bij een pinker is nauwkeurigheid niet zo een groot probleem
ga ik iets mee proberen

@benleentje

deze code had ik geschreven voor ik 5 hersen infarcten heb gekregen dus ik moet deze terug helemaal door nemen om zelf te begrijpen wat ik toen geschreven heb
maar ze werkte wel

het laatste gedeelte van de code word eigenlijk maar een keer uitgevoerd tijdens het voor de eerste keer opstarten van het gehele systeem .
daar worden de midden waarden van de ontvanger kanalen mee opgeslagen .eens opgeslagen worden ze bij opstarten gewoon ingelezen en klaar

maar inderdaad er ontbreken twee returns in de code bij links en links 1
nu over schrijft hij steeds de midden stand terug
en inderdaad de code compilde dus wel daar er onder aan ook die return staat

maar eens degelijk terug beginnen schrijven want dit trekt nergens op

gr raf en bedankt voor de info
ik ga eerst met die timer en dergelijke aan de slag
en eens kijken of ik daar zo afzonderlijk iets mee kan in elkaar steken

Gr Raf
buckfast_beekeeper

Golden Member

Op 1 november 2019 22:18:39 schreef SparkyGSX:
Wat ik standaard doe is een timer instellen zodat hij interrupts geeft op 1kHz, en in die ISR (interrupt service routine, de functie die door de interrupt wordt uitgevoerd) hoog ik een teller TickCount op.

Op andere plaatsen in het programma kun je dan de waarde van TickCount lezen, en bepalen of een bepaalde tijd al verstreken is.

code:

if( TickCount - StartTime >= 500 )
{
  StartTime = TickCount;
  ToggleLED();
}

Voor het aansturen van lampjes is één milliseconde meer of minder niet belangrijk.

Starttime heb je niet nodig.

code:

if( TickCount >= 500 )
{
  TickCount = 0;
  ToggleLED();
}
Van Lambiek wordt goede geuze gemaakt.
Arco

Special Member

Ik gebruik meestal een paar counters die ik af laat tellen in de timerinterrupt (die meestal op 1mS of 0.1mS draait)
je laadt de gewenste waarde in main() in en wacht tot 'ie weer nul is. (zero test is meestal veel minder werk voor de processor als 'vergelijken met')

code:



Interrupt:  
  If MyCounter1 Then Dec(MyCounter1) End If  
  If MyCounter2 Then Dec(MyCounter2) End If  
End Interrupt
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Klopt, maar met een enkele teller kan ik overal in een programma een timer starten, door de starttijd op te slaan. Die teller gebruik ik op talloze plaatsen, zoals voor transmit intervals en receive timeouts van CAN berichten, wat er tientallen kunnen zijn. Ik heb natuurlijk geen zin om tientallen tellers te gaan ophogen in de timer interrupt, en dat zou dan ook allemaal hardcoded worden, waar ik in ieder geval niet gelukkig van wordt.

In veel gevallen wordt het aflopen van de timer minder vaak gecontroleerd dan de timer interrupt uitgevoerd wordt, dus netto is het beter om die korter te houden. Daarbij zou die interrupt alle andere interrupts tegenhouden zolang hij bezig is, en ik hecht en boel waarde aan een lage latency voor mijn belangrijke realtime interrupts.

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

Special Member

Daarbij zou die interrupt alle andere interrupts tegenhouden zolang hij bezig is

Als je de timer interrupt een lagere priority geeft, heb je daar weinig last van...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Re-interruptable interrupts zijn niet perse een goed idee, daarmee trek je een heel nieuw blik wormen open. Het is ook niet nodig, ik hoef maar één tellertje op te hogen.

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