- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: ISR(SIG_OUTPUT_COMPARE0B){} und TCNT0 Problem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    03.01.2007
    Beiträge
    5

    ISR(SIG_OUTPUT_COMPARE0B){} und TCNT0 Problem

    Anzeige

    Praxistest und DIY Projekte
    Hallo das habe ich soweit zusammen. Ein Problem habe ich aber noch und
    zwar wen das Programm ISR(SIG_OUTPUT_COMPARE0B){} startet wird der TCNT0
    Register nicht angehalten so das wen ich den wert von OCR0B ändere das
    kein Einfluss auf die Frequenz hat! habe ich da was vergessen?

    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>

    volatile uint16_t ImpulsZaehler1=0;
    uint16_t a=50; //mitte 1,6ms


    // Timer interrupt 4000Hz (4Mhz Quarz)
    void Teimer0B_ON(void){
    TCCR0B |= (1<<CS00) | (1<<WGM02);
    OCR0B = 1;
    TIMSK |= (1<<OCIE0B);
    sei();
    }


    ISR(SIG_OUTPUT_COMPARE0B){
    if (ImpulsZaehler1<100){
    ImpulsZaehler1++;
    }
    if(ImpulsZaehler1==100){
    ImpulsZaehler1=0;
    }
    }



    int main(void){
    Teimer0B_ON();
    DDRD = (1 << DDB6);
    while(1){
    if ( ImpulsZaehler1<a ) {
    PORTD &= ~(PIND ^ ( 1 << PD6) );
    }
    else{
    PORTD = PIND ^ ( 1 << PD6 );
    }
    /*if ( PINB & (1<<PB0) ) {
    a=42; //1,05ms min
    }*/
    }
    }

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Der Zähler wird auch nicht angehalten, sonder nur zurück auf 0 gesetzt und läuft dann weiter.

    Ausserdem: lies mal

    https://www.roboternetz.de/wissen/in...-atomarer_Code

    Ist etwas versteckt das Thema. Wenn wieder Muße habe, wird's ein eigener Artikel.

    Bei dir schlägt das voll zu, weil OCR1B = 1 ist und damit nach *jeder* Instruktion eine IRQ ausgelöst wird! Die ISR wird also krass seltener durchlaufen, als es IRQs gibt.

    Du willst den Port hin-herschalten?

    Das geht zB so:

    Code:
    PORTD ^= 1 << PD6;
    Auch wenn es geht, wird das den Port sehr schnell schalten, so daß du mit bloßem Auge nix erkennst, zB wenn du ne LED am Port hast um zu schauen was der Kamerad so treibt.
    Disclaimer: none. Sue me.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    03.01.2007
    Beiträge
    5
    hallo, danke für den Link leider hat er mir nicht weiter geholfen, ich messe mit einem Oszilloskop und mit einen Frequenzmessgerät, ob ich OCR1B = 1 oder OCR1B = 100 oder auf OCR1B = 256 setze das Oszilloskop zeigt die selbe Frequenz.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Wie sieht dein Code denn jetzt aus?

    [code]-Tags wären angenehm. Der konkrete Controller-Typ unterliegt offenbar der Geheimhaltung.
    Disclaimer: none. Sue me.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    03.01.2007
    Beiträge
    5
    nein, ist ein ATTiny2313, ist nur das was oben sehet mehr habe ich nicht.

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802

    Re: ISR(SIG_OUTPUT_COMPARE0B){} und TCNT0 Problem

    DS pp. 75:

    Du betreibst Timer0 in Mode #4 (Reserved, also ungültig) anstatt in Mode #2 (CTC):

    Code:
    	// Mode #2 (CTC)
    	TCCR0B = (1 << CS00) | (1 << WGM01);
    Disclaimer: none. Sue me.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    03.01.2007
    Beiträge
    5
    danke, hat aber den selben Effekt, der TCNT wird nicht zurückgesetzt!

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    oopps, habe mein post von eben überheinert. Antwort steht oben.
    Disclaimer: none. Sue me.

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    
    volatile uint16_t ImpulsZaehler1;
    uint16_t  a = 50;  //mitte 1,6ms
    
    
    // Timer interrupt 4000Hz (4Mhz Quarz)
    void Timer0B_ON (void)
    {
    	// Mode #2 (CTC)
    	TCCR0B = (1 << CS00) | (1 << WGM01);
    	OCR0B  = 200;
    	TIMSK |= (1 << OCIE0B);
    }
    
    
    ISR (SIG_OUTPUT_COMPARE0B)
    {
        if (++ImpulsZaehler1 >= 100)
        {
    	    ImpulsZaehler1 = 0;
        }
    }
    
    int main(void)
    {
    	Timer0B_ON();
    	DDRD = (1 << PD6);
    	
    	sei();
    	
    	while(1)
    	{
    		uint16_t iz;
    		
    		// atomic
    		cli();
    		iz = ImpulsZaehler1;
    		sei();
    		
    		if (iz < a) 
    		{
    			PORTD &= ~(1 << PD6);
    		}
    		else
    		{
    			PORTD |= (1 << PD6);
    		}
    	} // while (1)
    } // main
    Disclaimer: none. Sue me.

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Das ganze kann aber nur funzen, wenn OCR0B größer ist als die Anzahl der Ticks, die du in der ISR brauchst. Die ISR sollte also noch kürzer werden.
    Disclaimer: none. Sue me.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen