www.mikrocontroller.net

Forum: Compiler & IDEs ATMEGA644 und E2-Interface (i2c) hilfe


Autor: fler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Da ich mehr in der SPS Programmierung tätig bin bin ich mit der 
Programmierung des Atmega644 nicht so vertraut und bitte euch um 
Ausführliche Hilfe.
Hardware: AVR-NET-IO Atmega32 auf Atmega644 getauscht.
Ich möchte den Temperatur Feuchte Sensor beiliegendes Datenblatt 
verwenden.
SDA und SCL müssen am PORTC.0 und PORTC.1 angeschlossen werden?
oder ist dies auch auf einem anderen Port möglich?

Nachdem ich den source Code von ROBUE Http Server in einer Abgespeckten 
version verwende bitte ich euch um hilfe bei der Implementierung des für 
den Sensor notwendigen C Code.

Ich habe die SW AVR-Studio und Winavr.

Ich bedanke mich im voraus.

Autor: Erich Floh (fler)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anscheind ist der Dateianhang nicht mitgegangen.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht doch alles in deinem Dokument. Komplett mit Sourcode.

>4.3 Softwarefunktionen des E2 Interfacemoduls
>Die folgenden Funktionen ergeben, mit den Definitionen im Anhang, ein 
>vollständig kompilierbares E2-Interface Softwaremodul. Dieser Code kann sehr 
>einfach an den gewünschten Prozessor angepasst werden. Es sind dazu nur der 
>DELAY_FAKTOR, die HW-Pins und die gekennzeichneten Funktionen zu adaptieren.

as ist eine Softwareinplementierung des Protokolls, insofern kannst du 
deine Pins frei wählen.

Die delay-Funktionen musst du zwar anpassen, wie die beim WINAvr 
heissen, steht in der Doku zur avr-libc, zu finden auf deiner 
Festplatte.

Oliver

Autor: Erich Floh (fler)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die rasche Antwort.
Jedoch hilft mir das nicht viel.
Da ich versucht habe dieses Programm zu implementieren.
Nachdem es nicht funktioniert bitte ich hier um Hilfe

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nachdem es nicht funktionier...

Es lässt sich so sicherlich noch nicht einmal kompilieren.

Zunindest ein
#include <avr/io.h>

sollte da schon drin vorkommen. Oben links im Menu gibt es ein Tutorial 
zum avr-gcc. Da stehen die wichtigsten Grundlagen drin.

Oliver

Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ist includiert, ich habe nur einen teil mit den Funktionen aus der 
main.c herauskopiert ich sehe auch mit dem Osci das Protokoll
jedoch werden keine Daten eingelesen und in die float RH bzw Float 
temperature geschrieben. Ich denke das er die einzellnen bit nicht lesen 
kann.
Mfg
Erich

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ich habe nur einen teil mit den Funktionen aus der main.c herauskopiert

In dem Fall steckt der Fehler in Zeile 42.


Vermutlich aber eher hier:
#define SDA (*(volatile struct test*)&PORTA).b1

Solange du nicht verstehst, was du da machst, schmeiß diese Macros raus. 
avr-gcc kann keine Einzelbits ansprechen, und dabei sollte man es 
belassen.

Denn:
>Ich denke das er die einzelnen bit nicht lesen kann.

könnte daran liegen, daß man beim AVR IO-Pins über PINX liest, nicht 
über PORTX. Insofern macht
unsigned read_SDA(void)
{
  return SDA;
} // read SDA-pin status
nicht das, was du möchtest.

Oliver

Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ja, die PINA definition habe ich oben in der structur schon getestet.
jedoch vermutlich nicht richtig.
die Struct test funktioniert einwandfrei und arbeitet auch.
Habe ich mir mit dem osci angesehen.
ich denke auch das die funktion read_SDA einen wurm beinhaltet.
Aber würdest du mir schreiben wie dies richtig wäre, bitte?
für SDA und SCL verwende ich PORTA.1 und PORTA.2
die habe ich als Ausgang definiert.
Kann ich trotzdem PINA verwenden?

mfg
Erich

Autor: SF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du steuerst SDA, SCL falsch an. Du must beim I²C-Bus wissen, das der 
High-Pegel auf dem Bus nur durch die externen Pull-Up-Widerstände 
erreicht wird. High-Pegel bedeuet also Port ist hochohmig geschaltet. 
Nur der Low-Pegel wird aktiv erzeugt. Somit must du folgende Routinen 
verwenden:

Irgendwo oben im Code
#define SDA 0 // SDA ist Bit 0
#define SDA_PORT PORTA
#define SDA_DDR  DDRA
#define SDA_PIN  PINA

#define SCL 1 // SDA ist Bit 1
#define SCL_PORT PORTA
#define SCL_DDR  DDRA
#define SCL_PIN  PINA
void set_SDA(void)
{
  // SDA hochohmig schalten, High pegel wird durch externen Pull-up
  // erreicht.
  SDA_DDR &= ~(1 << SDA);
}

void clear_SDA(void)
{
  // SDA auf low, es wird ausgenutzt, das das entsprechende PORTA Bit
  // defaultmäßig 0 ist. Somit wird hiermit aktiv low ausgegeben
  // obwohl nur der Port von Eingang(=hochohmig) auf Ausgang geschaltet wurde.
  SDA_DDR |= (1 << SDA);
}

unsigned read_SDA(void)
{
  // read SDA-pin status 
  return ( (SDA_PIN & (1<<SDA)) != 0);
} 


void set_SCL(void)
{
  // SCL hochohmig schalten
  SCL_DDR &= ~(1 << SCL);
}

void clear_SCL(void)
{
  // SCL auf low
  SCL_DDR |= (1 << SCL);
}

Flüchtigkeitsfehler bitte ignorieren  ...

Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo SF

Das war mir eine große Hilfe nun verstehe ich die funktionsweise.
Danke nochmals.
Ich konnte es noch nicht testen habe es jedoch schon compilier.
Werde ich am abend testen, ergebnis schreibe ich hier.
mfg Erich

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>die habe ich als Ausgang definiert.
>Kann ich trotzdem PINA verwenden?

Jein. Du kannst zwar über PINA den Zustand des Pins lesen, unabhängig 
davon, ob der Pin als Ein- oder Ausgang definiert ist, aber was genau 
dann da ansteht, wissen die Götter. I²C, und vermutlich auch dein 
komischer E2-Bus, basiert auf wired and. Wenn da ein Busteilnehmer eine 
Leitung auf Null zieht, muß die auch Null sein. Hochgehalten wird die 
nur durch die 10k-Pull-Ups (die du hoffentlich auch eingebaut hast).
temperature = -300; // default value (error code)
E2Bus_start();
E2Bus_send(0xA1); // MW2-low request
if (check_ack()==ACK)
{
   temp_low = E2Bus_read();
...

Der als Ausgang konfigurierte Pin SDA wird am Ende von E2Bus_send() auf 
Null gesetzt, und zieht damit die Leitung auf Null, und damit dürften 
dann nur noch Nullen gelesen werden.

Falls dieer E2-Bus ein I²C sein soll, ist sowieso die Logik (auch in dem 
Beispiel im der Application note) falsch rum. Eine Leitung ist aktiv, 
wenn sie aktiv auf Null gezogen wird, und nicht aktiv, wenn sie im 
tri-state-Zustand ist.

Probier mal (ungetestet, daher selber mitdenken erwünscht):

// in main.c
DDRA &=~ ((1<<PA1) | (1<<PA2));   // default: Bus-Pins sind Eingänge
PORTA = 0x00; // keine Pull ups für PA1 und PA2 einschalten
              // 10k-Pull-Up-Widerstände sind extern erforderlich !!!

...

void set_SDA(void)
{ 
   DDRA |= (1<<PA1); // setzt PA1 als Ausgang und zieht die Leitung auf Low
} 

void clear_SDA(void)
{
 DDRA &= ~(1<<PA1);  // setzt PA1 als Eingang, damit hochohmig, und gibt die Leitung frei
} 

bit read_SDA(void) // C kennt keinen Datentyp bit...
{ 
   DDRA &= ~(1<<PA1);  // setzt PA1 zur Sicherheit als Eingang, falls er das nicht schon ist 
                       //(da wäre dann aber ein Programmfehler an anderer Stelle)

   if (PINA &= (1<<PA1)) // liest den Leitungsstatus
      return 1;
   else
      return 0;
} 

void set_SCL(void)
{
   DDRA |= (1<<PA2); // setzt PA2 als Ausgang und zieht die Leitung auf Low} 

void clear_SCL(void)
{ 
   DDRA &= ~(1<<PA2);  // setzt PA2 als Eingang, damit hochohmig, und gibt die Leitung frei
} 

Oliver

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...da war SF schneller :-)

Oliver

Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Danke Es lauft schon.
Habe grundsätzlich code von SF genommen.
Danke nocheinmal

mfg Erich

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.