- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 3 von 3

Thema: Anfängerhilfe: Zähler zählt nicht (ATtiny45)

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.12.2011
    Beiträge
    17

    Anfängerhilfe: Zähler zählt nicht (ATtiny45)

    Anzeige

    Powerstation Test
    Hallo,

    ich möchte gern den tiny45 als Basis für diverse kleine Projekte benutzen und habe mir als Anfang vorgenommen, ein Servosignal einzulesen und damit über einen MosFET eine Glühkerze zu dimmen.
    -Alle 20ms kommt ein Puls von 1..2ms
    -Pulslänge messen, ggf. verwerfen
    -Wert erzeugen
    -neue PWM am Ausgang erzeugen

    Aber so weit bin ich noch nicht—wie 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 möchte ich aber gern die LED erst mal aussen vor lassen und im Programm einfach eine Variable führen, 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 Zählerstand 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 Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    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 Ausdrücke konstant bleiben, oder Variablen nicht ins SRAM schreiben, sondern nur in den Registern belassen. Durch die Interrupts gehen diese Voraussetzungen verloren und viele Optimierungen können nicht mehr durchgeführt werden, oder liefern nicht mehr lauffähigen Code. Um den Compiler darauf hinzuweisen gibt es das Schlüsselwort volatile. Damit werden Variablen gekennzeichnet die sich anders als durch den normalen Programmfluss verändern können. Das sind typischerweise Variablen die im Hauptprogramm und in einer ISR benutzt werden. Wenn ein Programm nur ohne Optimierung lauffähig 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
    Bild hier  
    Atmel’s 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
    Beiträge
    17
    OK, das hast's also schon mal gebracht. Läuft. Ich hatte mir natürlich noch nie Gedanken darüber gemacht, WO diese Variable eigentlich stehen soll, ansonsten wäre mir vielleicht aufgefallen, dass die ja irgendwo im Registerbereich Platz haben muss.

    Vielen Dank!
    Stefan

Ähnliche Themen

  1. Zähler der immer gleich schnell zählt
    Von Problem im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 28
    Letzter Beitrag: 14.12.2010, 21:17
  2. Zähler funktioniert nicht
    Von Hartl im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 08.06.2008, 21:27
  3. Timer zählt nicht weiter?
    Von TobiasBlome im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 28.02.2008, 16:31
  4. PWM Steller mit LCD, aber zähler läuft nicht
    Von scream!!!! im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 14.09.2005, 07:21
  5. Anfängerhilfe
    Von foxhound im Forum AVR Hardwarethemen
    Antworten: 5
    Letzter Beitrag: 23.01.2005, 19:04

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress