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.