Ich bin langsam am verzweifeln. Egal was ich mache - es geht nicht.
Den Max7300 habe ich wie folgt beschaltet:
Pin1: über 42k an Masse
Pin2+3 : Masse
Pin4: Masse
Pin5: getesteter Ausgang
Pin25: SDA
Pin26: SCL
Pin27: V+
Pin28: V+
Mein Code:
.include "8535def.inc"
.def temp = r16
.def data = r17
.def eeph = r18 ; Zähler des EEPROMs
.def eepl = r19
.org 0x000
rjmp main ; Reset Handler
reti ; IRQ0 Handler
reti ; IRQ1 Handler
reti ; Timer2 compare Handler
reti ; Timer2 overflow Handler
reti ; Timer1 Capture Handler
reti ; Timer1 compareA Handler
reti ; Timer1 compareB Handler
reti ; Timer1 Overflow Handler
reti ; Timer0 Overflow Handler
reti ; SPI Transfer Complete Handler
reti ; UART RX Complete Handler
reti ; UDR Empty Handler
reti ; UART TX Complete Handler
reti ; ADC Conversion Complete Interrupt Handler
reti ; EEPROM Ready Handler
reti ; Analog Comparator Handler
read:
OUT EEARL,eepl ; im EEPROM an den EEPROM-Port
OUT EEARH,eeph ; übergeben, da 512 Byte verfügbar
SBI EECR, 0 ; Setze des Read-Enable-Bit EERE im
; EEPROM-Control-Register EECR
IN data,EEDR ; Lese das Byte aus dem EEPROM-Speicher
inc eepl
read_wait:
sbic EECR, 0
rjmp read_wait
ret
main:
ldi eeph, HIGH(daten)
ldi eepl, LOW(daten)
ldi temp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
out SPL, temp
ldi temp, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
out SPH, temp
ldi temp, 0xFF ; PortC als Ausgang festlegen
out DDRC, temp
; PORTC, 0 SCL
; PORTC, 1 SDA
ldi temp, 0xFF
out PORTC, temp
rcall send
rcall send
rjmp loop
loop:
rjmp loop
wait:
ldi temp, 0x00
out TCNT0, temp
ldi temp, 0b00000010
out TCCR0, temp
wait_: in temp, TCNT0
cpi temp, 8
brlo wait_
ldi temp, 0x00
out TCCR0, temp
ret
send:
rcall start
rcall read
rcall sendbyte
rcall read
rcall sendbyte
rcall read
rcall sendbyte
rcall stop
ret
start:
rcall wait ; t_buf abwarten
rcall wait
cbi PORTC, 1 ; SDA löschen, während SCL high
rcall wait
cbi PORTC, 0
rcall wait
ret
stop:
cbi PORTC, 1
rcall wait ; 1/2 t_low abwarten
sbi PORTC, 0
rcall wait
sbi PORTC, 1 ; SDA setzen, während SCL high
ret
sendbyte:
sbrc data, 7
rcall send1
sbrs data, 7
rcall send0
sbrc data, 6
rcall send1
sbrs data, 6
rcall send0
sbrc data, 5
rcall send1
sbrs data, 5
rcall send0
sbrc data, 4
rcall send1
sbrs data, 4
rcall send0
sbrc data, 3
rcall send1
sbrs data, 3
rcall send0
sbrc data, 2
rcall send1
sbrs data, 2
rcall send0
sbrc data, 1
rcall send1
sbrs data, 1
rcall send0
sbrc data, 0
rcall send1
sbrs data, 0
rcall send0
rcall ackn
ret
send1:
sbi PORTC, 1
rcall wait
sbi PORTC, 0
rcall wait
cbi PORTC, 0
rcall wait
cbi PORTC, 1
ret
send0:
rcall wait
sbi PORTC, 0
rcall wait
cbi PORTC, 0
rcall wait
ret
ackn:
rcall wait
sbi PORTC, 1
cbi DDRC, 1
sbi PORTC, 0
rcall wait
sbis PINC, 1 ; wenn Datenbit von Empfänger gelöscht,
cbi PORTC, 2 ; LED an
cbi PORTC, 0
sbi DDRC, 1
rcall wait
ret
.eseg
daten:
.db 0b10001000, 0x0B, 0x55, 0b10001000, 0x2C, 0x01 ;(oder 0x00)
Am Ausgang Pin5 messe ich nichts vernünftiges (egal ob Pin high oder
low gesetzt)