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
|