Forum: Mikrocontroller und Digitale Elektronik Tooglen von einer LED abfragen


von Toogle (Gast)


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.

von Edi R. (edi_r)


Lesenswert?

Einfach den Zustand nachher mit dem Zustand vorher vergleichen.

von OhHa (Gast)


Lesenswert?

Das heißt umschalten und nicht toogeln :)

Sonst: Den abgefragten Zustand zwischenspeichern, umschalten, abfragen 
und mit dem gespeicherten vergleichen.

von r_u_d_i (Gast)


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 ;-)

von OhHa (Gast)


Lesenswert?

r_u_d_i schrieb:
> 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

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

Genau.

von r_u_d_i (Gast)


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

;-)

von Max H. (hartl192)


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.

von Eric (Gast)


Lesenswert?

Toogle schrieb:
> Bei den PIC Controllern kann man ganz einfach eine LED tooglen über
> z.B.:
> LATDbits.LATD0 ^= 1;
>
> Meine Frage lautet jetzt wie ich eine Abfrage starten kann ob die LED
> getoogelt wurde.

In dem obigen Fall wird die LED immer umgeschaltet. Braucht man nicht 
nachfragen.

(Toggle, nicht toogle)

von Peter D. (peda)


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?

von Michael B. (laberkopp)


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.

von Volker S. (vloki)


Lesenswert?

Peter Dannegger schrieb:
> Wozu braucht man sowas?

Würde ich auch gerne wissen ;-)

Peter Dannegger schrieb:
> Und wenn er sich zwischen 2 Abfragen 2* geändert hat?

Genau.

von OhHa (Gast)


Lesenswert?

Man könnte auch auf dem entsprechenden Portpin den Pinchangeinterrupt 
aktivieren. Beim toggeln äh umschalten ;-) wird dann in der zugehörigen 
ISR ein Flag gesetzt, daß man dann später wieder abfragen kann.
;-)

von Volker S. (vloki)


Lesenswert?

OhHa schrieb:
> Man könnte auch

Man könnte vieles, aber zuerst sollte man mal wissen wozu das gut sein 
soll.
(Ob der Lösungsansatz überhaupt Sinn macht)

von Simpel (Gast)


Lesenswert?

Man umgeht das ganze Gewusel dadurch, dass man statt des Toggle-Befehls 
dediziert abwechselnd eine 1 oder 0 zum Ausgangspin schickt. Dann weiß 
man im Code verlässlich, was gerade aktuell ist.

von OhHa (Gast)


Lesenswert?

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!?

von ;-) (Gast)


Lesenswert?

Simpel schrieb:
> Man umgeht das ganze Gewusel dadurch, dass man statt des Toggle-Befehls
> dediziert abwechselnd eine 1 oder 0 zum Ausgangspin schickt. Dann weiß
> man im Code verlässlich, was gerade aktuell ist.

niemals!
Was ist wenn ein Bit umfällt?

;-)

von Simpel (Gast)


Lesenswert?

"Was ist wenn ein Bit umfällt?"

...dazu gibt es den Glue-Befehl, der das Bit totsicher im letzten 
Zustand festklebt... ;-)

von ;-) (Gast)


Lesenswert?

Simpel schrieb:
> "Was ist wenn ein Bit umfällt?"
>
> ...dazu gibt es den Glue-Befehl, der das Bit totsicher im letzten
> Zustand festklebt... ;-)

genau
;-)
wer die Technik nicht kennt, da stehen dann die Tips zum Glue:

Beitrag "Tipps und Tricks für Sekundenkleber"

;-)

von Volker S. (vloki)


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 ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.