- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 9 von 9

Thema: Einfache ISR mittels GCC (Anfänger)

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.095
    Das Programm ist ein Beispiel. Du musst die einzelnen Register ändern. Diese findest du im DB (Datenblatt). Die verwendeten Register im Beispiel ist "TCCR2" und "TIMSK". Du musst das Programm jetzt ändern.
    Ich verwende dieses DB http://www.atmel.com/dyn/resources/p...ts/doc2593.pdf
    Ab Seite 60 fängt das Kapitel Externe Interrupts an.
    Du musst jetzt die richtigen Register heraussuchen. Z.B. das EICRA, EIMSK
    Wenn du jetzt den INT 0 mit steigender Flanke verwenden willst musst du das in den entsprechenden Registern einstellen.
    Code:
    .........
    EICRA |= (1<<ISC00) | (1<<ISC01);
    EIMSK |= (1<<INT0);
    .....
     sei();
    ......
    while(1)
    {
    .....
    }
    Es gibt aber auch noch andere Interrupts. Z.B. die PCINT (Pin Change Interrupts). Diese reagieren auf einen Flankenwechel (egal ob rising oder falling edge).

    Die ISR musst du natürlich auch ändern. Das wirst du aber schon schaffen. Man sollte zwar nicht zuviele Zeilen in der ISR haben, aber wenn es nur z.B. 5 Zeilen sind mache ich die Auswertung direkt in der ISR. Wenn man mehr machen muss sollte man es so machen, wie im nächsten Beispiel im Link, den ich vorher gepostet habe (UART Beispiel).

    PS: Wenn man mit Interrupt arbeitet muss man die Interrupts freigeben. Eine generelle Freigabe wir mit "sei();" gemacht, man kann es aber auch sperren, das ist wichtig wenn etwas wichtiges auf keinen Fall unterbrochen werden darf. Dieser Befehl lautet "cli();". Etwas das auch wichtig ist ist bei der Deklaration von Variablen das "volatile". Für was das ist gibt es Google.

    MfG Hannes

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    07.07.2011
    Ort
    nähe Bremen
    Alter
    35
    Beiträge
    14
    Okay ich hab nun eigentlich versucht das ganze über PCINT laufen zu lassen, allerdings funktioniert es noch nicht so wie ich`s mir erhofft hatte.

    Code:
    #define F_CPU 20000000UL
     
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
     
    volatile  uint8_t flag;
    
    int main(){
     
     	// #### IO`s etc. konfigurieren....
    	DDRB |= (1<<PB0);				// LED Output schalten...
    	flag = 0;
    
    
    	EICRA |= (1<<ISC00) | (0<<ISC01);		// Modus: "Any edge of INT0 generates asynchronously an interrupt request"
    	EIMSK |= (1<<INT0);				
    	
    
    	PCMSK0 |= (1<<PCINT7);				// PA7 als Interrupt-Pin....
    	PCICR  |= (1<<PCIE0);			        // Das dazugehörige Register...
    
    	// ISR`s freigeben...
    	sei();
     
        while(1){
    		// Endlosschleife...
    		if(flag==1){
    			_delay_ms(3000);
    			PORTB &= (0<<PB0);	// LED AUS...
    			flag=0;
    		}
        }
    
    }
     
    
    ISR( PCINT0_vect ){
    	flag = 1;
    	PORTB |= (1<<PB0);	// LED AN...
    }
    Die LED fängt direkt nach gefühlten 600ms an zu leuchten und schaltet nach 3 Sekunden ab.
    Das mit dem abschalten stimmt ja soweit, aber wieso geht diese einfach von alleine an?

    Hab bis auf den ISP und der LED (PB0) noch nichts weiter angeschlossen.

    Hat wer nen Tipp? Oder sagt Ihr euch, ich sollte morgen lieber nochmal komplett neu ansetzen

    MfG

    Propeller Clock

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Offene Eingänge sind sehr empfindlich und fangen gerade mit den Steckbrett schnell mal Störungen ein. Das mindeste ist es die internen Pullup Widerstände einzuschalten (DDRA auf 0, also Eingänge und PORTA auf 1) . Auch damit kann es noch zu gelegentlichen Störungen kommen.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    07.07.2011
    Ort
    nähe Bremen
    Alter
    35
    Beiträge
    14
    Gehe ich doch noch heute Abend mit einem kleinem Erfolgserlebnis zu Bett *freu* =)

    Wenn auch einwenig kompliziert geschrieben der Code, aber er funktioniert.

    Der nächste Schritt wird sein, meinen Infrarot-Empfänger auszuwerten. Aber damit mache ich morgen weiter.

    Vielen Dank an euch drei !!!


    Ps.: Auf den Teil mit der Störungsempfindlichkeit ... darauf wäre ich ja nie gekommen.

    Code:
    #define F_CPU 20000000UL
     
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
     
    volatile  uint8_t flag;
    
    int main(){
     
     	// #### IO`s etc. konfigurieren....
    	DDRB |= (1<<PB0);				// LED Output schalten...
    
    	
    	DDRA &= ~( (1<<PA0) | (1<<PA1) | (1<<PA2) | (1<<PA3) | (1<<PA4) | (1<<PA5) | (1<<PA6) | (1<<PA7)  );
    	PORTA |= (1<<PA0) | (1<<PA1) | (1<<PA2) | (1<<PA3) | (1<<PA4) | (1<<PA5) | (1<<PA6) | (1<<PA7);
    
    	flag = 0;
    
    
    	EICRA |= (1<<ISC00) | (0<<ISC01);		// Modus: "Any edge of INT0 generates asynchronously an interrupt request"
    	EIMSK |= (1<<INT0);				
    	
    
    	PCMSK0 |= (1<<PCINT7);					// PA7 als Interrupt-Pin....
    	PCICR  |= (1<<PCIE0);			
    
    	// ISR`s freigeben...
    	sei();
     
        while(1){
    		// Endlosschleife...
    		if(flag==1){
    			_delay_ms(3000);
    			PORTB &= (0<<PB0);	// LED AUS...
    			flag=0;
    		}
        }
    
    }
     
    
    ISR( PCINT0_vect ){
    	flag = 1;
    	PORTB |= (1<<PB0);	// LED AN...
    }

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.095
    Sehr schön, wenn es funktioniert. Wenn du mehrere Pins gleichzeitig konfigurieren willst (wie bei dir DDRA bzw PORTA) kannst du die kürzere Schreibweise mit Hexadezimalzahlen verwenden.


    Wie man das anwendet findet man im Internet.

    MfG Hannes

Ähnliche Themen

  1. CRP5: meine Erweiterung (vom Anfänger für Anfänger)
    Von loewenzahn im Forum Robby CCRP5
    Antworten: 11
    Letzter Beitrag: 21.03.2007, 18:37
  2. [ERLEDIGT] LED-Steuerung mittels PIC16F627 (blutiger Anfänger)
    Von rossi_2 im Forum PIC Controller
    Antworten: 7
    Letzter Beitrag: 09.12.2005, 19:34
  3. LCD Ansteurung mittels C
    Von semicolon im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 19.10.2005, 16:58
  4. Antworten: 3
    Letzter Beitrag: 14.08.2005, 13:21
  5. Anfänger: welches modul sollte man als anfänger nehmen???
    Von patti16 im Forum AVR Hardwarethemen
    Antworten: 5
    Letzter Beitrag: 04.01.2005, 08:44

Stichworte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress