PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LED-blinkt - auch ohne Pause zwischen ein/aus



Dolfo
03.05.2009, 19:07
Hallo,

am Attiny 45 soll eine LED an PB2 blinken:

start:
cbi PinB,2 ; LED aus
rcall timeloop1

sbi PinB,2 ; LED ein
; rcall timeloop2

rjmp start

"timeloop" sind kleine Zeitschleifen damit man das Blinken auch sieht.

Zuerst fiel auf, dass das Blinken immer gleichmäßig erfolgt, auch wenn timeloop1 und timeloop2 unterschiedlich lange Pausen erzeugen. Zum Testen dann mal timeloop2 ausgeblendet - und die LED blinkt immer noch. Ich verstehe beim besten Willen nicht warum. Dachte zuerst, dass cbi "toggelt", ist aber nicht der Fall. Hat jemand eine Idee?

oberallgeier
03.05.2009, 19:22
Was steht in der Hilfe zum Assembler im AVRStudio ?


CBI - Clear Bit in I/O Register

Description:
Clears a specified bit in an I/O register. This instruction operates on the lower 32 I/O registers - addresses 0-31.



Operation:

I/O(A,b) <- 0

Syntax: Operands: Program Counter:

CBI A, b 0 ≤ A ≤ 31, 0 ≤ b ≤ 7 PC ← PC + 1

16-bit Opcode:

1001 1000 AAAA Abbb


Example:

cbi $12, 7 ; Clear bit 7 in Port D



Words: 1 (2 bytes)

Cycles: 2

Besserwessi
03.05.2009, 21:12
Bei einigen Chips, offensichtlich auch der tiny45 kann man einzelen Ausgänge toggeln indem man in das PinB Register ein 1 schreibt. In dem Beispiel oben macht der Befehl CBI wohl nichts (ggf. etwas mit anderen Pins !) und das SBI PinB,2 schaltet die LED abwechslend an und aus.

Normalerweise ist da PinB Register zum lesen. Die Normale Ausgabe geht in die Register PortB.

Dolfo
14.05.2009, 06:04
... gefunden: es muß cbi PortB,2 nicht cbi PinB,2 heißen.

Naja, vielleicht tappen andere auch in diese "Falle" und denen möge der Eintrag hier helfen.