-
Projekt PCF8591
Hallo ich habe auf der "asurowiki" Seite ein paar Informationen zu der Analogen Porterweiterung gefunden und wollte hier mal anfragen was das Unterprogramm, welches auf der genannten Seite steht zurückgibt? Von welchem Eingang gibt mir dieses Programm die Daten?
-
Die Funktion read_pcf8591_adc erwartet als Parameter den A/D Kanal (0..3) und gibt den entsprechenden A/D Wert zurück.
Hier noch der Link zur Schaltung und zum Programm:
http://www.asurowiki.de/pmwiki/pmwik...orterweiterung
-
Ok das hilft mir schon mal weiter. Aber ich bekomme immer Fehlermeldungen beim erstellen meiner Datei.
Code:
>Session Environment Variables:
AF_AVRDIR=C:\WinAVR
AF_PROJECT=test
AF_SOURCE_FILES=test.c i2c.c
AF_ASM_SRC_FILES=
AF_PRGDIR=C:\Programme\AsuroFlash
AF_PRJDIR=C:\AsuroFlash\asuro-lib\examples\US
AF_ASURO_LIB_PATH=C:\AsuroFlash\asuro-lib\lib
File test.c saved.
>Default make_all.cmd file created.
>Default makefile created.
Make
C:\AsuroFlash\asuro-lib\examples\US>C:\WinAVR\utils\bin\make.exe all
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst -IC:\Programme\AsuroFlash\include test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d
-------- begin --------
avr-gcc --version
avr-gcc (WinAVR 20090313) 4.3.2
Copyright (C) 2008 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.
Size before:
test.elf :
section size addr
.text 714 0
.bss 17 8388704
.stab 888 0
.stabstr 95 0
.debug_aranges 128 0
.debug_pubnames 335 0
.debug_info 1165 0
.debug_abbrev 592 0
.debug_line 1025 0
.debug_frame 240 0
.debug_str 502 0
.debug_loc 106 0
Total 5807
avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst -IC:\Programme\AsuroFlash\include test.c -o test.o
test.c: In function 'read_pcf8591_adc':
test.c:12: warning: passing argument 1 of 'StartI2C' makes integer from pointer without a cast
test.c:18: warning: passing argument 1 of 'StartI2C' makes integer from pointer without a cast
test.c: In function 'main':
test.c:42: warning: passing argument 1 of 'SerWrite' makes pointer from integer without a cast
avr-gcc -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.o -IC:\Programme\AsuroFlash\include test.o i2c.o --output test.elf -Wl,-Map=test.map,--cref -IC:\Programme\AsuroFlash\lib -lm
test.o: In function `read_pcf8591_adc':
C:\AsuroFlash\asuro-lib\examples\US/test.c:17: undefined reference to `Sleep'
test.o: In function `main':
C:\AsuroFlash\asuro-lib\examples\US/test.c:35: undefined reference to `Init'
C:\AsuroFlash\asuro-lib\examples\US/test.c:37: undefined reference to `FrontLED'
C:\AsuroFlash\asuro-lib\examples\US/test.c:42: undefined reference to `SerWrite'
make: *** [test.elf] Error 1
ExitCode 2
>Ready.
Hier mal das Programm. Es soll den Wert von dem ersten Eingang vom PCF8591 über die serielle Schnittstelle senden.
Code:
#include "asuro.h"
#include "i2c.h"
#define pcf8591_address 0x90 // I2C Adresse des PCF8574
//liest einen ADC Wert vom PCF8591
unsigned char read_pcf8591_adc(unsigned char adc)
{
unsigned char ret;
unsigned char byte = 0;
ret = StartI2C(pcf8591_address+WriteI2C); // Sende Start Condition
if (ret == 0)
ret = WriteI2C(adc); // Senden des Control Bytes startet die A/D Wandlung
StopI2C(); // Sende Stop Condition, Bus freigeben
Sleep(10); // Warten bis A/D Wandlung benedet (mind. 90µs)
ret = StartI2C(pcf8591_address+ReadI2C); // Sende Start Condition
if (ret == 0)
{
// Mehrmaliges Lesen um alte A/D Werte zu ignorieren
byte = ReadI2C(1); // Lese Byte + acknowledge
byte = ReadI2C(0); // Lese Byte + no acknowledge
}
else ret = 3;
StopI2C(); // Sende Stop Condition, Bus freigeben
return byte;
}
int main(void)
{
unsigned char rled;
unsigned char port;
Init();
InitI2C();
FrontLED(ON);
while(1)
{
port=0;
rled = read_pcf8591_adc(port);
SerWrite(rled,4);
}
return 0;
}
-
Da fehlt zumindest noch die asuro.c in deinem Projekt. Die Asuro-Lib selbst scheint aber auch zu fehlen. Eigentlich sollte das schon durch das Makefile Template vom AsuroFlash Tool eingebunden werden.
Das ist seltsam, hast du die Templates geändert? Welche AsuroFlash Version verwendest du?
-
Ich verwende die Version 1.4.6.56. Ich habe jetzt nochmal etwas geändert und bekomme aber folgende Fehlermeldung
Code:
>Session Environment Variables:
AF_AVRDIR=C:\WinAVR
AF_PROJECT=Project1
AF_SOURCE_FILES=test.c
AF_ASM_SRC_FILES=
AF_PRGDIR=C:\Programme\AsuroFlash
AF_PRJDIR=C:\ASURO_SRC\programm\us
AF_ASURO_LIB_PATH=C:\ASURO_SRC\AsuroLib\lib
File test.c saved.
>Default make_all.cmd file created.
>Default makefile created.
Make
C:\ASURO_SRC\programm\us>C:\WinAVR\utils\bin\make.exe all
set -e; avr-gcc -MM -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=i2c.lst i2c.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > i2c.d; \
[ -s i2c.d ] || rm -f i2c.d
set -e; avr-gcc -MM -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst asuro.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > asuro.d; \
[ -s asuro.d ] || rm -f asuro.d
set -e; avr-gcc -MM -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d
-------- begin --------
avr-gcc --version
avr-gcc (WinAVR 20090313) 4.3.2
Copyright (C) 2008 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.
avr-gcc -c -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
test.c: In function 'read_pcf8591_adc':
test.c:12: warning: passing argument 1 of 'StartI2C' makes integer from pointer without a cast
test.c:18: warning: passing argument 1 of 'StartI2C' makes integer from pointer without a cast
test.c: In function 'main':
test.c:42: warning: passing argument 1 of 'SerWrite' makes pointer from integer without a cast
avr-gcc -c -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst asuro.c -o asuro.o
avr-gcc -c -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=i2c.lst i2c.c -o i2c.o
avr-gcc -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.o test.o asuro.o i2c.o --output test.elf -Wl,-Map=test.map,--cref -L../../lib -lm -lasuro
c:/winavr/bin/../lib/gcc/avr/4.3.2/../../../../avr/bin/ld.exe: cannot find -lasuro
make: *** [test.elf] Error 1
ExitCode 2
>Ready.
-
ok hab den Fehler selbst gefunden.
Muss ich an die SDA und SCL Leitung einen Widerstand anschließen?
Laut I2C Spezifikation ist dies doch notwendig?
Weil laut Plan der oben genanten Seite muss man nichts anschließen. Und in dem Video funktioniert diese Schaltung ja. Oder wurde da etwas auf der Hauptplatine geändert?
-
An die SCL und SDA Leitungen müssen Widerstände sein. Oft verwendet man die internen Pullupwiderstände des µC. Für höhere Frequenzen bzw längere Leitungen sollte man aber externe Widerstände verwenden.
MfG Hannes
-
So wenn ich die Bauteile zur Linienverfolgung an die analogen Eingänge des PCF8591 anschliese benötige ich ja auch wieder Pulldown Widerstände. Sollte ich da die gleichen verwenden wie original( 20k Ohm) oder sind da auch andere möglich?
-
Du solltest schon die gleivhen Widerstände verwenden.
Stimmt, in der Schaltung fehlen die I2C PullUp Widerstände (4,7k nach VCC)
-
So habe alles aufgebaut. Aber es will einfach nicht funktionieren. Ich habe den rechten Liniensensor auf den ersten und den linken Sensor auf den zweiten Eingang gelegt, aber ich bekomme keinen vernünftigen Werte über mein Programm. Ich habe mit einem Multimeter nachgemessen und habe festgestellt das sich die Spannung am den Eingängen ändert. Hat jemand ne idee wie ich die Werte in mein Programm bekomme?