Forum: Mikrocontroller und Digitale Elektronik f*** mega8 ->I²C


von Felix Fellhauer (Gast)


Lesenswert?

Hallo Leuz

ich versuch jetz schon seit ner halben woche den mega8l i2c tauglich zu
machen, damit ich damit auf des i2c eeprom bei meinem
temperaturdatenlogger zugreifen kann.
jetz iss des problem, dass ich mit nem AT90s8515 problemlos eine i2c
verbindung zu einem pcf8574 (mein i2c-tester) [alles auf meinem stk500]
aufbauen kann. wenn ich aber haargenau das gleiche programm auf meinen
mega8l programmiere, natürlich mit ner anderen include datei, dann
macht der pcf8574 nix!
an was könnte das denn liegen. ich denke dass es villeicht mit den
vielen zusatzfunktionen des mega8l an den einzelnen ports
zusammenhängt, kann das sein?

währ nett, wenn ihr mir irgendwie helfen könnten

THX Felix

von Jadeclaw (Gast)


Lesenswert?

Laufen parallel Interrupts?
Wenn ja, entweder die Interrupts ausschalten oder die Abfrageroutine in
die Interruptroutine einbauen.
Scheinbar sind die Ports nicht interruptfest.
Effekt: Der Controller schreibt zu den gewünschten Texten zusätzlich
Müll in ein LCD,
ein serielles PCF2111-basiertes 7-segment-Display gibt nur völligen
Müll aus, wenn es sich denn überhaupt rührt.
Interrupts aus und alles ist ok.
Ist die Ausgabe in der Interruptroutine geht es auch, weil innert der
Interruptroutine alle weiteren Interrupts gesperrt sind.
Meine Controller sind übrigens ATmega8 von 0311.
Ich besorge mir mal andere Controller und probier mal damit.
Kann ja nicht sein, dass Interrupts die Portausgabe zerschießen.

Gruss
Jadeclaw.

von crazy horse (Gast)


Lesenswert?

"Scheinbar sind die Ports nicht interruptfest." - was heisst das denn?
Interessante Feststellung. Probleme mit Interupts sind i.a. bei der
Software zu suchen, also bei dir.
Ansonsten - wie so oft -: ohne Programm und Anschlussschema kann man zu
solchen Problemen fast gar nichts sagen (ausser vielleicht bei Megaxx,
LCD an PortC funktioniert nicht :-)

von Felix Fellhauer (Gast)


Lesenswert?

ich mache den i2c mit software, ich hab also parallel garnix laufen

CODE:

.include "m8def.inc"
 .equ   scl  = 0
 .equ   sda  = 1

 .equ i2c_port  = PORTC
 .equ i2c_pin   = PINC
 .equ i2c_ddr   = DDRD



  ldi r16, 0xff
 out DDRC, r16


        ; Stackpointer initialisieren
        ldi r16, LOW(RAMEND)
        out SPL, r16
        ldi r16, HIGH(RAMEND)
        out SPH, r16




 schreiben:



rcall i2c_start

ldi   r16, 0b01000000; Adresse des Chips senden
; ( 0x41 = lesen , 0x40 = schreiben)
rcall putbyte

ldi   r16, 0b01010101
rcall putbyte; Bytewert AA (=10101010) an den
; Chip senden

rcall i2c_stop






rjmp schreiben


.include "i2c_routinen.txt"

also eigendlich komplett simpel, beim 90s8515 funktionierts ja auch!

von Felix Fellhauer (Gast)


Lesenswert?

ich hab übrigens den i2c an verschiedenen ports des m8 ausprobiert, hat
nirgens funktioniert!
gruß felix

von Jadeclaw (Gast)


Lesenswert?

Schön wär's.
Erstens, alle vom Interrupthandler benutzten Register werden auf den
Stack gepusht und vor dem abschliessenden Reti in der richtigen
Reihenfolge wieder zurückgepoppt.
Zweitens, der Interrupthandler fragt einen Pin an PortD ab, das Display
hängt an PortB.
Drittens, der Interrupthandler fasst die von der Ausgabe benutzten
SRam-Adressen nicht an.
Eine weitergehende Trennung kann ich mir irgendwie nicht vorstellen.
Du etwa?

Gruss
Jadeclaw.

von Felix Fellhauer (Gast)


Lesenswert?

von was für nem lcd redest du den da hängt an dem mega8 nur en pcf8574
als portexpander, den steuer ich mit nem m8l über i2C, mit dem oben
abgebildeten prog!

von crazy horse (Gast)


Lesenswert?

@Jadeclaw:
folgende Probleme treten öfter auf, inwieweit die bei dir zutreffen
oder nicht, weiss ich natürlich nicht:
-Zeitprobleme, dazwischenhauende Ints bringen jedes timing
durcheinander. Ist das kritisch, müssen eben während der kritischen
Phase alle Ints gesperrt werden
-Stackprobleme, kennst du ja sicher selbst
-die alte read/modify/write-back Geschichte

von Jadeclaw (Gast)


Lesenswert?

Das Posting von 00:59 war an Crazy Horse gerichtet.

Die Sache mit den Displays waren die Effekte, die ich hier hatte.
Der Effekt bei dir wäre, das der PCF8574 dann nicht reagiert.

Nur sehe ich, das du keine Interrupts da drin hast, dann kann ich nur
einen evtl, zu hohen oder zu niedrigen Takt vermuten.

Gruss
Jadeclaw.

PS: Stinknormale Schieberegister kann das Ding bedienen.

von Felix Fellhauer (Gast)


Lesenswert?

wie sperre ich denn alle int´s ?
aber was ich nicht verstehe, ist, dass da interrupt´s dazwischn funken,
obwohl ich doch garkeine aktiviert habe ?

Gruß felix

von crazy horse (Gast)


Lesenswert?

.equ i2c_port  = PORTC
 .equ i2c_pin   = PINC
 .equ i2c_ddr   = DDRD  //???

von Jadeclaw (Gast)


Lesenswert?

""  .equ i2c_ddr   = DDRD  //??? ""
Fiel mir auch gerade auf,
dadrunter wird dann PortC als Ausgang gesetzt.

@Felix: Man muss Int's gezielt einschalten, das machst du ja nicht,
also scheidet das aus.
Schau dir mal die .equ mal an.

Gruss
Jadeclaw.

von Felix Fellhauer (Gast)


Lesenswert?

wenn ich den i2c port konstant als ausgang schalte, dann funktionierts
beim 90s8515, wenn ich sie von der routine schalten lasse, dann nicht.
hat jemand für mich villeicht ne bessere funktionierende i2c-routine ?
gruß Felix

von thkais (Gast)


Lesenswert?

Schonmal drüber nachgedacht, den Hardware-I²C des Mega-8 zu nutzen? In
den Datenblättern gibts recht ausführliche Beispiele, die man
eigentlich nur abschreiben muß.

von Peter Dannegger (Gast)


Lesenswert?

Das mit den Interrupts sperren ist Quatsch, beim I2C gibt es keine
Maximalzeiten.

Wenn Interrupts sperren hilft, dann ist der Interrupt Grotte (vergessen
Register zu pushen usw.)


Ansonsten wäre ein Blick in die Sourcen nötig, um mehr zu sagen.

Und nenne Deine Sourcen nicht i2c_routinen.txt oder sind das
Liebesbriefe ?

Also *.asm, *.inc, *.c, *.h, wie es sich gehört.


Vom HW-I2C rate ich dringend ab, der ist wesentlich komplizierter zu
verstehen. Außerdem kann er sich verhaken, wenn Störungen auf dem
I2C-Bus sind.

Ich hab das HW-I2C mal als Multimaster verwenden müssen, ab und zu
blockierte es.
Ich hab dann SDA mit auf einen Interrupt gelegt und einen Timer
aufgesetzt. Wenn dann SDA für über 50ms konstant auf Low bleibt, läuft
der Timer über und das I2C muß disabled werden, damit es die
Blockierung wieder aufhebt.

D.h. das HW-I2C geht intern in den Zustand SDA = 0, ohne irgendwelche
weiteren Aktionen zu machen oder das Interruptbit zu setzen.


Peter

von bob (Gast)


Lesenswert?

Hallo, ich hatte auch probleme mit dem empfang von i2c. habe es dann
selber s/w gelöst.

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.