- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: wie benuzt man ein INTERRUPT

  1. #11
    Anzeige

    Praxistest und DIY Projekte
    So da bin ich...
    Ich bin gerade daran Interrupts zu erlernen und komme auch nach durchlesen des Datenblattes nicht weiter.
    Könnt ihr mir eine ganz einfache Lösung zeigen wie ich einen Interrupt verwende (einfach nur lich an lich aus oder ähnliches).

    Ich benutzte AT90s8535 und benutzte den Compiler "CodeVisionAVR"

  2. #12
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Tut mir leid, zum Codevision kann ich im Detail nix sagen.
    Im Prinzip läuft das Ganze aber immer gleich

    du definierst beim WinAvr z.B,
    Code:
    volatile char bByte = 0;
    
    SIGNAL(SIG_xxxxxxx)  
    {
        bByte |= 1;  
    }
    
    main()
    {
         // definieren speziellen Interrupt & enablen 
    
        sei();    / Alle Interrupts enablen
    
      while (1)
     {
          if ( bByte & 1)                 // warten auf interrupt
         {  
                 bByte &= ~1;           // zurücksetzen
                 // mach irgendwas
         }
     }
    }
    Das ist nur ein Strickmuster, aber so läuft's im Prinzip
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #13
    Code:
    #include <avr/signal.h>
    #include <avr/interrupt.h>
    
    #include <stdio.h> 
    #include <avr/io.h>
    
    
    volatile char bByte = 0; 
    
    SIGNAL(SIG_INTERRUPT0)  
    { 
        bByte |= 1;  
    } 
    
    main() 
    { 
    DDRA = 0xFF;
    DDRD = 0x00;
    PORTA=0xF0;
    PORTD=0xFF;
         // definieren speziellen Interrupt & enablen 
    
        sei();    // Alle Interrupts enablen 
    
      while (1) 
     { 
          if ( bByte & 1)                 // warten auf interrupt 
         {  
                 bByte &= ~1;           // zurücksetzen 
                 PORTA=~PORTD;
         } 
     } 
    }

    bringt bei mir garnichts habe ich irgendwas vergessen oder falsch gemacht?

  4. #14
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Da fehlt noch das Enablen vom Interrupt0. Da mußt du nachschauen
    ich glaub MCUCSR /GIFR ist zuständig
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #15
    habe leider nichts passendes gefunden. Villeicht hat das ja schon jemand benutzt?

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    im Register GICR musst du den externen Interrupt0 aktivieren, also in deinem Fall INT0 auf 1 setzen

    dann musst du noch im Register MCUCR festlegen, wann der Interrupt ausgelöst werden soll, mit ISC01=0 und ISC00=1 wird der Interrupt bei jedem Wechsel(0V->5V, 5V->0V) der Spannung am Pin für den externen Interrupt ausgelöst

  7. #17
    Code:
    GICR=GICR | 1 << INT0;
    MCUCR=MCUCR & ~(1<<ISC01);
    ich habe vermutet das du das so meinst ist aber falsch
    kannst du das auch in code ausdrücken mit registern habe ich bei AVR keine erfahrung


    Code:
    MCUCR = 2;                                // INT0 interrupt on falling edge
        edge = 0;                                // 0 = falling edge  1 = rising edge
    stand von vorn herein drinne ist das richtig?

  8. #18
    hier mein funktionsfähiger code

    Code:
    #include <avr/signal.h>
    #include <avr/interrupt.h>
    
    #include <stdio.h> 
    #include <avr/io.h>
    
    
    volatile char bByte = 0; 
    
    SIGNAL(SIG_INTERRUPT0)  
    { 
        bByte |= 1;  
    } 
    
    main() 
    { 
    DDRA = 0xFF;
    DDRD = 0x00;
    PORTA=0xF0;
    PORTD=0xFF;
     sei();    // Alle Interrupts enablen 
    
         // definieren speziellen Interrupt & enablen 
    MCUCR = 2; //
    GICR=0x40;
       
      while (1) 
     { 
          if ( bByte & 1)                 // warten auf interrupt 
         {  
                 bByte &= ~1;           // zurücksetzen 
                 PORTA=~PORTA;
         } 
     } 
    }

  9. #19
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    68
    Beiträge
    531
    Hallo Dark emporer,

    ich hab mahl das AT90s8535.pdf durchgeguckt

    um die einzelne INT0 interrupt ein zu schalten braucht mann

    GIMSK |= 0x40;

    (General Interrupt MaSK register) Seite 25 der .pdf

    gruss

    Henk

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Labornetzteil AliExpress