Pages: [1]   Go Down
Author Topic: i2c problem nach Wire.begin();  (Read 1047 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
* 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.
Logged

Bonn, Germany
Offline Offline
God Member
*****
Karma: 2
Posts: 903
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Was genau funktioniert dann nicht mehr? wo bleibt der Code stehen? Koennen wir einen Code sehen?
Logged

Believe me, Mike, I calculated the odds of this succeeding against the odds I was doing something incredibly stupid[ch8230] and I went ahead

0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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);
}      
              
            
Logged

Bonn, Germany
Offline Offline
God Member
*****
Karma: 2
Posts: 903
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sehe beim Code so drekt nichts, was irgendwie falsch aussieht.... wie sieht die verkabelung aus? Analog4  und 5 richtig auf SDL und SCA gesetzt?
Logged

Believe me, Mike, I calculated the odds of this succeeding against the odds I was doing something incredibly stupid[ch8230] and I went ahead

0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 11
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Pages: [1]   Go Up
Jump to: