Hallo,
ich möchte auf einem Atmgea16 die Eingabe an PinA7 zählen, nun habe ich
nach ersten recherche festgestellt, das das nicht so einfach geht wie
mit z.B. PinB0, wo ich ja TSCR0 verwenden kann. Habe ich da bei meiner
recherche etwas übersehen und es gibt doch so etwas ähnliches? Oder wie
sonst könnte ich das Lösen.
Konkret soll das Assembler Programm die Fallende flanke eines Buttons an
PinA7 zählen, ist es 5 mal vorgekommen, so soll er eine ISR ausführen
und danach wieder in die Main loop springen.
Dies währe eine Beispiel Implementierung mit PinB0 als Eingabe:
1 | .nolist
|
2 | .include "m16def.inc"
|
3 | .list
|
4 |
|
5 | .def Temp = R16
|
6 | .equ Anz = 5
|
7 |
|
8 | .CSEG
|
9 | .ORG $0000
|
10 |
|
11 | ; Init Counter 0 and Port B
|
12 | INIT: ldi Temp,(1<<CS02)|(1<<CS01)|(0<<CS00)
|
13 | out TCCR0, Temp ; Mode: Event Counter T0 L/H
|
14 | ldi Temp, Anz-1 ; Set Compare Value of
|
15 | out OCR0, Temp ; Counter to ANZ-1
|
16 | ldi Temp, (1<<PB3)
|
17 | out DDRB, Temp ; as Outp., others Inp./Hi-Z
|
18 | clr Temp
|
19 | out PORTB, Temp
|
20 |
|
21 | ; Reset Counter
|
22 | START: clr Temp
|
23 | out TCNT0, Temp
|
24 |
|
25 | ; Polling Loop until Anz Events Counted
|
26 | POLL: in Temp, TIFR ; Read Timer-Flags
|
27 | sbrs Temp, OCF0 ; Skip if Output Compare set
|
28 | rjmp POLL
|
29 |
|
30 | ; Invert Bits
|
31 | in Temp, PORTB ; Get value of Port B
|
32 | com Temp ; Invert Bits
|
33 | andi Temp, (1<<PB3) ; Write inverted
|
34 | out PORTB, Temp
|
35 | ; Clear Flag and Start Next Counting Round
|
36 | ldi Temp, (1<<OCF0) ; Clear Compare Flag
|
37 | out TIFR, Temp
|
38 | rjmp START
|
Dankeschön schonmal im Voraus für die Hilfe und Anregungen.