Forum: Mikrocontroller und Digitale Elektronik AVR- Taster an PortPin anschließen


von andy (Gast)


Lesenswert?

Hi,

ich versuche gerade einen Taster an einem uController anzuschließen. 
Aber leider tut sich nichts. Hab auch schon im avr-tutorial geschaut, 
aber ich finde meinen Fehler einfach nicht. Verwendeter uController: AVR 
8-Bit


Der Code:
1
int main( void )
2
{
3
     cli(); //disable Interrupt
4
5
    // Port als Output konfigurieren
6
    DDRC |= _BV(PC2); //Output 'LED Rot'
7
    DDRC |= _BV(PC3); //Output 'LED Grün'
8
9
    DDRC |= _BV(PC5); //Output 'LED test'
10
11
    // Port als Input konfigurieren
12
    DDRD  &= ~(1<<PD2); //Int0 Start
13
    DDRD  &= ~(1<<PD3); //Int1
14
    DDRC  &= ~(1<<PC4); //Ende
15
16
    // Pull-up resistor
17
    PORTC |= _BV(PC3);
18
    PORTC |= _BV(PC2);
19
    PORTD |= (1<<PD1);    // Enable pull-up resistor
20
    PORTD |= (1<<PD2);    // Enable pull-up resistor
21
    PORTC |= (1<<PC4);    // Enable pull-up resistor
22
23
24
    // Enable Interrupt
25
    GICR |= (1 << INT0);  // Enable INT0 | PDF S. 67
26
    GICR |= (1 << INT1);  // Enable INT1
27
28
    MCUCR |= 1<<ISC01 | 0<<ISC00;  // Trigger INT0 on falling edge
29
    MCUCR |= 1<<ISC11 | 0<<ISC10;  // Trigger INT1 on falling edge
30
31
    // Hauptschleife des Programms
32
    while (1)
33
    {
34
        PORTC &= ~_BV(PC5); // LED einschalten
35
        _delay_ms(100);
36
37
        PORTC |= _BV(PC5);  // LED ausschalten
38
        _delay_ms( 100 );
39
40
41
        if((PINC & (1 << PC4)))
42
        {
43
          LED_GREEN_ON;
44
            _delay_ms( 100 );
45
          LED_GREEN_OFF;
46
            _delay_ms( 100 );
47
        }
48
    }
49
}


Schaltplan:
PIN:PC4-----/ ----GND

Es ändert sich nichts, wenn der Schalter geschlossen/offen ist.

von Peter II (Gast)


Lesenswert?

andy schrieb:
> Es ändert sich nichts, wenn der Schalter geschlossen/offen ist.

dann funktioniert eventuell LED_GREEN_OFF und LED_GREEN_ON nicht. Hast 
du die überhaupt definiert?

von andy (Gast)


Lesenswert?

Jo, die funktioniert. Im Moment geht das Programm immer in die 
IF-Abfrage rein und die grüne LED blinkt.

von andy (Gast)


Lesenswert?

Kann es sein dass der Port "defekt" ist? Wenn ich mit dem Multimeter 
gegen VCC bzw. GND messe bekomme ich immer ca. 0V.

von Karl M. (Gast)


Lesenswert?

Hallo,

was soll der ganze kram ?
1
// Enable Interrupt
2
    GICR |= (1 << INT0);  // Enable INT0 | PDF S. 67
3
    GICR |= (1 << INT1);  // Enable INT1
4
5
    MCUCR |= 1<<ISC01 | 0<<ISC00;  // Trigger INT0 on falling edge
6
    MCUCR |= 1<<ISC11 | 0<<ISC10;  // Trigger INT1 on falling edge

Also Taster verarbeitet man nicht per Interrupt. Es gibt aber eine 
Ausnahme.

von Karl M. (Gast)


Lesenswert?

Hallo,

Diese IF-Abfrage
1
(PINC & (1 << PC4))
ist fast immer Wahr, da der Pullup von Portc.4 eingeschaltet wurde.

von The D. (thedaz)


Lesenswert?

Deine Pull-Ups aktivierst du an PD1 und PD2, du benutzt aber PD2 und PD3 
als Input.

von NurEinGast (Gast)


Lesenswert?

> Verwendeter uController: AVR 8-Bit

Welcher der AVR 8-Bit controller ?

Es gibt welche, die PC3-PC6 als JTAG Port verwenden.
Wenn Du die Pins als I/O Verwenden willst, muss JTAG ausgeschaltet 
werden.

von andy (Gast)


Lesenswert?

Vielen dank für eure Antworten!

Karl M. schrieb:
> Hallo,
>
> was soll der ganze kram ?// Enable Interrupt
>     GICR |= (1 << INT0);  // Enable INT0 | PDF S. 67
>     GICR |= (1 << INT1);  // Enable INT1
>
>     MCUCR |= 1<<ISC01 | 0<<ISC00;  // Trigger INT0 on falling edge
>     MCUCR |= 1<<ISC11 | 0<<ISC10;  // Trigger INT1 on falling edge
> Also Taster verarbeitet man nicht per Interrupt. Es gibt aber eine
> Ausnahme.

Ich möchte dass bei einem bestimmten Ereignis, das ich per Schalter 
steuere, Variablen sofort verändert werden(dies geschieht in der ISR, 
die ich jetzt nicht mit reinkopiert habe). Allerdings sollten die 
Befehle im Moment keine Rolle spielen, da sie an dem Port nichts 
ändern(und ich habe alle Interrupt auch ausgeschaltet bis das mit dem 
Taster funktioniert).

Karl M. schrieb:
> Hallo,
>
> Diese IF-Abfrage(PINC & (1 << PC4))ist fast immer Wahr, da der Pullup
> von Portc.4 eingeschaltet wurde.

Jo, aber wenn ich den Schalter schließe, müsste der Eingang doch 0 sein 
und die Bedingung ist falsch => Dann sollte IF-Abfrage nicht 
abgearbeitet werden. Aber das Programm springt immer in die Abfrage 
rein.


The D. schrieb:
> Deine Pull-Ups aktivierst du an PD1 und PD2, du benutzt aber PD2 und PD3
> als Input.

Stimmt danke.

NurEinGast schrieb:
> Welcher der AVR 8-Bit controller ?
>
> Es gibt welche, die PC3-PC6 als JTAG Port verwenden.
> Wenn Du die Pins als I/O Verwenden willst, muss JTAG ausgeschaltet
> werden.

Ich benutze den ATmega8-16PU. Die LEDs an PC3 und PC5 
funktionieren(Blinken), von daher glaub ich nicht, dass ich noch etwas 
extra ausschalten muss?
-> Datenblatt: 
http://datasheet.octopart.com/ATMEGA8-16PU.-Atmel-datasheet-14702621.pdf

von andy (Gast)


Lesenswert?

NurEinGast schrieb:
> Welcher der AVR 8-Bit controller ?
>
> Es gibt welche, die PC3-PC6 als JTAG Port verwenden.
> Wenn Du die Pins als I/O Verwenden willst, muss JTAG ausgeschaltet
> werden.

Habe jetzt doch mal einen anderen Port genommen- Damit funktioniert mein 
Code.
Vielen dank für den Tipp ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.