TWI in ASM

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 12 2025  23:34:57      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Oszilloskop-Schirmbilder            


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

Autor
TWI in ASM

    







BID = 145507

HarryGr

Gerade angekommen


Beiträge: 5
 

  


Gesundes neues Jahr an alle!

Ich hab folgendes Problem:
Ich möchte mit einem MEGA32 einen PCF8574 (8Bit IO-Expander) per I2C ansteuern. Der Bustakt muss 100 kHz betragen und mein µC wird mit 16 MHz getaktet.
Zur Berechnung findet man im Datenblatt S.173 die Formel:
fSCL=fCPU/(16+2(TWBR)*4^TWPS)
TWPS ist der Prescaler. In der Formel kann er zw. 0 und 3 liegen. Die PS-Werte auf s.177 sind bereits ausgerechnet (zB. TWPS = 3 -> PS = 4^3 = 64)
TWBR ist das "Bit Rate Register" und kann werte zw. 0 und 255 aufnehmen.

Nach meinen Berechnungen müsste TWBR einen Wert von 72 erhalten (bei TWPS = 0) oder 18 (bei TWPS = 1).

Doch dass funzt net!!!

Hat jemand ne Idee??? Oder ein ASM-Tutorial???

Danke im Voraus

BID = 145651

HarryGr

Gerade angekommen


Beiträge: 5

 

  

OK,
da offensichtlich niemand meine Berechnung dementiern möchte, fahre ich fort:

In der Reset-Funktion wird die "I2CInit" aufgerufen.
SCL und SDA sind beim MEGA32 PC0 und PC1. Um mir die externen PullUps zu sparen, nehme ich die innern (Hab gelesen, dass das kein Problem darstellt):



Code :

I2CInit:

ldi r16,(1<<PC0)+(1<<PC1)
out PORTC,r16



Das Bitrate-Register wird also mit 72 gefüllt:



Code :

	ldi r16,72

out TWBR,r16



Und der Prescaler mit 0 (PS=1)



Code :

	clr r16

out TWSR,r16



Ende:


Code :

	ret





Im Datenblatt ist auf Seite 180 ein schönes Beispiel gegeben. Diesen hab ich fast eins-zu-eins übernommen und "SENDEN" genannt. Der einzige Unterschied ist, dass ich weder SLA_W (Slave-Adresse) noch DATA (zu sendende Byte) als Konstante vorliegen habe, sondern in den Registern ADR und BYTE.
Die verwendeten Status-Codes sind auf Seite 183 zu finden.



Code :

.equ START = 0x08

.equ MT_SLA_ACK = 0x18
.equ MT_DATA_ACK = 0x28



In der ERROR-Funktion (sie wird aufgerufen wenn der Start missglückt oder kein ACK-Bit zurückgesendet wurde) schalte ich einfach nur ne LED ein. Diese wird später im Prog wieder gelöscht und ich erkenne an einer flackernden LED das Nichtfunktioniren des Bus.

Mein MAIN-Funktion sieht ganz einfach aus. Ein Counter, bei jedem Durchlauf decrementiert, wird an eine Reihe PCF8574 gesendet, noch ein bissl warten und das ganze von vorn:



Code :

MAIN:

dec COUNTER

mov BYTE,COUNTER

ldi ADR,0x40
rcall SENDEN

ldi ADR,0x42
rcall SENDEN

...

<ein bissl warten>
<Error-LED (wieder) aus>

rjmp MAIN



Das wars schon!
Macht eine wunderschön flackernde Error-LED.

Ich hoffe dass jetzt irgend jemand die Muse hat sich an das Datenblatt zu setzen und mir dann erklärt warum es net so tut wies soll.

Danke auch an die, die sich meinen Beitrag wenigstens durchgelesen habe. (Es kommt recht selten vor dass ICH solche EIER bis zum Ende lese.)


[ Diese Nachricht wurde geändert von: HarryGr am  4 Jan 2005  1:19 ]


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 17 Beiträge im Durchschnitt pro Tag       heute wurden bisher 10 Beiträge verfasst
© x sparkkelsputz        Besucher : 187995809   Heute : 15045    Gestern : 11123    Online : 430        28.12.2025    23:34
9 Besucher in den letzten 60 Sekunden        alle 6.67 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0233161449432