f*** mega8 ->I²C

Gast #214651
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
Gast #214652
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.
Gast #214653
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 :-)
Gast #214654
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!
Gast #214656
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.
Gast #214658
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
Gast #214659
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.
Gast #214662
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.
Gast #214663
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
Gast #214665
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren