-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: Taster an Attiny45

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    24.10.2006
    Beiträge
    7

    Taster an Attiny45

    Anzeige

    Hallo,

    irgendwie verstehe ich die Welt nicht mehr. Ich möchte einen Taster an einen Attiny45 anschliessen und den Status abfragen oder einen Interrupt bekommen. Aber weder das eine noch das andere funktioniert.

    Taster ist am PB1 angeschlossen. Led ist ist an PB4 angeschlossen.

    DDRB &= ~(1<<DDB1);
    PORTB |= (1 << PB1);

    if( bit_is_clear(PORTB, PINB1) )
    PORTB |= (1 << PINB4);
    else
    PORTB &= ~(1 << PINB4);

    Den Interrupt habe ich wie folgt initialisiert
    PCMSK |= (1 << PB1);
    MCUCR = (0<<ISC01) | (0<<ISC00);
    GIFR |= (1 << INTF0);
    GIFR = 0x40;

    ISR(INT0_vect)
    {
    PORTB |= (1 << PINB4);
    }

    Kann mir da einer weiterhelfen, welches Register ich vergessen habe oder geht das nicht über den PIN?

    Gruß

    Frank

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    Im ersten Beispiel ist PB4 nicht als Ausgang definiert,
    und beim einlesen von PB1 wird PinB verwendet und nicht PortB !


    Im 2. Beispiel hast Du das mit dem PinChange-Interrupts verwechselt (PCINT), bzw. alles auf einmal gesetzt, das führt i.d.R zu einem Reset und der AVR beginnt von vorne, und man sieht nix.
    Also erstmal die Zeile mit PCMSK weglassen.

    Um den INT0 zu aktivieren musst Du im Register GIMSK das Flag INT0 setzen.
    Dann wird die ISR auch verwendet, die Du schon angelegt hast.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    12.01.2007
    Beiträge
    93
    der pull-up ist schon beabsichtigt? sprich dein taster zieht auf masse oder?

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    24.10.2006
    Beiträge
    7
    Hallo,

    richtig den PB1 habe ich an die Taste angeschlossen und er Taster liegt an Masse. Ich habe auch noch einen Pullup Widerstand von 1kOhm zusätzlich an PB1 angeschlossen, aber das bringt auch nicht. Hier mal der ganze Code. Wenn ich den Interrupt einschalte geht das LED aus und leutet kurz auf. Egal ob ich den Taster drücke oder nicht. Habe auch PCMSK mal rausgeschmissen und den Attiny gewechselt. Überall das gleiche. Keine Reaktion auf einen Tastendruck.http://www.roboternetz.de/phpBB2/ima.../eusa_wall.gif
    Brick wall

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    
    int main( void )
    {
    
      	DDRB  = 0xFF; // Alles als Ausgang deklarieren
      	DDRB &= ~(1<<PORTB1); // PB1 als Input setzen
      	PORTB |= (1 << PB1); // Pin 1 auf High
    	PORTB |= (1 << PINB4); // LED an
    
    /*    PCMSK |= (1 << PB1);
    	MCUCR &= ~(1<<ISC01) & ~(1<<ISC00);
    	GIFR |= (1 << INTF0);
    	GIMSK |= (1 << INT0);
    	sei(); // Globalen Interrupt zulassen
    */
      	while(1)
      	{
    
    		if( bit_is_clear(PINB, PB1))
    			PORTB |= (1 << PB4);
    		else
    			PORTB &= ~(1 << PB4);
      }
    }
    
    ISR(INT0_vect)
    {
    	int i;
    	PORTB &= ~(1 << PINB4);
    	for(i = 0;i <10; i++)
    		_delay_ms(10);
    }
    Gruß

    Frank

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    12.01.2007
    Beiträge
    93
    hast nen logik fehler, schau dir nochmal die if-else an und was du im interrupt machst.

    wenn du nicht drauf kommst meld dich nochmal aber aus fehlern lernt man(n), also frohes tüfteln *daumendrück*

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    24.10.2006
    Beiträge
    7
    hi blink,

    anscheinend habe ich eine Brett vor dem Kopf.

    if( bit_is_clear(PINB, PB1)) -> Wenn das Pin PB1 auf Low
    PORTB |= (1 << PB4); -> Dann LED an
    else
    PORTB &= ~(1 << PB4); -> Sonst aus.

    Im Interrupt mache ich immer das LED aus. Dann einen Delay.

    Wo ist da der Fehler???????

    Gruß

    Frank

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    12.01.2007
    Beiträge
    93
    - taster nicht gedrückt: PB1 high
    - setzte PB4 low

    - taster gedrückt PB1 low
    - setze PB4 high
    - taster logelassen -> rising edge -> interrupt -> lösche PB4

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    24.10.2006
    Beiträge
    7
    schade, dass ist es nicht. Hatte den Interrupt ja auskommentiert. Ich verstehe einfach nicht, warum das Ding mir nicht den Wert zurück gibt, der an dem PB1 anliegt. Was ich auch nicht verstehe ist, dass wenn ich den Interrupt rein nehme er immer dort rein geht, ohne das ich den Taster drücke. Selbst wenn ich den Taster drücke geht er auch rein. Bin voll am verzeifeln.

    Gruss

    Frank

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    12.01.2007
    Beiträge
    93
    du willst den wert an PB1? dann nimmst einfach das macro.

    Code:
    #define VALUEPB1 ((PINB & (1<<PB1)) > 0 ? (1):(0))
    
    switch(VALUEPB1)
    {
       case 0: //bit is cleared
         break;
       case 1: //bit is set
         break;
       default: //fallthru
         break;
    }

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    hallo frankz,
    das ist seltsam.. ich habe eben mit deinem code gespielt, und dabei festgestellt, dass es funktioniert, wenn man das hier macht:

    DDRB = (1<<PORTB1)|(1<<PORTB3);
    oder DDRB = (1<<DDB1)|(1<<DDB3);

    pb1 ist bei mir die led, pb3 der taster, beide gehen auf masse.

    kann mir das jmd erklären? steh irgendwie aufm schlauch..

    im datenblatt steht doch explizit:
    The DDxn bit in the DDRx Register selects the direction of this pin. If DDxn is written logic one, Pxn is configured as an output pin. If DDxn is written logic zero, Pxn is configured as an input pin.
    gruesse von der etwas verwirrten katz

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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