Hi,
I´ve got the same problem, but I start the Topic in the german Thread.
http://arduino.cc/forum/index.php/topic,77741.0.html
My problem is that the Atmega328P stop working by the comand Wire.request(72, 2); .
I use the comand in the interruptroutine of FlexiTimer2, maybe that´s the problem, but I'm not sure.
A easy testcode does work:
#include <Wire.h>
char c;
void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}
void loop()
{
Wire.requestFrom(72, 2); // request 2 bytes from slave device #2
while(Wire.available()) // slave may send less than requested
{
c = Wire.receive(); // receive a byte as character
Serial.print(c); // print the character
}
delay(50);
}
The interruptroutine that not work is following (the lcd.print("x"); is only to see where the Atmega stops):
void Get_Analog (){
if (Analog_Neu == false){
//Analog_Wert = analogRead(0);
lcd.print("0");
Wire.requestFrom(72, 2);
lcd.print("1");
while(Wire.available()){
lcd.print("2");
Analog_Wert = Wire.receive();
lcd.print("3");
Analog_Neu = true;
}
//Analog_Neu = true;
}
else
{
FlexiTimer2::stop();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Fehler 1");
}
}
The full Code is:
#include <FlexiTimer2.h>
#include <LiquidCrystal.h>
#include <Wire.h>
LiquidCrystal lcd(12,11,5,4,3,2); //Interface definieren
int Analog_Wert = 0;
boolean Analog_Neu = false;
void setup(){
FlexiTimer2::set(50,Get_Analog);//(interruptinterval in ms, ISR)
Serial.begin(115200);
lcd.begin(16,2); //Spalten/Zeilen
lcd.clear();
Wire.begin();
Wire.beginTransmission(72);
Wire.send(48);//Anzwählen der richtigen PCF8591P Funktion
Wire.endTransmission();
}
void loop (){
int Rec = 0;
int x = 0; //Schleifendurchlaufzähler, wird ggf an mehreren Stellen
//verwendet. Der Zählerstand hat nach der Schleife keine
//Relevanz mehr und wird vor beginn der Schleife neu
//initialisiert wird.
if (Analog_Neu == true){
//Serial.print (Analog_Wert);
Serial.write (Analog_Wert);
//Serial.print(" ");
Analog_Neu =false;
/*lcd.clear();
lcd.setCursor(0,1);
lcd.print (int((Analog_Wert/1023.0)*5000));
lcd.print("mV");*/
}
if (Serial.available()){
FlexiTimer2::stop();//Interrupt anhalten damit USB ohne unterbrechung gelesen werden kann
Rec = Serial.read();
lcd.clear();
lcd.setCursor(0,0);
lcd.print(Rec,DEC);
}
switch (Rec)
{
case 49: //ASCII 1 Interrupt starten
FlexiTimer2::start();
break;
case 50: //ASCII 2 Interrupt stop
FlexiTimer2::stop();
break;
case 51: //ASCII 3 Abtastrate setzen
FlexiTimer2::stop();
x=0;
do{
if (Serial.available()){
Abtastrate_setzen(Serial.read());
}
delay(1);
x++;
}
while (x!=1500);
break;
case 52: //ASCII 4 Spannungsbereich setzen
FlexiTimer2::stop();
x=0;
do{
if (Serial.available()){
Spannungsbereich_setzen(Serial.read());
}
delay(1);
x++;
}
while (x!=1500);
break;
/*case 53: //ASCII 5 Triggerpunkt setzen
x=0;
do{
if (Serial.available()){
Set_Trigger(Serial.read());
}
delay(1);
x++;
}
while (x!=1500);
break;*/
}
}
void Analog(){
}
void Get_Analog (){
if (Analog_Neu == false){
//Analog_Wert = analogRead(0);
lcd.print("0");
Wire.requestFrom(72, 2);
lcd.print("1");
while(Wire.available()){
lcd.print("2");
Analog_Wert = Wire.receive();
lcd.print("3");
Analog_Neu = true;
}
//Analog_Neu = true;
}
else
{
FlexiTimer2::stop();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Fehler 1");
}
}
void Abtastrate_setzen (int Abtastrate){
lcd.clear();
lcd.setCursor(0,1);
lcd.print(Abtastrate);
switch (Abtastrate){
case 49:
FlexiTimer2::set(50,Get_Analog);//(interruptinterval in ms, ISR)
break;
case 50:
FlexiTimer2::set(100,Get_Analog);//(interruptinterval in ms, ISR)
break;
case 51:
FlexiTimer2::set(250,Get_Analog);//(interruptinterval in ms, ISR)
break;
case 52:
FlexiTimer2::set(500,Get_Analog);//(interruptinterval in ms, ISR)
break;
case 53:
FlexiTimer2::set(1000,Get_Analog);//(interruptinterval in ms, ISR)
break;
case 54:
FlexiTimer2::set(2500,Get_Analog);//(interruptinterval in ms, ISR)
break;
case 55:
FlexiTimer2::set(5000,Get_Analog);//(interruptinterval in ms, ISR)
break;
case 56:
FlexiTimer2::set(10000,Get_Analog);//(interruptinterval in ms, ISR)
break;
case 57:
FlexiTimer2::set(25000,Get_Analog);//(interruptinterval in ms, ISR)
break;
case 48:
FlexiTimer2::set(100000,Get_Analog);//(interruptinterval in ms, ISR)
break;
}
}
void Spannungsbereich_setzen (int Spannungsbereich){
switch (Spannungsbereich){
case 49: Wire.beginTransmission(32);
Wire.send(254); //K1 wird angeschalten
Wire.endTransmission();
break;
case 50: Wire.beginTransmission(32);
Wire.send(253); //K2 wird angeschalten
Wire.endTransmission();
break;
case 51: Wire.beginTransmission(32);
Wire.send(251); //K3 wird angeschalten
Wire.endTransmission();
break;
case 52: Wire.beginTransmission(32);
Wire.send(247); //K4 wird angeschalten
Wire.endTransmission();
break;
case 53: Wire.beginTransmission(32);
Wire.send(239); //K5 wird angeschalten
Wire.endTransmission();
break;
case 54: Wire.beginTransmission(32);
Wire.send(255); //alle Relais werden abgeschalten
Wire.endTransmission();
break;
}
}
The Code is for a smal USB-Ozilloskop.
I hope you understand my english, I haven't speak it for a long time.
MfG Jago
PS.: What I forgot to say, it seem´s to be no problem with the PCF8591, the same problem appears when I use the PCF8574 instead.