C INT0 deaktivieren ?!

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Hallo,

Wie kann es sein, dass wenn ich die Taste gedrückt halte... Meine ISR (INT0) trdz. arbeitet ?
Halte ich die Taste am (INT0) gedrückt, Flackert das Licht... Ich gebe sonst nirgends den INT0 wieder frei... Außer zum Anfang in der Main...

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

	if ((PORTB & 0b00001111) == (0b00000000))
	{
		PORTB |= ((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
	}
		else	
	{
		PORTB &= ~((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
	}
	
	TCNT1 = 0;


}
 
Das dürfte eigentlich nicht passieren.

Um besser helfen zu können wäre es gut, wenn du uns sagst, welchen Mikrocontroller du verwendest und ob der Compiler warnings anzeigt.

Gut wäre auch mehr Programmcode, ggf. als Anhang.

Dirk :ciao:
 
Ich habe das Programm im Anhang!
Warnings werden bei mir nicht angezeigt (ATMEL STUDIO 6.2)
(TINY2313)
 

Anhänge

  • UltraBeamXPE_V2.zip
    20,2 KB · Aufrufe: 6
Ist das derselbe Code, den Du auch mir verlinkt hattest? Die .zip lad ich mir nicht aufs Mobile...
Im mir vorliegendem Code hast Du ja die TOV0-ISR auskommentiert, der Interrupt wird aber trotzdem freigegeben, der Timer gestartet. somit werden die IRQs auch ausgelöst.
Die außerdem verwendeten IRQs (OCIE1A und INT0) besitzen eine höhere Priorität, stehen davor in der IVT.
Ich weiß jetzt nicht, wie C das handhabt, Bascom beschreibt die IVT regulär mit RETIs, in ASM ist das ja generell Sache des Programmierers...
Default stehen da ja NOPs (No Operations) drin.
Wenn C die da läßt, und der Interrupt zuschlägt (bei jedem Überlauf von T0), wird also die IVT angesprungen. Da steht am Einsprungpunkt ein NOP, also macht der Controller einen Takt nichts, und mit der nächsten Zeile weiter. Das ist ein weiteres NOP (UART-RX-IRQ-Einsprungpunkt) usw usw. Die verwendest Du ja alle nicht - überall ein Takt nichts tun.
Nach der IVT folgt dann der Code der Main (wo Du die IRQs wieder freigibst) und die leere loop, die solange läuft, bis Du entweder INT0 auslöst, oder der TOV0 wieder zuschlägt.
Außerdem müßte es irgendwann zu einem Stacküberlauf kommen (IRQs werden nach dem TOV0 ja in der main trotzdem wieder freigegeben, aber es wird nie aus der "ISR" zurückgekehrt (also die Adresse vom Stack gepoppt).

Du hättest dann mit dem TOV0 sowas ähnliches (!!) wie 'nen automatischen Reset realisiert. Register, SRAM usw werden zwar nicht(!
) zurückgesetzt, das Programm startet aber trotzdem jedesmal neu.
Wie gesagt, ne mögliche Erklärung...
Trotzdem hat der Ansatz nicht allzu viel mit meinem Vorschlag zu tun.
Außerdem sind in dem Konzept einige Unstimmigkeiten/Unklarheiten, deswegen:
Hindert Dich irgendwas daran, das ganze(!) Projekt mal komplett(!) offen in einem neuen Thread zu schildern?
Stehst Du irgendwie (->Zukunftstag) unter Zeitdruck, oder könntest Du das ganze nochmal komplett neu angehen?

zB warum der SoftPWM? Warum immer 4 Pins simultan? Was für LEDs sind da wie angekoppelt? (macht vielleicht ein, durch den Tiny angesteuerter LED-Treiber Sinn?)
Dann hast Du ja auch noch ein paar, noch nicht realisierte Andeutungen drin. Mit dem SOS und dem Auto-Off benötigst Du ja ne Möglichkeit, sowas wie "Programme" (zeitlich getaktete Makros) abarbeiten zu können.
Mein Vorschlag: Hosen runter;)
I 'nem neuen Topic stellst Du Dein Ziel vor, also auch alles, was vielleicht noch rein soll. Insbesondere auch Fakten zu den LEDs usw.
Dann Kannst Du Deine eigenen Ansätze schildern, und auf unsere Vorschläge warten. Dino hat mit seinem Zauberstab ja was ähnliches realisiert - wenn sicher auch komplexer.
Wenn Du Dich dann für 'ne grobe Richtung entschieden hast (in seiner Gesamtheit), machst Du Dir Gedanken um das eigentliche Konzept Programmablaufplan), wo sicher auch wieder Vorschläge/Hinweise/Kritiken zu erwarten sind, als letztes gehts an die Implementierung.

Dinos Thread zum Magierstab kennst Du ja sicher, ich hatte auch mal mit dem Tiny2313 'ne dimmbare Lampe realisiert (wo der Tiny eigentlich nur UART-Kommandos von'nem PC auf das PWM-Dimming über einen LM3407 oder so umgesetzt hat. Das Teil befindet sich jetzt übrigens in irgendeiner Beamline vom ESRF.) Hier im Forum existiert noch irgendwo ein Bild von einem Teil (Beschaltung des Treiber-ICs) der Schaltung.
 
Du hättest dann mit dem TOV0 sowas ähnliches (!!) wie 'nen automatischen Reset realisiert.

Ja, so ungefähr wirkt sich das aus. Da die ISR auskommentiert ist, trägt der Compiler in der Interruptvektortabelle nicht die Adresse der ISR ein, sondern die Adresse von einer Fehlerbehandlungsroutine "__bad_interrupt". Hier wird dann zur Anfangsadresse der Interruptvektortabelle gesprungen, also zum Resetpunkt. Interrupts die auftreten und deren ISR nicht vorhanden sind, wirken also wie ein Reset. Der TOV0 Interrupt tritt natürlich permanent auf, das führt dann zu solch einem Effekt mit dem vermeintlich gesperrten EXT0 Interrupt, der trotzdem auftritt, weil er am Anfang des Programms freigegeben wird.

Dirk :ciao:
 
Erstmal vielen dank für eure Tipp´s ! Das mit der Entprellung klappt jetzt einwandfrei...

Jetzt muss ich es nur noch hin bekommen, dass ich meine Software PWM ... Ein & Ausschalten kann.... Ich habe mir gedacht, dass ich für´s "AUSSCHALTEN" die Clock vom TIMER0 nehme und beim "EINSCHALTEN" wieder dazu schalte...

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)
{
	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 (TIMER0_OVF_vect)



währe das "Effektiv" oder eher nicht ?
 
Hallo Janiiix,

wie du das nun mit dem Entprellen hinbekommen hast, verstehe ich noch nicht ganz. Irgendwo musst du ja das INT0 Flag wieder setzen (und zuvor das Anforderungsflag löschen) ... aber egal, wenns geht ist ja gut :)

Ich hätte mir einfach mit einem Timer ein Zeitsignal für das Hauptprogramm erzeugt, zum Beispiel ein 10ms Signal (10ms reichen eigentlich, wenn nicht, dann ist der Taster eventuell Müll). Dieses hätte ich im Hauptprogramm abgefragt, wenn "gesetzt", dann "gelöscht" und Tasten abgefragt.

Ich habe mir gedacht, dass ich für´s "AUSSCHALTEN" die Clock vom TIMER0 nehme und beim "EINSCHALTEN" wieder dazu schalte...

Wenn du den Timer0 startest, musst du zuvor nicht die Pins der LEDs auf PORTB ändern. Nach dem Stoppen schon, damit die LEDs auch wirklich aus sind.
Alternative zum Starten/Stoppen wäre zum Beispiel den Overflow Interrupt aktivieren/deaktivieren.

Dirk :ciao:
 
Hallo Janiiix,

wie du das nun mit dem Entprellen hinbekommen hast, verstehe ich noch nicht ganz. Irgendwo musst du ja das INT0 Flag wieder setzen (und zuvor das Anforderungsflag löschen) ... aber egal, wenns geht ist ja gut :)

Ich hätte mir einfach mit einem Timer ein Zeitsignal für das Hauptprogramm erzeugt, zum Beispiel ein 10ms Signal (10ms reichen eigentlich, wenn nicht, dann ist der Taster eventuell Müll). Dieses hätte ich im Hauptprogramm abgefragt, wenn "gesetzt", dann "gelöscht" und Tasten abgefragt.



Wenn du den Timer0 startest, musst du zuvor nicht die Pins der LEDs auf PORTB ändern. Nach dem Stoppen schon, damit die LEDs auch wirklich aus sind.
Alternative zum Starten/Stoppen wäre zum Beispiel den Overflow Interrupt aktivieren/deaktivieren.

Dirk :ciao:


Anbei noch mal das ganze Projekt.. Ich lösche das Flag wieder in der "TIMER1_OVF" Routine ;)
Leider klappt das mit dem Stoppen des Timer´s nicht... Die LED´s gehen weder an noch aus ?!


Code:
/***********************************************************************************************
*	  -								Zukunftstag 2014 (UltraBeamXPE (C))		                   *
*								   ____________________________  			                   *
*																			                   *
*										- Taschenlampe 						                   *
*																			                   *
* 							  Mitwirkende : Hardo Grubitz , Jan Homann						   *
*																							   *
*				Funktionen : Auto Off (ca. 6 min.) , Licht dimmen , SOS Funktion (Morse Code)  *
*																							   *
*                                                                                              *
*										Stand : 26.03.2014                                     *
***********************************************************************************************/

/***********************************************************************************************
*																							   *
*	Stromaufname im IDLE Mode       = ca. 770 µA ( 8 MHz ) kein großer Unterschied zu 4 MHz	   *
*	Stromaufname im Power_Pown_Mode = ca. 20 µA  ( 8 MHz ) kein großer Unterschied zu 4 MHz    *
*																							   *
************************************************************************************************/

#define F_CPU 8000000						// Interner RC Oszillator. Frequenz = 8000000 Hz ( 4 ms. Einschwingzeit )

#define KEY_SOS_GEDRUECKT			(!(PIND & (1<<PIND3)))		// Taste SOS
#define KEY_ON_GEDRUECKT			(!(PIND & (1<<PIND2)))		// Taste ON
#define KEY_UP_GEDRUECKT			(!(PIND & (1<<PIND1)))		// Taste UP
#define KEY_DOWN_GEDRUECKT			(!(PIND & (1<<PIND0)))		// Taste Down

#define PWM_AUS		TCCR0B &= ~(1<<CS00); ;	alle_AUS;
#define PWM_AN      TCCR0B |= (1<<CS00);	
#define INT0_ENABLE 	GIMSK  |= (1<<INT0);	
#define INT0_DISABLE	GIMSK &= ~(1<<INT0);

#define KEY_SOS_NICHT_GEDRUECKT		(PIND & (1<<PIND3))		// Taste SOS
#define KEY_ON_NICHT_GEDRUECKT		(PIND & (1<<PIND2))		// Taste ON
#define KEY_UP_NICHT_GEDRUECKT		(PIND & (1<<PIND1))		// Taste UP
#define KEY_DOWN_NICHT_GEDRUECKT	(PIND & (1<<PIND0))		// Taste Down


#define XPE_1_AN		PORTB |= (1<<PB0)	// HighPowerLED 1 an
#define XPE_2_AN		PORTB |= (1<<PB1)	// HighPowerLED 2 an
#define XPE_3_AN		PORTB |= (1<<PB2)	// HighPowerLED 3 an
#define XPE_4_AN		PORTB |= (1<<PB3)	// HighPowerLED 4 an

#define XPE_1_AUS		PORTB &= ~(1<<PB0)	// HighPowerLED 1 aus
#define XPE_2_AUS		PORTB &= ~(1<<PB1)	// HighPowerLED 2 aus
#define XPE_3_AUS		PORTB &= ~(1<<PB2)	// HighPowerLED 3 aus
#define XPE_4_AUS		PORTB &= ~(1<<PB3)	// HighPowerLED 4 aus

#define ALARM_AN		PORTB |=  (1<<PB4)	// Summer an
#define ALARM_AUS		PORTB &= ~(1<<PB4)	// Summer aus

#include <avr/io.h>							// Library für die I/O (Ports)
#include <avr/sleep.h>						// Library für den Schlaf Modus
#include <avr/interrupt.h>					// Library für die Interrupts
#include <stdint.h>							// Benötigt Library für Uint16_t Werte
#include <util/delay.h>


volatile uint8_t PWM0 = 1;
    
uint8_t keystatus;



int main(void)
{
	
	//Ausgänge festlegen
/*---------------------------------------------------------*/
	
	DDRB |= ((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3) | (1<<PB4));
	
	//TIMER1 für TastenEntprellung & Auto_Off konfigurieren (10 ms.)
/*---------------------------------------------------------*/
	OCR1A = 77;
	
	TCCR1A = (1<<WGM11);
	
	TIMSK |= (1<<OCIE1A);
	
	TCCR1B = ((1<<CS12)) | ((1<<CS10)); // 1024
	
	//TIMER0 für Soft PWM konfigurieren
/*---------------------------------------------------------*/

	TCCR0B = (1<<CS00);
	
	TIMSK  = (1<<TOIE0);
	
	
	
	//INT0 freigeben
/*---------------------------------------------------------*/
		
	GIMSK  |= (1<<INT0);				

	//Interrupts Global freigeben
/*---------------------------------------------------------*/	
	sei();									
	
	

	while(1)
	{
		
	
					
	}// Ende While
	
}// Ende Main

	
	//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)
{
	
	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)
{
	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)
 
Ich versteh den Punkt noch nicht, wo du INT0 wieder setzt, also den EXT0 Interrupt wieder frei gibst. Das machst du vom Zustand PIND2 abhängig ?! Soll dies nur zum Test sein?

Dann läuft der Timer bzw. das Compare-Ereignis asynchron zum Tastendruck, dadurch hast du nie eine definierte Pause von 10ms, sondern irgendwas von 0ms ... 10ms.

Dann kommt noch hinzu, dass wenn der Taster prellt, das Interruptanforderungsflag INTF0 des INT0 Interrupts gesetzt wird, auch wenn der Interrupt deaktiviert ist. Aktivierst du im Idealfall nach 10ms (auch nach x Stunden) den Interrupt wieder, wird die ISR sofort ausgelöst, da INTF0 gesetzt ist. Das bedeutet aber, bei dir funktioniert aktuell die Entprellung nicht, bzw. hat keine Wirkung?! Zum Löschen von INTF0, das Bit setzen (siehe Datenblatt). Problem ist dann aber immer noch der asynchrone Timer1.
 
Ich versteh den Punkt noch nicht, wo du INT0 wieder setzt, also den EXT0 Interrupt wieder frei gibst. Das machst du vom Zustand PIND2 abhängig ?! Soll dies nur zum Test sein?

Dann läuft der Timer bzw. das Compare-Ereignis asynchron zum Tastendruck, dadurch hast du nie eine definierte Pause von 10ms, sondern irgendwas von 0ms ... 10ms.

Dann kommt noch hinzu, dass wenn der Taster prellt, das Interruptanforderungsflag INTF0 des INT0 Interrupts gesetzt wird, auch wenn der Interrupt deaktiviert ist. Aktivierst du im Idealfall nach 10ms (auch nach x Stunden) den Interrupt wieder, wird die ISR sofort ausgelöst, da INTF0 gesetzt ist. Das bedeutet aber, bei dir funktioniert aktuell die Entprellung nicht, bzw. hat keine Wirkung?! Zum Löschen von INTF0, das Bit setzen (siehe Datenblatt). Problem ist dann aber immer noch der asynchrone Timer1.

Erst wenn ich den Taster am "INT0" (PIND2) wieder los lasse... soll INT0 wieder freigegeben werden, ist das eher eine schlechte Idee ?
Aber das mit dem Entprellen klappt super! Ich kann nun mit dem ersten Tastendruck an INT0 die LED´s EINSCHALTEN und nach dem zweiten Tastendruck wieder AUSSCHALTEN... das Funktioniert wunderbar...
Nur wenn ich jetzt anstatt die LED´s... ein & ais schalte... den TIMER0 deaktiviere (TIMER0OVF), bleiben die LED´s gedimmt & ich kann mit der Taste an INT0 nichts mehr bezwecken...
 
Erst wenn ich den Taster am "INT0" (PIND2) wieder los lasse... soll INT0 wieder freigegeben werden, ist das eher eine schlechte Idee ?
Ich habe gesehen, du nutzt Low Level Interrupt Sense Control. Dann musst du INTF0 nicht löschen. Allerdings bleibt dann immer noch der zum Tastendruck asynchrone Timer1 CompareInterrupt.

Mir ist das im Moment zu kompliziert :D

Aber das mit dem Entprellen klappt super! Ich kann nun mit dem ersten Tastendruck an INT0 die LED´s EINSCHALTEN und nach dem zweiten Tastendruck wieder AUSSCHALTEN... das Funktioniert wunderbar...
Nur wenn ich jetzt anstatt die LED´s... ein & ais schalte... den TIMER0 deaktiviere (TIMER0OVF), bleiben die LED´s gedimmt & ich kann mit der Taste an INT0 nichts mehr bezwecken...

Naja der Timer0 ist verantwortlich für die PWM, wenn der deaktiviert wird, funktioniert die Helligkeitseinstellung nicht mehr.:D
 
Naja der Timer0 ist verantwortlich für die PWM, wenn der deaktiviert wird, funktioniert die Helligkeitseinstellung nicht mehr.:D


Ja, ich möchte doch wenn ich AUSSCHALTE, dass der TIMER0 deaktiviert wird & die LED´s (PWM) aus geht...
 
Ja, ich möchte doch wenn ich AUSSCHALTE, dass der TIMER0 deaktiviert wird & die LED´s (PWM) aus geht...

Bei deinem letzten Stand schaltest du weder den Interrupt ein, noch lässt du den Timer laufen. Eins von beiden musst du machen, also entweder Interrupt aktivieren/deaktivieren oder Timer starten/stoppen.

Code:
if ((PORTB & 0b00001111) == (0b00000000))
    {
        PORTB |= ((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
       [COLOR=#800000][B] //TIMSK  = (1<<TOIE0);    
        //TCCR0B = (1<<CS00);
    }[/B][/COLOR]
        else    
    {
        //TIMSK  &= ~(1<<TOIE0);
        TCCR0B &= ~(1<<CS00);
        PORTB &= ~((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));    
    }
 
Bei deinem letzten Stand schaltest du weder den Interrupt ein, noch lässt du den Timer laufen. Eins von beiden musst du machen, also entweder Interrupt aktivieren/deaktivieren oder Timer starten/stoppen.

Code:
if ((PORTB & 0b00001111) == (0b00000000))
    {
        PORTB |= ((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));
       [COLOR=#800000][B] //TIMSK  = (1<<TOIE0);    
        TCCR0B = (1<<CS00);
    }[/B][/COLOR]
        else    
    {
        //TIMSK  &= ~(1<<TOIE0);
        TCCR0B &= ~(1<<CS00);
        PORTB &= ~((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));    
    }

Wenn die LED´s an sind... & ich die Taste drücke... führt er "else" aus... & da wird doch die Clock von Timer0 genommen & wenn die LED´s aus sind & ich wieder in die INT0 ISR springe... schaltet er die Clock vom Timer0 wieder zu und die PWM wird wieder ausgeführt oder nicht ?
 
Wenn die LED´s an sind... & ich die Taste drücke... führt er "else" aus... & da wird doch die Clock von Timer0 genommen & wenn die LED´s aus sind & ich wieder in die INT0 ISR springe... schaltet er die Clock vom Timer0 wieder zu und die PWM wird wieder ausgeführt oder nicht ?

Ich würde sagen ja,

allerdings hatte ich deinen letzten Code zitiert:

Code:
...
[COLOR=#800000][B]//TIMSK  = (1<<TOIE0); 
 //TCCR0B = (1<<CS00);[/B][/COLOR]
...

Hier passiert natürlich nichts. Der Timer0 wird nicht gestartet. Du hattest mich dann zitiert, den Code aber in deinem Zitat geändert...

Code:
...
[COLOR=#800000][B]//TIMSK  = (1<<TOIE0); 
 TCCR0B = (1<<CS00);[/B][/COLOR]
...

Jetzt weiß ich nicht, ob es nun so wieder funktioniert.
 
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);	
		[B][COLOR="#FF0000"]TCCR0B = (1<<CS00);[/COLOR][/B]
	}
		else	
	{
		//TIMSK  &= ~(1<<TOIE0);
		[B][COLOR="#FF0000"]TCCR0B &= ~(1<<CS00);[/COLOR][/B]
		PORTB &= ~((1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3));	
	}


}

so sieht der Code jetzt aus... Die PWM bleibt aber an.... also scheint der TIMER weiter zu arbeiten :(
 
Dies könnte nun auch wieder am Prellen liegen.

Wieso am Prellen ???
Wenn ich die LED´s direkt schalten tue... Sprich... An & Aus... Ohne PWM oder sonste was... Dann klappt es doch auch.... 1 x drücken... LED´s an... 2 x drücken... LED´s aus...
 
OK, dann nicht am prellen.

Deine Software PWM läuft? Hast du den PWM Wert eingestellt?
 
So, ich schreibe jetzt mal ein paar Sachen dazu, da das mit dem 2ten Timer und dem Lowlevel-IRQ an INT0 gewissermaßen mein Vorschlag war.

Idee war, den INT0 als wakeup-Source zu verwenden und zwar aus dem tiefstmöglichen sleep. Problem wäre dann weniger das Prellen, sondern mehr das hinreichend schnelle Loslassen des Tasters. Also sollte der INT0 in seiner eigenen ISR deaktiviert werden, und ein 2ter Timer gestartet werden.
Dieser Timer sollte sich selbst im Überlauf wieder anhalten und den INT0 wieder freigeben. Da ich der Meinung war, daß es problematisch werden könnte, innerhalb der TOV-ISR den sleep zu aktivieren, hätte ich hier nicht den TOV-IRQ verwendet, sondern im Hauptprogramm das Flag selbst gepollt.
Weitere Überlegung war, den Controller mit lediglich 1MHz laufen zu lassen - dann wäre mit'nem 8bit-Timer 'ne Viertelsekunde drin.

Außerdem hatte ich daran gedacht, auch die hoch/runter-Taster über einen gemeinsamen PCINT laufen zu lassen, wo eben der PWM manipuliert werden sollte, und dann auch der Timer für den Sleep gestartet werden sollte. (Zu dem Zeitpunkt wußte ich noch nichts vom verwendeten Soft-PWM).
Kurz:
PCINT mit den beiden Tastern sollte den PWM-OC umsetzen, sich selbst deaktivieren (IRQ-Enable-Flag) und dann den "Entprell-Timer" starten
INT0 sollte den COM des PWM an-/abschalten (LED sicher aus), den Sleepmode umschalten (Idle/PowerDown), ggf auch den PCINT (hier über das Mask-Register) und auch den Entprell-Timer starten.
In der main-loop sollte auf das TOV0-Flag gepollt werden, dann Flag gelöscht, Timer angehalten, Interrupts wieder freigegeben und als letztes der Sleep aktiviert werden.

Im Idle würde die CPU dann schlafen, der PWM-Timer aber trotzdem arbeiten, die IRQs aller Taster wären scharf.
Im PowerDown würde auch der PWM-Timer stehen, Licht aus. Reaktivierung mittels INT0-Tasters
Ok, über den Sinn, den Controller (zum Stromsparen) während des Leuchtens auch schlafen zu schicken braucht Ihr nichts zu sagen...
 

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