klucky
25.12.2004, 17:25
Ich hab mir mal den Artikel hier durchgelesen und wollte jetzt gerne die das ganze in meinem Programm verwenden. https://www.roboternetz.de/phpBB2/viewtopic.php?t=3447
Jetzt hab ich das ganze Fertig und es sieht so aus:
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>
#include <stdlib.h> /*für exit*/
/*SD20 Adresse mit Lese- oder Schreibbit*/
#define SD20_W 0xC2
#define SD20_R 0xC3
typedef unsigned char BYTE;
typedef unsigned short WORD;
void i2c_start(BYTE ADRESSE)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); /*Startbedingung senden*/
while (!(TWCR & (1<<TWINT))); /*Darauf warten dass TWINT gesetzt wurde was aussagt das die Startbedingung gesendet wurde*/
if ((TWSR & 0xF8) != START) exit; /*Überprüfen ob START erfolgreich gesendet wurde sonst abbrechen*/
TWDR = ADRESSE; /*Slave Adresse in TWDR laden*/
TWCR = (1<<TWINT)|(1<<TWEN); /*TWINT und TWEN löschen damit die ADRESSE gesendet wird*/
while (! (TWCR & (1<<TWINT))); /*Darauf warten dass TWINT gesetzt wurde was aussagt dass die ADRESSE gesendet wurde*/
if ((TWSR & 0xF8) != MT_SLA_ACK) exit; /*Überprüfen ob ADRESSE erfolgreich gesendet wirde sonst abbrechen*/
}
void i2c_data(BYTE DATA)
{
TWDR = DATA; /*DATA in TWDR laden*/
TWCR = (1<<TWINT)|(1<<TWEN); /*TWINT und TWEN löschen damit die DATA gesendet wird*/
while (! (TWCR & (1<<TWINT))); /*Darauf warten dass TWINT gesetzt wurde was aussagt dass die DATA gesendet wurde*/
if ((TWSR & 0xF8) != MT_DATA_ACK) exit; /*Überprüfen ob DATA erfolgreich gesendet wirde sonst abbrechen*/
}
void i2c_stop(void)
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); /*Stopbedingung senden*/
}
int main(void)
{
i2c_start(SD20_W);
i2c_data(0x7F);
i2c_stop();
}
Naja jetzt bekomm ich nur leider einen ganzen haufen Fehlermeldungen:
> "make.exe" all
-------- begin --------
avr-gcc (GCC) 3.4.1
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Compiling: Lauflicht.c
avr-gcc -c -mmcu=atmega128 -I. -gstabs -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=Lauflicht.lst -std=gnu99 -Wp,-M,-MP,-MT,Lauflicht.o,-MF,.dep/Lauflicht.o.d Lauflicht.c -o Lauflicht.o
Lauflicht.c: In function `i2c_start':
Lauflicht.c:21: error: `START' undeclared (first use in this function)
Lauflicht.c:21: error: (Each undeclared identifier is reported only once
Lauflicht.c:21: error: for each function it appears in.)
Lauflicht.c:25: error: `MT_SLA_ACK' undeclared (first use in this function)
Lauflicht.c: In function `i2c_data':
Lauflicht.c:34: error: `MT_DATA_ACK' undeclared (first use in this function)
Lauflicht.c: In function `i2c_start':
Lauflicht.c:21: warning: statement with no effect
Lauflicht.c:25: warning: statement with no effect
Lauflicht.c: In function `i2c_data':
Lauflicht.c:34: warning: statement with no effect
make.exe: *** [Lauflicht.o] Error 1
> Process Exit Code: 2
Dass START, MT_SLA_ACK, MT_DATA_ACK Probleme machen würden hab ich mir schon direkt Gedacht als ich sie gelesen habe da sie ja nirgends vorher definiert werden. Nur wo bekomm ich die definition dafür her?
Würd mich freun wenn mir jemand von euch helfen könnte! THX schonmal für eure Mühe!
Jetzt hab ich das ganze Fertig und es sieht so aus:
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>
#include <stdlib.h> /*für exit*/
/*SD20 Adresse mit Lese- oder Schreibbit*/
#define SD20_W 0xC2
#define SD20_R 0xC3
typedef unsigned char BYTE;
typedef unsigned short WORD;
void i2c_start(BYTE ADRESSE)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); /*Startbedingung senden*/
while (!(TWCR & (1<<TWINT))); /*Darauf warten dass TWINT gesetzt wurde was aussagt das die Startbedingung gesendet wurde*/
if ((TWSR & 0xF8) != START) exit; /*Überprüfen ob START erfolgreich gesendet wurde sonst abbrechen*/
TWDR = ADRESSE; /*Slave Adresse in TWDR laden*/
TWCR = (1<<TWINT)|(1<<TWEN); /*TWINT und TWEN löschen damit die ADRESSE gesendet wird*/
while (! (TWCR & (1<<TWINT))); /*Darauf warten dass TWINT gesetzt wurde was aussagt dass die ADRESSE gesendet wurde*/
if ((TWSR & 0xF8) != MT_SLA_ACK) exit; /*Überprüfen ob ADRESSE erfolgreich gesendet wirde sonst abbrechen*/
}
void i2c_data(BYTE DATA)
{
TWDR = DATA; /*DATA in TWDR laden*/
TWCR = (1<<TWINT)|(1<<TWEN); /*TWINT und TWEN löschen damit die DATA gesendet wird*/
while (! (TWCR & (1<<TWINT))); /*Darauf warten dass TWINT gesetzt wurde was aussagt dass die DATA gesendet wurde*/
if ((TWSR & 0xF8) != MT_DATA_ACK) exit; /*Überprüfen ob DATA erfolgreich gesendet wirde sonst abbrechen*/
}
void i2c_stop(void)
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); /*Stopbedingung senden*/
}
int main(void)
{
i2c_start(SD20_W);
i2c_data(0x7F);
i2c_stop();
}
Naja jetzt bekomm ich nur leider einen ganzen haufen Fehlermeldungen:
> "make.exe" all
-------- begin --------
avr-gcc (GCC) 3.4.1
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Compiling: Lauflicht.c
avr-gcc -c -mmcu=atmega128 -I. -gstabs -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=Lauflicht.lst -std=gnu99 -Wp,-M,-MP,-MT,Lauflicht.o,-MF,.dep/Lauflicht.o.d Lauflicht.c -o Lauflicht.o
Lauflicht.c: In function `i2c_start':
Lauflicht.c:21: error: `START' undeclared (first use in this function)
Lauflicht.c:21: error: (Each undeclared identifier is reported only once
Lauflicht.c:21: error: for each function it appears in.)
Lauflicht.c:25: error: `MT_SLA_ACK' undeclared (first use in this function)
Lauflicht.c: In function `i2c_data':
Lauflicht.c:34: error: `MT_DATA_ACK' undeclared (first use in this function)
Lauflicht.c: In function `i2c_start':
Lauflicht.c:21: warning: statement with no effect
Lauflicht.c:25: warning: statement with no effect
Lauflicht.c: In function `i2c_data':
Lauflicht.c:34: warning: statement with no effect
make.exe: *** [Lauflicht.o] Error 1
> Process Exit Code: 2
Dass START, MT_SLA_ACK, MT_DATA_ACK Probleme machen würden hab ich mir schon direkt Gedacht als ich sie gelesen habe da sie ja nirgends vorher definiert werden. Nur wo bekomm ich die definition dafür her?
Würd mich freun wenn mir jemand von euch helfen könnte! THX schonmal für eure Mühe!