Forum: Mikrocontroller und Digitale Elektronik Wie schaltet man beim ATMEGA32 den I²C-Bus frei?


von Electronicfox (Gast)


Lesenswert?

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?

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Zeile 214 in deinem Code ist fehlerhaft.

von Electronicfox (Gast)


Lesenswert?

Genau das wars! DANKE :-D

von Nico (Gast)


Lesenswert?

Was man dir damit sagen wollte:

Zeig deinen Code und deinen Schaltplan, leider mangelt es hier im Forum 
an Hellsehern.

von Electronicfox (Gast)


Angehängte Dateien:

Lesenswert?

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 ;-)

von Klugscheisser (Gast)


Lesenswert?

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?

von Tim (Gast)


Lesenswert?

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 :-)

von Frank G. (dg1sbg)


Lesenswert?

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

von Electronicfox (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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!

von Tim (Gast)


Lesenswert?

@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.

von Klugscheisser (Gast)


Lesenswert?

@  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?

von Klugscheisser (Gast)


Lesenswert?

> Der Stackpointer wird nicht gesetzt.
Ach richtig. Beim 168er wird er ja auf RAMEND gesetzt und beim Mega32 
auf 0. Mist.

von Electronicfox (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.