Autor |
Hilfe AVR mit I2C software AVR300 Suche nach: i2c (581) |
|
|
|
|
BID = 93809
Condor-x Gelegenheitsposter
Beiträge: 56
|
|
Hallo
Habe einen avr und möchte diesen als master betreiben.
habe mir nun die AVR300.asm software von atmel runtergeladen.
als slave habe ich einen LM75.
mein code schaut jetzt so aus :
I2C_Temp_read:
rcall i2c_init ; initialize I2C interface
ldi i2cadr,$90+i2crd ; Set device address and read
rcall i2c_start ; Send repeated start condition and address
rcall i2c_read ; Execute transfer (read)
mov LCD1,i2cdata
sec
rcall i2c_read ; Execute transfer (read)
mov LCD2,i2cdata
rcall i2c_stop ; Send stop condition - releases bus
ret
ich bekomme aber nur unsin in den registern LCD1 und LCD2
was mach ich falsch ?
|
|
BID = 93888
Jornbyte Moderator
Beiträge: 7178
|
|
Poste mal das gesammte Programm.
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten. |
|
BID = 93894
Condor-x Gelegenheitsposter
Beiträge: 56
|
Hallo
Das gesamte programm ? AVR300.asm ist von atmel ein i2c bus rotine !
ich wolte nur wissen warum ich in den registern LCD1 und LCD2 nicht das bittmuster bekomme was ich eigendlich haben solte.
ich habe den LM 75 am Pc getestet . da bekomme ich richtige daten.
also solte es doch an dem aufruf der atmel rotinen die ich oben gepostet habe ligen oder ?
|
BID = 93909
Jornbyte Moderator
Beiträge: 7178
|
Ja, mit dem was da oben steht geht nix.
Also poste mal alles (ich schreibs ja nicht aus langer weile her).
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 93977
Condor-x Gelegenheitsposter
Beiträge: 56
|
also gut dan poste ich halt das avr300.asm
;**** A P P L I C A T I O N N O T E A V R 3 0 0 ************************
;*
;* Title : I2C (Single) Master Implementation
;* Version : 1.0 (BETA)
;* Last updated : 97.08.27
;* Target : AT90Sxxxx (any AVR device)
;*
;* Support email : avr äht atmel.com (automatisch editiert wegen spamgefahr)
;*
;* DESCRIPTION
;* Basic routines for communicating with I2C slave devices. This
;* "single" master implementation is limited to one bus master on the
;* I2C bus. Most applications do not need the multimaster ability
;* the I2C bus provides. A single master implementation uses, by far,
;* less resources and is less XTAL frequency dependent.
;*
;* Some features :
;* * All interrupts are free, and can be used for other activities.
;* * Supports normal and fast mode.
;* * Supports both 7-bit and 10-bit addressing.
;* * Supports the entire AVR microcontroller family.
;*
;* Main I2C functions :
;* 'i2c_start' - Issues a start condition and sends address
;* and transfer direction.
;* 'i2c_rep_start' - Issues a repeated start condition and sends
;* address and transfer direction.
;* 'i2c_do_transfer' - Sends or receives data depending on
;* direction given in address/dir byte.
;* 'i2c_stop' - Terminates the data transfer by issue a
;* stop condition.
;*
;* USAGE
;* Transfer formats is described in the AVR300 documentation.
;* (An example is shown in the 'main' code).
;*
;* NOTES
;* The I2C routines can be called either from non-interrupt or
;* interrupt routines, not both.
;*
;* STATISTICS
;* Code Size : 81 words (maximum)
;* Register Usage : 4 High, 0 Low
;* Interrupt Usage : None
;* Other Usage : Uses two I/O pins on port D
;* XTAL Range : N/A
;*
;***************************************************************************
;**** Includes ****
.include "1200def.inc" ; change if an other device is used
;**** Global I2C Constants ****
.equ SCLP = 1 ; SCL Pin number (port D)
.equ SDAP = 0 ; SDA Pin number (port D)
.equ b_dir = 0 ; transfer direction bit in i2cadr
.equ i2crd = 1
.equ i2cwr = 0
;**** Global Register Variables ****
.def i2cdelay= r16 ; Delay loop variable
.def i2cdata = r17 ; I2C data transfer register
.def i2cadr = r18 ; I2C address and direction register
.def i2cstat = r19 ; I2C bus status register
;**** Interrupt Vectors ****
rjmp RESET ; Reset handle
; ( rjmp EXT_INT0 ) ; ( IRQ0 handle )
; ( rjmp TIM0_OVF ) ; ( Timer 0 overflow handle )
; ( rjmp ANA_COMP ) ; ( Analog comparator handle )
;***************************************************************************
;*
;* FUNCTION
;* i2c_hp_delay
;* i2c_qp_delay
;*
;* DESCRIPTION
;* hp - half i2c clock period delay (normal: 5.0us / fast: 1.3us)
;* qp - quarter i2c clock period delay (normal: 2.5us / fast: 0.6us)
;*
;* SEE DOCUMENTATION !!!
;*
;* USAGE
;* no parameters
;*
;* RETURN
;* none
;*
;***************************************************************************
i2c_hp_delay:
ldi i2cdelay,2
i2c_hp_delay_loop:
dec i2cdelay
brne i2c_hp_delay_loop
ret
i2c_qp_delay:
ldi i2cdelay,1
i2c_qp_delay_loop:
dec i2cdelay
brne i2c_qp_delay_loop
ret
;***************************************************************************
;*
;* FUNCTION
;* i2c_rep_start
;*
;* DESCRIPTION
;* Assert repeated start condition and sends slave address.
;*
;* USAGE
;* i2cadr - Contains the slave address and transfer direction.
;*
;* RETURN
;* Carry flag - Cleared if a slave responds to the address.
;*
;* NOTE
;* IMPORTANT! : This funtion must be directly followed by i2c_start.
;*
;***************************************************************************
i2c_rep_start:
sbi DDRD,SCLP ; force SCL low
cbi DDRD,SDAP ; release SDA
rcall i2c_hp_delay ; half period delay
cbi DDRD,SCLP ; release SCL
rcall i2c_qp_delay ; quarter period delay
;***************************************************************************
;*
;* FUNCTION
;* i2c_start
;*
;* DESCRIPTION
;* Generates start condition and sends slave address.
;*
;* USAGE
;* i2cadr - Contains the slave address and transfer direction.
;*
;* RETURN
;* Carry flag - Cleared if a slave responds to the address.
;*
;* NOTE
;* IMPORTANT! : This funtion must be directly followed by i2c_write.
;*
;***************************************************************************
i2c_start:
mov i2cdata,i2cadr ; copy address to transmitt register
sbi DDRD,SDAP ; force SDA low
rcall i2c_qp_delay ; quarter period delay
;***************************************************************************
;*
;* FUNCTION
;* i2c_write
;*
;* DESCRIPTION
;* Writes data (one byte) to the I2C bus. Also used for sending
;* the address.
;*
;* USAGE
;* i2cdata - Contains data to be transmitted.
;*
;* RETURN
;* Carry flag - Set if the slave respond transfer.
;*
;* NOTE
;* IMPORTANT! : This funtion must be directly followed by i2c_get_ack.
;*
;***************************************************************************
i2c_write:
sec ; set carry flag
rol i2cdata ; shift in carry and out bit one
rjmp i2c_write_first
i2c_write_bit:
lsl i2cdata ; if transmit register empty
i2c_write_first:
breq i2c_get_ack ; goto get acknowledge
sbi DDRD,SCLP ; force SCL low
brcc i2c_write_low ; if bit high
nop ; (equalize number of cycles)
cbi DDRD,SDAP ; release SDA
rjmp i2c_write_high
i2c_write_low: ; else
sbi DDRD,SDAP ; force SDA low
rjmp i2c_write_high ; (equalize number of cycles)
i2c_write_high:
rcall i2c_hp_delay ; half period delay
cbi DDRD,SCLP ; release SCL
rcall i2c_hp_delay ; half period delay
rjmp i2c_write_bit
;***************************************************************************
;*
;* FUNCTION
;* i2c_get_ack
;*
;* DESCRIPTION
;* Get slave acknowledge response.
;*
;* USAGE
;* (used only by i2c_write in this version)
;*
;* RETURN
;* Carry flag - Cleared if a slave responds to a request.
;*
;***************************************************************************
i2c_get_ack:
sbi DDRD,SCLP ; force SCL low
cbi DDRD,SDAP ; release SDA
rcall i2c_hp_delay ; half period delay
cbi DDRD,SCLP ; release SCL
i2c_get_ack_wait:
sbis PIND,SCLP ; wait SCL high
;(In case wait states are inserted)
rjmp i2c_get_ack_wait
clc ; clear carry flag
sbic PIND,SDAP ; if SDA is high
sec ; set carry flag
rcall i2c_hp_delay ; half period delay
ret
;***************************************************************************
;*
;* FUNCTION
;* i2c_do_transfer
;*
;* DESCRIPTION
;* Executes a transfer on bus. This is only a combination of i2c_read
;* and i2c_write for convenience.
;*
;* USAGE
;* i2cadr - Must have the same direction as when i2c_start was called.
;* see i2c_read and i2c_write for more information.
;*
;* RETURN
;* (depends on type of transfer, read or write)
;*
;* NOTE
;* IMPORTANT! : This funtion must be directly followed by i2c_read.
;*
;***************************************************************************
i2c_do_transfer:
sbrs i2cadr,b_dir ; if dir = write
rjmp i2c_write ; goto write data
;***************************************************************************
;*
;* FUNCTION
;* i2c_read
;*
;* DESCRIPTION
;* Reads data (one byte) from the I2C bus.
;*
;* USAGE
;* Carry flag - If set no acknowledge is given to the slave
;* indicating last read operation before a STOP.
;* If cleared acknowledge is given to the slave
;* indicating more data.
;*
;* RETURN
;* i2cdata - Contains received data.
;*
;* NOTE
;* IMPORTANT! : This funtion must be directly followed by i2c_put_ack.
;*
;***************************************************************************
i2c_read:
rol i2cstat ; store acknowledge
; (used by i2c_put_ack)
ldi i2cdata,0x01 ; data = 0x01
i2c_read_bit: ; do
sbi DDRD,SCLP ; force SCL low
rcall i2c_hp_delay ; half period delay
cbi DDRD,SCLP ; release SCL
rcall i2c_hp_delay ; half period delay
clc ; clear carry flag
sbic PIND,SDAP ; if SDA is high
sec ; set carry flag
rol i2cdata ; store data bit
brcc i2c_read_bit ; while receive register not full
;***************************************************************************
;*
;* FUNCTION
;* i2c_put_ack
;*
;* DESCRIPTION
;* Put acknowledge.
;*
;* USAGE
;* (used only by i2c_read in this version)
;*
;* RETURN
;* none
;*
;***************************************************************************
i2c_put_ack:
sbi DDRD,SCLP ; force SCL low
ror i2cstat ; get status bit
brcc i2c_put_ack_low ; if bit low goto assert low
cbi DDRD,SDAP ; release SDA
rjmp i2c_put_ack_high
i2c_put_ack_low: ; else
sbi DDRD,SDAP ; force SDA low
i2c_put_ack_high:
rcall i2c_hp_delay ; half period delay
cbi DDRD,SCLP ; release SCL
i2c_put_ack_wait:
sbis PIND,SCLP ; wait SCL high
rjmp i2c_put_ack_wait
rcall i2c_hp_delay ; half period delay
ret
;***************************************************************************
;*
;* FUNCTION
;* i2c_stop
;*
;* DESCRIPTION
;* Assert stop condition.
;*
;* USAGE
;* No parameters.
;*
;* RETURN
;* None.
;*
;***************************************************************************
i2c_stop:
sbi DDRD,SCLP ; force SCL low
sbi DDRD,SDAP ; force SDA low
rcall i2c_hp_delay ; half period delay
cbi DDRD,SCLP ; release SCL
rcall i2c_qp_delay ; quarter period delay
cbi DDRD,SDAP ; release SDA
rcall i2c_hp_delay ; half period delay
ret
;***************************************************************************
;*
;* FUNCTION
;* i2c_init
;*
;* DESCRIPTION
;* Initialization of the I2C bus interface.
;*
;* USAGE
;* Call this function once to initialize the I2C bus. No parameters
;* are required.
;*
;* RETURN
;* None
;*
;* NOTE
;* PORTD and DDRD pins not used by the I2C bus interface will be
;* set to Hi-Z (!).
;*
;* COMMENT
;* This function can be combined with other PORTD initializations.
;*
;***************************************************************************
i2c_init:
clr i2cstat ; clear I2C status register (used
; as a temporary register)
out PORTD,i2cstat ; set I2C pins to open colector
out DDRD,i2cstat
ret
|
BID = 94012
Jornbyte Moderator
Beiträge: 7178
|
Es ging nicht um die ApNote. Es geht um dein Programm.
Ich sehe z.b. nicht wie du das LCD1 und LCD2 Register initialisiert hast.
z.b.
.def LCD1 = r20
.def LCD2 = r21
Auch fehlt der Einsprung zum Resthandler. Wo ist der?
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 94103
Condor-x Gelegenheitsposter
Beiträge: 56
|
hallo
.def LCD1 = r1
.def LCD2 = r2
die werden auch nicht überschriben sind nur zum testen da.
restet und so sind ok.
das programm geht ja auch soweit
das ich die inhalte von LCD 1 und 2 auf LED´s an den ports ausgebe.
nur das was ich vonm LM 75 bekomme kann nicht stimmen.
ich bin mir eben nicht so sicher das ich die befehle zum LM75 richtig schreibe ....
das programm hängt sich auch nicht auf....(blinkende LED)
|
BID = 94269
Condor-x Gelegenheitsposter
Beiträge: 56
|
hallo
habe das problem entdeckt ! ich habe die pull up widerstände in den busleitungen nicht auf 5v gelegt.....
jetzt kann ich das 1. register lesen und auch eine temperatur auf menem LCD anzeigen nur im 2. register steht immer 0
hatt mir da villeicht einer einen tip was ich falsch mache ?
der fehler liegt irgonwo in den zeilen aus dem 1.posting.
das erste I2C_read bringt die temperatur - geht jetzt auch.
das zeweite I2C_read bringt 0 - sollte aber auf bit 7- 0 oder 1 für ,0 oder ,5 bringen
??????????????
|
BID = 95311
fox82 Gerade angekommen
Beiträge: 8 Wohnort: Wien
|
Hallo,
ich habe mir das ganze jetzt nur kurz angesehen...
Mir scheint, dass hier das pull-up (von master Seite aus) für das ACK Signal fehlt.
check das mal... (falls es noch aktuell ist..)
Greez
Nick
|
BID = 95431
Condor-x Gelegenheitsposter
Beiträge: 56
|
hallo
Pull up von der master seite aus ? es sind hardware mäßig pull up wiederstände auf beiden leitungen .
das problem das ich nur das 1.register lesen kann und vom 2.register nichts bekomme habe ich immer noch.
|
BID = 96899
fox82 Gerade angekommen
Beiträge: 8 Wohnort: Wien
|
Hallo,
sorry für die Fehlinfo.... *grins* Richtigstellung:
Du brauchst ein Pull-Down während des 9. Taktes von Mikrocontroller-seite aus.
(Siehe Bild)
Damit der LM weiß, dass der Controller bereit ist für weitere Datenaufnahme.
-------------------------------
Was meiner Ansicht jetzt passiert ist folgendes:
.)LM wird richtig adressiert
.)Kontroller empfängt 8 Bit
.)LM wartet auf ACK
.)Controller denkt dass er weitere 8 Bit empfängt... Die natürlich nicht gesendet werden, weil der LM noch auf das ACK wartet.
.)Bus wird von Controllerseitens aus wieder frei gegeben
-------------------------------
Greez
Nick
|
BID = 96904
fox82 Gerade angekommen
Beiträge: 8 Wohnort: Wien
|
Hallo nochmals,
ich habe mir den source gerade angesehen.
versuche doch einfach einmal (NUR!!!) nach dem ersten i2c_read ein i2c_put_ack aufzurufen....
Müsste dann so aussehen:
========================
rcall i2c_read ; Execute transfer (read)
mov LCD1,i2cdata
rcall i2c_put_ack
========================
Greez
Nick
|
BID = 96989
Condor-x Gelegenheitsposter
Beiträge: 56
|
hallo
i2c_put_ack wird automatich nach i2c_read aufgerufen.
wobei das cary flag vohrgibt ob ack hig oder low ist....
darann solte es also nicht liegen - aber ich versuche das heute aben mal....
|
BID = 101747
Condor-x Gelegenheitsposter
Beiträge: 56
|
hallo
Es geht einfach immer noch nicht das 2. byte zu bekommen.
mein aufruf sieht so aus :
rcall i2c_init ; initialize I2C interface
ldi i2cadr,$90+i2cwr ; Set device address and write
rcall i2c_start ; Send start condition and address
ldi i2cdata,$00 ; Write word address
rcall i2c_do_transfer ; Execute transfer
ldi i2cadr,$90+i2crd ; Set device address and read
rcall i2c_rep_start ; Send repeated start condition and address
clc
rcall i2c_read ; Execute transfer (read)
mov zahl3,i2cdata
sec
rcall i2c_read ; Execute transfer (read)
mov temp5,i2cdata
rcall i2c_stop ; Send stop condition - releases bus
das 2. read gibt immer 0 in temp5
die orginal rotine von atmel schaut so aus:
|
BID = 101748
Condor-x Gelegenheitsposter
Beiträge: 56
|
|