2x interrupt werkt niet

trix

Golden Member

ik kom er niet uit :(
op een of andere manier krijg ik het niet voor elkaar, wellicht gebruik ik een verkeerde methode.
terwijl ik voor af dacht......appeltje...eitje.
ik heb even een nieuw tekeningentje gemaakt met wat ik nou uiteindelijk moet hebben. bovenstaande tekening was meer om te testen en die 500 mS was bedoeld zodat ik de boel met het blote oog kon volgen.
elke LED zit op een eigen uit gang (portB, portA en portC).

eigenwijs = ook wijs

Je moet die 38kHz wegdenken, dat is de draaggolf, het enige wat telt is hoe je die moduleert.
Die 38kHz wordt door de ontvanger teniet gedaan.


if (pulse_train == 1)	{PORTB = (khz_train & 1);}
if (pulse_train == 2)	{PORTB = (khz_train & 2);}
if (pulse_train == 3)	{PORTB = (khz_train & 4);}
if (pulse_train == 4)	{PORTB = (khz_train & 8);}
if (pulse_train == 5)	{PORTB = (khz_train & 16);}
if (pulse_train == 6)	{PORTB = (khz_train & 32);}
if (pulse_train == 7)	{PORTB = (khz_train & 64);}
if (pulse_train == 8)	{PORTB = (khz_train & 128);

Als je in uw voorbeeld de khz_train variabele verstuurt a 38kHz dan krijg je in elk van de 8 gevallen aan de ontvangstkant 1 puls, het resultaat is dus gelijk.
Maw. de ontvanger ziet wel dat er een bit ontbreekt zal u niet kunnen zeggen in welke positie, hij zal dus in alle gevallen een puls geven.

Zolang je geen gelijklopende timer lopen hebt aan zend- en ontvangstzijde kun je serieel geen data verzenden anders moet je de clock meesturen zoals in SPI mode.
Je kunt ook elke led een adres geven maar dat is nog meer programmeerwerk.

LDmicro user.
Arco

Special Member

Of zoals gezegd een 'leader' sturen (van bijv. 80 x '1' pulsje) als synchronisatie. Zender en ontvanger moeten dan wel redelijk gelijk lopen qua frequentie...
Je kunt als modulatie bijv. ook iets als Manchester NRZ gebruiken...

[Bericht gewijzigd door Arco op zaterdag 28 maart 2020 11:49:06 (18%)

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

Golden Member

Op 28 maart 2020 11:42:31 schreef MGP:
Je moet die 38kHz wegdenken, dat is de draaggolf, het enige wat telt is hoe je die moduleert.
Die 38kHz wordt door de ontvanger teniet gedaan.

volgens mij ben je (en arco) al een stap verder dan ik, op dit moment doe ik nog helemaal niks met de ontvangers. ik krijg die pulstrein zoals op mijn plaatje al niet voor elkaar. kan je die ook niet weg denken :)

eigenwijs = ook wijs

Kun je eens een tekening maken hoe je het ziet om de kHz_train te verzenden, ik begrijp het niet omdat je PORTB hierbij gebruikt, dat zijn dus 8 kanalen ??

LDmicro user.
Arco

Special Member

De clock (of pulstrein zoals je 'm noemt) is toch simpel: 1 timer starten op 76kHz en bij ieder interrupt de output togglen...
(en die kun je eventueel per 4mS aan of uit zetten)

[Bericht gewijzigd door Arco op zaterdag 28 maart 2020 12:11:11 (17%)

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

Golden Member

excuus voor de late reactie, ik moest na het eten mee monopolien (dat bordspel), zoontje is al de hele week thuis natuurlijk, dan kan je niet continu in de schuur zitten, al zou ik dat wel willen :)

Op 28 maart 2020 12:05:25 schreef MGP:
Kun je eens een tekening maken hoe je het ziet om de kHz_train te verzenden, ik begrijp het niet omdat je PORTB hierbij gebruikt, dat zijn dus 8 kanalen ??

ik kan het denk ik niet duidelijker tekenen als dat tekeningetje van hierboven. dat is wat het moet zijn.

- inderdaad portB zijn 8x uitgangen (straks komt er ook nog portB & portC bij dan dus totaal 24x uitgangen)
- die 8x uitgang worden 1 voor 1 aangestuurd. eerst 1 dan 2 dan 3 enz. enz.
en zijn dan 4 mS hoog.
- in die 4mS word het 38 kHz signaal uit gezonden.

dat stukje code dat je quote is gewoon zo'n looplicht.

eigenwijs = ook wijs
trix

Golden Member

Op 28 maart 2020 12:08:03 schreef Arco:
De clock (of pulstrein zoals je 'm noemt) is toch simpel: 1 timer starten op 76kHz en bij ieder interrupt de output togglen...
(en die kun je eventueel per 4mS aan of uit zetten)

hoe kom je aan die 76 kHz ?
snap het al,.....toggelen.

allemaal bedankt trouwens voor de reacties.

eigenwijs = ook wijs

Zou je dan niet beter schrijven naar elke IO apart ipv een AND uit te voeren op de volledige poort want dat is geen looplicht.
Als bv. bit0 eenmaal op 0 staat kun je met uw AND functie die nooit meer op 1 zetten.

Maak 8 variabelen per PORTB.0 ...7 poort met de figuur die je wilt en schuif die naar buiten.
var.0 = b00110011
var.1 = b10101010

enz...

LDmicro user.
trix

Golden Member


if (pulse_train == 1)	{PORTB = (khz_train & 1);}
if (pulse_train == 2)	{PORTB = (khz_train & 2);}
if (pulse_train == 3)	{PORTB = (khz_train & 4);}
if (pulse_train == 4)	{PORTB = (khz_train & 8);}
if (pulse_train == 5)	{PORTB = (khz_train & 16);}
if (pulse_train == 6)	{PORTB = (khz_train & 32);}
if (pulse_train == 7)	{PORTB = (khz_train & 64);}
if (pulse_train == 8)	{PORTB = (khz_train & 128);

dit kan je toch vertalen naar:


if (pulse_train == 1)	{PORTB = (khz_train & 0b00000001);}
if (pulse_train == 2)	{PORTB = (khz_train & 0b00000010);}
if (pulse_train == 3)	{PORTB = (khz_train & 0b00000100);}
if (pulse_train == 4)	{PORTB = (khz_train & 0b00001000);}
if (pulse_train == 5)	{PORTB = (khz_train & 0b00010000);}
if (pulse_train == 6)	{PORTB = (khz_train & 0b00100000);}
if (pulse_train == 7)	{PORTB = (khz_train & 0b01000000);}
if (pulse_train == 8)	{PORTB = (khz_train & 0b10000000);}
eigenwijs = ook wijs
trix

Golden Member

maar ik hoor graag hoe ik het beter kan doen, want wat ik doe gaat op een of andere manier niet.

eigenwijs = ook wijs
if (pulse_train == 1)	{PORTB = (khz_train & 0b00000001);}

Vertalen ja maar die 1 heeft enkel betrekking op PORTB.0
De uitgang op PORTB.0 is dan 1 en hoe ga je daar een 0 van maken?

LDmicro user.
trix

Golden Member


if (pulse_train == 2)	{PORTB = (khz_train & 0b00000010);}

dan overschrijft hij hem toch met een "0"

eigenwijs = ook wijs

Op 28 maart 2020 16:22:23 schreef trix:


if (pulse_train == 1)	{PORTB = (khz_train & 1);}
if (pulse_train == 2)	{PORTB = (khz_train & 2);}
if (pulse_train == 3)	{PORTB = (khz_train & 4);}
if (pulse_train == 4)	{PORTB = (khz_train & 8);}
if (pulse_train == 5)	{PORTB = (khz_train & 16);}
if (pulse_train == 6)	{PORTB = (khz_train & 32);}
if (pulse_train == 7)	{PORTB = (khz_train & 64);}
if (pulse_train == 8)	{PORTB = (khz_train & 128);

dit kan je toch vertalen naar:

Ik weet niet wat dit moet doen, maar de code is equivalent met:

// aanname: pulse_train zit in 1 t/m 8: 
   PORTB = khz_train & (1 << (pulse_train-1));
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
trix

Golden Member

daar word hij korter van, dat komt mischien straks als het werkt.

dit is toch gewoon een looplicht, die wanneer de waarde van pulse_train met 1 ophoogd de volgende led laat branden. en de vorige dooft.


if (pulse_train == 1)	{PORTB = (khz_train & 0b00000001);}
if (pulse_train == 2)	{PORTB = (khz_train & 0b00000010);}
if (pulse_train == 3)	{PORTB = (khz_train & 0b00000100);}
if (pulse_train == 4)	{PORTB = (khz_train & 0b00001000);}
if (pulse_train == 5)	{PORTB = (khz_train & 0b00010000);}
if (pulse_train == 6)	{PORTB = (khz_train & 0b00100000);}
if (pulse_train == 7)	{PORTB = (khz_train & 0b01000000);}
if (pulse_train == 8)	{PORTB = (khz_train & 0b10000000);}
eigenwijs = ook wijs

Eerst een vraagje, wat is de beginwaarde van khz_train, of waar haal je dat?

Want dat is een looplicht op de volledige parallelle poort op voorwaarde dat khz_train altijd gelijk is aan 0b11111111.

edit: wat je nu geprogrammeerd hebt is hetzelfde als wat een 4017 ic doet, als khz_train telkens = 0b11111111

LDmicro user.
trix

Golden Member

Op 28 maart 2020 17:00:46 schreef MGP:
Want dat is een looplicht op de volledige parallelle poort op voorwaarde dat khz_train altijd gelijk is aan 0b11111111.

je zet me aan het denken en twijfelen, maar ik denk dat je het bij het rechte eind hebt.

ik doe inderdaad niet de 38 kHz over de volledige poort 8)7 ik ga dat morgen eens bekijken,.....bedankt MGP

ik zal zo meteen eens mijn test code posten.
word morgenvroeg, anders moet ik weer helemaal naar de schuur.

eigenwijs = ook wijs

Geen probleem ;)

[Bericht gewijzigd door MGP op zaterdag 28 maart 2020 18:46:37 (52%)

LDmicro user.
trix

Golden Member

klopt inderdaad (ik heb eerder wat zinnen weggehaald uit mijn post, waardoor het een beetje raar loopt)

ik was mijn programma deze morgen aan het testen m.b.v. een logic analyzer.
ik vond het niet eenvoudig om het resultaat van mijn code te zien.
probleem is dat je 2 frequenties hebt die sterk verschillen (250 Hz en 38 kHz)
optimaliseer je de boel voor de ene (b.v. sample rate) dan zie je de andere niet en vica versa.
ik weet niet of ik iets verkeerd doe ?
morgen eens kijken of ik 1 van die 2 frequentie's op de scoop kan laten zien.

eigenwijs = ook wijs

Je moet een vast 38kHz signaal maken dat voor alle poorten geldt.
Mengen mag niet, schakelen wel..denk hier eens goed over na.

LDmicro user.
trix

Golden Member

ik had al een testcode gemaakt, die denk ik wel goed werkt.
ik ga gewoon de pulsen v/d 38 kHz tellen, ik weet dat er 152 in 4 mS gaan,
dus:
van 0 tot 152 -> led 1
van 152 tot 304 -> led 2
van 304 tot 456 -> led 3
enz. enz.

ik ga het morgen wel zien.

eigenwijs = ook wijs

Nu zijn we terug aan het begin, dat zal niet werken.

Zolang je de 38khz pulsen telt ben je verkeerd bezig want als je een 0 uitzendt heb je geen pulsen en ben je de telling kwijt.

Als je later die TSOP gebruikt vind je die 38khz pulsen nergens meer terug, die worden door de TSOP eruit gefilterd.

LDmicro user.
Arco

Special Member

Met een TSOP kun je geen clockpulsen tellen, daar is 'ie niet voor gemaakt, de uitgang blijft actief zolang er pulsen aanwezig zijn.
(binnen grenzen, te lange pulstrein wordt ook afgekapt)
Je kunt wel de lengte van de burst (pulstrein) meten natuurlijk.

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

Op 28 maart 2020 19:44:49 schreef Arco:
(binnen grenzen, te lange pulstrein wordt ook afgekapt..

De nieuwere zoals de TSOP48xx kun je gebruiken als een fotocel, lengte van de pulstrein speelt geen rol meer.

LDmicro user.
Arco

Special Member

Maar enkele 38kHz pulsen tellen gaat er zeker niet mee...

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