Attiny25 interne Pullup-Widerstände

OP #2296176
Lesenswert?

Guten Abend,

Ich habe ein kleines Problem mit den internen Pullups im Attiny.
Bisher hatte ich nur mit Atmegas zu tun und bei denen hat so alles 
geklappt.

Möchte an an pin b3 und b4 die internen Pullups für Taster aktivieren 
und Pin 0 bis 2 als Ausgänge definieren. Was mache ich falsch ? Kann mir 
bitte jemand Helfen.
1
 
2
   #define DD_A DDB1
3
   #define DD_B DDB2
4
   #define DD_INH DDB0
5
   #define PIN_A PB1
6
   #define PIN_B PB2
7
   #define PIN_INH PB0
8

9
   //...
10

11
   //Datenregister als Ausgänge und Eingänge definieren    
12
    DDRB = (1 << DD_A) | (1 << DD_B) | (1 << DD_INH);
13
    DDRB &= ~(1 << DDB3); 
14
    DDRB &= ~(1 << DDB4);
15

16
    //interne Pullips für Taster aktivieren
17
    PORTB |= (1 << PB3) | (1 << PB4);

Vielen Dank für die Hilfe!
Gast #2296192
Lesenswert?

Also soweit ich mich entsinne, war es genauso wie bei den ATMegas; Also 
genauso wie du es gemacht hast( Allerdings weis ich nicht welcher Werte 
in DDB1, DB1 usw. stecken) Wie sieht das PUD Bit in MCUSR aus? Muss 
glaube ich 0 sein.


Gegenfrage: Was klappt nicht. Vielleicht Taster falsch angeschloßen?
OP #2296229
Lesenswert?

Danke für deine Antwort.

Was nicht klappt ist: Beim Ausführen des obigen Codes messe ich an den 2 
Pins immer noch 0V und keine ca 5V (Betriebsspannung).

Taster sind soweit richtig angeschlossen und mit Durchgangsprüfer 
getestet worden.

Im MCUCR Register habe ich bisher noch nichts geschrieben. Daher sollte 
der Wert in PUD standardmäßig 0 sein oder ? Im Datenblatt steht auf 
Seite 57, dass der Wert 0 für Pullup enabled steht.
http://www.atmel.com/dyn/resources/prod_documents/doc2586.pdf

Wenn es hilft könnte ich auch einen Schaltplan posten.
OP #2296265
Lesenswert?

Habe an den Fusebits nichts geändert bisher, da ich den internen RC Osz. 
mit 8Mhz verwenden möchte. Die daraus resultierende Taktfrequenz von 1 
MHz reicht für 2 Taster und 3 Ausgänge aus.

Hab jetzt einen Taster testweise ausgelötet. Auch jetzt keine 5V am Pin 
mit Pullup, aber der Prozessor läuft, da ein Ausgang wie programmiert 
auf High geht nach der gesamten Initialisierung.
OP #2296273
Lesenswert?

Der gesamte Code:
1
#include <avr/io.h>
2
 #include <stdint.h>
3
 #include <util/delay.h>
4

5
 #define DD_A DDB1
6
 #define DD_B DDB2
7
 #define DD_INH DDB0
8
 #define PIN_A PB1
9
 #define PIN_B PB2
10
 #define PIN_INH PB0
11

12
 inline uint8_t debounce(volatile uint8_t *port, uint8_t pin);
13

14
 int main() {
15

16
     uint8_t enableA;
17
    uint8_t enableB;
18
    uint8_t enableINH;
19

20
    enableINH = 1;
21
    enableA = 0;
22
    enableB = 0;
23
     
24
    //Datenregister als Ausgänge und Eingänge definieren    
25
    DDRB = (1 << DD_A) | (1 << DD_B) | (1 << DD_INH);
26
    DDRB &= ~(1 << DDB3); 
27
    DDRB &= ~(1 << DDB4);
28

29
    //interne Pullips für Taster aktivieren
30
    PORTB |= (1 << PB3) | (1 << PB4);
31

32

33
    //Endlosschleife
34
     while (1) {
35
        
36
        //Eingänge auf Tastendruck überprüfen
37
        if (debounce(&PINB, PB3)) { // CH1
38
            enableINH = 0;
39
            enableA = 0;
40
            enableB = 0;
41
        }
42
        if (debounce(&PINB, PB4)) { // CH2
43
            enableINH = 0;
44
            enableA = 1;
45
            enableB = 0;
46
        }
47
    
48
        // Schaltern der Ausgänge
49
        if(enableINH) {
50
            PORTB = (1 << PIN_INH);
51
        } else {
52
            if(enableA) {
53
                PORTB |= (1 << PIN_A);
54
            } else {
55
                PORTB &= ~(1 << PIN_A);
56
            }
57
            if(enableB) {
58
                PORTB |= (1 << PIN_B);
59
            } else {
60
                PORTB &= ~(1 << PIN_B);
61
            }
62
        }
63
    }
64
    
65
    return 0;
66
 } // main
67

68
 /* Einfache Funktion zum Entprellen eines Tasters */
69
 inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
70
 {
71
    if ( !(*port & (1 << pin)) )
72
    {
73
        /* Pin wurde auf Masse gezogen, 100ms warten   */
74
        _delay_ms(50);   // Maximalwert des Parameters an _delay_ms 
75
        _delay_ms(50);   // beachten, vgl. Dokumentation der avr-libc
76
        if ( *port & (1 << pin) )
77
        {
78
            /* Anwender Zeit zum Loslassen des Tasters geben */
79
            _delay_ms(50);
80
            _delay_ms(50); 
81
            return 1;
82
        }
83
    }
84
    return 0;
85
 } // debounce
Gast #2296276
Lesenswert?

(1) Zum kompilieren den richtigen Mikrocontroller ausgewählt?
(2) Sicher das die Ports richtig konfiguriert blieben? Ich meine wir 
sehen hier nur Code-Schnippsel. Nicht das im Programm sonst noch Ports 
verändert werden.
(3) Sicher, dass das Program läuft. Vielleicht zum Testen ne blinkende 
LED implementieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren