Forum: Mikrocontroller und Digitale Elektronik Pin wird nicht richtig gelesen


von donald (Gast)


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

von Uhu U. (uhu)


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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Die parasitäre Kapazität der angeschlossenen Leitung und des Tasters muß 
auch mit umgeladen werden. Nimm 2x oder mehr "NOP" dazwischen, dann 
geht´s auch.

von Mensch_Z (Gast)


Lesenswert?

hast du soo viel Zeit um 4 NOPs zu spendieren ? (Zeit is Geld , gelle)

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.