Forum: Mikrocontroller und Digitale Elektronik MAX7300


von Florian Venzke (Gast)


Lesenswert?

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

von Rockhound (Gast)


Lesenswert?

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

von Florian Venzke (Gast)


Lesenswert?

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)

von Florian Venzke (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.