TWI in ASM Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
| Autor |
|
|
|
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:
Und der Prescaler mit 0 (PS=1)
Ende:
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 ] |
|
|
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
|