mikrocontroller.net

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


Autor: Electronicfox (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeile 214 in deinem Code ist fehlerhaft.

Autor: Electronicfox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau das wars! DANKE :-D

Autor: Nico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was man dir damit sagen wollte:

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

Autor: Electronicfox (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Klugscheisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Frank Goenninger (dg1sbg)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Electronicfox (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
; Stackpointer Init
ldi r16, LOW(RAMEND)
out SPL, r16
ldi r16, HIGH(RAMEND)
out SPH, r16

Bei der gelegenheit bitte auch gleich deine
; Portbestimmungen

ldi r20, 0x00
out ddrd, r20
ldi r20, 0x3F
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.

Autor: Klugscheisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klugscheisser (Gast)
Datum:

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

Autor: Electronicfox (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 
;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.