Forum: Mikrocontroller und Digitale Elektronik Interne Pulldown widerstände?


von hermo (Gast)


Lesenswert?

Ich bin gerade heftig am Zweifeln warum das Funktioniert was ich gerade 
mache, es kommt mir so Vor als hätte der Atmega32 in meinem Programm 
Pull Down Widerstände und in einem anderen Programm Pull Up Widerstände, 
folgendes Programm:
1
.include "m32def.inc"
2
3
//Interrupt Adressen
4
.org 0x0000
5
rjmp    Init           
6
.org OVF0addr
7
rjmp    timer0_overflow 
8
9
Init:
10
//Registerdefinition
11
.def temp1 = r16
12
.def temp2 = r17
13
.def menu  = r18
14
.def menu_item  = r19 
15
.def adlow     = r20        
16
.def adhigh    = r21
17
.def old_key   = r22
18
.def new_key   = r23
19
20
//Defines
21
.equ XTAL  = 4000000
22
23
.equ DISPLAY1_PORT  = PORTC
24
.equ DISPLAY1_PIN_RS  = 4
25
.equ DISPLAY1_PIN_E  = 5
26
27
.equ DISPLAY2_PORT  = PORTD
28
.equ DISPLAY2_PIN_RS  = 4
29
.equ DISPLAY2_PIN_E  = 5
30
31
//Datenrichtung Portbelegung
32
//PORTA = ADC
33
ldi temp1, 0x00
34
out DDRB, temp1 //Input Taster (0-3 = Menü)
35
36
ldi temp1, 0xFF
37
out DDRB, temp1 //Interne Pullup
38
out DDRC, temp1 //Display 1
39
out DDRD, temp1 //Display 2
40
41
//Stack Initialisieren
42
ldi     temp1, HIGH(RAMEND)
43
out     SPH, temp1
44
ldi     temp1, LOW(RAMEND)     
45
out     SPL, temp1
46
47
//Timer Initialisieren
48
ldi     temp1, (1<<CS02) | (0<<CS01) | (1<<CS00)  //Vorteiler 1024     
49
out     TCCR0, temp1
50
51
ldi     temp1, (1<<TOIE0)     
52
out     TIMSK, temp1
53
sei
54
55
//ADC Initialisieren
56
ldi     temp1, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
57
out     ADCSRA, temp1  
58
59
Main:
60
rcall ADC_Check //Unwichtige Funktion welche berechnungen ergebnisse im SRAM speichert verändert keine Register
61
62
out PORTC, menu_item//Dient zum Debuggen des Timers
63
64
in temp1, PINB
65
out PORTD, temp1 // Debug info von PINB Ohne ein Taster zu drücken steht in temp1 0x00 aber wieso wenn doch die PullUp Widerstände an sind
66
rjmp Main
67
68
//Interrupts
69
timer0_overflow:
70
71
tst old_key
72
brne timerEnde//Eine Taste wurde gedrückt
73
//Keine Taste wurde gedrückt
74
in new_key,PINB
75
tst new_key//Zeroflag ist 1 da PINB = 0x00 (Warum nicht 0xFF)
76
breq keineTaste
77
//Eine Taste wird gedrückt
78
com menu_item //Debug info lässt eine LED Blinken um zu sehen, dass der Code hier ist.

Nun habe ich PINB 0 über ein Taster mit 0V verbunden man mag meinen 
durch die PullUp Widerstände geschieht eine Veränderung am PORT aber 
nichts... beim drücken des Tasters verändert sich weder werte am Port 
noch wird die Zeile "com menu_item" aufgerufen.

Nun eine Andere Variante, ich verbinde PINB 0 über den Taster mit 5V, 
sobald ich den Taster drücke komme ich zur Zeile "com menu_item" doch 
wieso? Das gesamte Programm funktioniert es kommt mir so vor als seien 
keine PullUp sondern PullDown Widerstände am Werk die den Port auf 0V 
Ziehen darum Passiert auch nichts wenn ich PINB 0 auf 0V schalte, aber 
es Passiert das richtige wenn er auf 5V Liegt.

Zum Testen habe ich aus dem Tutorial den einfachen Testcode genommen:
1
.include "m32def.inc"
2
ldi r16, 0xFF
3
out DDRD, r16     ; Alle Pins am Port B durch Ausgabe von 0xFF ins
4
                           ; Richtungsregister DDRB als Ausgang konfigurieren
5
ldi r16, 0x00
6
out DDRB, r16     ; Alle Pins am Port D durch Ausgabe von 0x00 ins
7
                           ; Richtungsregister DDRD als Eingang konfigurieren
8
 
9
ldi r16, 0xFF     ; An allen Pins vom Port D die Pullup-Widerstände
10
out PORTB, r16    ; aktivieren. Dies geht deshalb durch eine Ausgabe
11
                  ; nach PORTD, da ja der Port auf Eingang gestellt ist.
12
loop:
13
in r16, PINB      ; an Port D anliegende Werte (Taster) nach r16 einlesen
14
out PORTD, r16    ; Inhalt von r16 an Port B ausgeben
15
rjmp loop         ;  zu "loop:" -> Endlosschleife

Dieser Code funktioniert wieder wie Erwartet und umgekehrt meinem:

Nichts Passiert wenn ich 5V Schalte und eine Veränderung geschieht wenn 
ich ein PORT auf 0V Ziehe.
Auch die Ausgabe im Ruhezustand ist anders, hier sieht man anhand von 
LEDs die den PORT Prüfen, dass dort ohne was zu drücken 0xFF drinne 
steht.

Nun frage ich mich doch, warum ich bei meinem oberen Programm ein 
solches Verhalten habe, warum der PORTB ohne eine Eingabe trotz PullUp 
Widerstände den Wert 0x00 hat und diesen erst bei +5V ändert


Anbei, Schalte ich die Internen Pullup Widerstände aus funktioniert 
natürlich  weder meiner noch der Beispielcode.

Hoffe jemand versteht mein Anliegen und noch besser das seltsahme 
Verhalten in meinem Programm... warum funktioniert es.

von Daniel S. (daniel_s49)


Lesenswert?

1
//Datenrichtung Portbelegung
2
ldi temp1, 0x00
3
out DDRB, temp1 //Input Taster (0-3 = Menü)
4
5
ldi temp1, 0xFF
6
out DDRB, temp1 //Interne Pullup

sollte es beim 2. Befehl nicht PORTB heißen? Weil so machst du die 
Pullups nie an, oder?

von Bernd K. (prof7bit)


Lesenswert?

Du schaltest nicht die Pullups, du schreibst FF ins DDR und schaltest 
alle Pins auf AUSGANG. Tippfehler in Deinem Code.

von hermo (Gast)


Lesenswert?

ARGH ich danke dir, habe vorhin auch schon PORTX statt PINX bei einer 
Eingabe geschrieben, das verwechsel ich gerne.

Danke dir, nun muss ich mein Code umschreiben aber das wirds kleinste 
sein.

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.