Pin wird nicht richtig gelesen

Gast #1085918
Lesenswert?

hallo,
nach dem einschalten bezw. einem reset liest der atmega einen taster ein 
und je nach dem was für ein pegel anliegt wird entschieden welche led 
angeht.
jedoch wird nicht immer der richtige pegel eingelesen was mir 
unverständlich ist.

der pin ist mit einem taster verbunden der im gedrückten zustand auf 
masse gezogen wird.
um zu verhindern das bei nicht gedrückten taster der pin in der luft 
hängt ist der interne pull up zugeschalten, denoch wird der pin manchmal 
nicht richtig eigelesen wenn der taster offen ist.

so wie ich das im datenblatt verstanden habe, braucht der avr einen takt 
um den aktuellen pin wert zu synchronisieren was durch den befehl "nop" 
geschied.
leider bringt das nicht der gewünschten erfolg und der taster wird wenn 
er geöffnet ist ab und an falsch eingelesen.

wenn man nun ein zweites "nop" hinzufügt wird der taster urplötzlich 
jedesmal richtig eingelesen!

nun macht mich das schon etwas stuzig da laut datenblatt ja ein "nop" 
zur synchronisation reichen sollte, wie auch in dem beispiel das auf 
seite 55 im datenblatt gezeigt wird:
1
...
2
; Define pull-ups and set outputs high
3
; Define directions for port pins
4
ldi r16,(1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0)
5
ldi r17,(1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0)
6
out PORTB,r16
7
out DDRB,r17
8
; Insert nop for synchronization
9
nop
10
; Read port pins
11
in r16,PINB
12
...

datenblatt:
http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf

bei der hardware handelt es sich um das myavr board.
den schaltplan kann man hier einsehen:
http://www.myavr.info/download/schaltplan_15.png

hier mal das programm das den taster nur manchmal richtig einliest.
hat da jemand eine idee wieso sich das so verhält?
1
.include "m8def.inc"
2

3

4
  sbi PORTC, 0
5
  nop                ; synchronisieren
6

7

8
  sbic PINC, 0
9
  rjmp eins
10

11
null:
12
  sbi PORTD, 7
13
  sbi DDRD, 7
14
  rjmp ende
15

16

17
eins:
18
  sbi PORTD, 6
19
  sbi DDRD, 6
20
  rjmp ende
21

22

23

24
ende:
25
  rjmp ende
#1085954
Lesenswert?

Wenn du direkt nach dem Einschalten der Pull-Ups den Zustand der Leitung 
einlist, dann ist die externe Beschaltung wahrscheinlich noch nicht im 
stabilen Zustand und der Controller liest irgend einen Zwischenzustand, 
den er dann mal als 1, mal als 0 interpretiert, je nach Windrichtung und 
Laune.

Schalte einen ausreichenden Delay vor das Einlesen des Ports - das eine 
nop reicht nicht aus - das wird für die interne Logik des Controllers 
gebraucht.

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