- fchao-Sinus-Wechselrichter AliExpress         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 22 von 22

Thema: Zeiten ohne Delay

  1. #21
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    39
    Beiträge
    199
    Anzeige

    Powerstation Test
    Ich hab mir jetzt folgendes überlegt.
    Ich nehme einfach den OCR1B mit dazu und bei jedem Compare soll eine interrupt-routine ausgelöst werden, die meine Variable einen hochzählt. Hab die Funktion umgeschrieben. Die gibt jetzt einen Wert zurück.
    Mein Programm gibt auch keine Fehlermeldung raus, nur mein Servo zuckt jetzt ganz schnell in mittelstellung hin und her, aber nur immer paar millimeter in jede richtung.
    Kann sich vielleicht noch mal jemand meinen neuen Code ansehen?
    Code:
    #include <avr/io.h>
    #include <stdint.h>
    #include <avr/interrupt.h>
    
    #ifndef F_CPU
    #define F_CPU 16000000
    #endif
    
    #define Scheinwerfer 0
    #define Rueckleuchten 1
    #define PWM_ServoPort 5
    
    
    //Globale Variablen
    uint8_t a;
    uint16_t count;
    
    
    //---------------------------------Helligkeitsmessung---------------------------------
    void helligkeitsmessung(void)
    {
    uint16_t LDR;
    
    ADCSRA |= (1<<ADSC);
      while (ADCSRA & (1<<ADSC))
        {
    	;
    	}
      LDR = ADCL;
      LDR += (ADCH<<8);
      
      if (LDR<150)
        {
        PORTD |= (1<<Scheinwerfer);
        PORTD |= (1<<Rueckleuchten);
        }
      if (LDR>160)
        {
    	PORTD &= ~(1<<Scheinwerfer);
    	PORTD &= ~(1<<Rueckleuchten);
    	}
    }
    
    //-------------------------------------IR_Servosteuerung---------------------------------------
    int IR_Servoposition(void)
    {
    ISR(TIMER1_COMPB_vect);
    
    if (a==0)
      {
      count++;
      if (count==50)
        {
    	a=1;
    	}
      }
    if (a==1)
      {
      count--;
      if (count==0) 
        {
    	a=0;
    	}
      }
    return (count+440);   //440=min, 490=max
    }
    
    
    //-------------------------------------initialisierungen---------------------------------------
    void Initial_ADC0(void)
    {
    ADMUX = 0x00;	//AREF, resultat rechtsbündig, ADC-Eingang ADC0
    ADCSRA = ((1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0));  //ADC eingeschaltet, Teilungsfaktor..
    DDRD |= ((1<<Scheinwerfer) | (1<<Rueckleuchten));
    }
    
    void Initial_IR_Servo(void)
    {
    TCCR1A = ((1<<WGM11)|(1<<COM1A1)|(1<<COM1A0)); //9-Bit PWM, Inverted Mode OC1A
    TCCR1A |= ((1<<COM1B1)|(1<<COM1B0)); //Inverted Mode OC1B
    TCCR1B = (1<<CS12); 	//Prescaler 256
    DDRD |= (1<<PWM_ServoPort); 
    PORTD |= (1<<PWM_ServoPort);
    OCR1B=500; //beliebige zeit (irgendwas unter ner ms)
    }
    
    //---------------------------------------Hauptprogramm---------------------------------
    int main(void)
    {
    Initial_ADC0();
    Initial_IR_Servo();
    a=0;
    count=0;
    
    while(1)
      {
      sei();
      helligkeitsmessung();
      OCR1A = IR_Servoposition();
      cli();
      }
    }
    Wenigstens tut sich jetzt schon mal was

    MfG Jan
    Habe Mut, dich deines eigenen Verstandes zu bedienen.

  2. #22
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    39
    Beiträge
    199
    Habs grade rausgefunden. Die Frequenz war einfach viel zu hoch.
    Jetzt klappts!!!
    Nur eins kann ich mir jetzt echt nicht erklähren. Warum flackern die Scheinwerfer und Rückleuchten jetzt???
    Das liegt doch nicht an dem Interrupt, oder? Wie kann ich das denn (falls es so ist) ändern?

    MfG Jan
    Habe Mut, dich deines eigenen Verstandes zu bedienen.

Seite 3 von 3 ErsteErste 123

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress