Timer1 Problem

Ok.das war mein Fehler. Ich habe vergessen TCNT Wert zu schreiben .Jetzt Shnell=8 Hz , Langsam =2 hz.
Code:
#include <avr\io.h>
#include <inttypes.h>
#include <avr\interrupt.h>
#include <util/delay.h>
#include <stdbool.h> 

volatile uint16_t PrescaleCounter;
volatile uint8_t Slow;
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
{

	PrescaleCounter = 0;        // wird in der ISR genutz
	Slow = 0xFF;
	TIFR1  =0b00000010;        // Interrupt Request loeschen (sicherheitshalber)
    TIMSK1 =0b00000010;        // Enable Output Compare A Interrupt
	TCNT1 = 0;  
	OCR1A= 288;            		//	CompareTime 1m
    TCCR1B =0b00001010;        // Prescaler 64, CTC Mode 4, Timer1 Start	
}


ISR (TIMER1_COMPA_vect)
{
    
   if (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++;
      }
   }  
}    

int main(void)
{
   InitPorts();
   InitTimer1();
   sei();

do   {
 
      // Drehzahl ändern
      if(check_button(&PINC,PINC4,false))
      {
       
	   Slow = 0xFF;    // 1Hz
      } 
	  else {
      
		Slow = 0;      // 4Hz 
      }
   }
 while(1);
 }
CKDIV8 aktiviert.
Manchmal ohne Motor alles richtig funktioniert, aber wenn Motor angeschlossen wurde , dann dreht nicht (richtige Frequenzen).
Aber sie haben Recht, ich soll immer ohne Motor testen.
 
Hallo,

bist du sicher, dass du über eine ganze Periode gemessen hast? Ich würde die Periodendauer des Interrupts überprüfen, verwende doch einfach einen freien Pin, schalte diesen als Ausgang und toggel den Pin direkt in der ISR, da müsste dann am Pin ein Rechtecksignal mit einer Periodendauer von 2ms zu messen sein.

Ich hatte leider noch keine Zeit, das Programm selber einmal auszuprobieren.

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)