Hoi,
bei mir funktioniert die Fast PWM mit Timer 1 (16BIT) nicht.

Der Timer sollte eigentlich bis zum Wert des Registers OCR1A (Top value) zählen (funktioniert meiner Meinung nach auch) und bei Erreichen des Wertes im Register OCR1B den Ausgang OC1B setzen.


Ich bin mir sicher, daß der Timer wie vorgesehen läuft bzw zählt. Die Interrupts Overflow, Capture und Compare Match OCR1B funktionieren wie gewollt.

Wenn ich die Pins D4,5 als Ausgänge setze, sind beide die ganze Zeit auf 1 gesetzt. Wobei ich OC1A ja garnicht verwende und sogar Port D5 auf 0 setze. Jemand ne Idee woran das liegen könnte?
Keine Ahnung warum OC1B nicht reagiert....

Hier der Code:



Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "delay_ms.h"


volatile unsigned int zvz;


int main(void)
{
	//**********IO-Init******************************

	PORTB|=0xFF;		
	DDRB|=0xFF;

	PORTD|=(1<<4);//PWM Ausgang Timer OC1B
	DDRD&=~(1<<5);
	PORTD|=(1<<5);
 	SREG|=(1<<7);					//Global Interrupt enable


	//***********16Bit Timer Init *************************

	TCCR1A&=~((1<<COM1A1)|(1<<COM1A0));	//normale Port Funktion an PINB5
	TCCR1A|= (1<<COM1B1)|(1<<COM1B0);//	Set ORC1B On Compare Match, löschen bei Top-value
	TCCR1A&=~((1<<3)|(1<<2));		// keine Funktion
	TCCR1A|= (1<<WGM11);			//FAST PWM , TOP=OCR1A
	TCCR1A|= (1<<WGM10);			//FAST PWM , TOP=OCR1A
	
	TCCR1B&=~(1<<ICNC1);			//Input Noise Canceler aus
	TCCR1B|= (1<<WGM13);			//FAST PWM , TOP=OCR1A
	TCCR1B|= (1<<WGM12);			//FAST PWM , TOP=OCR1A
	TCCR1B&=~((1<<CS12)|(1<<CS11));	//Prescaler =1
	TCCR1B|= (1<<CS10);				//Prescaler =1

	TIMSK|= (1<<TICIE1);			//Interrupt Capture enable
	TIMSK|=~(1<<OCIE1A);			//Interrupt Output Compare Match A disable
	TIMSK|= (1<<OCIE1B);			//Interrupt Output Compare Match B enable
	TIMSK|= (1<<TOIE0);				//Interrupt Overflow enable
//**********************************************************************************	
	unsigned char sreg;
	sreg=SREG;
	cli();
	OCR1A=4000;			//einstellen des Top Value des Counters
	OCR1B=2000;			//setzen des Compare matches
	SREG=sreg;
	
	//TCNT1=0;
	
	while (1)
	{

	}



	

}

	//***********Interrupt Routinen Timer1 interrupts****************
	
	//***Interrupt Compare Match B
	ISR(TIMER1_COMPB_vect)			
	{
		PORTB&=~(1<<1);
		PORTB|=(1<<0);

	//	delay_ms(500);
	}
	//***Interrupt Overflow			
	
	ISR(TIMER1_OVF_vect)
	{
		PORTB&=~(1<<0);
		PORTB|=(1<<1);
	//	delay_ms(500);
	}

	//*****Interrupt Capture Event
	ISR(TIMER1_CAPT_vect)			// Tritt ein bei Positive Flanke an ICP1
	{
		zvz=TCNT1;
		if (TCNT1<2000)
		{
			PORTB&=~(1<<5);
			PORTB|=(1<<4);
		}
		if (TCNT1>2000)
		{
			PORTB&=~(1<<4);
			PORTB|=(1<<5);
		}
		PORTB&=~(1<<7);
		delay_ms(500);



	}