Dynamische pulsen met Timer1

Arduino specifieke Software
Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Dynamische pulsen met Timer1

Berichtdoor Koepel » 04 Aug 2017, 01:16

Ik heb nog steeds geen flauw idee what het OpenTherm protocol is. Hoeveel bits ? Welke bitrate ? Hoe vaak die puls-trein per seconde ? Jij gebruikt 32 µs, maar ik heb dus geen idee hoe je daar aan komt.

De 'cli' in de interrupt is niet nodig. Dit is een eenvoudig 8-bit AVR chip. Normaal gesproken komt er in een ISR geen andere ISR doorheen.

Een ISR duurt al 3 µs (https://gammon.com.au/interrupts), de regel met digitalRead() en digitalWrite() duurt 9 µs. Dus je bent al 12 µs kwijt. Dit is dus richting de grens van wat de ATmega aan kan.

Het zetten van OCR1A op 1 is een risico. Als de teller daar voorbij schiet, dan draait de teller eerst helemaal door.
Met een aantal aanpassen krijg ik het werkend als OCR1A zo rond de 20 of 50 wordt gezet. Met werkend bedoel ik dat de timer wordt gestart en bij de eerste ISR wordt gestopt. Bij een lagere waarde gaat de teller eerst naar 0xFFFF tellen. Probeer maar eens 0xFFFF in te vullen voor OCR1A, dan krijg je hetzelfde.

Aangezien je richting de grens gaat van wat de ATmega kan, en ik niet begrijp hoe aan 32 µs komt, zie ik nog niet hoe dit goed kan komen. Kun je een tekening maken van de puls-trein die je wilt gaan maken ? (met de tijden er bij).

Advertisement

Berichten: 11
Geregistreerd: 11 Jan 2014, 12:38

Re: Dynamische pulsen met Timer1

Berichtdoor liemstra » 04 Aug 2017, 20:40

@koepel: DANK voor het 'door-chatten' ... 'heb nu een doorbraak dankzij jouw vragen, commentaren en opmerkingen!

'Doorbraak' is dat ik het "1,049s" probleem gevonden heb. Het kwam doordat ik de 'grenzen' vd timer aan t onderzoeken was: vandaar die OCR1A waarde van "1", en ook "65535", geprobeerd in het kader van 'tis-toch-een-16bit-timer' ..., moet kunnen.
Nou nee dus. Je opmerkingen brachten mij op een ander zoekpad:

1. De waarde van 1,049s is, na wat rekenwerk, te corresponderen met een OCR1A waarde van '65535' ofwel, idd, jouw '0xFFFF'!

2. Verder blijkt het dus zo te zijn dat er een 'overhead delta' is van ±59µs. Dit is een constante! Ik kan de code hiervoor dus compenseren. Tegelijkertijd werkt dit overhead als een soort 'ondergrens' - een tijd lager dan dit kiezen (bv die '32µs') kan dus niet! In mijn geval heb ik dus te maken met een minimale-OCR1A van '4' (A-mega-16MHz, Prescale-256).
Raadsel (voor mij) is dus opgelost! Let wel, in een ander setting kan deze ondergrens een ander waarde hebben.

3. Ik zal je de 'pulstrein-tekening' besparen .. ;-) Ik kan nu weer verder klussen.
Om toch je vragen tav OT-protocol enigszins te beantwoorden kan ik je de volgende link geven:
http://www.palebluedot.nl/jml/index.php ... enthermmon

Schijnt dat nieuwe CV ketels hiermee uitgerust zijn ... .

Nogmaals, dank voor het meedenken (ook @shooter)!
grtn, L.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Dynamische pulsen met Timer1

Berichtdoor Koepel » 05 Aug 2017, 03:39

Die link die je gaf gaat volgens mij nog steeds over een bitrate van 1000 per seconde. Dus een eventuele wijziging van het signaal iedere 500 µs. Ik kan nergens vinden dat er iets nieuws zou zijn met 32 µs. Dus dat blijft nog een groot mysterie voor mij.

Ben je bereid af te stappen van je idee om steeds opnieuw de tijd in te stellen ?

Volgens mij zijn er twee goede mogelijkheden:
1) Een interrupt met 500 µs en daar binnen het protocol verwerken. Dat is wat shooter meteen al schreef en dat is het voorbeeld van OT_encoder (https://github.com/amvv/ArduinoOpenTherm/tree/master/OT_encoder) dat ik gaf.
2) De puls-trein er uit gooien met digitalWrite() en delayMicroseconds(). Eventueel de interrupts uitzetten.

Kun je een schema laten zien hoe je het met de Arduino gaat verbinden ?

Berichten: 11
Geregistreerd: 11 Jan 2014, 12:38

Re: Dynamische pulsen met Timer1

Berichtdoor liemstra » 05 Aug 2017, 17:08

# "32µs": Dit heeft helemaal niets te maken met OT. Dit getal kwam tot stand tijdens mijn zoektocht in de registers van de Timers. Gedachtengang is: Timer1 is een 16-bitter, dus met een minimale OCR1A waarde van "1" en een maximale van "65535" moet het kunnen werken.
Na wat rekenwerk levert de waarde "1" een T van 32µs, bij een f=16MHz en Prescaler=256.
Dit was wat ik tracht te construeren, niet wetende (toen) dat er een soort 'overhead' tijd van ca. 59µs meespeelde ..., dus kan het niet.
Het was dus meer een theoretische zoek-experiment en heeft niets te maken met het OT protocol.

# Jouw suggestie (en shooter) zijn waardevolle ideëen. De OT_encoder ditto. Echter, op dit moment is het niet direkt bruikbaar vanwege het volgende: het projekt waar ik (met anderen) mee bezig ben behelst het werken met het OT protocol maar niét voor de Arduino's. We werken met een ander device: "Wemos" en wel de "Wemos D1 Mini Pro-ESP8266". Het zijn hele leuke ieniemini computertjes. Dit stukje HW wordt door een ander projektlid gedaan. Lastigheid is dat er geen vrije Timers ter beschikking is bij dit device.
Vandaar dat ik met dit stuk simulatiecode bezig ben op een A-Mega, uitsluitend om het Manchester deel te kunnen simuleren/debuggen tenbehoeve van de nog te maken code voor de Wemos die dan zonder een Timer moet kunnen werken.
Het is dus een zeer toepassingsgerichte stukje code.

# 'Ben niet zo'n voorstander van het werken met 'delay' .. alle andere codedelen staan dan stil.

Nogmaals: dank voor jullie medewerking! ;-))

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Dynamische pulsen met Timer1

Berichtdoor Koepel » 05 Aug 2017, 18:36

Meng dit http://xyproblem.info/ met dit https://nl.wikipedia.org/wiki/Odyssee en dan krijg je waar jij mee bezig bent :o

Neem een variabele of een tabel met gegevens; maak de manchester code; en print de manchester code naar de serial monitor.
De volgende stap zou kunnen zijn om dat naar een pin te schrijven, en met een logic analyzer op te nemen.
De timing kan dan gewoon met delayMicroseconds() en zet de interrupts niet uit, maar laat de interrupts gewoon doorlopen.
Dat lijkt me de meest directe manier om de manchester code uit te testen.

Berichten: 11
Geregistreerd: 11 Jan 2014, 12:38

Re: Dynamische pulsen met Timer1

Berichtdoor liemstra » 06 Aug 2017, 00:32

@koepel:
Dank voor de Wijze Lessen!

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Dynamische pulsen met Timer1

Berichtdoor Gij Kieken » 10 Aug 2017, 18:15

Hi liemstra,
Als je wat wil knutselen met vertragingen die korter zijn dan micros() kun je ook overwegen om inline asembler toe te passen.
b.v. __asm__("nop\n" "nop\n" )

Vorige

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Alexduh en 15 gasten