Hallo! Ich versuche erfolglos den MAX7300 zu benutzen. Die I2C-Routinen scheinen zu funktionieren (Acknowledge-Bit wird gelöscht). Ich möchte z.B. Port 12 als Ausgang benutzen. Also habe ich folgende Bytes gesendet: 0x0B (Register) 0x55 (alle als Ausgang). Ist das bisher richtig? Wie spreche ich dann z.B. Port 12 einzeln an, und setze diesen high/low? Bisher messe ich an Port 12 immer irgendwas (~300mV). Gruß Florian
Hallo Florian, die Portkonfiguration ist richtig. Port 12 wird über Register 0x2C geschaltet. Für Pegel High sende 0x2C, 0x01 (Port, Data) und für Pegel Low sende 0x2C, 0x00. Funktioniert bei mir problemlos. Gruß Rockhound
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)
Hat sich erledigt. Ich hatte nicht den Normal-Operation-Mode eingestellt. Wer ahnt denn auch, dass das Teil Anfangs in einem Shutdown-Mode rumgammelt :-/ Florian
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.