-         

Ergebnis 1 bis 3 von 3

Thema: Anfngerhilfe: Zhler zhlt nicht (ATtiny45)

  1. #1
    Neuer Benutzer fters hier
    Registriert seit
    04.12.2011
    Beitrge
    17

    Anfngerhilfe: Zhler zhlt nicht (ATtiny45)

    Anzeige

    Hallo,

    ich mchte gern den tiny45 als Basis fr diverse kleine Projekte benutzen und habe mir als Anfang vorgenommen, ein Servosignal einzulesen und damit ber einen MosFET eine Glhkerze zu dimmen.
    -Alle 20ms kommt ein Puls von 1..2ms
    -Pulslnge messen, ggf. verwerfen
    -Wert erzeugen
    -neue PWM am Ausgang erzeugen

    Aber so weit bin ich noch nichtwie man sehen kann, ist das Programm auch noch Baustelle. Die ISR funktioniert schon und wenn ich in dieser je nach gestiegener oder gefallener Flanke auch den Ausgang mit einer LED schalte, dann bekomme ich quasi dort eine Kopie des Eingangsignals (1 Servokanal).

    Nun mchte ich aber gern die LED erst mal aussen vor lassen und im Programm einfach eine Variable fhren, die bei mir "int Dauer" heisst. Ich hatte mir das eigentlich so vorgestellt, dass ich den Timer mit einem Prescaler versehe und bei fallender Flanke den Zhlerstand immer in diese Variable bergebe.

    Aber: es funktioniert nicht. Sie bleibt immer Null.

    Hat einer 'ne Idee, wo hier der Denkfehler ist?

    Danke, Stefan

    Code:
    #define F_CPU 8000000                   
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    
    #define LED PB4
    
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/delay.h>
    
    int hi=0;
    int Dauer=0;
    
    void Initialisierung(){
    DDRB |= (1 << LED);            // Set direction register output
    GIMSK |= (1<<PCIE);                                  // Pin Change Interrupt Enable
    PCMSK |= (1<<PCINT0);            // Enable external interrupts PCINT0
    MCUCR |= (1<<ISC01);            // PCINT0 is triggered on any change
    TCCR1 |= (1<<CS13);
    TCCR1 |= (1<<CS12);
    TCNT1 = 0x00;
    sei();
    
    }
    
    ISR (PCINT0_vect)               // Interrupt on PCINT0 vector
    { 
    	if (PINB&1){
    		TCNT1=0x00;
    	} else {
    		Dauer=TCNT1;
    	}
    }
    
    int main(void){
    	Initialisierung();
    	while (1){
    		if (Dauer==0){
    			PORTB |= (1<<PB4);
    		} else {
    			PORTB &= ~(1<<PB4);
    		}
    	}
    }

  2. #2
    Moderator Robotik Visionr Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beitrge
    5.782
    Blog-Eintrge
    8
    Hallo

    So vielleicht:

    volatile int Dauer=0;

    "Eine zweite Schwierigkeit ergibt sich, wenn der Compiler den Code optimiert. Bei normalem Programmfluss kann der Compiler ausnutzen das einige Ausdrcke konstant bleiben, oder Variablen nicht ins SRAM schreiben, sondern nur in den Registern belassen. Durch die Interrupts gehen diese Voraussetzungen verloren und viele Optimierungen knnen nicht mehr durchgefhrt werden, oder liefern nicht mehr lauffhigen Code. Um den Compiler darauf hinzuweisen gibt es das Schlsselwort volatile. Damit werden Variablen gekennzeichnet die sich anders als durch den normalen Programmfluss verndern knnen. Das sind typischerweise Variablen die im Hauptprogramm und in einer ISR benutzt werden. Wenn ein Programm nur ohne Optimierung lauffhig ist, ist oft ein fehlendes volatile die Ursache."
    (Zitat aus http://www.rn-wissen.de/index.php/C-...Programmierung)

    http://de.wikibooks.org/wiki/C-Progr...6_Co.#volatile
    http://tigcc.ticalc.org/doc/keywords.html#volatile

    Gru

    mic

    Atmels products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Neuer Benutzer fters hier
    Registriert seit
    04.12.2011
    Beitrge
    17
    OK, das hast's also schon mal gebracht. Luft. Ich hatte mir natrlich noch nie Gedanken darber gemacht, WO diese Variable eigentlich stehen soll, ansonsten wre mir vielleicht aufgefallen, dass die ja irgendwo im Registerbereich Platz haben muss.

    Vielen Dank!
    Stefan

hnliche Themen

  1. Zhler der immer gleich schnell zhlt
    Von Problem im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 28
    Letzter Beitrag: 14.12.2010, 22:17
  2. Zhler funktioniert nicht
    Von Hartl im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 08.06.2008, 22:27
  3. Timer zhlt nicht weiter?
    Von TobiasBlome im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 28.02.2008, 17:31
  4. PWM Steller mit LCD, aber zhler luft nicht
    Von scream!!!! im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 14.09.2005, 08:21
  5. Anfngerhilfe
    Von foxhound im Forum AVR Hardwarethemen
    Antworten: 5
    Letzter Beitrag: 23.01.2005, 20:04

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhnge hochladen: Nein
  • Beitrge bearbeiten: Nein
  •