Created
October 30, 2011 22:28
-
-
Save botic/1326537 to your computer and use it in GitHub Desktop.
Maus"treiber" aus der HTL
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ORG $101 | |
| ; ______ ___ ____ | |
| ; /\__ _\ /'___`\ /\ _`\ | |
| ; \/_/\ \/ /\_\ /\ \\ \ \ | |
| ; \ \ \ \/_/// /__\ \ \ __ | |
| ; \_\ \__ // /_\ \\ \ \ \ \ | |
| ; /\_____\/\______/ \ \____/ | |
| ; \/_____/\/_____/ \/___/ | |
| ; _____ __ ___ | |
| ; /\ _`\ /\ \ __ /\_ \ __ | |
| ; \ \ \L\ \ \ \___ /\_\\//\ \ /\_\ _____ _____ | |
| ; \ \ ,__/\ \ _ `\/\ \ \ \ \ \/\ \/\ '__`\/\ '__`\ | |
| ; \ \ \/ \ \ \ \ \ \ \ \_\ \_\ \ \ \ \L\ \ \ \L\ \ | |
| ; \ \_\ \ \_\ \_\ \_\/\____\\ \_\ \ ,__/\ \ ,__/ | |
| ; \/_/ \/_/\/_/\/_/\/____/ \/_/\ \ \/ \ \ \/ | |
| ; \ \_\ \ \_\ | |
| ; (C) 2003 3ADV-Kat. 13 \/_/ \/_/ | |
| ; __ __ __ | |
| ; /\ \/\ \ /\ \ | |
| ; \ \ `\\ \ __ \_\ \ __ _ __ __ _ __ | |
| ; \ \ , ` \ /'__`\ /'_` \ /'__`\/\`'__\/'__`\/\`'__\ | |
| ; \ \ \`\ \/\ \L\.\_/\ \L\ \/\ __/\ \ \//\ __/\ \ \/ | |
| ; \ \_\ \_\ \__/.\_\ \___,_\ \____\\ \_\\ \____\\ \_\ | |
| ; \/_/\/_/\/__/\/_/\/__,_ /\/____/ \/_/ \/____/ \/_/ | |
| BYTEP1 EQU $1 | |
| DDR EQU $5 | |
| SCL EQU 3 ; unter Basic PORT[4] | |
| SDA EQU 2 ; unter Basic PORT[3] | |
| VCC EQU 7 | |
| ;* FUNKTION: initial * | |
| ;* Zweck: Strom aufdrehen, * | |
| ;* Ausgabetreiber aktivieren * | |
| INITIAL BSET VCC,BYTEP1 ;auf 1 setzen, aktiv | |
| BSET VCC,DDR ;auf 1 setzen, aktiv | |
| BCLR SDA,DDR ;auf 0 setzen, nicht aktiv | |
| BCLR SCL,DDR ;auf 0 setzen, nicht aktiv | |
| RTS | |
| ;------------------------------------------------------------------------------------------------------- | |
| ; START | | |
| ; | | |
| ; I2C-Clock ________ | | |
| ; |_________ | | |
| ; | | |
| ; SDA _____ | | |
| ; |____________ | | |
| ; | | |
| ; Description: Nachdem dieses Signal gesendet wurde vergleichen alle IC's | | |
| ; die Nachfolgende Adresse mit ihrer eigenen. Die StartCondition | | |
| ; bedeutet das SCL auf high liegt und SDA von High auf LOW wechselt. | | |
| ; Dies ist ein Vorgang der bei der Datenübertragung nicht zulässig ist. | | |
| ; Beim Datentransfer darf sich der Zustand von SDA nur während SCL = low ändern. | | |
| ;-------------------------------------------------------------------------------------------------------- | |
| START BCLR SDA,BYTEP1 ;SDA auf 1, damit der Wechsel sicher von 1 auf 0 erfolgt | |
| BSET SDA,DDR ;SDA auf 0 (Strom einschalten, durch PullUp auf 1) | |
| BCLR SCL,BYTEP1 ;SCL auf 1, damit der Wechsel sicher von 1 auf 0 erfolgt | |
| BSET SCL,DDR ;SCL auf 0 (Strom einschalten, durch PullUp auf 1) | |
| RTS | |
| ;------------------------------------------------------------------------------------------------------- | |
| ; STOP | | |
| ; | | |
| ; I2C-Clock ___________ | | |
| ; ______| | | |
| ; | | |
| ; SDA ________ | | |
| ; _________| | | |
| ; | | |
| ; Description: Nachdem Der Master die Adresse übermittelt hat, können Master und der angesprochene | | |
| ; Slave ungestört miteinander "reden". Erst Nachdem die StopCondition gesendet wurde, | | |
| ; warten wieder alle IC's auf eine neue StartCondition. Die StopCondition besteht aus SCL | | |
| ; high und einem wechsel von SDA von low auf high. | | |
| ;-------------------------------------------------------------------------------------------------------- | |
| STOP BCLR SDA,BYTEP1 ;SDA und SCL auf 0 setzen | |
| BCLR SCL,DDR ;damit beide sicher unten sind | |
| BSET SCL,DDR ;SCL zuerst setzen | |
| BSET SDA,DDR ;gleich danach auch SDA nach oben | |
| RTS | |
| ;------------------------------------------------------------------------------------------------------- | |
| ; SBIT | | |
| ; | | |
| ; Description: Das zu sendende Bit, welches vorher im Carry-Flag abgelegt wurde, wird nun über den I2C | | |
| ; an das andere Ende übertragen. | | |
| ;-------------------------------------------------------------------------------------------------------- | |
| SBIT BCC SENDEZ ;wenn Carry-Bit 0 ist - 0 senden | |
| SENDEO BCLR SDA,DDR ;1er in Datenleitung | |
| BRA GEHHAM ;zu GEHAM springen, ansonsten 0er anlegen | |
| SENDEZ BCLR SDA,BYTEP1 ;0er in die Datenleitung | |
| BSET SDA,DDR | |
| GEHHAM BCLR SCL,DDR ;und geh wieder heraus | |
| BSET SCL,DDR | |
| RTS | |
| ;------------------------------------------------------------------------------------------------------- | |
| ; SBYTE | | |
| ; | | |
| ; Description: Durch den Umstand, dass das zu sendende Byte in den Akku gelegt wurde, kann man mit | | |
| ; einem Rotate einfach das gewünschte Bit in das Carry-Flag legen und dann einfach | | |
| ; die Routine zum senden eines einzelnen Bits aufrufen. | | |
| ;-------------------------------------------------------------------------------------------------------- | |
| SBYTE LDX #$7 ;in das Index Register laden | |
| LOOP ROLA ;den Akku einmal Rotaten | |
| BSR SBIT ;ins Bitsenden gehen | |
| DECX ;Index Register dekrementieren | |
| BPL LOOP ;Wenn das Negativ-Flag nicht gesetzt ist LOOPe noch einmal durch | |
| ROLA ;Ausgangszustand herstellen | |
| BRA EMPFBIT | |
| ;------------------------------------------------------------------------------------------------------- | |
| ; EMPFBIT | | |
| ; | | |
| ; Description: Das empfangene Bit, welches auf der SDA-Leitung anliegt, wird einfach in das Carry | | |
| ; geschrieben und kann dort später ausgelesen werden. | | |
| ;-------------------------------------------------------------------------------------------------------- | |
| EMPFBIT BCLR SCL,DDR ;SCL clearen | |
| BRSET SDA,BYTEP1,RETONE ;Wenn das SDA-Bit auf dem Byteport gesetzt ist zu RET1 springen | |
| RETONE BSET SCL,DDR ;durch die obige Überprüfung auf 1 setzen | |
| RTS | |
| ;------------------------------------------------------------------------------------------------------- | |
| ; EMBYTE | | |
| ; | | |
| ; Description: Das empfangene Bit liegt im dank der EMPFBIT im Carry-Flag und die braucht jetzt einfach| | |
| ; durch einen fetten Loop genau 8x (=1Byte) ausgeführt werden. Und schon haben wir ein | | |
| ; Byte empfangen und es auch gleich zusammengebastelt. | | |
| ;-------------------------------------------------------------------------------------------------------- | |
| EMBYTE LDX #$7 | |
| LOOP BSR EMPFBIT | |
| BCC BIT0 ;Carry-Flag == 0? | |
| BIT1 ROLA |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment