Shock Media

Navigatie

10 interrupt pinnen nodig - PIC

Forum > Schoolvragen > 10 interrupt pinnen nodig - PIC << Vorige | 1 | 2 | 3 | Volgende >>
Naam Bericht
ThieuV

Oké ga dan even moeten de scoop boven halen. Maar moet straks naar een feest. Dus gaat waarschijnlijk niet meer voor vandaag zijn.

Ik ga jullie dit zo rap mogelijk laten weten!
Videomodulator
Golden Member

Ik zie in de datasheet dat je een duty-cycle van ~50% hebt, dus even lang laag als hoog (vergeet de pull-up niet!). Maximale flow is 0.5194 l/s, en je hebt 1925 pulsen per liter ==> maximale pulsfrequentie is ongeveer 1000Hz, 1KHz.
Je gebruikt een 18F PIC, die kan tot 48MHz, de instructie-klok is dan 12MHz ==> er worden 12000 instucties uitgevoerd in 1 pulstijd (op zijn max van 1kHz).

Samengevat: maximale frequentie uit de flowmeters is 1kHz (50% duty-cycle), de Nyquist-frequentie is dan 2kHz, dus als je wil pollen moet je elke 6000 instructies alle flow-sensoren minimaal 1 keer bekijken, dat is ruim voldoende tijd (en dat is bij 0,5l/s flow, wat echt veel is).

Een voor een doseren is volgens mij het eenvoudigste. Je kijkt welke cocktail geselecteerd is, kijkt hoeveel van drank1 er nodig is, >0 dan klep1 open en tellen tot hoeveelheid is bereikt, klep1 toe. Dan kijken hoeveel van drank2 er nodig is, >0 dan klep2 open en tellen tot hoeveelheid is bereikt, klep2 toe, en zo aflopen tot drank10.
[Bericht gewijzigd door Videomodulator op 10 augustus 2008 12:20:54]
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
ThieuV

Ga denk ik daar ook mee beginnen. Kan dan nog altijd uitbreiden naar een aantal dranken ter gelijkertijd.

Hoe hang ik dan best alle flowsensors aan mijn controller via interrupts of poll
en?
[Bericht gewijzigd door ThieuV op 10 augustus 2008 21:00:11]
bprosman

Zo iets dergelijks heb ik ooit eens gemaakt op de volgende manier :

Allereerst werden de recepten samengesteld en opgeslagen, bijvoorbeeld :

Coctail A.
100 Eenheden Product A
200 Eenheden Product B
50 Eenheden Product C maar mag pas NA Product B.

De "eenheden" kun je adh van de doorstroomsnelheid omzetten in tijdseenheden.

Dit resulteerd in :
Start Product A = 0 , Eind Product A = 100
Start Product B = 0 , Eind Product B = 200
Start Product C = 200, Eind Product C = 250.

Start een hoofdlus die loop van 0 tot de langste tijd (250).
Bepaal nu in de hoofdlus de status van de kleppen.
0 > tijd < 100 = Product A open.
0 > tijd < 200 = Product B open.
200 > tijd < 250 = Product C open.

De grootste truc zat m in het samenstellen van de recepten en het omrekenen van hoeveelheid drank -> Tijdseenheid.
Niet gewerkt met flowsensors maar met magneetventieltjes. Experimenten hadden namelijk uitgewezen dat de doorstroomsnelheid behoorlijk constant was, nauwkeuriger dan een "handgemixte" coctail. flowsensors was dus een beetje overkill en ook wat moeilijker met reinigen.

Zat wel een "kijkglas moet vol zijn" sensor op voor als er een bepalde drank echt op was.

Groeten, Bram
[Bericht gewijzigd door bprosman op 10 augustus 2008 21:16:39]
De jongere generatie loopt veel te vaak zijn PIC achterna.
ThieuV

Is al eens gemaakt in mijn school als eindwerk. En mijn leerkracht vond dat een beetje foefelen. Daarom wil ze het nu zo wat uitbreiden en metingen doen via flowsensors. Dit hebben ze zelfs ergens gemaakt volledig met relais...
High met Henk
Honourable Member

ben ik nu heel achterlijk: maar normaliter neem je dus 1 interrupt pin en knoop je alle interrupts eraan via een OR gate

als je dan de 10 pinnen ook aan de normale I/O knoopt lees je in de interrutp gewoon uit welke pinnen je moet handelen..
to al newbies: RTFM/D of google eens (p.s. RTFM/D = Read the f*cking manual/datasheet). Mijn werk is pure p0rno: ik ben Professioneel bitneuker
bprosman

quote:
En mijn leerkracht vond dat een beetje foefelen.
Gelukkig een leerkracht met praktijkervaring . Misschien heeft ie gelijk, de door mij beschreven manier was geen eindwerk maar wordt toegepast door een commercieel bedrijf uit Breda en staan oa opgesteld bij Holland Casino. Let op het reinigingsaspect.

quote:
1 interrupt pin en knoop je alle interrupts eraan via een OR gate
Inderdaad en op het moment dat de interrupt komt heb je nog tijd genoeg om uit te vinden WIE van de 10 de interrupt veroorzaakt heeft, tenminste, in de 8051 wereld , vanwege de lage interrupt latency. De rest kan ik niet over oordelen.

Groeten, Bram
[Bericht gewijzigd door bprosman op 10 augustus 2008 21:30:03]
De jongere generatie loopt veel te vaak zijn PIC achterna.
flipflop

Dat ORen gaat niet zo goed omdat de pulsen niet gelatched zijn. Je gaat dus 10 verschillende blokgolven bij elkaar mixen en dat geeft een zootje. Teken de tijdvolgorde maar eens.
Gewoon pollen en een flankdetectie programmeren. Dan ben je onafhankelijk van de pulsduur en kijk je puur naar de frequentie. TS, Videomod rekent het je compleet voor, en nog vraag je of je een irq nodig hebt. Nog maar eens lezen?
if (rst='1') then d <= '1' elsif (clk'event and clk='1') then d <= data end if;
bprosman

quote:
Dat ORen gaat niet zo goed omdat de pulsen niet gelatched zijn. Je gaat dus 10 verschillende blokgolven bij elkaar mixen en dat geeft een zootje. Teken de tijdvolgorde maar eens.
Je kunt toch de uitgangen van de flowsensors op 8 "gewone" I/O ingangen aansluiten en ze dan vervolgens OR-en naar 1 interrupt pin. Dus als er een interrupt gegenereerd wordt kun je op je 8 ingangen kijken wie de "dader" was. Videomod toont met zn berekening ook aan dat latchen niet nodig is. De signalen "OR-en" naar 1 INT wil niet zeggen dat je de signalen ook moet "mixen".
[Bericht gewijzigd door bprosman op 10 augustus 2008 22:48:07]
De jongere generatie loopt veel te vaak zijn PIC achterna.
High met Henk
Honourable Member

idd &#180;t lijkt mij vaag dat de interrupt routine langer nodig heeft om de puls uit te lezen.... dan zijn de pulsjes haast onvolgbaar klein...

je kunt dan natuurlijk nog idd latchen, maar latches moet je weer resetten...
dat is weer een extra pin.
to al newbies: RTFM/D of google eens (p.s. RTFM/D = Read the f*cking manual/datasheet). Mijn werk is pure p0rno: ik ben Professioneel bitneuker
flipflop

quote:
Op 10 augustus 2008 22:46:37 schreef bprosman:
[...]Je kunt toch de uitgangen van de flowsensors op 8 "gewone" I/O ingangen aansluiten en ze dan vervolgens OR-en naar 1 interrupt pin.

OR-en is in mijn ogen ook een vorm van mixen. Je gooit alles op een hoop. Inderdaad kan het door gewoon na een irq te kijken welke puls veranderd is. Simpel OR-en is dus niet genoeg. Even een tekeningetje:
code:
    _____
___|     |____
      _____
  ___|     |____
    _______
OR_|       |____
     ^


Twee signalen van de sensoren, en het ORed signaal. Je krijgt ten eerste al geen irq bij de 2e puls. Als dat wel zo zou zijn (bij het pijltje dus), dan zie je nog niet welk signaal de verandering teweeg brengt want ze zijn allebei hoog. Moet je het alsnog in SW gaan bijhouden.
Wat in de FPGA/ASIC wereld veel gebeurd is dat elk signaal een flipflop heeft die geset wordt op een flank (bv posedge in dit voorbeeld). Als die gelatchte signalen kun je wel ORen. Als de OR actief is, genereer je een irq. CPU gaat kijken welke actief zijn en reset daarna de betreffende FF, of meerdere.
Dan werkt het wel. In het geval van TS zou ik gewoon pollen, da's snel genoeg. En alleen reageren bij een flank (je moet dus de oude stand wel bijhouden).
if (rst='1') then d <= '1' elsif (clk'event and clk='1') then d <= data end if;
bprosman

quote:
Als de OR actief is, genereer je een irq. CPU gaat kijken welke actief zijn
Tja dat zeg ik (vrij naar Maarten Waardenberg )

quote:
OR-en is in mijn ogen ook een vorm van mixen. Je gooit alles op een hoop.
Je OR'ed alleen de signalen om een int te genereren NIET om de signalen uit te lezen, dat doe je apart.

Groeten, Bram
[Bericht gewijzigd door bprosman op 11 augustus 2008 10:35:53]
De jongere generatie loopt veel te vaak zijn PIC achterna.
High met Henk
Honourable Member

klopt idd FF, maar dit is alleen als de pulsen overlappen idd.

ik zou zelf in de ISR alle ingangen checken voor een actief signaal. Nadeel is dat als je bijv eerst int 0 en dan 1 en dan 2 uitleest en int 2 is actief en terwijl je int2 handelt komt int 0 actief. die mis je dan: kun je oplossen door de IR flag te resetten (als dat niet automatisch gebeurt) als je de ISR ingaat, zodat hij meteen na de eerste ISR opnieuw de ISR ingaat
to al newbies: RTFM/D of google eens (p.s. RTFM/D = Read the f*cking manual/datasheet). Mijn werk is pure p0rno: ik ben Professioneel bitneuker
flipflop

quote:
Op 11 augustus 2008 10:43:09 schreef High met Henk:
klopt idd FF, maar dit is alleen als de pulsen overlappen idd.

Dat is igv TS per definitie zo. Er wordt tegelijkertijd gedoseerd en gemeten door onafhankelijke sensoren. Zelfs al je hele korte pulsen hebt, gaat dat volgens Murphy ook fout.
if (rst='1') then d <= '1' elsif (clk'event and clk='1') then d <= data end if;
ThieuV

quote:
Op 11 augustus 2008 17:59:34 schreef flipflop:
[...]
Er wordt tegelijkertijd gedoseerd en gemeten door onafhankelijke sensoren.


Ik zou beginnen met drank per drank en dan eventueel nog uitbreiden. Natuurlijk als alles in een keer kan dat men kan kiezen 1 per 1 of alles door een, zou dit perfect zijn!

Dus even samenvatten.
Voorstel 1: Alles aan I/O's en dan alles nog eens via of-poorten aan de interrupt pen. Dan kijken welke sensor het is. Dit is dan waarschijnlijk het pollen dat men zegt?

Dit voorstel is niet zo optimaal.

Pollen is eigenlijk op alle mogelijk tijdstippen dat er een puls kan zijn kijken de ingang een logisch 1 geeft?

Ik ga maar ten vroegste vrijdag kunnen kijken om even met de scoop te meten op de sensor. Denk dat we dan al heel wat wijzer worden
flipflop

Als je polling gebruikt heb je helemaal geen irq nodig. Je kijkt gewoon regelmatig of het signaal actief is. Uiteraard vaak genoeg kijken. Wat genoeg is hangt af van de max frequentie van de sensor.
Dat OR-en van de signalen voor een irq gaat niet goed als je signalen eruit zien zoals ik hierboven liet zien.
if (rst='1') then d <= '1' elsif (clk'event and clk='1') then d <= data end if;
High met Henk
Honourable Member

@FF dan geld het verhaal wat eronder staat nog steeds trouwens.....
to al newbies: RTFM/D of google eens (p.s. RTFM/D = Read the f*cking manual/datasheet). Mijn werk is pure p0rno: ik ben Professioneel bitneuker
WilToyo
Golden Member

Mij lijkt het het handigste om alle sensoren één voor één af te lopen met een timer. Gewoon het aantal pulsen tellen in x tijd. Je kunt het af met één of twee timers door de sensoren met een and-poortje en een enable-lijntje uit te rusten.
Volgens mij als je de sample-tijd van de timers goed kiest, heb je tijd zat om alle sensoren uit lezen.
[Bericht gewijzigd door WilToyo op 11 augustus 2008 22:44:17]
Videomodulator
Golden Member

quote:
Op 11 augustus 2008 21:06:23 schreef ThieuV:
[...]Pollen is eigenlijk op alle mogelijk tijdstippen dat er een puls kan zijn kijken de ingang een logisch 1 geeft?
Neen, in je programma weet je niet wanneer de puls zal/kan komen. Bij pollen ga je het bekijken van de ingangen opnemen in de main-lus van je programma, waarin al je andere niet-interrupted zaken in staan (bijvoorbeeld de kleppen aansturen, LCDtje aansturen,...).
Pollen kan dus maar goed gebeuren als je polling-frequentie (het aantal keren kijken naar de gepollde ingangen per seconde) voldoende groter is dan de maximale ingangsfrequentie.
quote:
Ik ga maar ten vroegste vrijdag kunnen kijken om even met de scoop te meten op de sensor. Denk dat we dan al heel wat wijzer worden
Ik denk het eigenlijk niet. Het is een gezonde mentaliteit om mij (of enige andere) niet klakkeloos te geloven, maar ik neem toch aan dat grote fouten in mijn berekening al gezien zouden zijn.
Dus: ik voorspel dat je een blokgolf zal meten met een frequentie lager dan 1 kHz en met 50% duty-cycle. Controleer de dender ("contact bounce" of "switch bounce", zie google) mss is een simpele RC filter nodig om het signaal netjes te krijgen.
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
ThieuV

Sensor even aangesloten zoals in de datasheet. Tussen de signaal lijn en de + 4k7, tussen signaal lijn en - 100nf.

Scoop aan gehangen nu krijg ik, met mijn huidige opstelling ongeveer om de 100ms een puls met duty-cycle van 50%. Dus is de frequentie 5Hz zeker? Ben aan het twijfelen, formule is 1/T = F dus 1/0.2.

Het kan zijn dat we dit nog sneller laten lopen. Het signaal is wel niet onmiddelijk mooi 5V. Maar ga de scoop afbeelding nog eens op het forum zetten dan.

Ik weet wel wat dender is hoor. Sommige termen ken ik nog niet. Ga nu naar men 2de jaar industriele ict.
bprosman

quote:
Het signaal is wel niet onmiddelijk mooi 5V.
Schmitt-triggertje dr tussen.

5 Hz, kun je gewoon pollen dus met een langzame PIC, heb je geeneens een echte (8051 Core) processor voor nodig

Groeten, Bram
[Bericht gewijzigd door bprosman op 15 augustus 2008 12:51:04]
De jongere generatie loopt veel te vaak zijn PIC achterna.
ThieuV

En stel nu dat ik het signaal toch 100Hz krijg is pollen dan nog mogelijk?
SparkyGSX

Je kunt het gemakkelijk pollen tot een frequentie van een paar kHz. Daarboven gaat ook nog wel, maar dan moet je heel strak en slim gaan programmeren (een AVR op 16MHz kan 100kHz nog volgen, maar wel met veel moeite).

Je zou het ingewikkeld kunnen maken door hardwarematig flanken te gaan tellen en zo, maar dat lijkt me een beetje zinloos in deze situatie.

Persoonlijk zou ik het pollen niet in de main loop doen, maar in een timer interrupt die je op ruimschoots meer dan 2x de maximaal te tellen frequentie laat lopen. Theoretisch is precies 2x voldoende, maar als de pulsbreedte nu eens niet precies 50% is, of de controller even in een andere interrupt routine zit zou het sporadisch fout kunnen gaan.

Als je in de timer interrupt de status van de ingangen opslaat (gewoon de port uitlezen, masker er overheen voor de flowsensors, en dat in een statische variabele opslaan), en XOR't met de status van de vorige keer, heb je hoog bitje op de plaatsen waar de ingang veranderd is. Die veranderingen tel je vervolgens. Dit heeft als voordat dat je het aantal flanken telt, en de resolutie daarmee ook 2 keer zo hoog is als wanneer je het aantal pulsjes direct telt.
Videomodulator
Golden Member

quote:
Op 15 augustus 2008 13:37:58 schreef ThieuV:
En stel nu dat ik het signaal toch 100Hz krijg is pollen dan nog mogelijk?
Kijk eens naar mijn berekeningen, je kan er binnen de 5 seconden mee berekenen hoeveel instructies je in jou situatie hebt tussen 2 keer pollen. Met een instuctie of 1000 tussen 2 keer pollen kom je zeker toe... reken en tel eens zelf!
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
BobbyT

quote:
Op 10 augustus 2008 12:17:23 schreef Videomodulator:
Maximale flow is 0.5194 l/s, en je hebt 1925 pulsen per liter ==> maximale pulsfrequentie is ongeveer 1000Hz, 1KHz.


Weet zo even niet wat g/pulse betekent maar ik zie bij de maximale flow iets anders staan. 0.5692 L/min. Daardoor is je maximale pulsfrequentie een heel stuk lager, wat de polling ten goede komt.

Of ik doe iets verkeerds..
Zoeken in topic << Vorige | 1 | 2 | 3 | Volgende >>