- Akku Tests und Balkonkraftwerk Speicher         
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
    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

  2. #2
    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.

  3. #3
    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...
    }

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.091
    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. 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
  •  

Labornetzteil AliExpress