Tooglen von einer LED abfragen

Gast #3962528
Lesenswert?

Bei den PIC Controllern kann man ganz einfach eine LED tooglen über 
z.B.:
1
LATDbits.LATD0 ^= 1;

Meine Frage lautet jetzt wie ich eine Abfrage starten kann ob die LED 
getoogelt wurde. Mich interessiert also Nicht ob LED HIGH oder LOW, 
sondern nur ob ihr Zustand sich geändert hat.

Den Zustand abfragen kann ich beispielsweise über
1
if(PORTReadBits(IOPORT_D, BIT_0)) == 1; // == 0

Nur wie ich abfragen kann ob die LED getoogelt wurde ist mir noch nicht 
ganz klar.
Gast #3962566
Lesenswert?

@toogle:
mach dir eine variable namens 'toogleTag'
darin spreicherst du bei jedem 'tooglen' den zustand ( 1 / 0 )
setz einen timer darauf an, der den tag vergleicht
dann kannst du die variable als interupt verwenden wenn du sowas 
brauchst und dir kommt das 'tooglen' bei jeder änderung.
lg rudi ;-)

'toogeln' .. 'toggeln' .. umschalten..
solange du weisst was du willst ist es egal ;-)
Gast #3962581
Lesenswert?

@OhHa:

@ r_u_d_i
> > solange du weisst was du willst ist es egal ;-)

> Genau.

nö..

@toogle:
option b:
wenn du keinen timer verwenden willst/kannst:
du kannst dir eine weitere bool variable als timer generieren
und in der main, loop oder sonstwo ,
'den' generierten timer bool variable abfragen, ob er für dich 'tooglen' 
soll das komplettiert die sache.

wenn der 'timer' ( macro call )  dann aktiv ist
schreibst in dem macro dann deinen abfragevergleich zur 'getoogleten' 
LED
wenn sich was geändert hat, returnst in einem if vergleich den bool der 
'getoogleten' led mit der du dann weisst, ob die led getooglet' wurde

lg rudi ;-)

@OhHa:

jetzt: genau

;-)
#3962590
Lesenswert?

Toogle schrieb:
> Nur wie ich abfragen kann ob die LED getoogelt wurde ist mir noch nicht
> ganz klar.
1
uint8_t latd_old = LATD;
2
LATDbits.LATD0 ^= 1;
3

4
if((LATD ^ latd_old) & (1<<0))
5
{
6
  // Wird ausgeführt, wenn bit 0 von LATD ungleich bit 0
7
  // von latd_old ist.
8
}
Wenn du andere Portbits abfragen willst einfach dass (1<<0) durch 
(1<<bitnummer) ersetzten.

Wenn es kein 8bit PIC ist, einfach das uint8_t durch einen Variablentype 
der gleich viele bits wie ein Port hat ersetzten.
#3962904
Lesenswert?

Toogle schrieb:
> Meine Frage lautet jetzt wie ich eine Abfrage starten kann ob die LED
> getoogelt wurde.

Wozu braucht man sowas?

Eine Möglichkeit:
1
LATDbits.LATD0 ^= 1;
2
toggle_flag = 1;

Toogle schrieb:
> Mich interessiert also Nicht ob LED HIGH oder LOW,
> sondern nur ob ihr Zustand sich geändert hat.

Und wenn er sich zwischen 2 Abfragen 2* geändert hat?
#3962922
Lesenswert?

Toogle schrieb:
> Meine Frage lautet jetzt wie ich eine Abfrage starten kann ob die LED
> getoogelt wurde

Gar nicht und es ist auch komplett überflüssig.

Da DU in deinem Programm die LED geTOGGELT hast, weisst du das und musst 
das nicht per Programm erfragen.

Natürlich kannst du das zusätzlich vermerken
1
BOOL getoggelt=FALSE;
2

3
LATDbits.LATD0 ^= 1;
4
getoggelt=TRUE;
und abfragen
1
if(getoggelt) ...
2
getoggelt=FALSE;

Diese ZUSÄTZLICHE Code ist dann eben nötig, wenn du zu vergesslich 
warst, um selbst noch zu wissen, was du neulich getan hast, also dein 
Programm Alzheimer hat.
#3963175
Lesenswert?

OhHa schrieb:
> Volker SchK schrieb:
>> OhHa schrieb:
>>> Man könnte auch
>>
>> Man könnte vieles,
>
> Wenn das beim PIC so funktioniert wie beim AVR. Sonst den LED-Pin mit
> dem Input Pin für Interrupt on Change Pin HW-mäßig verbinden!?

Oder einen Timer programmieren in dessen Interrupt man den Pin (besser 
das Latch) abfrägt, und das Signal auf einen PIN mit Interrupt-on-Change
ausgibt den man entsprechend konfiguriert hat und dann ...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren