Skip to content

Instantly share code, notes, and snippets.

@botic
Created October 30, 2011 22:28
Show Gist options
  • Select an option

  • Save botic/1326537 to your computer and use it in GitHub Desktop.

Select an option

Save botic/1326537 to your computer and use it in GitHub Desktop.
Maus"treiber" aus der HTL
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