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
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.
"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 :-)
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!
ich hab übrigens den i2c an verschiedenen ports des m8 ausprobiert, hat nirgens funktioniert! gruß felix
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 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!
@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
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.
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
"" .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.
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
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ß.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.