Pic 16f877a en serial verbinding

Ontwerpen en programmeren

Re: Pic 16f877a en serial verbinding

Postby nieuw 2 » Tue Mar 25, 2014 7:08 pm

Henk,

Wat ik zou doen. Een teller koppelen aan een interrupt ingang. Hier tel je het aantal pulsen. Normaal kan je deze interrupt zo configureren zodat deze alleen op een rising edge of een falling edge reageert. Als 2de een timer interrupt elke seconde. Tijdens deze interrupt lees je de teller in de interrupt uit en je bewaart deze waarde in een variabele die je gebruikt in je programma. Direct na het uitlezen zet je de interrupt teller op 0. Nu mag je programma in je PIC zo dikwijls doorlopen worden als je wil.

Ik hoop dat je deze uitleg begrijpt.
nieuw 2
 
Posts: 120
Joined: Thu Jan 02, 2014 3:28 pm

Re: Pic 16f877a en serial verbinding

Postby Henko1 » Wed Mar 26, 2014 6:34 am

nieuw 2 wrote:Henk,

Wat ik zou doen. Een teller koppelen aan een interrupt ingang. Hier tel je het aantal pulsen. Normaal kan je deze interrupt zo configureren zodat deze alleen op een rising edge of een falling edge reageert. Als 2de een timer interrupt elke seconde. Tijdens deze interrupt lees je de teller in de interrupt uit en je bewaart deze waarde in een variabele die je gebruikt in je programma. Direct na het uitlezen zet je de interrupt teller op 0. Nu mag je programma in je PIC zo dikwijls doorlopen worden als je wil.

Ik hoop dat je deze uitleg begrijpt.



Ik werk in Flowcode en rising edge of een falling edge kom ik niet tegen, daar wil ik wat meer over weten.
In Flowcode heb ik wel de mogelijkheid om een ingang te laten wachten totdat de puls hoog word, maar dat werkt niet omdat als de puls laag is omdat er geen wind is gebeurd er niets meer in de pic.
Stel nu dat het schijfje van de anemometer voor de opening voor de opto coupler staat en er is geen wind, dan is de puls hoog en zal de interrupt reageren en dat stop niet want er is geen wind.
Dus we hebben met twee situaties te maken waar we rekening mee moeten houden.

Rising edge of een falling edge is dan waarschijnlijk wat anders.
Kan jij mij daar iets meer over vertellen?
Hoe schrijf je dat in C?
Henko1
 
Posts: 13
Joined: Fri Mar 21, 2014 1:29 pm

Re: Pic 16f877a en serial verbinding

Postby nieuw 2 » Wed Mar 26, 2014 6:58 pm

Henk,

Flowcode is bij mij zeer lang geleden. Ik schrijf de code liever zelf.

Even terug Flowcode 3 opgezocht. Niet de meest recente maar het zou me verbazen als het een groot verschil is.

Je hebt een Interrupt (int) knop. Je kan dus aangeven dat flowcode moet rekening houden met een interrupt. Waar deze moet komen en hoe je dit gebruikt vind je wel op het flowcode forum. Dubbelklik je nu, dan kan je eigenschappen instellen zoals bij alle andere onderdelen. De radio button moet op enable staan. Interrupt on kies je RB0/INT, op deze pin sluit je nu je snelheidsmeter aan. Eigenschappen knop gebruiken en je krijgt de mogelijkheid te kiezen tussen rising edge en falling edge. Hoe je er verder mee omgaat vind je ook op het flowcode forum.

Wat het probleem is van jou werkwijze geef je zelf aan. Je zet je programma op pauze tot de ingang wijzigt. Hoe lang dit duurt weet je niet. De looptijd van je programma is dus ook direct afhankelijk van de windsnelheid. Niet alleen dat. Als je snelheid hoger wordt dan de loopsnelheid van je programma ga je pulsen missen. Ook dat wil je uiteraard niet. Daarom ga je interrupts gebruiken. Je programma wordt zeer kort onderbroken zodra er een interrupt is. Is dit 1 keer om het uur of 1 keer per minuut of 10 keer per seconde het maakt geen verschil. Je ingang wordt constant in het oog gehouden door een aparte en snelle routine. Met faling edge of rising edge geef je aan dat de interrupt gebeurd bij een neergaande flank of een stijgende flank. Het is de flank die belangrijk is en niet de duur van de puls.

In de interrupt routine doe je zo weinig als mogelijk omdat dit je programma even kort onderbreekt. Hoe meer er in de routine staat, hoe langer de onderbreking. Ideaal is het verhogen van een teller. Dit gaat razend snel. Bijvoorbeeld intIngang als variabele. Hoe groot deze variabele kan worden is afhankelijk van het aantal pulsen en duurtijd van de meting.

Omdat de duur van je programma kan variëren moet je er ook voor zorgen dat je timing voor je windmeter vrij nauwkeurig is en eigenlijk onafhankelijk van de lengte van je programma. Hoe je dit nu doet weet ik niet. Ideaal is een timer. Ook dit zit in de interrupt knop. Kies hier voor Timer0 Overflow. Ook daar weer wat uitleg.

Je snelheid is afhankelijk van het aantal pulsen en uiteraard van de correctheid van je tijd. Windsnelheid wordt dikwijls weergegeven in m/s of meter per seconde. Elke seconde zou dus een mooie en handig tijdsvenster zijn. We zorgen er dus voor dat we een timer instellen die elke seconde een timeroverflow veroorzaakt. Dit gebeurd dus ook onafhankelijk van je hoofdprogramma. Wat doe je tijdens deze interrupt? Je haalt de waarde uit de variabele die je ophoogt (intTeller zie het interrupt deel) in je interrupt deel. Je steekt de waarde in een variabele (bijv intPulsen) die je gaat gebruiken in je hoofdprogramma (main) op het ogenblik dat je de snelheid wil berekenen. Je maakt dan onmiddellijk de variabele intTeller leeg.

Hoe lang je main ook duurt, het heeft geen invloed meer op je snelheidsmeting en de windsnelheid heeft een minimale invloed op je programma.

Stel dat je main 0,2 seconde duurt en je tijdsvenster is 1 seconde. Ok geen probleem. Je vraagt gewoon 5 keer intPulsen op en deze is niet gewijzigd dus de snelheid blijft gelijk. Duurt je main net 1 seconde, dan heb je altijd een recente en veranderende waarde.

Ik hoop dat ik het wat duidelijker heb gemaakt.

edit: ik vermoed dat deze interrupts zo hoog mogelijk in je programma moeten staan. Zodat ze starten bij de initialisatie van de pic.

edit 2: blijkt dat de interrupts je main programma verstoren. Dan kan je dit nog oplossen. Disable de beide interrupts. Op het ogenblik dat jij het wil zet je de beide interrupts aan. Je laat je programma x-tijd wachten (WAIT). Heb je bijvoorbeeld een tijdsvenster van 1 seconde, laat je programma dan 1,2 seconde wachten. Disable de interrupts. Je hebt dan 1 keer de teller waarde opgevraagd en kan deze verwerken.
nieuw 2
 
Posts: 120
Joined: Thu Jan 02, 2014 3:28 pm

Re: Pic 16f877a en serial verbinding

Postby Henko1 » Wed Mar 26, 2014 7:58 pm

nieuw 2 wrote:Henk,

Flowcode is bij mij zeer lang geleden. Ik schrijf de code liever zelf.

Even terug Flowcode 3 opgezocht. Niet de meest recente maar het zou me verbazen als het een groot verschil is.

Je hebt een Interrupt (int) knop. Je kan dus aangeven dat flowcode moet rekening houden met een interrupt. Waar deze moet komen en hoe je dit gebruikt vind je wel op het flowcode forum. Dubbelklik je nu, dan kan je eigenschappen instellen zoals bij alle andere onderdelen. De radio button moet op enable staan. Interrupt on kies je RB0/INT, op deze pin sluit je nu je snelheidsmeter aan. Eigenschappen knop gebruiken en je krijgt de mogelijkheid te kiezen tussen rising edge en falling edge. Hoe je er verder mee omgaat vind je ook op het flowcode forum.

Wat het probleem is van jou werkwijze geef je zelf aan. Je zet je programma op pauze tot de ingang wijzigt. Hoe lang dit duurt weet je niet. De looptijd van je programma is dus ook direct afhankelijk van de windsnelheid. Niet alleen dat. Als je snelheid hoger wordt dan de loopsnelheid van je programma ga je pulsen missen. Ook dat wil je uiteraard niet. Daarom ga je interrupts gebruiken. Je programma wordt zeer kort onderbroken zodra er een interrupt is. Is dit 1 keer om het uur of 1 keer per minuut of 10 keer per seconde het maakt geen verschil. Je ingang wordt constant in het oog gehouden door een aparte en snelle routine. Met faling edge of rising edge geef je aan dat de interrupt gebeurd bij een neergaande flank of een stijgende flank. Het is de flank die belangrijk is en niet de duur van de puls.

In de interrupt routine doe je zo weinig als mogelijk omdat dit je programma even kort onderbreekt. Hoe meer er in de routine staat, hoe langer de onderbreking. Ideaal is het verhogen van een teller. Dit gaat razend snel. Bijvoorbeeld intIngang als variabele. Hoe groot deze variabele kan worden is afhankelijk van het aantal pulsen en duurtijd van de meting.

Omdat de duur van je programma kan variëren moet je er ook voor zorgen dat je timing voor je windmeter vrij nauwkeurig is en eigenlijk onafhankelijk van de lengte van je programma. Hoe je dit nu doet weet ik niet. Ideaal is een timer. Ook dit zit in de interrupt knop. Kies hier voor Timer0 Overflow. Ook daar weer wat uitleg.

Je snelheid is afhankelijk van het aantal pulsen en uiteraard van de correctheid van je tijd. Windsnelheid wordt dikwijls weergegeven in m/s of meter per seconde. Elke seconde zou dus een mooie en handig tijdsvenster zijn. We zorgen er dus voor dat we een timer instellen die elke seconde een timeroverflow veroorzaakt. Dit gebeurd dus ook onafhankelijk van je hoofdprogramma. Wat doe je tijdens deze interrupt? Je haalt de waarde uit de variabele die je ophoogt (intTeller zie het interrupt deel) in je interrupt deel. Je steekt de waarde in een variabele (bijv intPulsen) die je gaat gebruiken in je hoofdprogramma (main) op het ogenblik dat je de snelheid wil berekenen. Je maakt dan onmiddellijk de variabele intTeller leeg.

Hoe lang je main ook duurt, het heeft geen invloed meer op je snelheidsmeting en de windsnelheid heeft een minimale invloed op je programma.

Stel dat je main 0,2 seconde duurt en je tijdsvenster is 1 seconde. Ok geen probleem. Je vraagt gewoon 5 keer intPulsen op en deze is niet gewijzigd dus de snelheid blijft gelijk. Duurt je main net 1 seconde, dan heb je altijd een recente en veranderende waarde.

Ik hoop dat ik het wat duidelijker heb gemaakt.

edit: ik vermoed dat deze interrupts zo hoog mogelijk in je programma moeten staan. Zodat ze starten bij de initialisatie van de pic.

edit 2: blijkt dat de interrupts je main programma verstoren. Dan kan je dit nog oplossen. Disable de beide interrupts. Op het ogenblik dat jij het wil zet je de beide interrupts aan. Je laat je programma x-tijd wachten (WAIT). Heb je bijvoorbeeld een tijdsvenster van 1 seconde, laat je programma dan 1,2 seconde wachten. Disable de interrupts. Je hebt dan 1 keer de teller waarde opgevraagd en kan deze verwerken.


Ok nieuw,
Het word nu een stukkie duidelijker. Hier ga ik mee aan de slag. Kijk ik heb niet zoveel tijd voor mijn hobby en ik zou het wel willen leren om de code zelf te schrijven maar tijd is bij mij zeer weinig aanwezig. Dank voor je uitleg.
Henko1
 
Posts: 13
Joined: Fri Mar 21, 2014 1:29 pm

Re: Pic 16f877a en serial verbinding

Postby willi4711 » Mon Jan 05, 2015 8:49 am

Als dat zo is kun je de data uit een register halen.
willi4711
 
Posts: 1
Joined: Mon Jan 05, 2015 5:32 am

Previous

Return to Microcontrollers

Who is online

Users browsing this forum: No registered users and 2 guests