Hilfe AVR mit I2C software AVR300

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 28 11 2024  23:43:51      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( 1 | 2 Nächste Seite )      


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:



PDF anzeigen


BID = 101748

Condor-x

Gelegenheitsposter



Beiträge: 56



      Nächste Seite
Gehe zu Seite ( 1 | 2 Nächste Seite )
Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag       heute wurden bisher 21 Beiträge verfasst
© x sparkkelsputz        Besucher : 182420897   Heute : 5395    Gestern : 7490    Online : 461        28.11.2024    23:43
1 Besucher in den letzten 60 Sekunden        alle 60.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0580439567566