2017-07-19 2 views
0

Ich verwende ATMEGA32 mit Crystal 16MHz.
Ich habe folgenden Code geschrieben, um 1kHz Welle zu generieren.ATMEGA32 Sicherungsbiteinstellungen, Low Fuse und High Fuse, 16MHz, Externer Quarz?

Ich versuchte Low- 0xFFHigh-0x99
schreiben Aber ich bin nicht in der Lage 1kHz wave zu bekommen. Ich bekomme 250Hz wave. anstelle von 1kHz.

Bitte helfen.

#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

Wahrscheinlich verwendet der Timer eine geteilte Uhr als Eingabe und Sie können den Teiler irgendwie konfigurieren. Schauen Sie in Ihr Datenblatt. –

+0

Es funktionierte gut mit dem vorherigen ATMEGA32-Chip, der mit dem Kit geliefert wurde. Ich habe nie versucht, die Sicherungsbits zu überprüfen/ändern. Aber dieser brannte wegen irgendeines Problems. also musste ich ein neues kaufen. Code ist gleich, Schaltung ist gleich. Ich bin mir sicher, dass es etwas mit Fuse bit Settings zu tun hat. Ich habe auf Datenblatt verwiesen und 0xFF anf 0x99 als Sicherungsbits gemäß Datenblatt gesetzt. aber leider bleibt das Problem bestehen. –

Antwort

0

Hast du Taktauswahl fuse bits (und möglicherweise Taktteiler) in der richtigen Art und Weise eingestellt? Ich würde anfangen, CKSEL0...3 und CKDIV8 zu überprüfen.

Nach meiner Erfahrung beruht das Erhalten eines genauen Vielfachen des gewünschten time/frequency fast immer auf einer falschen Uhreinstellung.

+0

Ich überprüft und doppelt überprüft CKSEL0 ... 3 sollte 1111 CKDIV8 ich habe überprüft und es funktioniert gut auf Simulator. Nur dass es in echter Hardware nicht wie erwartet funktioniert. Ich dachte mein Oszillator hat aufgegeben. Ich habe den Kristall auch ersetzt. –

+1

@AntarikshBahekar: Sie können das Problem eingrenzen, indem Sie vorübergehend den internen 8MHz-Oszillator (niedrige Sicherung 0xE4) verwenden und prüfen, ob Sie die erwartete Frequenz (halb) erhalten. Sie können auch einen IO-Pin jede Sekunde mit einem _delay_ms (1000) umschalten und sicherstellen, dass es wirklich 1s ist. Zuerst solltest du deine Zeitbasis richtig einstellen und dann PWN-Zeug starten. –

+0

@AntarikshBahekar: Um zu überprüfen, ob Sie die Clock-Quelle richtig eingestellt haben, können Sie den Kristall abklemmen und das Ausgangssignal überprüfen. Wenn Sie immer noch 250Hz bekommen, läuft der Mikrocontroller auf seiner internen Uhr. – d10e

Verwandte Themen