PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C Einstieg



Der Einsteiger
27.07.2013, 13:00
Hallo Leute,
ich würde gerne mal in die I2C Technik mit Bascom einsteigen.
Da ich aber Neuling bin, was dieses Thema angeht, habe ich mal eine Frage : Wie ist das mit der Adresseneinstellung/ wie finde ich heraus, welche Adresse ein IC hat ?? Wie stelle ich sie in Bascom ein ??

Dann noch eine Frage : Mit welchem Baustein sollte ich anfangen und üben (welcher ist einfacher anzusprechen) ?? Zur Auswahl stehen : LM75, PCF8574 und ST 24C16 BN6 ( 24C16)

Ich hoffe ihr könnt mir bei dem heißen Wetter helfen und seid nicht alle im Freibad...

Der Einsteiger

021aet04
27.07.2013, 14:30
Die Adresse, die du brauchst steht im Datenblatt des jeweiligen ICs. Oft gibt es auch eine Hardwaremäßige Einstellmöglichkeit der Adresse (der PCF8574 ist so einer). Die Adresse ist im Normalfall 8Bit lang (es gibt glaube ich auch noch 10Bit). Das niedrigste Bit ist das R/W Bit, das entscheidet ob man ein IC beschreiben oder lesen will. Wie das in Bascom geht weiß ich jedoch nicht, da ich in C programmiere. Welches IC du nimmst ist eigenlich egal. Häufig wird der PCF8574, LM75, SAA1064,... verwendet. MfG Hannes

Kampi
27.07.2013, 14:46
Hey,

eine Adresse in Bascom wird einfach als Konstante definiert und dann bei bedarf übertragen.
Zum Einstieg ist ein PCF8574 die leichtere Wahl, da du dort keine Register etc. einstellen musst, sondern nur das Datenbyte für die IOs....so bekommt man schon mal etwas "Feeling" für den I2C. Als nächstes würde ich dann ein EEPROM nehmen (24C....) und danach den LM75. So steigerst du die "Komplexität" Stück für Stück :)
Schau mal hier:

http://kampis-elektroecke.de/?page_id=421

Dort habe ich ein fertiges Programm für den I2C und den PCF8574 hochgeladen.
Da siehst du den Grundlegenden Aufbau einer I2C Kommunikation und wie du erkennen kannst habe ich einmal die Lese und einmal die Schreibadresse als Konstante definiert (geht auch einfacher, indem du einfach die Grundadresse als Konstant annimmst und dann das RW Bit bei Bedarf setzt oder nicht).
Anschließend wird ein Datenbyte übertragen.

Der Einsteiger
27.07.2013, 16:06
Hallo und danke ihr beiden...

http://kampis-elektroecke.de/?page_id=421
Das hat mir schon mal geholfen. :)
Doch noch eine Frage zur Hardware: Wie soll ich den PCF anschließen ?? Damit meine ich die A0 - A2 (an GND oder 5V ) und die Ein/Ausgänge P0 - P7 ( benötig Pullup oder down oder gar nichts ) ??

Kampi
27.07.2013, 16:24
Hey,

die Pins A0-A2 kannst du unbeschaltet lassen. Die brauchst du nur wenn du an einem Bus mehr als einen PCF8574 hast (damit kannst du einzelnen Bausteine anderen Adressen zuweisen).
Die Ausgänge vom PCF8574 sind Open-Collector, sprich die schalten nach GND. Wenn du eine LED anschließen willst einfach Vcc->Widerstand->LED->Pin vom PCF

021aet04
27.07.2013, 16:59
Die Adresspins würde auf definierte Pegel bringen (GND oder 5V). So kannst du ein Fehlverhalten von Anfang an ausschließen. Ich würde immer die kleinste mögliche Adresse wählen, wenn du mehrere verwendest brauchst du nur die Adresse erhöhen. MfG Hannes

Weichlöter
27.07.2013, 17:11
Hallo Einsteiger,

eine sehr gute Beschreibung der Hardware mit Schaltplan findest Du hier:

http://www.horter.de/i2c/i2c-ausgabe/ausgabe_2a.html

Gruß Christian

Der Einsteiger
27.07.2013, 17:46
Also Leute, danke für eure Antworten.
Doch es will noch nicht gehen... :(

Hie der Code :


$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 200
$swstack = 200
$framesize = 400

'TWI konfigurieren
Config Sda = Portc.1
Config Scl = Portc.0
Config Twi = 100000 'TWI Frequenz

'Adresse des PCF
Const Pcf8574w = &H40
Const Pcf8574r = &H41

Dim Bitmuster As Byte
Bitmuster = 1

'I²C initialisieren
I2cinit

Do

I2cstart 'TWI Startkondition
I2cwbyte Pcf8574w
I2cwbyte Bitmuster
I2cstop

Wait 1

I2cstart 'TWI Startkondition
I2cwbyte Pcf8574w
I2cwbyte 0
I2cstop

Wait 1


Loop
End

Zu A0-2 hab ich es so gemacht wie empfohlen: kleinste Adresse -> daraus folgere ich A0-2 auf GND ??

eine LED an P0 angeschlossen. Müsste die dann nicht leuchten ?? Oder habe ich mal wieder einen Denkfehler ??
Ich hoffe ihr könnt mir helfen ...

021aet04
27.07.2013, 18:01
Welchen Typ hast du genau? Es gibt den PCF8574 und den PCF8574A. Das hier (http://www.nxp.com/documents/data_sheet/PCF8574.pdf)auf Seite 9.
Die Adresse ist einmal Hex 40 (bzw 41) und einmal Hex 70 (bzw 71).

MfG Hannes

Der Einsteiger
27.07.2013, 18:10
Ich habe den PCF 8574 P von Reichelt.
Muss ich INT irgendwie verbinden ??

021aet04
27.07.2013, 18:30
Der Int kann unbeschalten bleiben. Dieser ist nur dafür gedacht wenn man den µC signalisieren will das neue Daten anliegen (wenn man einen oder mehrere I/O als Eingang verwendet). Ich kenne mich mit Bascom nicht aus, aber versuche einmal den Gesamten Port zu beschreiben. Eventuell im Sekundentakt die Werte ändern (z.B. gesamten Port 0 und dann 1). MfG Hannes

Der Einsteiger
27.07.2013, 19:01
Ich habe den Fehler gefunden :)
Es lag daran dass ich die Widerstände an SCL und SDA vergessen hab ( ich habe nicht RN-Control sondern mein eigenes Board genutzt, welches diese Widerstände nicht hat).
Jetzt geht es also und summt vor sich hin und blinkt dazu :


$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 200
$swstack = 200
$framesize = 400


Config Portd.7 = Output


'TWI konfigurieren
Config Sda = Portc.1
Config Scl = Portc.0
Config Twi = 100000 'TWI Frequenz

'Adresse des PCF
Const Pcf8574w = &H40
Const Pcf8574r = &H41


Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 1

'I²C initialisieren
I2cinit

Sound Portd.7 , 400 , 450

Do

I2cstart 'TWI Startkondition
I2cwbyte Pcf8574w
I2cwbyte &B00000000
I2cstop

Sound Portd.7 , 400 , 450

Wait 1

I2cstart 'TWI Startkondition
I2cwbyte Pcf8574w
I2cwbyte &B11111111
I2cstop

Sound Portd.7 , 400 , 450

Wait 1

Loop
End

:)
Kann ich, wenn ich neue Prog proggen möchte auch die Kabel und Verbindungen zum PCF dranlassen ??

Wie soll es jetzt weiter gehen ??

Weichlöter
27.07.2013, 19:05
Hallo Einsteiger,

für einen PCF8574 (alle Adressanschlüsse auf low) schaltet man folgendermaßen alle LED´s aus:

I2cstart
I2cwbyte &B01000000 'Adresse
I2cwbyte &B11111111 'Daten
I2cstop




Zum Einschalten mußt Du statt 1 eine 0 schreiben. Alle LES´s an:


I2cstart
I2cwbyte &B01000000 'Adresse
I2cwbyte &B00000000 'Daten
I2cstop



Geht natürlich auch gemischt in jeder Kombination.

Gruß Christian

Der Einsteiger
27.07.2013, 20:25
Und wie kann ich einen Eingang auslesen ??

Kampi
27.07.2013, 20:32
Hey,

das machst du einfach mit einem I2crbyte, statt dem I2cwbyte um die Daten zu schreiben.



I2cstart
I2cwbyte Adresse
I2crbyte MeineVariable, Nack
I2cstop


Das Datenbyte enthält den Status ALLER GPIOs.
Um den Status von GPIO 0 zu erhalten musst du es maskieren:

Status = MeineVariable AND &B00000001

Der Einsteiger
27.07.2013, 20:53
Ok. Danke :)

RoboHolIC
28.07.2013, 15:43
So weit ich weiß (=gelesen hatte), muss man diejenigen Bits, die man als Eingang haben will, zuvor auf H setzen, damit sie -weil OpenCollector- auch hochohmig sind. H-Pegel auf L-Ausgang macht sich nicht so gut!

Der Einsteiger
31.07.2013, 13:27
H-Pegel auf L-Ausgang macht sich nicht so gut!
Das stimmt wohl :)

So, ich habe jetzt mal mit dem 24C16 weitergemacht. Dieser hat gleich funktioniert. Doch habe ich noch ein paar Fragen (Verständnis) :

Ist das richtig, dass beim 24C16 Typ die Adressenanschlüsse nicht intern beschaltet sind, sodass ich nur eine Adresse habe und auch nicht ändern kann (so stand es irgendwo)??

Wie ist der 24C16 genau aufgebaut ?? Damit meine ich wie viele Datenstellen und was passt in jede Stelle ?? Kann ich in eine Stelle auch ein Wort schreiben oder nur eine gewisse länge von Zahlen/Bits ??

Das ist das Programm :


$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 200
$swstack = 200
$framesize = 400

Config Portd.7 = Output


'TWI konfigurieren
Config Sda = Portc.1
Config Scl = Portc.0
Config Twi = 100000


Dim X As Byte
Dim A As Byte
Dim B As Byte
Dim Lesen As Byte


Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 1


Do
'---- schreibe in EEprom ----
For A = 1 To 10
Incr X '1 bis Überlauf zählen

I2cstart 'Start I2C
I2cwbyte &HA0 'Sende Slave Adresse
I2cwbyte A 'Sende Speicheradresse
I2cwbyte X 'Sende Wert
I2cstop 'Stop I2C
Waitms 10 'warte 10ms

Print "ins EEprom = " ; X ; " " ' Ausgabe der geschriebenen Werte
Waitms 500
Next A


'--- lesen vom EEprom ----
For B = 1 To 10

I2cstart 'Start I2C
I2cwbyte &HA0 'sende Slave Adresse
I2cwbyte B 'sende Speicheradresse

I2cstart 'Start I2C
I2cwbyte &HA1 'sende Slave Adresse +1 für Lesen
I2crbyte Lesen , Nack 'lese Adresse vom EEprom
I2cstop 'Stop I2C

Print "Lese EEprom= " ; Lesen ; " " 'Ausgabe der EEprom Werte
Waitms 500
Next B

Loop
End

Wieso muss ich bei der For B = 1 To 10 Schleife erst einmal den I2C Bus öffnen
Dann das schreiben : (was bedeutet das dann ??)
I2cstart 'Start I2C
I2cwbyte &HA0 'sende Slave Adresse
I2cwbyte B

Und dann den Bus nicht schließen, aber noch mal öffnen ??:
I2cstart 'Start I2C
I2cwbyte &HA1 'sende Slave Adresse +1 für Lesen
I2crbyte Lesen , Nack 'lese Adresse vom EEprom
I2cstop

Und noch eine Frage : Wie kann man das mit den Adressen herausfinden ?? Wie funktioniert das mit dieser Hex Zahl oder der Bin Darstellung ??

Ich hoffe ihr könnt mir meine ganzen Fragen beantworten ..... Denn wie immer freue ich mich über Antworten sehr :)
Der Einsteiger

Kampi
31.07.2013, 14:07
Hey,

ja das 24C16 hat keine Adresspins -> ergo nur eine Adresse möglich!
Das 24C16 ist ein 8Bit EEPROM, sprich jede Speicherzeille ist 8Bit breit...ein Integer würde also zwei Zellen benötigen.
Stell dir das EEPROM wie eine Tabelle mit 2000 Zeilen vor, wovon jede Zeile 8 Spalten hat :)
Das Programm schreibt bei der ersten Schleife 10 Werte in 10 Zellen (Schleife mit der Variable A) und ließt diese dann aus (Schleife mit der Variable B).
I2Cstart erzeugt eine Startbedingung um eine Kommunikation einzuleiten. Dadurch wird jedes Device am Bus "aufgeweckt" und horcht auf den Master.
Dann sendet I2Cwbyte die Adresse um ein(!) einzelnes IC anzusprechen. Und danach wird die Registeradresse (in deinem Fall die Adresse der Speicherzelle) gesendet.
Das zweite I2cstart erzeugt eine NEUE Startbedingung (kannst glaube ich auch repeat oder so verwenden...ka wie der Befehl heißt).
Die genaue Kommunikation siehst du hier (Seite 16 u. 18 ):

http://www.farnell.com/datasheets/1700034.pdf

Auf Seite 18 steht "Random Access Read"...das ist dein Fall und dann siehst du, dass das IC nach der Adresse eine zweite Startbedingung haben will.
Die Adresse steht im Datenblatt (bei dem EEPROM auf S. 13)...da du keine Adresspins hast, sind diese automatisch 0.
Deine Adresse wäre also 1010 (der feste Teil für alle EEPROMs der Reihe) + drei Adresspins die bei dir 0 sind, da nicht vorhanden + das RW Bit.

Der Einsteiger
31.07.2013, 14:20
Vielen Dank für deine Antwort Kampi. Das hat mir echt geholfen es zu verstehen. Doch eine Frage fehlte noch :


Wie funktioniert das mit dieser Hex Zahl oder der Bin Darstellung ??
Das verstehe ich ja noch :

Deine Adresse wäre also 1010 (der feste Teil für alle EEPROMs der Reihe) + drei Adresspins die bei dir 0 sind, da nicht vorhanden + das RW Bit.
Aber ich weiß nicht wie ich jetzt auf den Hex wert (in diesem Fall auf &HA0 komme)
ich hoffe die Frage kannst du mir auch noch beantworten :)

Kampi
31.07.2013, 14:34
Für faule Leute:

http://www.arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm

Ansonsten normale Binär-Hex Umwandlung :)
Deine Adresse ist zum schrieben:

1010 0000

Du fängst von links an:

1010 = 10 (1*(2^3) + 0*(2^2) + 1*(2^1) + 0*(2^0)) aber 10 ist im Hexsystem = A

Und bei "0000" machst du es genau so :)

Der Einsteiger
31.07.2013, 14:42
Ok, danke, aber da fällt mir gleich noch eine Frage zum PCF ein :
Programm für Eingänge:


$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 200
$swstack = 200
$framesize = 400

Config Portd.7 = Output

'TWI konfigurieren
Config Sda = Portc.1
Config Scl = Portc.0
Config Twi = 100000 'TWI Frequenz

'Adresse des PCF
Const Pcf8574w = &H40
Const Pcf8574r = &H41

Dim Meinevariable As Byte

Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 1

'I²C initialisieren
I2cinit

Sound Portd.7 , 400 , 450

Do

I2cstart
I2cwbyte Pcf8574r
I2crbyte MeineVariable, Nack
I2cstop

Print Meinevariable
Print

Waitms 500

Loop
End

Warum erhalte ich da nur 255 und wenn ich einen Taste drücke 127 ? Wie mache ich das richtig ? Was ist dieses Nack (das habe ich in der Bascom Hilfe nicht gefunden) ?

Kampi
31.07.2013, 14:48
Ganz einfach....der PCF gibt 1 BYTE an Daten raus, wovon jedes Bit einen IO darstellt, sprich Bit 0 = IO 0 etc.
Hier ist was zum Thema ACK/NACK:

http://de.wikipedia.org/wiki/I%C2%B2C

Der Einsteiger
03.08.2013, 13:53
Ok. Danke :) funktioniert jetzt und ich habe es verstanden .
Doch jetzt noch was : irgendeiner sagte ein paar Beiträge zuvor, dass man einen Eingang vorher auf 1 stellen muss, da es sonst nicht funktioniert. Muss man das ? bei mir hat es nämlich auch ohne funktioniert mit dem Code aus Beitrag 22.

RoboHolIC
03.08.2013, 22:36
irgendeiner sagte ein paar Beiträge zuvor, dass man einen Eingang vorher auf 1 stellen muss, da es sonst nicht funktioniert. Muss man das ? bei mir hat es nämlich auch ohne funktioniert mit dem Code aus Beitrag 22.

Das war ich. Im Datenblatt unter "quasi-bidirectional I/O" findet man beide sich ergänzende Aussagen: Zum einen sind alle Ports nach dem PowerUp per default High und damit Input-fähig; das trifft deinen Fall. Zum anderen sind Anwendungen denkbar, bei denen ein Port z.B. sowohl eine LED treiben als auch (zeitversetzt !) einen Schalter lesen soll. Dann gilt das Gesagte zum expliziten H-setzen.

Der Einsteiger
07.08.2013, 16:55
bei denen ein Port z.B. sowohl eine LED treiben als auch (zeitversetzt !) einen Schalter lesen soll. Dann gilt das Gesagte zum expliziten H-setzen.
Und das wollte ich ja nicht :)


So, ich habe jetzt mal mit dem 24C16 einen kleinen Datenlogger für LDR Messwerte gebaut.
Das Aufnehmen der Messwerte klappt auch schon, doch kann ich sie weder abspielen, noch, wenn ich den Conroller wieder einschalte neu beschreiben. Also ich kann es nur einmal beschreiben. Danach wird irgendwie der Controller dumm (beim wiederanschalten gibt es keinen Summerklang mehr und ich bekomme nichts mehr auf der seriellen Schnittstelle angezeigt )

Woran liegt es ??


$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 200
$swstack = 200
$framesize = 400

Config Portd.7 = Output

Config Pind.6 = Input
Pind.6 = 1

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Waitms 10

'TWI konfigurieren
Config Sda = Portc.1
Config Scl = Portc.0
Config Twi = 100000

Dim X As Byte
Dim A As Byte
Dim B As Byte
Dim Lesen As Byte

Dim W As Word

Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 2


If Pind.6 = 0 Then 'Taster für Moduswahl

'---- schreibe in EEprom ----
For A = 1 To 10

W = Getadc(6) 'Messwert
Print W
X = W / 4 'damit der Speicher reicht
Print "Durch 4 geteilt: " ; X
Print
Print
Waitms 200

I2cstart 'Start I2C
I2cwbyte &HA0 'Sende Slave Adresse
I2cwbyte A 'Sende Speicheradresse
I2cwbyte X 'Sende Wert
I2cstop 'Stop I2C
Waitms 10 'warte 10ms

Print "ins EEprom = " ; X ; " " ' Ausgabe der geschriebenen Werte
Waitms 500
Next A

Sound Portd.7 , 400 , 450 'damit ich weiß, wann er fertig ist
Waitms 40
Sound Portd.7 , 400 , 450



Else

'--- lesen vom EEprom ----
For B = 1 To 10

I2cstart 'Start I2C
I2cwbyte &HA0 'sende Slave Adresse
I2cwbyte B 'sende Speicheradresse

I2cstart 'Start I2C
I2cwbyte &HA1 'sende Slave Adresse +1 für Lesen
I2crbyte Lesen , Nack 'lese Adresse vom EEprom
I2cstop 'Stop I2C

Print "Lese EEprom= " ; Lesen ; " " 'Ausgabe der EEprom Werte
Waitms 500
Next B

End If

End

Sternthaler
07.08.2013, 20:06
Grüß dich 'Der Einsteiger',

ich habe zwar keine Ahnung vom BASCOM und mache auch nur mit C, aber igendwie vermisse ich hier die Initialisierung mit "I2cinit". (Ob es das ist, kann ich noch nicht einmal sagen.)
Oder ich bin nur blind ;)

Gruß Sternthaler

P.S.: Im übrigen hat mir deine Fragerunde auch gut 'die Augen geöffnet'.
Also ein großes Dankeschön an alle Frageantworter

P.P.S: Und da das hier gerade (schon wieder) mein 1000'er Eintrag ist, verweise ich mal auf https://www.roboternetz.de/community/threads/50577-Ein-Klick-f%C3%BCr-mich-ein-Kuchen-f%C3%BCr-die-Menschheit!?p=487842&viewfull=1#post487842

Der Einsteiger
07.08.2013, 20:47
Hallo Sternthaler,


"I2cinit
Habe ich jetzt eingefügt, geht aber trotzdem nicht.


P.S.: Im übrigen hat mir deine Fragerunde auch gut 'die Augen geöffnet'.
?


Und da das hier gerade (schon wieder) mein 1000'er Eintrag ist, verweise ich mal auf
Warum schon wieder ?? Du hast doch erst 1000.

Also zurück zu meinem Problem: Warum geht es nicht ?? Beim ersten Mal anschalten nach dem Proggen funktioniert es, wenn ich es dann aber ausschalte und wieder an dann geht gar nichts mehr! Weder Ton noch Text !

Kennt sich einer von den Fachleuten da aus ?? Ich würde mich über Antworten sehr freuen, da ich echt nicht weiter weiß.

Der Einsteiger

Sternthaler
07.08.2013, 21:52
Habe ich jetzt eingefügt, geht aber trotzdem nicht.Schade. Aber da sieht man mal, dass ich wirklich keine Ahnung vom Bascom habe ;)


P.S.: Im Übrigen hat mir deine Fragerunde auch gut 'die Augen geöffnet'.
Ich habe die Antworten zu deinen Fragen mit Spannung gelesen, da meine I2C-Kentnisse, zwar in C, auch nur recht klein sind.


Warum schon wieder ?? Du hast doch erst 1000.Genau das ist auch mein "Problem"!


Also zurück zu meinem Problem: Warum geht es nicht ?? Beim ersten Mal anschalten nach dem Proggen funktioniert es, wenn ich es dann aber ausschalte und wieder an dann geht gar nichts mehr! Weder Ton noch Text !Da bin auch ich auf eine funktionierende Antwort gespannt.

Gruß
Sternthaler

RoboHolIC
07.08.2013, 22:11
Hast du eine LED dran, mit der du die verschiedenen Programmphasen sichtbar machen kannst? Die LED sukkzessive immer später im Programmablauf einschalten.Vielleicht bleibt der Controller in einer der Funktionen stecken.

Wie ist der Reset realisiert? Über den Programmer, oder über das Spannung einschalten? Gibt es da unterschiedliches Verhalten? Die Initialisierung nach dem Reset kann (zumindest bei PICs) je nach Resetursache (PowerUp, BrownOut, WatchDog, Sleep) durchaus unterschiedlich sein.

Michael
08.08.2013, 11:04
Config Pind.6 = Input
Pind.6 = 1
um den Pullup einzuschalten, muss das Portregister gesetzt werden.

Gruß, Michael

Der Einsteiger
08.08.2013, 11:58
Hast du eine LED dran, mit der du die verschiedenen Programmphasen sichtbar machen kannst? Die LED sukkzessive immer später im Programmablauf einschalten.Vielleicht bleibt der Controller in einer der Funktionen stecken.

Wie ist der Reset realisiert? Über den Programmer, oder über das Spannung einschalten? Gibt es da unterschiedliches Verhalten? Die Initialisierung nach dem Reset kann (zumindest bei PICs) je nach Resetursache (PowerUp, BrownOut, WatchDog, Sleep) durchaus unterschiedlich sein.
Für die Led habe ich ja den Summer ...


Vielleicht bleibt der Controller in einer der Funktionen stecken.
Das sage ich ja: und zar nach dem zweiten mal anschalten direkt am Anfang. Oder ??


Wie ist der Reset realisiert?
Beim Proggen macht das der Progger selbst. Wenn ich es im Verlauf ändern möchte, habe ich dafür einen Taster.

Nur mal zur Info : Ich verwende RN-Control, also müsste Hardwaremäßig alles passen. Ich habe auch ein anders Board mit Mega 32 probiert, doch es hat sich genau so verhalten. Das würde dann ja auch für ein anders Problem sprechen. Es liegt bestimmt an der Software, nur was ist die Frage ???


um den Pullup einzuschalten, muss das Portregister gesetzt werden.
Wie ??

Ich hoffe einer von euch findet die Lösung ...

Der Einsteiger
08.08.2013, 15:40
Also, ich konnte mir nun ein wenig selbst weiterhelfen (nach längerem testen...)

Zur Info noch mal ich verwende RN-Control, USB-AVR-Progger von robotikhardware und ftdi Board für seriell 5V-Pegel

Das ist der Code:

$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 200
$swstack = 200
$framesize = 400

Config Portd.7 = Output


Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Waitms 10

'TWI konfigurieren
Config Sda = Portc.1
Config Scl = Portc.0
Config Twi = 100000

Dim X As Byte
Dim A As Byte
Dim B As Byte
Dim Lesen As Byte

Dim W As Word

Dim Inpu As Byte


Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 2

I2cinit
Waitms 10



Input "1 = schreiben und 0 = lesen" , Inpu

Select Case Inpu

Case 1
'---- schreibe in EEprom ----
For A = 1 To 10

W = Getadc(6) 'Messwert
Print W
X = W / 4 'damit der Speicher reicht
Print "Durch 4 geteilt: " ; X
Waitms 200

I2cstart 'Start I2C
I2cwbyte &HA0 'Sende Slave Adresse
I2cwbyte A 'Sende Speicheradresse
I2cwbyte X 'Sende Wert
I2cstop 'Stop I2C
Waitms 10 'warte 10ms

Print "ins EEprom = " ; X ; " " ' Ausgabe der geschriebenen Werte
Print
Print

Waitms 500
Next A

Sound Portd.7 , 400 , 450 'damit ich weiß, wann er fertig ist
Waitms 40
Sound Portd.7 , 400 , 450



Case 0

'--- lesen vom EEprom ----
For B = 1 To 10

I2cstart 'Start I2C
I2cwbyte &HA0 'sende Slave Adresse
I2cwbyte B 'sende Speicheradresse

I2cstart 'Start I2C
I2cwbyte &HA1 'sende Slave Adresse +1 für Lesen
I2crbyte Lesen , Nack 'lese Adresse vom EEprom
I2cstop 'Stop I2C

Print "Lese EEprom= " ; Lesen ; " " 'Ausgabe der EEprom Werte
Waitms 500
Sound Portd.7 , 400 , 450 'damit ich weiß, wann er fertig ist
Waitms 40
Sound Portd.7 , 400 , 450

Next B


End Select


End
Und jetzt haltet euch gut fest ! Der Code (leicht verändert) funktioniert auch, aber was anderes ist ganz komisch:

Als ich es jetzt getestet hatte habe ich erst das Programm geproggt, seriell angesteckt, lesen oder schreiben gedrückt, den M32 machen lassen, dann ausgeschaltet, seriell abgesteckt, wieder angesteckt, wieder angeschaltet, und wieder einen Taster gedrückt.............

So hat der Code funktioniert. Wenn ich aber den seriellen Anschluss dran lasse und dann direkt wieder anschaltet funktioniert gar nichts mehr. ???? :confused:

Meine Vermutung (die hört sich ein wenig blöde an): Es muss irgendwie die Leitung beim seriellen Kram "verstopft" sein oder irgend sowas ?????

Searcher
08.08.2013, 16:08
Config Pind.6 = Input
Pind.6 = 1



Michael meint, daß, um den Pullup einzuschalten, es Portd.6 = 1 heißen müsste.

Gruß
Searcher

Der Einsteiger
08.08.2013, 16:12
Danke, aber trotzdem gibt es diese komische Störung :)

Sternthaler
08.08.2013, 19:32
Hallo Einsteiger,

unter http://avrhelp.mcselec.com/ (bei "Newbie problems") habe ich noch folgendes gefunden:

Some bits on Port C are not working

Some chips have a JTAG interface. Disable it with the proper fuse bit . Or use DISABLE JTAG in your code.


Leider weiss ich nicht welcher AVR hinter deiner "m32def.dat"-Angabe steckt. Somit weiss ich auch nicht, ob da überhaupt ein JTAG vorhanden ist.

Gruß Sternthaler

Michael
08.08.2013, 22:16
Als ich es jetzt getestet hatte habe ich erst das Programm geproggt, seriell angesteckt, lesen oder schreiben gedrückt, den M32 machen lassen, dann ausgeschaltet, seriell abgesteckt, wieder angesteckt, wieder angeschaltet, und wieder einen Taster gedrückt.............
nur hast du keinen Taster im Programm berücksichtigt, den man drücken könnte.
Hier wäre es nur folgerichtig, wenn du erstmal deinen Taster überprüfst, eine systematische Arbeitsweise führt bei mir immer zum Erfolg.
Dein letztes Programm krankte ja an der falschen Tasterabfrage (Ergebnis immer Null), jetzt muss es die serielle sein.
Kannst du erläutern, warum?

@Sternthaler:
Nichts für ungut, du schreibst selbst, dass Bascom nicht dein Gebiet ist und weisst auch nicht was hinter m32 stecken könnte, warum antwortest du dann?

Gruß, Michael

Der Einsteiger
23.08.2013, 12:16
Some bits on Port C are not working

Some chips have a JTAG interface. Disable it with the proper fuse bit . Or use DISABLE JTAG in your code.
Vielen Dank für den Hinweis, aber das war mir schon bekannt.


Leider weiss ich nicht welcher AVR hinter deiner "m32def.dat"-Angabe steckt. Somit weiss ich auch nicht, ob da überhaupt ein JTAG vorhanden ist.
Hinter der m32def.dat Angabe steckt ein Atmega 32...... :)


Als ich es jetzt getestet hatte habe ich erst das Programm geproggt, seriell angesteckt, lesen oder schreiben gedrückt, den M32 machen lassen, dann ausgeschaltet, seriell abgesteckt, wieder angesteckt, wieder angeschaltet, und wieder einen Taster gedrückt.............
nur hast du keinen Taster im Programm berücksichtigt, den man drücken könnte.

Doch, in dem Prog. davor war ein Taster. Diesen habe ich ja jetzt durch die Serielle ersetzt.


Hier wäre es nur folgerichtig, wenn du erstmal deinen Taster überprüfst, eine systematische Arbeitsweise führt bei mir immer zum Erfolg.
Der Taster hatte ja auch funktioniert.


Dein letztes Programm krankte ja an der falschen Tasterabfrage (Ergebnis immer Null)
Da hast du recht.


jetzt muss es die serielle sein.
Kannst du erläutern, warum?
Das hatte ich doch jetzt schon geschrieben ( weiß ich nicht genau, muss aber daran liegen, da alles andere funktioniert.


So, da mein Datenlogger ja nun funktioniert, habe ich noch mal ne neue Frage :
Wie kann ich zwei Atmegas über I2C verbinden ?? Im Wiki habe ich schon geschaut, doch habe ich das nicht so ganz verstanden (wegen diesen Twsr und so weiter Befehlen ).
Könnt ihr mir da weiterhelfen ?? Bitte ?

Michael
23.08.2013, 19:14
So, da mein Datenlogger ja nun funktioniert, habe ich noch mal ne neue Frage
Das ist schön, aber magst du dafür keinen neuen Thread aufmachen?
I2C-Slave hat mit I2C-Einstieg nichts mehr zu tun und der Thread hier ist auch schon recht lang.

Gruß, Michael