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:
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.
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.