- LiFePO4 Speicher Test         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 36

Thema: Problem mit Timerablauf/neu ICP1 funktioniert nur einmal

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Anzeige

    Powerstation Test
    okay ... jetzt wo cih nochmal genau geschaut habe, hast du recht! hab ich gar nicht so gewusst

    irgendwann aber, meine ich, hab ich gelesen (so in den anfängen) dass die ISRs verschachtelt aufgerufen werden können wenn ich sie nicht per cli und sei sperre ... und irgendwie hat das auch wirklung gezeigt ...

    PS mein winavr war von 2007 (man sollte gebrauchtes equipment wirklich vorher überprüfen ^^) wenn ich mich vorhin nicht verguckt habe .. kann es sein dass das erst später dazukam ?

  2. #12
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    HIER GEHTS MIT "ICP1 funktioniert nur einmal" WEITER

    Code:
    ISR(SIG_INPUT_CAPTURE1) 
    {
            PORTB |= (1<<PB0);
    	if(TCCR1B & (1<<ICES1)) {
    		TCCR1B &= ~(1<<ICES1);
    		ramptimeusec = (ICR1>>1);
    		ramptimemsec = mtime;
    	}
    	else {
    		TCCR1B |= (1<<ICES1);
    		unsigned int ramptime = ((unsigned int)(mtime - ramptimemsec)) * 1000;
    		ramptime = (signed int)ramptime + (signed int)(ICR1>>1) - (signed int)ramptimeusec;
                   .....
            }
    	PORTB &= ~(1<<PB0);
    }
    in dieser ISR versuche ich eine impulslänge zu messen ...

    die flanken werden u.a. durch start und stop ausgelöst/erzeugt

    kann es sein, dass durch das LÖSCHEN des edgeselect

    TCCR1B &= ~(1<<ICES1);

    der interrupt gestört wird ? wenn ich die zeile aus dem true-zweig nämlich rauseditiere gehts, dann bekomme ich den strobe mit!

    ich hab jetzt die startbedingung geändert und den edgeselect auf falling initialisiert, und siehe da ich bekommen GARKEINEN impuls ... hab ich meinen komparator geschrottet ? hab ich beim schreiben der ISR was nicht beachtet ??? warum bekomm cih auf fallende flanken plötzlich keinen interrupt mehr ?

    das signal hab ich auf dem oszi überprüft, einwandfrei!

  3. #13
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Ceos
    irgendwann aber, meine ich, hab ich gelesen (so in den anfängen) dass die ISRs verschachtelt aufgerufen werden können wenn ich sie nicht per cli und sei sperre ...
    Dann bezog sich der Text entweder nicht auf den AVR oder er war schlicht falsch.

    PS mein winavr war von 2007 (man sollte gebrauchtes equipment wirklich vorher überprüfen ^^) wenn ich mich vorhin nicht verguckt habe .. kann es sein dass das erst später dazukam ?
    Wie bereits gesagt, es ist ein Feature der Hardware, der Compiler hat nicht das Geringste damit zu tun.
    MfG
    Stefan

  4. #14
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    mh ergibt sinn, er springt an die adresse und unterdrückt dabei die interrupts ... naja man lertn halt nie aus ...

    dennoch

    wie kann es sein dass mein input capture keine fallenden flanken detektiert ?! das macht mich jetzt echt stutzig

    egal was ich mach es kommt einfach kein interrupt zustande, trotz sauberem 5V Impuls mit fallender als auch steigender flanke!

    Code:
    				OCR1A = 2000;
    				TCCR1A |= (1<<WGM11) | (1<<WGM10);
    				TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS11);// | (1<<ICES1);
    //				TIFR |= (1<<TOV1);
    				TIMSK |= (1<<TICIE1) | (1<<TOIE1);
    das ist der initialisierungscode, wenn ich den ICES1 wieedr einschalte, bekomme ich einen strobe solange ich ihn anlasse, schalte ich ihn ab kommt wieder kein strobe/interrupt

  5. #15
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Lasse mal folgendes aus dem Datenblatt in deinen Code einfließen, und probiere es dann nochmal:
    After a change of the edge, the input capture flag (ICF1) must be cleared by software (writing a logical one to the I/O bit location).
    Außerdem würde ich ICR1 so früh wie möglich auslesen (insbesondere noch vor der Flankenänderung), also:
    Code:
    unsigned int capture = ICR1;
    gleich als allererste Zeile in der ISR, und dann mit capture weiterarbeiten.
    MfG
    Stefan

  6. #16
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    die zeile muss ich überlesen haben ... muss ich morgen mal ausprobieren, danke für den hinweis

    die variable wollte ich eigentlich umgehen, da ich davon ausging dass kein neues ereignis auftreten kann (zumindest in der praxis) aber kann ja was schief gehn ^^ ... komisch aber dass es vorher funktioniert hat ... äußerst seltsam ... kann das evtl. am alten compiler manchmal liegen ?!

  7. #17
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    kein erfolg ....

    Code:
    /** Interruptservice routine for timer 1 input compare.
    */
    ISR(SIG_INPUT_CAPTURE1) 
    {
    		PORTB |= (1<<PB0);
    	if(TCCR1B & (1<<ICES1)) {
    		TCCR1B &= ~(1<<ICES1);
    		TIFR |= ICF1;
    		ramptimeusec = (ICR1>>1);
    		ramptimemsec = mtime;
    	}
    	else {
    		TCCR1B |= (1<<ICES1);
    		TIFR |= ICF1;
    		unsigned int ramptime = ((unsigned int)(mtime - ramptimemsec)) * 1000;
    		ramptime = (signed int)ramptime + (signed int)(ICR1>>1) - (signed int)ramptimeusec;
    
    	}
    		PORTB &= ~(1<<PB0);
    }
    
    
    //initialisierung
    ...
    				OCR1A = 2000;
    				TCCR1A |= (1<<WGM11) | (1<<WGM10);
    				TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS11) | (1<<ICES1);
    				TIFR |= (1<<TOV1) | (1<<ICF1);
    				TIMSK |= (1<<TICIE1) | (1<<TOIE1);
    ...
    ich bekomme genau EINEN impuls und dann totenstille

    EDIT: ich kann auch nur ausdrücklich betonen: das eingangssignal ist ein rechtecksignal, beginnend mit steigender und abschliessend fallender flanke, variabler länge und wiederholfrequenz mit pegeln von 0V und 5V und sieht auf dem oszi traumhaft aus! ich kanns mir nciht erklären oder ich hab was elementares übersehen ... es hat aber SO schonmal funktioniert ... selbst mit nem 2008 compiler gehts nciht ... 2007 (also der ganz alte) finde cih garnichtmehr zum

    EDIT: es liegt nicht am computer! habs grad an nem anderen compiliert ...

    ich habe es mal simuliert und einfach den ICP pin über das port register geschaltet, da funktioniert es einwandfrei ...

    da ich das ICES in der ISR ändere, muss ich laut simulation nicht mal das flag löschen ... das scheint da automatisch zu passieren ...

    in der realität habe ich einen spannungspegel von einem anderen pin angeschlossen, der etwas schaltet das signal ist aber ganz normal und dennoch detektier ich KEINE FALLENDEN flanken

  8. #18
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    triple post ... aber ... GELÖST

    meine güte wie dämlich von mir ...

    TIFR |= (1<<TOV2);

    löscht AUTOMATISCH mein ICF mit ... ist ja völlig logisch >_<

    mit TIFR = (1<<TOV2); geht es jetzt

    tja das passiert wenn man zu sehr die refgisternutzung verallgemeinert ^^

  9. #19
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    54
    Beiträge
    502
    mmh verstehe ich nicht. Wieso soll das setzen eines ganzen Bytes besser sein als das eines Bits? Wenn ich das richtig sehe im Datenblatt, dann wird doch der ICF1 mit 1 gelöscht. Dh du setzt ihn mit dem Aufruf von TIFR = (1<<TOV2); auf 0.
    Ist das wirklich das was du wolltest?

    sast

    雅思特史特芬
    开发及研究

  10. #20
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    54
    Beiträge
    502
    mmh verstehe ich nicht. Wieso soll das Setzen eines ganzen Bytes besser sein als das eines Bits? Wenn ich das richtig sehe im Datenblatt, dann wird doch der ICF1 mit 1 gelöscht. Dh du setzt ihn mit dem Aufruf von TIFR = (1<<TOV2); auf 0.
    Ist das wirklich das was du wolltest?

    sast

    雅思特史特芬
    开发及研究

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress