2017-07-19 22 views
0

私はATMEGA32とクリスタル16MHzを使用しています。
私は1kHz waveを生成するために次のコードを書いています。ATMEGA32ヒューズビット設定、低ヒューズと高ヒューズ、16MHz、外付けクリスタル?

私はLow- 0xFFHigh-0x99
を書いてみました。しかし、私は1kHz waveを取得することができません。私は250Hz waveを得ています。 1kHzの代わりに。

助けてください。

#define F_CPU 16000000UL 
#include <avr/io.h> //io related 
#include <util/delay.h> //delay 
#include "lcd.h" //custom lib for lcd 
#include <stdlib.h> //for string handling 
#ifndef sbit_h 
#define sbit_h 
int main(void) 
{ 

    //All Declarations Go here. 

    OCR0=p*127/100; //set pwm1 duty cycle 
    OCR2=OCR0;  //set pwm2 duty cycle (Output compare register) 

    while(1) 
    { 
     if ((bit_is_set(PIND, 3))) 
     { 
      pinChange(LED8,1); //Turn on solenoid valve 
      pinChange(LED1,1); 
      //PORTC|=(1<<PC3); 
      _delay_ms(sq); //wait for squeeze time 
      TCCR0 |= (1<<WGM00)|(1<<COM01)|(1<<WGM01)|(1<<CS01)|(1<<CS00); 
      //initialise timer in PWM mode 1kHz//cs00 and cs02 
      _delay_us(500);//90 degree phase shift 
      TCCR2 |= (1<<WGM20)|(1<<COM21)|(1<<WGM21)|(1<<CS22); //initialise timer2 in PWM mode 1kHz//CS22 for 1kHz 
      _delay_ms(w1); //wait until weld time over 
      TCCR0=0x00; //stop PWM1 
      TCCR2=0x00; //Stop PWM2 
      _delay_ms(h); //wait for hold time 
      pinChange(LED8,0); //turn off solenoid valve 
      pinChange(LED1,0); 
      TCNT0=0x00; //Reset timer counter 
      TCNT2=0x00; //reset timer counter 
    } 
} 
+1

おそらく、タイマーは分周クロックを入力として使用し、何とか除数を設定できます。あなたのデータシートを見てください。 –

+0

キットに付属の以前のATMEGA32チップでFineが動作していました。 私は決してヒューズビットをチェック/変更するのに気にかけませんでした。 しかし、それは何らかの問題のために燃えていました。私は新しいものを買わなければならなかった。 コードは同じで、Circuitは同じです。 ヒューズビットの設定と関係があると確信しています。 私はデータシートを参照し、データシートに従ってヒューズビットとして0xFFと0x99を設定します。しかし、残念ながら、まだ問題は残っています。 –

答えて

0

時計の選択fuse bits(場合によってはクロックディバイダ)を正しい方法で設定しましたか?私はCKSEL0...3CKDIV8をチェックし始めます。

私の経験では、希望の正確な倍数を得ることは、ほとんど常に間違ったクロック設定に基づいています。

+0

私はチェックし、ダブルチェックCKSEL0 ... 3は1111 CKDIV8私はチェックして、それはシミュレータ上で正常に動作する必要があります。 実際のハードウェアでは期待通りに動作しません。 私のオシレーターがあきらめてしまったと思いました。私はクリスタルも交換しました。 –

+1

@AntarikshBahekar:内部の8MHz発振器(低ヒューズ0xE4)を一時的に使用して問題の範囲を絞り込み、予想される周波数がそのようになるかどうかを確認できます。 _delay_ms(1000)を使って1秒ごとにIOピンを切り替えることもでき、実際には1秒であることを確認することもできます。まず、タイムベースの権利を取得してから、PWNを開始します。 –

+0

@AntarikshBahekar:クロックソースを正しく設定しているかどうかを確認するには、クリスタルを切断し、出力信号を確認します。まだ250Hzが得られている場合、マイクロコントローラは内部クロックで動作しています。 – d10e

関連する問題