Forum: Mikrocontroller und Digitale Elektronik Attiny25 interne Pullup-Widerstände


von Christopher S. (chris91)


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!

von Coder (Gast)


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?

von Christopher S. (chris91)


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.

von Coder (Gast)


Lesenswert?

Ich wage es nicht zu fragen aber fehlt vielleicht die Betriebsspannung?

von Christopher S. (chris91)


Lesenswert?

Ok das war ne Standardfrage...
Aber sie liegt an über einen 7805 und ner 9V Blockbatterie und ist auch 
am Controller messbar.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Die nächste Standardfrage wäre dann:

Läuft der Prozessor überhaupt? Taktfrequenz ok? Fuses auf den richtigen 
Oszillatortyp gestellt?

Grüße,

Peter

von Coder (Gast)


Lesenswert?

Hm. Dann hätte es funktionieren "können". Liegen denn ohne Taster 5v an?

von Christopher S. (chris91)


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.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Dann gibt es ja noch die Möglichkeit, dass eine "alternate pin function" 
aktiv ist. Kannst du den ganzen Quellcode herzeigen?

Grüße,

Peter

von Christopher S. (chris91)


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

von Coder (Gast)


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.

von Christopher S. (chris91)


Lesenswert?

Verdammt ich habe den Fehler glaube eben gefunden...
1
 if(enableINH) {
2
            PORTB = (1 << PIN_INH);
3
        } else {

Habe vergessen zu verodern.

Ich probiere gleich mal aus. Sorry für die ganzen Bemühungen.


Funktioniert jetzt alles einwandfrei! Vielen Dank

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.