C INT0 deaktivieren ?!

OK, dann nicht am prellen.

Deine Software PWM läuft? Hast du den PWM Wert eingestellt?

Ja, die Läuft... Mir ist gerade aufgefallen... ( NUR ZUM TESTEN )

Code:
	//ISR für das Einschalten und Ausschalten der Taschenlampe
/*---------------------------------------------------------*/

ISR (INT0_vect)
{
	
	GIMSK &= ~(1<<INT0);

	if ((PORTB & 0b00001111) == (0b00000000))
	{
	//	PORTB |= ((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
		//TIMSK  = (1<<TOIE0);	
		TCCR0B = (1<<CS00);
	}
		else	
	{
		//TIMSK  &= ~(1<<TOIE0);
		TCCR0B &= ~(1<<CS00);
		PORTB &= ~((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));	
	}
	

}


	//ISR für Soft PWM
/*---------------------------------------------------------*/

ISR(TIMER0_OVF_vect)
{

 XPE_4_AN;
 _delay_ms(50);
 XPE_4_AUS;
 _delay_ms(50);	

} // Ende ISR (TIMER1_OVF_vect)

Starten lässt sich die ISR (TIMER0OVF) nur beenden leider nicht... Kann das mit meiner Abfrage von den Tasten zusammen hängen ?

Code:
 	if ((PORTB & 0b00001111) == (0b00000000))

bei der PWM... währ es mal eine reine Glückssache... also kann ich den TIMER0 so nicht aktivieren / deaktivieren... sehe ich das richtig ?
Ich frage ja ab, ob am PORT die dementsprechenden Bits... gesetzt oder nicht gesetzt sind... bei einer PWM... könnt ihr euch selber denken...
 
bei der PWM... währ es mal eine reine Glückssache... also kann ich den TIMER0 so nicht aktivieren / deaktivieren... sehe ich das richtig ?

Ja genau, das ist ein Problem. Frage nicht das Portregister ab, sondern einfach das eine Timervorteilerbit.
 
Ja genau, das ist ein Problem. Frage nicht das Portregister ab, sondern einfach das eine Timervorteilerbit.

du meinst so ?...

Code:
if (TCCR0B = (1<<CS00))
{
   TIMER0_DISABLE;
}
  else
{
   TIMER0_ENABLE;
}
 
Code:
	//ISR für das Einschalten und Ausschalten der Taschenlampe
/*---------------------------------------------------------*/

ISR (INT0_vect)
{
	
	GIMSK &= ~(1<<INT0);

	if (TCCR0B & (1<<CS00))
	{
		TCCR0B &= ~(1<<CS00);
		PORTB &= ~((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
	}
		else	
	{
		TCCR0B = (1<<CS00);
	}
	

}
 
habt Ihr meinen Beitrag #20 eigentlich gelesen?

Ja, also ich schon.

Das mit dem sleep mode war mir nicht bewusst (Da war aber mal etwas im parallelen Thema kann ich mich erinnern). Also hier bietet sich natürlich ein externer Interrupt an, um den Mikrocontroller aufzuwecken, da hast du recht. Auch die anderen Ideen finde ich gut.

Das müsste Janiiix nur noch umsetzen:)
 
@ Dirk...

Ich kann die LED´s zwar EINSCHALTEn aber nicht AUSSCHALTEN... was mache ich denn noch falsch ? Stehe gerade auf dem "Schlauch"


Code:
ISR (INT0_vect)
{
	
	GIMSK &= ~(1<<INT0);

	if (TCCR0B & (1<<CS00))
	{
		TCCR0B &= ~(1<<CS00);
		PORTB &= ~((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
	}
		else	
	{
		TCCR0B = (1<<CS00);
	}
	

}
 
Du mußt doch in der INT0-ISR lediglich den PWM-Timer mitanhalten/-starten. Für den möglichen Fall, daß die LEDs beim gewünschten abschalten grad an sind, schaltest Du sie in diesem Zweig einfach mit ab.

Edit: Anschalten brauchst Du die hingegen nicht wieder, nach dem Restart des PWM-Timers erledigt das ja Deine Soft-PWM.
 
Du mußt doch in der INT0-ISR lediglich den PWM-Timer mitanhalten/-starten. Für den möglichen Fall, daß die LEDs beim gewünschten abschalten gradan sind, schlatest Du sie in diesem Zweig einfach mit ab

Das bezwecke ich doch mit dem Code oder nicht ?
Wenn die "Clock" läuft (TIMER0) schalte "Clock" aus ... Sonst an...
 
Irgendwie ist mir Deine Verwendung der Timer nicht mehr ganz klar (da inzwischen viele Code-Schnipsel, mit teilweise widersprüchlichen Comments). Mein Vorschlag sah einen Timer für PWM (egal ob Soft oder hard) vor, und einen zweiten zum "Entprellen/Verzögern".
Im INT0 sollte generell der Entprell-Timer gestartet und der INT0 deaktiviert werden.
Zum an- und abschalten der LEDs wäre der PWM-Timer anzuhalten/zu starten (eben über die CS-Bits des dafür verwendeten Timers). Um die LEDs beim Anhalten des Timers sicher aus zu haben, muß in diesem Falle manuell nachgeholfen werden. Nach dem Start des PWM-Timers dauerst es halt nur einen Zyklus länger, bis die Lichter durch den PWM wieder angehen.
Die Fallunterscheidung kann zB an den Prescaler des PWM-Timers genagelt werden.
 
Irgendwie ist mir Deine Verwendung der Timer nicht mehr ganz klar (da inzwischen viele Code-Schnipsel, mit teilweise widersprüchlichen Comments). Mein Vorschlag sah einen Timer für PWM (egal ob Soft oder hard) vor, und einen zweiten zum "Entprellen/Verzögern".
Im INT0 sillte generell der Entprell-Timer gestartet und der INT0 deaktiviert werden.
Zum an- und abschalten der LEDs wäre der PWM-Timer anzuhalten/zu starten (eben über die CS-Bits des dafür verwendeten Timers). Um die LEDs beim Anhalten des Timers sicher aus zu haben, muß in diesem Falle manuell nachgeholfen werden. Nach dem Start des PWM-Timers dauerst es halt nur einen Zyklus länger, bis die Lichter durch den PWM wieder angehen.
Die Fallunterscheidung kann zB an den Prescaler des PWM-Timers genagelt werden.

Lotadac du hast Recht... es ist sehr viel durcheinander hier... das muss ich beim nächsten mal ändern...

Das ist doch meine Fallunterscheidung..

Code:
	//ISR für das Einschalten und Ausschalten der Taschenlampe
/*---------------------------------------------------------*/

ISR (INT0_vect)
{
	
	GIMSK &= ~(1<<INT0);

	if (TCCR0B & (1<<CS00))
	{
		TCCR0B &= ~(1<<CS00);
		PORTB &= ~((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
	}
		else	
	{
		TCCR0B = (1<<CS00);
	}
	

}

Nur leider wird (warum auch immer) der TIMER0 für die SOFT PWM... nicht angehalten...
 
Was ich hier nicht sehe, ist die "Entprellung". Das realisierst Du scheinbar (wo-) anders als in meinem Vorschlag.
Nach diesem Code wird der INT0 deaktiviert, danach werden für den Fall daß in TCCR0B das (und NUR das) CS00-Bit gesetzt ist CS00 und die 4 Ausgänge gelöscht. Andernfalls wird CS00 gesetzt.
 
Was ich hier nicht sehe, ist die "Entprellung". Das realisierst Du scheinbar (wo-) anders als in meinem Vorschlag.
Nach diesem Code wird der INT0 deaktiviert, danach werden für den Fall daß in TCCR0B das (und NUR das) CS00-Bit gesetzt ist CS00 und die 4 Ausgänge gelöscht. Andernfalls wird CS00 gesetzt.

Das mit dem Entprellen mache ich wo anders... & es funktioniert !!!

Wenn dem so sei, müsste mein TIMER0 einmal deaktiviert & im anderen Fall aktiviert werden... Das passiert nur leider nicht.
 
Ich sehe an der Abfrage des Prescalerbits und der Umschaltung keinen Fehler.

Beim Starten des Timers machst du keine ODER Verknüpfung, sondern weist direkt (1<<CS00) zu. Das macht im aktuellen Fall nichts aus, da alle anderen Bits sowieso 0 sind. So kann man sich aber schnell auch mal einen Fehler einbauen.

Da du meinst, dass die Entprellung funktioniert, weiss ich nicht, wo der Fehler noch liegen könnte.

Ich bin der Meinung, dass die Entprellung nicht richtig funktioniert, da der Timer1 zwar einen 10ms (habe ich nicht kontrolliert) Event erzeugt, dieser aber nicht synchron zum Tastendruck ist. Außerdem kann eine Taste beim loslassen auch prellen. Das "scharf stellen" von ext0 müsste dann erfolgen, wenn der Taster eine Zeit n nicht betätigt ist.

Im Moment sehe ich aber auch viele Bäume :rolleyes:
 
Ich bin der Meinung, dass die Entprellung nicht richtig funktioniert, da der Timer1 zwar einen 10ms (habe ich nicht kontrolliert) Event erzeugt, dieser aber nicht synchron zum Tastendruck ist. Außerdem kann eine Taste beim loslassen auch prellen. Das "scharf stellen" von ext0 müsste dann erfolgen, wenn der Taster eine Zeit n nicht betätigt ist.

Kannst du das noch mal genauer erklären was du mit nicht "synchron zum Tastendruck ist" meinst ?
Wie fange ich das am besten ab mit dem "Entprellen nach dem los lassen" ? Auch in der ISR mit der Zeitbasis von "10 ms."?
 
So wie ich es verstehe, erzeugt der Timer1 alle 10ms einen CompareInterrupt. Wenn du den Taster kurz vor dem Compare Event drueckst (dies ist asynchron zum CompareInterrupt), wird der Ext0 Interrupt zwar sofort durch seine ISR gesperrt, kurz danach kommt aber dann der CompareInterrupt. Wenn der Taster aber prellt und ein High erkannt wird, wird Ext0 Interrupt wieder freigegeben. Der Taster ist aber ggf. noch gedrueckt oder er prellt noch nach dem Loslassen. Es wird dann sofort wieder ein Ext0 Interrupt ausgelöst.

Ich bin nun nicht mehr am PC sondern am Tab zudem fehlt mir die Zeit, eine Lösung dafür zu erklären oder zu schreiben, sorry. Vielleicht kann hier aber ein anderer User helfen.
 
Hmm....

Also wenn ich "INT0_DISABLE" raus nehme.. und die Taste (INT0) drücke... geht die "PWM" aus... wie gewünscht...
Wenn ich nur die LED´s ansteuer... "AN / AUS" Schalte... funktioniert das wunderbar ... (1 x dücken ... LED´s an (ohne PWM, TIMER0) 2 x drücken ... LED´s ais!

Dann scheint es ja doch was mit dem "asychronen drücken" zu sein oder ?


[CODE/]

//ISR für Tastenentprellung & Auto_Off (10 ms.)
/*---------------------------------------------------------*/

ISR(TIMER1_COMPA_vect)
{
if (PIND & (1<<PIND2))
{
GIMSK |= (1<<INT0);
}

}


//ISR für das Einschalten und Ausschalten der Taschenlampe
/*---------------------------------------------------------*/

ISR (INT0_vect)
{
// INT0_DISABLE;

if ((TCCR0B & (1<<CS00)))
{
PWM_AN;
}
else
{
PWM_AUS;
PORTB &= ~((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
}

}


//ISR für Soft PWM
/*---------------------------------------------------------*/

ISR(TIMER0_OVF_vect)
{

static uint8_t counter = 0;

counter++;

if (counter >= 100)
{
counter = 0;

if (PWM0 > 0)
{
PORTB |= ((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
}
else
{
PORTB &= ~((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
}

}

else

{

if (counter == PWM0)
{
PORTB &= ~((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
}



}


} // Ende ISR (TIMER1_OVF_vect)

[/CODE]
 
...Wenn der Taster aber prellt und ein High erkannt wird, wird Ext0 Interrupt wieder freigegeben. Der Taster ist aber ggf. noch gedrueckt oder er prellt noch nach dem Loslassen. Es wird dann sofort wieder ein Ext0 Interrupt ausgelöst...
Eben deswegen hatte ich ja auch den Vorschlag mit dem 2ten Timer, gekoppelt an den INT0, gemacht. Und mit 'ner längeren Laufzeit.

Ich bin echt soo kurz davor (*zeigt 3cm*), meinen Vorschlag mal eben schnell in Assembler umzusetzen, und mit'm Logic8 aufzuzeichnen.
 
Hast du nicht Skype, wo man schneller schreiben kann ?
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)