Timer1 Problem

mktrspalte

Neues Mitglied
20. Mai 2008
30
0
0
Sprachen
Hallo
ich habe Timer1 Probleme.Ich habe 2 Schalter, einer für Start/Stop ,andere für Schnell/Langsam.wenn ich einmal schnell/langsam Schalter betätigt alles in Ordnung aber wenn ich zweite mal betätigt dann motor hält.und warte ca. 1 minute dann funktioniert weiter.
Code:
#include <avr\io.h>
#include <inttypes.h>
#include <avr\interrupt.h>
#include <util/delay.h>
#include <stdbool.h> 

volatile int i=0;	//schrittanzahl
float u=0;			//Umdrehung
float f_max=10;		//wenn Schalter Schnell betätigt->Frequenz=10
float f_min=5;		//wenn Schalter langsam betätigt->frequenz=5

void motor2();

void InitPorts()
{
 	DDRB =0b00000110;   		//PB1->richtung PB2 ->takt Ausgänge
	DDRC  &= ~(1<<DDC4);		//PC4 Schnell/langsam schalter
	PORTC |= (1<<PC4);
	
}

//Funktion für Schalter(gedrückt oder nicht)
bool check_button(volatile uint8_t *port, uint8_t pin, bool depressed){
		
	if(!(*port&_BV(pin))){
	_delay_ms(10);
    	if(!(*port&_BV(pin))){
       	if(depressed)while(!(*port&_BV(pin)));
       	return(true);
    	}
	}
	return(false);
}


void InitTimer1(void)		//Timer initialisierung
{
	
	TIFR1  =0b00000010;		// Interrupt Request loeschen (sicherheitshalber)
	TIMSK1 =0b00000010;		// Enable Output Compare A Interrupt
	TCCR1A =0b01000000;		
	TCCR1B =0b00001101;		// Prescaler 1024, CTC Mode 4, Timer1 Start
	OCR1A  =((18432000/8)/(2*1024*f_max))-1;			// CompareTime ist 200ms (18,432/900*1024*5MHz)
	TCNT1 =0;			
}

ISR (TIMER1_COMPA_vect)
{			
	(check_button(&PINC,PINC5,true));	//PC5 Start/Stop Schalter
	
	i++;
	motor2();
}	
	
void motor2()
{
	if (i<150)
	{
	PORTB^= (1<<PB2);	

	}
	else if (i>=150)
	{
		PORTB^= (1<<PB1);	//Richtung ändern
		_delay_ms(5);
		i=0;
		u++;
		
		if (u==6)		//6 Umdrehung hält Motor
		{
 			u=0;
			loop_until_bit_is_clear (PINC,PC5);	//start/stop schlater
	
		}
	}
}

int main()
{
sei();
InitPorts();
InitTimer1();
			
do{
			if(check_button(&PINC,PINC4,false))
			{
				OCR1A =((18432000/8)/(2*1024*f_min))-1;
			}
			else	
			{
				OCR1A =((18432000/8)/(2*1024*f_max))-1;
			}	

}
while(1);

}
Und wenn ich Timer2 benutze, dann funktioniert alle Funktinen richtig.Ich weiss nicht, warum so macht , warum wartet.Mein kleinere Frequenz soll 1 Hz aber mit Timer2 ist das nicht möglich. Kleinste Frequenz ist 4,39 Hz
(Fsignal=((18432000/8(CLKDIV))/(2*1024*(255+1))) ==>4,39HZ)

was soll ich machen?
 
Hallo,

ich vermute das Problem liegt an der allgemeinen Struktur deines Programms.

Du hast eine Interruptroutine (Timer1 Compare), in der du die Routine check_button aufrufst. Die Routine kehrt unter Umständen nicht sofort zurück, hier verwendest du sogar eine Pause _delay_ms(10), sowas ist in Interruptroutinen "gefährlich". Die TimerCompareISR ruft auch die Routine motor2() auf. Diese Routine verwendet ebenfalls eine Pause und kehrt eventuell durch loop_until_bit_is_clear nicht sofort zurück.

Eine wichtige Regel: Interruptserviceroutinen immer so kurz wie möglich, und hier nur zeitkritische Sachen erledigen!

Das Hauptprogramm main() kommt überhaupt nicht mehr richtig zum Laufen. Du fragst mit check_button() einen Pin ab und führst danach permanent eine float-Division durch, die Abarbeitungszeit ist entsprechend hoch, da eventuell nach der ISR nur ein Befehl in main (Assembler nicht C!, das sind vielleicht 1 bis 3 Maschinenzyklen) abgearbeitet wird, dann kommt erneut die ISR dran.

Du musst die Struktur deines Programmes ändern. Verwende möglichst kleine Zahlenbereiche, da du f_max und f_min zahlenmäßig festlegst, kannst du die Gleichungen in main bereits lösen, der AVR hat dann erheblich weniger zu tun. Und wie schon erwähnt, die Interruptserviceroutinen sind zu "überlastet". Ist die ISR abgearbeitet, ist wahrscheinlich schon wieder eine ISR-Anforderung vorhanden.

Ich hoffe, ich konnte dir ein bisschen weiterhelfen.

Grüsse,
Dirk

 
Hallo Dirk
Danke für Ihre Hilfe.
Ich habe ein bisschen verstanden.Ohne ISR ,wie soll ich Programm schreiben,oder was soll ich machen?
Die Einstellungen der Register muss veraendert werden? oder?
Können Sie mir helfen? Ich habe vorher nicht mit dem uC gearbeitet,deshalb manche Probleme kann ich nicht gut verstehen:(
 
Hallo,

du benötigst ja eine von einem Timer abgeleitete Zeitbasis, also nutzt du die entsprechende ISR des Timers, in deinem Fall ist es der CompareInterrupt.

Ich verstehe dein Programm noch nicht genau.
  1. Also du hast einen Start/Stopp-Taster, dieser soll Schaltfunktion und nicht Toggelfunktion haben?
  2. Du hast noch einen Taster, der die Drehzahl des Motors in zwei Stufen ändert, indem die entsprechende Routine den Comparewert des Timers ändert?
  3. Du toggelst 150 mal, etwa einmal in der Sekunde, je nachdem wie der Comparewert eingestellt ist? Dies entspricht einer Umdrehung des Motors?
  4. Nach jeder Umdrehung änderst du die Drehrichtung, das ganze 6 mal, dann stoppst du den Motor.
  5. Jetzt wartest du auf Betätigung der Starttaste, wenn sie betätigt wird läuft das ganze von vorne los?
Ist das so richtig?

Gruss,
Dirk
 
Ok ich erklaere mein System zuerst.
1) Ich habe 2 Schalter, kein Taster.Erste Schalter aendert die Frequenz.Langsamte Frequenz=1 Hz motor dreht mit 1 Hz, Schnellste Frequenz=5 Hz und Motor dreht mit 5 Hz.Andere Schlater ist für Start/Stop.
2) 150 mal wird getoggelt, und dann motor Richtung aenderter.Jede 150 Schritte soll die Richtung geaendert wird.
3)u ist Umdrehung, wenn 150 Schritte dreht der Motor u ++
4)Dann warte ich auf Betätigung der Starttaste, wenn sie betätigt wird läuft das ganze von vorne los.
Hoffentlich kann ich ein bisschen erklaeren.
 
Hallo,

ich habe das Programm etwas abgeändert. Die Tastenabfragen erfolgen nun in main() nicht mehr in der ISR. Ist der Motorzyklus durchlaufen, wird Timer und Interrupt in der ISR (bzw. in motor()) deaktiviert.

Was mir noch aufgefallen ist, du hattest PC5 nicht als Eingang definiert, nach einem Reset sind zwar alle Pins Eingänge, allerdings ist der interne Pullup ausgeschaltet, es kann somit zu einem nicht definierten Zustand kommen.

Die Berechnung der Comparewerte habe ich nicht überprüft.

Hier einmal das überarbeitete Programm (nicht ausgetestet):



CodeBox C
#include <avr\io.h>
#include <inttypes.h>
#include <avr\interrupt.h>
#include <util/delay.h>
#include <stdbool.h>

volatile int i=0; //schrittanzahl
float u=0; //Umdrehung
//float f_max=10; //wenn Schalter Schnell betätigt->Frequenz=10
//float f_min=5; //wenn Schalter langsam betätigt->frequenz=5

#define f_max 10
#define f_min 5

void motor2();

void InitPorts()
{
DDRB =0b00000110; //PB1->richtung PB2 ->takt Ausgänge
DDRC &= ~((1<<PC4) | (1<<PC5)); //PC4 Schnell/langsam schalter
PORTC |= (1<<PC4) | (1<<PC5); // Pullup

}

//Funktion für Schalter(gedrückt oder nicht)
bool check_button(volatile uint8_t *port, uint8_t pin, bool depressed){

if(!(*port&_BV(pin))){
_delay_ms(10);
if(!(*port&_BV(pin))){
if(depressed)while(!(*port&_BV(pin)));
return(true);
}
}
return(false);
}


void InitTimer1(void) //Timer initialisierung
{

TIFR1 =0b00000010; // Interrupt Request loeschen (sicherheitshalber)
TIMSK1 =0b00000010; // Enable Output Compare A Interrupt
TCCR1A =0b01000000;
TCCR1B =0b00001101; // Prescaler 1024, CTC Mode 4, Timer1 Start
OCR1A =((18432000/8)/(2*1024*f_max))-1; // CompareTime ist 200ms (18,432/900*1024*5MHz)
TCNT1 =0;
}

void StopTimer1(void)
{
TCCR1B = 0; // Stop Timer 1
TIMSK1 &= ~(1<<OCIE1A); // Disable OutputCompareA Interrupt

}

ISR (TIMER1_COMPA_vect)
{
//(check_button(&PINC,PINC5,true)); //PC5 Start/Stop Schalter

i++;
motor2();
}

void motor2()
{
if (i<150)
{
PORTB^= (1<<PB2); // PB2 toggeln

}
else
{
PORTB ^= (1<<PB1); //Richtung ändern
// _delay_ms(5); // Pause in der ISR ist nicht gut, wenn die notwendig ist
// dann wäre es besser, wenn man das anders löst
i=0;
u++;

if (u>=6) //6 Umdrehung hält Motor
{
u=0;
//loop_until_bit_is_clear (PINC,PC5); //start/stop schlater
StopTimer1(); // Timer1 anhalten und Interrupt deaktivieren

}
}
}



int main()
{

InitPorts();
//InitTimer1();
sei();

do{
// Drehzahl ändern
if(check_button(&PINC,PINC4,false))
{
// Taste betätigt, Schalter an
OCR1A =((18432000/8)/(2*1024*f_min))-1;
}
else
{
// Taste nicht betätigt, Schalter aus
OCR1A =((18432000/8)/(2*1024*f_max))-1;
}


// Motorzyklus anschalten
if((check_button(&PINC,PINC5,false)) && (TCCR1B == 0))
{
// Taste Start betätigt und Timer gestoppt
InitTimer1();
}

}
while(1);

}
Grüsse,
Dirk
 
Hallo Dirk
ich habe deine Code probiert aber jetzt funktioniert nicht Start/Stop Schalter und Motor hält noch, wenn Schnell/Langsam Schalter betätigt.

Ich habe nicht verstanden, warum wartet Motor und dann noch weiter funktioniert.:(
Warum funktioniert die Code mit Timer0 und Timer2 aber nicht mit Timer1?

Grüsse
 
Hallo,

versuche einfach einmal den code zu vereinfachen:
  • keine Drehrichtungsänderung,
  • keine Start/Stop-Taste,
  • keine Drehzahländerung.
Läuft der Motor dann?

Kannst du den Code für Timer0 und Timer2 posten.

Ich habe versucht, deine Festlegung des Comparewertes nachzuvollziehen, komme aber nicht auf die gewünschte Drehzahl.

Noch zwei Verständnisfragen:
  • 150 mal toggeln bedeutet 1 Umdrehung?
  • Du hast das Fusebit CKDIV8 aktiviert?
Grüße,
Dirk
 
Hallo

Das ist ein bisschen schwer zu erklaeren.
1)150 mal Toggle bedeutet:Motor dreht 150 mal (oder 200 mal egal) CCW (Counter Clockwise),dann aendert Drehrichtung und 150 mal CW, dann noch mal aendert....das passiert 6 mal.
2) Ich habe das Fusebit CKDIV8 aktiviert.

Code:
#include <avr\io.h>
#include <inttypes.h>
#include <avr\interrupt.h>
#include <util/delay.h>
#include <stdbool.h> 

volatile int i=0;	//schrittanzahl
float u=0;			//Umdrehung
float f_max=10;		//wenn Schalter Schnell->Frequenz=10
float f_min=5;		//wenn Schalter langsam->frequenz=5

void motor2();

void InitPorts()
{
 	DDRB =0b00000110;   		//PB1->richtung PB2 ->takt Ausgänge
	DDRC  &= ~(1<<DDC4);		//PC4 Schnell/langsam schalter
	PORTC |= (1<<PC4);
	
}

//Funktion für Schalter(gedrückt oder nicht)
bool check_button(volatile uint8_t *port, uint8_t pin, bool depressed){
		
	if(!(*port&_BV(pin))){
	_delay_ms(10);
    	if(!(*port&_BV(pin))){
       	if(depressed)while(!(*port&_BV(pin)));
       	return(true);
    	}
	}
	return(false);
}

void InitTimer2(void)		//Timer initialisierung
{
	
	TIFR2  =0b00000010;		// Interrupt Request loeschen (sicherheitshalber)
	TIMSK2 =0b00000010;		// Enable Output Compare A Interrupt
	TCCR2A =0b01000010;		
	TCCR2B =0b00000111;		// Prescaler 1024, CTC Mode 4, Timer2 Start
	OCR2A = ((18432000/8)/(2*1024*f_max))-1;  
	TCNT2 =0;				
}

ISR (TIMER2_COMPA_vect)
{			
	(check_button(&PINC,PINC5,true));	//PC5 Start/Stop Schalter
	
	i++;
	motor2();
}	
	
void motor2()
{
	if (i<200)
	{
	PORTB^= (1<<PB2);	

	}
	else if (i>=200)
	{
		PORTB^= (1<<PB1);	//Richtung ändern
		_delay_ms(5);
		i=0;
		u++;
		
		if (u==6)		//6 Umdrehung hält Motor
		{
 			u=0;
			loop_until_bit_is_clear (PINC,PC5);	//start/stop schlater
	
		}
	}
}

int main()
{
sei();
InitPorts();
InitTimer2();
			
do{
			if(check_button(&PINC,PINC4,false))
			{
				OCR2A =((18432000/8)/(2*1024*f_min))-1;
			}
			else	
			{
				OCR2A =((18432000/8)/(2*1024*f_max))-1;
			}	

}
while(1);


}


Diese Funktion funktioniert richtig.Aber wenn ich Timer1 benutze, dann Schnell/langsam Schlater funktioniert nicht.
 
Hallo,

mir ist folgendes aufgefallen. Du aktivierst die CompareMatch Pins der Timer OC1A und OC2A, nutzt du diese eigentlich? Wenn nicht, deaktiviere diese Funktion. Vielleicht nutzt du eines der Pins für eine normale Portfunktion, diese wird dann allerdings von der Timerfunktion deaktiviert.
Deine Konfiguration:
Code:
// Timer2:
TCCR2A =0b0[COLOR=DarkRed][B]1[/B][/COLOR]000010; // OC2A Pin aktiviert, normale Portfunktion deaktiviert
                    // Toggle on compare match

// Timer1:
TCCR1A =0b0[COLOR=DarkRed][B]1[/B][/COLOR]000000; // OC1A Pin aktiviert, normale Portfunktion deaktiviert
                    // Toggle on compare match
Der Grund warum es mit Timer1 nicht funktioniert ist wahrscheinlich folgender:

Im CTC Modus ist das Compareregister nicht double buffered. Wenn du das Compareregister änderst (Wert wird kleiner), kann es vorkommen, dass der Timer nicht den Wert des Compareregisters erreicht, es kommt somit nicht zum CompareEvent und der Timer wird somit nicht auf 0x00 zurückgesetzt, sondern läuft bis 0xFF (Timer2) oder 0xFFFF (Timer1), es wird hier auch kein CompareInterrupt ausgeführt. Timer1 ist ein 16bit Timer, Timer2 ist ein 8Bit Timer. Beim Timer2 kommt es hier also schneller wieder zu einem CompareEvent, der Timer1 läuft dann erst bis 0xFFFF (65535d) bis er überläuft. Den Effekt beim Timer2 merkst du also nicht so sehr, beim Timer1 jedoch viel eher, da er viel länger benötigt, bis es wieder zum CompareEvent kommen kann. Du hast zusätzlich die Timer sehr langsam laufen (XDIV8 und Prescaler 1024) und der Comparewert ist relativ klein (8bit Bereich).

Um das Problem zu umgehen, nutze den FastPWM Mode des Timers, wo TOP des Timers durch das Compareregister definiert wird und bei 0x00 das Compareregister automatsich aktualisiert wird (double buffered).

Das ist ein bisschen kompliziert, ich hoffe ich konnte das einigermassen rüberbrigen :rolleyes:

Grüße,
Dirk
 
Hallo
ich habe den Grund des Problems fast verstanden.Aber jetzt habe ich viele Frage.
Ok ich versuche nochmal ein neues Program zu schreiben.Mein Takt ist 18,432Mhz, ich will 1 Hz und 4 Hz zwei verschiedene Frequenzwerte.(Die Frequenzen wird mit dem Schalter eingestellt.)
1)Welche Timer Mode ist für mich besser?Ich möchte Rechtecksignal für den Schrittmotor?
2) Wie kann ich mich entschieden?
3)Wofür wird CTC Mode benutzt oder wofür wird Fast PWM Mode benutzt?

Ich habe schon Datashett des Atmega88 gelesen.Aber ohne Beispiel ist ein bisschen schwer zu verstehen.
Haben Sie kleine Beispiel mit Fast Pwm Mode?
Danke für Ihre Unterstützung.
Gruss
 
Hallo,
Hallo
Mein Takt ist 18,432Mhz, ich will 1 Hz und 4 Hz zwei verschiedene Frequenzwerte.

ich habe da nochmal eine Verständnisfrage:
  • 1Hz und 4Hz Rechtecksignal an einem Pin des AVR oder
  • 1Hz und 4Hz Motordrehzahl?
Grüße,
Dirk
 
Hallo
1Hz und 4Hz Rechtecksignal an einem Pin des AVR .Motor soll zwei verschiedene Frequenzen drehen.oder egal wenn Motor erstmal mit 1 Hz drehen kann, dann kann ich 4 Hz auch einstellen.

Mein Schrittmotor muss so langsam drehen wie möglich.
 
Hallo,

hier habe ich nochmal ein Beispiel, bei dem im Intervall von 1ms ein OutputCompareAInterrupt erfolgt. Der Timer läuft im CTC-Mode, das CompareRegister wird nur in der Routine InitTimer1() initialisiert, ansonsten jedoch nicht verändert.

In der ISR wird durch die Variable PrescaleCounter weiter verzögert, so dass man eine Ereigniszeit von 125ms oder 500ms erreicht, bei dieser man dann den Portpin toggeln kann. Durch setzen und löschen des Bits MODE_SLOW in der Variable Flags, kann man zwischen 1Hz und 4Hz umschalten. Start/Stop und Drehrichtungsänderung ist noch nicht realisiert.

Der Prescaler des Timers ist für 18,432MHz berechnet, also Fusebit CKDIV8 deaktivieren! (Das Programmbeispiel habe ich nicht ausgetestet)

Vielleicht hilft dir das Beispiel ja etwas weiter.

Grüße,
Dirk



CodeBox c
volatile uint16_t PrescaleCounter;
volatile uint8_t Flags;
#define MODE_SLOW 0

void InitTimer1(void) //Timer initialisierung

{

PrescaleCounter = 0; // wird in der ISR genutzt
Flags |= (1<<MODE_SLOW); // Bit MODE_SLOW gesetzt, dann 1Hz, ansonsten 4Hz

// CompareAEventTime = 1ms
// CTC-Mode: WGM13=0, WGM12=1, WGM11=0, WGM10=0
// Prescaler 64: CS12=0, CS11=1, CS10=1

TIFR1 =0b00000010; // Interrupt Request loeschen (sicherheitshalber)

TIMSK1 =0b00000010; // Enable Output Compare A Interrupt

// TCCR1A =0b00000000;

TCNT1 =0;

OCR1A = 288; // CompareTime 1ms

TCCR1B =0b00001011; // Prescaler 64, CTC Mode 4, Timer1 Start


}



ISR (TIMER1_COMPA_vect)

{

if (Flags &(1<<MODE_SLOW))
{
// 1Hz
if (PrescaleCounter >= 500)
{
PORTB^= (1<<PB2); // PB2 alle 500ms toggeln (1Hz Signal)
PrescaleCounter = 0;
} else {
PrescaleCounter++;
}

} else {
// 4Hz
if (PrescaleCounter >= 125)
{
PORTB^= (1<<PB2); // PB2 alle 2000ms toggeln
PrescaleCounter = 0;
} else {
PrescaleCounter++;
}

}

}

void main(void)
{

InitPorts();
InitTimer1();
sei();


do
{

// Drehzahl ändern
if(check_button(&PINC,PINC4,false))
{
Flags |= (1<<MODE_SLOW); // 1Hz
} else {
Flags &= ~(1<<MODE_SLOW); // 4Hz

}




}
while(1)



}

 

Anhänge

  • timer_1ms.png
    timer_1ms.png
    18,9 KB · Aufrufe: 4
Hallo
Flags |= (1<<MODE_SLOW); // Bit MODE_SLOW gesetzt, dann 1Hz, ansonsten 4Hz
was passiert mit diesem Flag?
und
ISR (TIMER1_COMPA_vect)
{
if (Flags &(1<<MODE_SLOW))
{
// 1Hz
if (PrescaleCounter >= 500)
{
PORTB^= (1<<PB2); // PB2 alle 500ms toggeln (1Hz Signal)
PrescaleCounter = 0;
} else {
PrescaleCounter++;
}
ich konnte diese Funktion nicht gut verstanden..
Gruss
 
Hallo,

MODE_SLOW ist ein Bit im 8Bit-Register Flags. Man kann ausserhalb der ISR dieses Bit setzen oder löschen. In der ISR wird dieses Bit überprüft, ist es gesetzt, wird in der ISR ein 1Hz Signal am Pin PB2 erzeugt, ist es gelsöscht, wird ein 4Hz Signal erzeugt.

Wenn du mit der Bitadressierung nicht zurechtkommst, verwende einfach ein ganzes Byte. Hier am Beispiel mit der Variablen Slow anstelle mit Flags.



CodeBox C
volatile uint16_t PrescaleCounter;
volatile uint8_t Slow;


void InitTimer1(void) //Timer initialisierung

{

PrescaleCounter = 0; // wird in der ISR genutzt
Slow = 0xFF;

// CompareAEventTime = 1ms
// CTC-Mode: WGM13=0, WGM12=1, WGM11=0, WGM10=0
// Prescaler 64: CS12=0, CS11=1, CS10=1

TIFR1 =0b00000010; // Interrupt Request loeschen (sicherheitshalber)

TIMSK1 =0b00000010; // Enable Output Compare A Interrupt

// TCCR1A =0b00000000;

TCNT1 =0;

OCR1A = 288; // CompareTime 1ms

TCCR1B =0b00001011; // Prescaler 64, CTC Mode 4, Timer1 Start


}



ISR (TIMER1_COMPA_vect)

{

// Die ISR wird alle 1ms aufgerufen

if (Slow)
{
// 1Hz
if (PrescaleCounter >= 500)
{
PORTB^= (1<<PB2); // PB2 alle 500ms toggeln (1Hz Signal)
PrescaleCounter = 0; // PrescaleCounter wieder auf Anfangswert
} else {
PrescaleCounter++; // PrescaleCounter inkrementieren
}

} else {
// 4Hz
if (PrescaleCounter >= 125)
{
PORTB^= (1<<PB2); // PB2 alle 200ms toggeln
PrescaleCounter = 0;
} else {
PrescaleCounter++;
}

}

}

void main(void)
{

InitPorts();
InitTimer1();
sei();


do
{

// Drehzahl ändern
if(check_button(&PINC,PINC4,false))
{
Slow = 0xFF; // 1Hz
} else {
Slow = 0; // 4Hz

}

}
while(1)

}
 
Hallo
Jetzt ist alles deutlich:) Ich habe die Code schon probiert.Das Programm funktioniert aber irgendwo gibt es ein Fehler.Die Frequenzen hab ich mit Osiloskop kontrolliert.aber nicht richtig 1 Hz= 35 Hz, und 4 Hz= 142 Hz.
Alle 1 ms wird die ISR aufgerufen und so können wir Freuquenz überprüfen für 1 hz oder 4 Hz.Ich konnte den Fehler noch nicht gesehen?
Gruss
 
Hallo,

versuche mal folgendes:
Code:
ISR (TIMER1_COMPA_vect)
{            
   PORTB^= (1<<PB2);
}
... was misst du denn jetzt an PB2?
 
Hallo
Code:
ISR (TIMER1_COMPA_vect)
{            
   PORTB^= (1<<PB2);
}

Jetzt ist sehr grössere Frequenz etwa 20 Khz, und Motor dreht nicht mehr.Grössere Frequenzen ist für Treiberkarte gefährlich.
 
Hallo,

der Test war eigentlich nur dafür gedacht, um mit dem Oszilloskop zu überprüfen, ob der Timerinterrupt im Intervall 1ms auftritt, nicht um den Motor damit laufen zu lassen.

Poste bitte einmal dein aktuelles Programm, ich werde es dann selber im Mikrocontroller testen.

Grüße,
Dirk
 

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