Hallo!
Ich arbeite seit Tagen an diesem Quellcode rum und habe nach längeren
Umschreiben endlich zum laufen gebracht. Die Ausgabe auf die LEDs
funktioniert wunderbar, nur komm ich nicht drauf, wie man die PORTs
einlesen kann und danach über TWI abzufragen.
So schaut der CODE aus:
1 | .include "tn26def.inc" ; Deklarationen für ATtiny26
|
2 |
|
3 | .equ twi_addr = $90 ; TWI Adresse
|
4 |
|
5 |
|
6 | .cseg ; Programm-Flash
|
7 | rjmp init ; Reset-Einsprung
|
8 |
|
9 | .org 0x007 ; USI Start Interrupt
|
10 | rjmp usi_start
|
11 |
|
12 | .org 0x008 ; USI Overflow Interrupt
|
13 | rjmp usi_ovf
|
14 |
|
15 |
|
16 | .org 0x00C ; Interrupteinsprünge übergehen
|
17 |
|
18 | init: ldi R16, RAMEND ; Stapel anlegen
|
19 | out SP, R16
|
20 |
|
21 | ldi R16, 0b11111111 ; PortA als Ausgang
|
22 | out DDRA, R16
|
23 |
|
24 | ; USI Control Register
|
25 | ldi R16, (1 << USISIE) | (1 << USIOIE) | (1 << USIWM1) | (1 << USIWM0) | (1 << USICS1) | (0 << USICS1)
|
26 | out USICR, R16
|
27 |
|
28 | sei ; Interrupts aktivieren
|
29 |
|
30 |
|
31 |
|
32 | loop:
|
33 |
|
34 | rjmp loop ; Endlosschleife
|
35 |
|
36 |
|
37 |
|
38 | usi_start:
|
39 | in R16, USISR ; Start Condition Interrupt Flag zurücksetzen
|
40 | ori R16, (1 << USISIF)
|
41 | out USISR, R16
|
42 |
|
43 | reti ; Kehre zurück
|
44 |
|
45 | usi_ovf:
|
46 | in R16, USIDR
|
47 | lsr r16
|
48 | lsr r16
|
49 | out PORTA, R16
|
50 |
|
51 | reti ; Kehre zurück
|
Nun möchte ich, wenn es möglich ist, an den freien B-PINs anschließen
und mit der Adresse $91 auslesen, nur komm ich nicht drauf wie man es
macht.
Könnt ja auch einen PCF nehmen, nur sind die schon mittlerweile
Abgekündigt ;-) und dazu lernen möchte man ja auch.