Hallo! Ich wollte mal was anders machen und kaufte mir um 4 Euro 2 ATMEGA32, sonst verwende ich immer nur den ATMEGA168 oder ATTINY26. Also Assemblercode geschrieben, die LEDs und Ports machen das was Sie machen sollen, nur der I²C-Bus ist tot, habe extra PC0 als SCL und PC1 als SDA genommen, nichts kommt raus.Laut WAVRASM ist im Assemblercode kein Fehler und die Adressen im Bus sind auch richtig und in Ordnung sind die ICs auch, der ATMEGA168 steuert die ohne Probleme. Kann mir da jemand weiter helfen?
Was man dir damit sagen wollte: Zeig deinen Code und deinen Schaltplan, leider mangelt es hier im Forum an Hellsehern.
Hallo! Hab wohl in der Eile den Anhang vergessen. Wie gesagt, eigentlich was simples und trotzdem gehts nicht. Anscheinend ist der ATMEGA168 und ATTINY26 nur was für Anfänger und der ATMEGA32 nur was für Profis ;-)
Also das Ganze bedarf vielleicht noch etwas mehr Klärung.
Zum einen fällt mir auf, das der enthaltene IIC Code eine
Software-Emulation des I2C ist. Es handelt sich um den Code aus der
AVR300 Appnote.
Du hast, soweit ich das gesehen habe auch die Ports von D auf C
geändert.
Soweit, so gut.
Allerdings schreibst Du in Deinem Titel was von "freischalten" und in
dem Text
>habe extra PC0 als SCL und PC1 als SDA genommen
was von der Formulierung her andeutet, das Du evtl. nicht weisst, das es
sich hier nicht um einen Code für die im Mega32 vorhandene
Zweidraht-Schnittstelle handelt. Da es sich um eine SW-Emulation handelt
sind die Port-Bits völlig egal.
Es wäre wahrscheinlich hilfreich, Schaltung , Fuses und Takt aufs
peinlichste zu kontrollieren und mit der 168er Schaltung zu vergleichen.
Bitte schreib doch einmal, was Du bis jetzt kontrolliert hast? Hast Du
ein Oszilloskop? Was heisst "nur der I²C-Bus ist tot" konkret?
Warum verwendest du nicht das interne Eeprom vom AVR? (Wenn dann bitte Brown-out fuses entsprechend setzten!) Ausserdem empfehle ich dir die Verwendung des TWI. Dabei kümmert sich die Hardware um die Übertragung. Wenn sie fertig ist gibt es einen eindeutigen Statuscode und deine Software muss nur noch entscheiden was als nächstes passieren soll. In deinem ASM code scheint sda2516 für einen Schreibzugriff und sda2516w für einen Lesezugriff zu stehen.... Dachte erst das das w für write steht. i2c_hp_delay und i2c_qp_delay scheinen mir mit 2 bzw 3 druchgängen etwas kurz zu sein. Mach die mal testweise viel länger. Mit welchem Takt läuft der AVR? Warum wertest du das Cary Flag nicht aus? Sonst ist mir nichts direkt aufgefallen. Versuche mal genauer zu beschreiben was nicht geht. Zur Fehlersuche könntest du deinen Code mal auf einen simplen I2C-Eeprom Lesezugriff reduzieren und auch den Takt deutlich verringern (i2c_hp_delay/i2c_qp_delay). Ein Oszilloskop wäre sehr hilfreich. I2C mit Leds zu debuggen macht keinen Spass. Notfalls die RS232 zur Hilfe nehmen und darüber den Status ausgeben. Wenn du auch in Zukunft mehr mit I2C machen willst lege dir einen I2C Sniffer zu (Gibt hier im Forum mindestens 2 Selbstbau Lösungen). >Anscheinend ist der ATMEGA168 und ATTINY26 nur was für Anfänger und der >ATMEGA32 nur was für Profis ;-) Das hat mit Profis nix zu tun. Es ist nur mehr Hardware drin und das Datasheet ist etwas länger :-)
Hallo Electronicfox, ohne mir den Code angeschaut zu haben, habe ich dort einige Anmerkungen gefunden: Beitrag "I2C Atmega32" Und dort eine Library, die bei mir mit ATMega32 funktioniert: http://homepage.hispeed.ch/peterfleury/avr-software.html (Siehe unter AVR-GCC Libraries). Viel Erfolg! Gruß, Frank
Also der Bus bleibt High, also per PullUp-Widerstand auf 5,01V. Auch die Änderung der Taktrate brachte nichts. Das Beispiel oben funktioniert allerdings, nur ist die zu langsam und weiß nicht wie ich die für meine Zwecke einsetzen kann.
Beim Mega32 liegt auf PortC der JTAG! Den sollte man per Fuse oder Software deaktivieren da sosnt einige der Portpins nicht als I/O nutzbar sind!
@laeubi: Jtag ist auf PortC, aber nicht auf den hier verwendeten Pins 0 und 1. Trotzdem sollte Electronicfox den natürlich abschalten.... @Electronicfox: ABER: Der Stackpointer wird nicht gesetzt. Da die I2C Rutienen aber regen gebrauch von ret machen kann das nicht funktionieren... Bau mal nach dem "Reset:" als erstes ein:
1 | ; Stackpointer Init |
2 | ldi r16, LOW(RAMEND) |
3 | out SPL, r16 |
4 | ldi r16, HIGH(RAMEND) |
5 | out SPH, r16 |
Bei der gelegenheit bitte auch gleich deine
1 | ; Portbestimmungen |
2 | |
3 | ldi r20, 0x00 |
4 | out ddrd, r20 |
5 | ldi r20, 0x3F |
6 | out ddrb, r20 |
hinter den Setup vom Stackpointer packen. Die Interruptvektoren sollten immer zuerst kommen. (Du verwendest hier zwar keine, wenn aber doch geht die suche los...) Für die Zukunft empfehle ich folgenden aufbau: 1. .include/etc... 2. Interruptvectoren 3. Stackpointer setzten 4. Ports Einstellen Erspart eine menge Ärger.
@ Läubi >da sosnt einige der Portpins nicht als I/O nutzbar sind! Er verwendet PC0 und PC1. Das sollte gehen. @ Electronicfox >Also der Bus bleibt High, also per PullUp-Widerstand auf 5,01V. Wie hast Du das gemessen? Hast Du ein Oszilloskop? Ein Mulitmeter? >Auch die Änderung der Taktrate brachte nichts. Auf welche Frequenz (auch im Vergleich zur funktionierenden 168er Variante) hast Du den Takt geändert? Wie? Was ergab die Kontrolle der Schaltung? Der Fuses. Was hast Du wie kontrolliert?
> Der Stackpointer wird nicht gesetzt.
Ach richtig. Beim 168er wird er ja auf RAMEND gesetzt und beim Mega32
auf 0. Mist.
Habe die RAMEND jetzt eingefügt und die Fuses geändert und jetzt gehts! Ich hab was gut bei euch, auf die RAMEND und Fuses wäre ich nie gekommen ;-)
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.