Schade, dass das mit dem debuggen nicht einfach so funktioniert.
Aber wie ich gerade merke, würde mir das eh nicht weiterhelfen.
Ich habe im Inet einen C-Code gefunden, den ich dann auf Assembler
umgestrickt habe (obwohl ich kein C kann... das möchte ich betonen).
Hier nun die ersten Zeilen des Codes:
1 | rjmp TWIStart
|
2 |
|
3 | TWIAction: ;R16 => Das Kommando
|
4 | ori r16, (1 << TWINT)
|
5 | sts TWCR,r16
|
6 |
|
7 | wait1: lds r16,TWCR
|
8 |
|
9 | Rcall USARTSent ;R16 'debuggen'
|
10 |
|
11 | sbrs r16,TWINT
|
12 | rjmp wait1
|
13 | lds r16, TWSR
|
14 | ret
|
15 |
|
16 | TWIStart:
|
17 |
|
18 | ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
|
19 | rcall TWIAction
|
20 | cpi r16, 0x08
|
21 | brne error
|
22 |
|
23 | ....
|
So: die Code Abarbeitung bleibt in der WAIT1 Schleife hängen. Bin schon
enttäuscht, dass gar nicht passiert....
Nun zu der Hauptfrage: "Wieso wird die Bedienung nicht erfüllt", noch 2
Andere:
Was bedeutet das :"(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)" und zwar die "<<"
und die "|". ist das "|" eine ODER-Verknüpfung? Wollte ich schon immer
wissen, hab mich aber noch nie zu fragen gewagt.
Dann der Befehl "sbrs r16,TWINT": Prüft ob das Bit "TWINT" im R16
gesetzt ist und führt dann den nächsten Befehl nicht aus? Diesen Befehl
hab ich direkt aus dem Datenblatt vom Mega88 genommen. Nur ein Problem
damit: TWINT hat den Wert 15? 15 Bits hat das Register doch gar nicht,
wenn ich mich nicht verzählt habe...Ach ja der Wert in R16, das geprüft
wird, ist 36.