Go Down

Topic: i2c problem nach Wire.begin(); (Read 1 time) previous topic - next topic

anfang.arduino

Hallo,

also ich habe möchte in mein bestehendes soweit funktionierendes Programm i2c kommunikation nutzen.
Mein Programm funktioniert aber garnicht mehr wenn ich nur ein

Wire.begin();

In die Setup() Prozedure einfüge.
Mein Programm nutzt ein LCD-Display, und die serielle Schnittstelle.
Das LCD-Display ist an:

Code: [Select]
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2


angeschlossen.
Ich versuche es mit einem DS1307. Wenn ich probeweise den Code von
http://combustory.com/wiki/index.php/RTC1307_-_Real_Time_Clock
teste, funktioniert er, ohne dass ich an meiner Schaltung etwas ändere.

Ich habe bisher nichts finden können, was dieses Verhalten erklärt.

Nachtwind

Was genau funktioniert dann nicht mehr? wo bleibt der Code stehen? Koennen wir einen Code sehen?
Believe me, Mike, I calculated the odds of this succeeding against the odds I was doing something incredibly stupid[ch8230] and I went ahead

anfang.arduino

klar könnt ihr den Code sehen.
Es funktioniert garnichts mehr, weder die serielle Schnittstelle, sie gibt keine Anwort mehr. Noch das LCD Display ich sehe nur eine schwache, leicht flackernde Leiste.

Und hier nur der Code

Code: [Select]
#include <LiquidCrystal.h>
#include <Wire.h>

/*
Version  : 0.1.prealpha
Titel    : AutoDisplay: Uhr Temperatur

Quellen:
zum Timer: http://www.uchobby.com/index.php/2007/11/24/arduino-interrupts/
zu Serial: http://arduino.cc/en/Serial/Available
DS1307   : http://combustory.com/wiki/index.php/RTC1307_-_Real_Time_Clock

*/

// Display ist ein 20 * 1 Zeichen Display
// Ansatz der Ausgabe:
// 12:34           22°C
// 12345678901234567890
// 12:23  12.5 V   23°C

/*

 The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)

*/

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte anzeigeStunden = 01;
byte anzeigeMinuten = 01;
byte anzeigeTemperatur = 01;
boolean DisplayAktualisieren = false;
byte AbgleichStunden = 23;
byte AbgleichMinuten = 59;

const char* VariablenListe[] = {"hallo","test"};

void setup() {
 //i2c bus anfang Arduino ist Master
 //Wire.begin();
   // klappt aus irgendeinem Grund nicht
 
 //Start up the serial port
 Serial.begin(9600);
 //Signal the program start
 Serial.println("Timer2 Test");
 
// set up the LCD's number of rows and columns:
// lcd.begin(20, 1);
 lcd.begin(16,2);    //Olli Display anpassen
 // Print a message to the LCD.
 
 lcd.print(" init  ");
   
 // versuch Timer2 zu initialisieren
 //Start the timer and get the timer reload value.
 //timerLoadValue=SetupTimer2(1);
 SetupTimer2(1);
}
 
void loop() {
//  lcd.setCursor(0,1);
//  lcd.print(millis()/1000);

if (DisplayAktualisieren == true){
  DisplayAktualisieren = false;
  Zeit();
  Display();
  SerialDebug();
}
i2cAnfang();
}    


void i2cAnfang(){
const byte adresseRTC = B1101000; //DS1307 arbeitet nur im 100kHz Modus
 

 
}

boolean stimmenStrings(char* ersterString, char* zweiterString){
 boolean zwischen = false;
 // noch eine Maximalstringlänge berücksichtigen
 for (byte i = 0; (ersterString[i] != '\0') || (zweiterString[i] != '\0') ; i++ ){
   if ( ersterString[i] == zweiterString[i] ) {
     zwischen = true;
   } else {
     return false;
   }
 }  
 return zwischen;
}


// Damit man jede Variable anzeigen und ändern kann.
// Für Debug Zwecke.
// wird periodisch von loop() aufgerufen.
//   Befehle: Help, Status, Test
void SerialDebug(){
 byte incomingByte;
 char buffer[50];
 byte bufferzaehler = 0;

 while (Serial.available() != 0){ // Zeichen in buffer einlesen bis CF 13 kommt
 incomingByte = Serial.read();
 
  if ( incomingByte == 13) {
    break;
    } else if (incomingByte == 10) {
      break;
     } else if (incomingByte == 0) {
        break;
      } else {
        buffer[bufferzaehler] = char(incomingByte);
        bufferzaehler++;
      }
 }
 buffer[bufferzaehler]= '\0';
 
 /* // warum klappt das nicht? Olli
 if ( buffer == "test" ) {
   Serial.println("Dieser Test ist geglückt");
 }
 */
 
 if (stimmenStrings(buffer,"test") == true ){
   Serial.println("Dieser wenigstens?");
 }
 if (stimmenStrings(buffer,"get time") == true){
   Serial.print("Die Zeit : ");
   Serial.print(anzeigeStunden,DEC);
   Serial.print(":");
   Serial.println(anzeigeMinuten,DEC);
 }
 if (stimmenStrings(buffer,"get timer") == true){
   Serial.println(millis(),DEC);
 }
 if (stimmenStrings(buffer,"help") == true){
   Serial.println("Derzeit mögliche Eingaben:");
   Serial.println("help      : gibt diesen Text aus");
   Serial.println("get time  : gibt die angezeigte Zeit aus");
   Serial.println("get timer : gibt die timer variable millis() aus.");
 }
}

// in millis sind die Millisekunden gespeichert seit dem der uC
// eingeschaltet wurde.
// Alle 50 Tage wird er überlaufen.   //Olli
// Also entweder vorher einen RTC-Chip einbauen oder abfangen. :)
void Zeit(){
 byte zwischenStunden = 0;
 byte zwischenMinuten = 0;
 byte zwischenTage = 0;
 unsigned long  zwischenMillisG = millis()/1000;
 
//  sekunden = millis()/1000;
//  minuten = millis()/(1000*60);
//  stunden = millis()/(1000*60*60);

   zwischenTage = zwischenMillisG/(60*60*24);
   zwischenMillisG = zwischenMillisG - zwischenTage*(60*60*24); //Tage werden abgezogen

   zwischenStunden = zwischenMillisG/(60*60);
   zwischenMillisG = zwischenMillisG-(zwischenStunden*(60*60));//Stunden werden abgezogen

   zwischenMinuten = zwischenMillisG/60;

   anzeigeMinuten = AbgleichMinuten+zwischenMinuten;
   anzeigeStunden = AbgleichStunden+zwischenStunden;
   if (anzeigeMinuten > 59) {
     anzeigeMinuten -= 60;
     anzeigeStunden++;
   }
   if (anzeigeStunden > 23) {
     anzeigeStunden -= 24;
   }    
}

// Funktion wird regelmä�ig von Timerinterrupt2 aufgerufen
void Display(){
 
   lcd.clear();
 
   // der Teil ist unwichtig nur für statuskram
   lcd.setCursor(0, 1);
   lcd.print("ha");
   
   // Hier wird die Zeit ausgegeben    
   lcd.setCursor(0,0);
   lcd.print(anzeigeStunden,DEC);
   lcd.print(":");
   lcd.print(anzeigeMinuten,DEC);
   lcd.print(" ");
   lcd.print(millis()/1000);
   lcd.print(" ");
   lcd.print(anzeigeTemperatur,DEC);
}
     
byte verzoegern;
//Timer2 overflow interrupt vector handler
ISR(TIMER2_OVF_vect) {  
 verzoegern++;
 if (verzoegern > 50 ) { //bei 250 etwa 4 Sekunden
   verzoegern = 0;
   DisplayAktualisieren = true;
 }
}    
     

#define TIMER_CLOCK_FREQ 2000000.0 //2MHz for /8 prescale from 16MHz
//#define TIMER_CLOCK_FREQ 8000000.0

//Setup Timer2.
//Configures the ATMega168 8-Bit Timer2 to generate an interrupt
//at the specified frequency.
//Returns the timer load value which must be loaded into TCNT2
//inside your ISR routine.
//See the example usage below.
void SetupTimer2(float timeoutFrequency){
 unsigned char result; //The timer load value.

 //Calculate the timer load value
 result=(int)((257.0-(TIMER_CLOCK_FREQ/timeoutFrequency))+0.5);
 //The 257 really should be 256 but I get better results with 257.

 //Timer2 Settings: Timer Prescaler /8, mode 0
 //Timer clock = 16MHz/8 = 2Mhz or 0.5us
 //The /8 prescale gives us a good range to work with
 //so we just hard code this for now.
 TCCR2A = 0;
 //TCCR2B = 0<<CS22 | 1<<CS21 | 0<<CS20;
 
 // lass uns prescale 1024 testen
 TCCR2B = 1<<CS22 | 1<<CS21 | 1<<CS20;

 //Timer2 Overflow Interrupt Enable
 TIMSK2 = 1<<TOIE2;

 //load the timer for its first cycle
 TCNT2=result;

//  return(result);
}      
             
           


Nachtwind

Sehe beim Code so drekt nichts, was irgendwie falsch aussieht.... wie sieht die verkabelung aus? Analog4  und 5 richtig auf SDL und SCA gesetzt?
Believe me, Mike, I calculated the odds of this succeeding against the odds I was doing something incredibly stupid[ch8230] and I went ahead

anfang.arduino

Verkabelung glaube ich eigentlich nicht.
1. mehrmals kontrolliert
2. funktioniert mit anderem Code

Ich habe eine Vermutung.
Wird für Wire der Timer2 benutzt? Habe bis jetzt noch nicht nachsehen können.
Ein kurzes Oberflächliches umschreiben meines Codes hat jedoch nichts gebracht.
Oh, doch, es wird auf der Serielle Schnittstelle immer "Timer2 test" ausgegeben.
Er scheint sich dann gleich zu resetten.

anfang.arduino

So habe jetzt mein Programm umgeschrieben. Der Timer2 wird nicht mehr genutzt. Aber leider bringt das keine Verbesserung. Klappt immer noch nicht. :(

Ich werde es auch mal im Englischen Bereich posten. Evtl. gibt mir dort jemand noch einen Tipp.

Go Up