Pages: [1]   Go Down
Author Topic: Arduino bleibt "hängen" trotz mircosoft-free  (Read 1352 times)
0 Members and 1 Guest are viewing this topic.
AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1148
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Leute,
ich habe ein ziemlich komisches Problem. Und zwar habe ich einen QlockTwo Nachbau (schon fertig in der Hardware :-)) aber beim Programm hängts noch. Der Arduino bleibt zwischen durch einfach "stehen".Mal nach 3 Stunden mal nach 8 Stunden mal nach 1 Stunde und das immer an verschieden stellen im Programm. Er reagiert nicht mehr auf Button eingaben. Die Heartbeat LED bleibt auch aus (RTC Implus eines DS1308).
Die "LED-Ausgabe" erfolgt über die SPI-Schnitstelle an die beiden MAX7221. Die Probleme tauchen nur im Setmode=0 auf also der Normalen Zeitausgabe über die LED register. Im Sekundenmodus (setmode=1)bleibt der Ardu am leben.
Ich verwende eine modifizierte MAX7219+7221 Lib aus dem Playground die ich zum echten SPI geändert habe damit ich schneller auf MAX schreiben kann. Wie verhält es sich mit dem RAM wenn aus der Loop einzelnen Funktionen (hier voids also ohne Rückgabewerte) aufruft und es dann irgendwann zuviele werden. Kann man den Ram irgenwie nach dem ablauf einer Loop clearen.
Ich habe es jetzt mit dem org AVR WatchDogTimer gelöst aber das ist nicht die Ursache und ich würde gerne ein Lösung haben.

Hier meine Tabs.

1/3
Main Loop
Code:
/*
 Enhanced and modify by Daniel Herr (adruino Forum "volvodani")
 Copy of the Biegert&Funk QlockTwo reprogramming by volvodani.
 The LEDs Controled by 2*MAX7221 (Daisy Chained)(over SPI).
 I enhanced the LEDControl.h Libary to real SPI for the maxx7221 and renamed LEDControlSPI.h
 based on:
 Copyright 2011 Michael Stebbins
 http://students.washington.edu/mikesteb/projects/Qlock_LED_Clock/Qlock_LED_clock.html
*/

#include <SPI.h>
#include <Wire.h>
#include <LedControlSPI.h>
#include <avr/wdt.h>

#define RTC_ADDRESS 0x68       // I2C Address of RTC
#define LCCS 10                // MAX7221 ChipSelect
#define TASTER 8               // Button Pin
#define RTCIN 2                // SQW Output of RTC connected here
#define TIME 750               // Split time between short and lognpress

LedControl LC=LedControl(LCCS,2);  // Init two MAX 7221 via Real SPI (SPI Interface on Atmega 13,12,

unsigned long ptime;
unsigned long start;
boolean druck=false;
boolean ldruck=true;
boolean longpress=false;
boolean shortpress=false;

boolean tasterlesen=true;
boolean update,last=true;
boolean sec=false;
boolean lsec=false;
boolean save,one=false;

byte setmode,lm=0;                                  // 0=Normal 1=Display Seconds 2=Set minutes 3=Set hours
byte lCase=0;
byte ss,mm,lmm,hh,mmset,lmmset,hhset,lhhset,mm5er,mm5erRest=0;                // Save Variables for time


void setup() {
  wdt_enable(WDTO_2S);
  pinMode(RTCIN,INPUT);                          // SQW Output of RTC connected here
  pinMode(TASTER,INPUT);                         // Taster Eingang
  pinMode(5,OUTPUT);                             // LED Heartbeat of RTC Pulse
  digitalWrite (TASTER,HIGH);                    // internal Pullup
  Wire.begin();                                  // Start I2C Kommunikation
  Wire.beginTransmission(RTC_ADDRESS);           // Beginn Kommunikation auf  Adresse 0x68
  Wire.send(0x07);                               // Pointer auf Control Register 0x07  
  Wire.send(0x10);                               // Controlbyte for RTC to set the sqw Output to 1Hz  
  Wire.endTransmission();                        // Beenden der I2C Kommunitkation
  LC.shutdown(0,false);                          // Disable Standby of the first MAX
  LC.shutdown(1,false);                          // Disable Standby of the first MAX
  LC.setIntensity(0,15);                         // Brightness on max (0-15 on MAX 7221) (0-31 on MAX7219)
  LC.setIntensity(1,15);                         // Brightness on max (0-15 on MAX 7221) (0-31 on MAX7219)
  //Alle_An();                                     // Test All LEDS turnes on
  //delay(1500);                                   // wait 3 seconds
  update=true;
  TimeRead();
}


// Start Main Loop
void loop() {
  wdt_reset();
  /*=>Routine OneButton Control<=*/
  druck=digitalRead(TASTER);
  if (druck==false&&ldruck==true){
    start=millis();
    ldruck=false;
  }
  if (druck==true&&ldruck==false){
    ptime=millis()-start;
    ldruck=true;
  }
  if (ptime>=TIME){
    longpress=true;
    ptime=0;
    //Serialprintln("LONG");  
  }
  if (ptime<TIME&&ptime>=100) {  
    shortpress=true;
    ptime=0;
    //Serialprintln("SHORT");
  }
  /*One Button End*/
  if (longpress==true){
    setmode++;  
    if (setmode==2){
      hhset=hh;
    }
    if (setmode==3){
      ss=0;
      mmset=mm;
    }
    if (setmode==4){
      if(save==true){
        hh=hhset;
        mm=mmset;
        ss=0;
        RTC_Set();
        save=false;
        update=true;
      }
      setmode=0;
    }
    longpress=false;  
    one=false;
  }
  if(shortpress==true){
    if(setmode==2){
      hhset=hhset+1;
      if (hhset>=24){
        hhset=0;
      }
    }
    if (setmode==3){
      mmset=mmset+1;
      if (mmset>=60){
        mmset=0;
      }  
    }
    if (setmode<2){
      if (setmode==1&&lm==true){
        setmode=0;
        update=true;
        lm=false;
      }
      if (setmode==0&&lm==true){  
        setmode=1;
        lm=false;
        update=true;  
      }
    }
    lm=true;  
    shortpress=false;
  }
  sec=digitalRead(RTCIN);
  digitalWrite(5,sec);
  if (sec==true && lsec==false){
    ++ss;                                          // sekunden Zähler aufadieren
    if (ss==60){
      ss=0;
      mm=mm+1;
    }
    if (setmode==1){
      LED_CLEAR();
      print_numbers(ss);
    }
    lsec=true;
  }
  if (setmode==0){
    if(mm!=lmm||update==true){
      TimeRead();
      update=false;
      mm5erRest=mm%5;
      mm5er=mm-mm5erRest;
      update==false;
      if (hh>=13){
        hh=hh-12;
      }
      LED_CLEAR();
      if (mm5erRest==1) P_EINS();
      else if (mm5erRest==2) P_ZWEI();
      else if (mm5erRest==3) P_DREI();
      else if (mm5erRest==4) P_VIER();
      W_ESIST();
      if (mm5er==5||mm5er==25||mm5er==35||mm5er==55){
        M_FUENF();
      }
      if (mm5er==10||mm5er==50){
        M_ZEHN();
      }
      if (mm5er==15||mm5er==45){
        M_VIERTEL();
      }
      if (mm5er==20||mm5er==40){
        M_ZWANZIG();
      }        
      if (mm5er==25||mm5er==30||mm5er==35){
        M_HALB();
      }
      if (mm5er==0){  
        W_UHR();
      }
      if (mm5er==5||mm5er==10||mm5er==15||mm5er==20||mm5er==35){
        W_NACH();
      }
      if (mm5er==25||mm5er==40||mm5er==45||mm5er==50||mm5er==55){
        W_VOR();
      }
      if (mm>=25){
        if (hh==12){
          hh=1;
        }
        else
          hh=hh+1;
      }
      if (hh==1&&mm5er==0) H_EIN();
      else if (hh==1) H_EINS();
      else if (hh==2) H_ZWEI();
      else if (hh==3) H_DREI();
      else if (hh==4) H_VIER();
      else if (hh==5) H_FUENF();
      else if (hh==6) H_SECHS();
      else if (hh==7) H_SIEBEN();
      else if (hh==8) H_ACHT();  
      else if (hh==9) H_NEUN();
      else if (hh==10) H_ZEHN();
      else if (hh==11) H_ELF();
      else if (hh==12||hh==0) H_ZWOELF();

    }
    lmm=mm;
  }
  if (sec==false && lsec==true){
    lsec=false;
  }

  if (setmode==2){
    if (hhset!=lhhset||one==false){
      LED_CLEAR();
      print_numbers(hhset);
      LC.setLed(0,5,0,true); // top left
      LC.setLed(1,5,0,true); // bottom left
      lhhset=hhset;
      one=true;
      save=true;  
    }
  }
  if (setmode==3){
    if (mmset!=lmmset||one==false){
      LED_CLEAR();
      print_numbers(mmset);
      LC.setLed(0,5,7,true); // top right
      LC.setLed(1,5,7,true);// bottom right
      lmmset=mmset;
      one=true;
      save=true;  
    }

  }
}
// End Main Loop


void print_numbers(byte num){   // Funktion zum Dartellen von Dezimalzahlen auf der Matrix
  byte num10;
  byte num1;
  num1=num%10;
  num10=(num-num1)/10;
  switch (num10){
  case 0:
    L_ZERO();
    break;
  case 1:
    L_ONE();
    break;
  case 2:
    L_TWO();
    break;
  case 3:
    L_THREE();
    break;
  case 4:
    L_FOUR();
    break;
  case 5:
    L_FIVE();
    break;
  }
  switch (num1){
  case 0:
    R_ZERO();
    break;
  case 1:
    R_ONE();
    break;
  case 2:
    R_TWO();
    break;
  case 3:
    R_THREE();
    break;
  case 4:
    R_FOUR();
    break;
  case 5:
    R_FIVE();
    break;
  case 6:
    R_SIX();
    break;
  case 7:
    R_SEVEN();
    break;
  case 8:
    R_EIGHT();
    break;
  case 9:
    R_NINE();
    break;
  }
}



* Foto0044.jpg (360.79 KB, 1600x1200 - viewed 61 times.)

* Foto0045.jpg (469.08 KB, 1600x1200 - viewed 48 times.)
« Last Edit: April 13, 2012, 03:08:45 pm by volvodani » Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1148
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

"Die Wörter" für den LEDs

Code:
/* For the LED code below to work, the LEDs need to be wired in a very specific way
 
 Normally a MAX7221's matrix is wired this way (8x8)
 
 dp| a| b| c| d| e| f| g
 0
 1
 2
 4
 5
 6
 7
 
 However, since the clock is 10x11 we wire 2x MAX7221 this way.
 Essentially, row 5,6,7 is transposed into column 9,10,11
 
 [dp,5]                         [g,5]
 -----------------------------------
 dp| a| b| c| d| e| f| g| 5| 6| 7
 0                       |         e - 5
 1                       |         d - 4
 2                       |         c - 3
 3                       |         b - 2
 4                       |         a - 1
 -----------------------------------
 dp| a| b| c| d| e| f| g| 5| 6| 7
 0                       |         e
 1                       |         d
 2                       |         c
 3                       |         b
 4                       |         a
 ------------------------------------
 [dp,5]                         [g,5]
 
 */
// void setLed(int addr, int row, int col, boolean state);
// void setRow(int addr, int row, byte);

// LED Turn on/off procedures
void LED_CLEAR() {
  LC.clearDisplay(0);
  LC.clearDisplay(1);
}

void Alle_An(){
  LC.setRow(0,0,B11111111);  
  LC.setRow(0,1,B11111111);  
  LC.setRow(0,2,B11111111);  
  LC.setRow(0,3,B11111111);  
  LC.setRow(0,4,B11111111);  
  LC.setRow(0,5,B11111111);  
  LC.setRow(0,6,B11111111);  
  LC.setRow(0,7,B11111111);  
  LC.setRow(1,0,B11111111);  
  LC.setRow(1,1,B11111111);    
  LC.setRow(1,2,B11111111);  
  LC.setRow(1,3,B11111111);  
  LC.setRow(1,4,B11111111);    
  LC.setRow(1,5,B11111111);    
  LC.setRow(1,6,B11111111);    
  LC.setRow(1,7,B11111111);  
}

void W_ESIST() {
  LC.setRow(0,0,B11011100);  // ES IST
}

void M_FUENF() {
  LC.setLed(0,0,7, true); // F
  LC.setLed(0,5,5, true); // Ü
  LC.setLed(0,6,5, true); // N
  LC.setLed(0,7,5, true); // F
}

void M_ZEHN() {
  LC.setRow(0,1,B11110000);  // ZEHN
}


void M_ZWANZIG () {
  LC.setRow(0,1,B00001111);  //ZWAN
  LC.setLed(0,5,4,true);      // Z
  LC.setLed(0,6,4,true);      // I
  LC.setLed(0,7,4,true);      // G
}

void M_VIERTEL () {
  LC.setRow(0,2,B00001111);  //VIER
  LC.setLed(0,5,3,true);// T
  LC.setLed(0,6,3,true);// E
  LC.setLed(0,7,3,true);// L
}

void W_NACH () {
  LC.setRow(0,3,B00111100);  //NACH
}

void W_VOR () {
  LC.setRow(0,3,B00000011);  //VO
  LC.setLed(0,5,2,true);// R
}


void M_HALB() {
  LC.setLed(0,4,0,true); //H
  LC.setLed(0,4,1,true); //A
  LC.setLed(0,4,2,true); //L
  LC.setLed(0,4,3,true); //B
}

void H_ZWOELF(){
  LC.setLed(0,4,5,true); //Z
  LC.setLed(0,4,6,true); //W
  LC.setLed(0,4,7,true); //Ö
  LC.setLed(0,5,1,true);// L
  LC.setLed(0,6,1,true);// F
}

void H_ZWEI(){
  LC.setRow(1,0,B11110000);  //ZWEI
}

void H_EIN(){
  LC.setRow(1,0,B00111000);  //EIN
}

void H_EINS(){
  LC.setRow(1,0,B00111100);  //EINS
}

void H_SIEBEN(){
  LC.setRow(1,0,B00000111);  //SIE
  LC.setLed(1,5,5,true);// B
  LC.setLed(1,6,5,true);// E
  LC.setLed(1,7,5,true);// N
}

void H_DREI(){
  LC.setRow(1,1,B01111000);  //DREI
}

void H_FUENF(){
  LC.setRow(1,1,B00000001);  //F
  LC.setLed(1,5,4,true);// Ü
  LC.setLed(1,6,4,true);// N
  LC.setLed(1,7,4,true);// F
}

void H_ELF () {
  LC.setRow(1,2,B11100000);  //ELF
}

void H_NEUN (){
  LC.setRow(1,2,B00011110);  //NEUN
}

void H_VIER (){
  LC.setRow(1,2,B00000001);  //V
  LC.setLed(1,5,3,true);  // I
  LC.setLed(1,6,3,true);  // E
  LC.setLed(1,7,3,true);  // R
}

void H_ACHT (){
  LC.setRow(1,3,B01111000);  //ACHT
}

void H_ZEHN () {
  LC.setRow(1,3,B00000111);  //ZEH
  LC.setLed(1,5,2,true);  // N
}

void H_SECHS(){
  LC.setRow(1,4,B01111100);  //SECHS
}

void W_UHR(){
  LC.setLed(1,5,1,true);  // U
  LC.setLed(1,6,1,true);  // H
  LC.setLed(1,7,1,true);  // R

}

void P_EINS() {
  LC.setLed(0,5,0,true); // top left
}
void P_ZWEI() {
  LC.setLed(0,5,0,true); // top left
  LC.setLed(0,5,7,true); // top right
}
void P_DREI() {
  LC.setLed(0,5,0,true); // top left
  LC.setLed(0,5,7,true); // top right
  LC.setLed(1,5,7,true);// bottom right
}
void P_VIER() {
  LC.setLed(0,5,0,true); // top left
  LC.setLed(0,5,7,true); // top right
  LC.setLed(1,5,7,true);// bottom right
  LC.setLed(1,5,0,true); // bottom left
}

void R_CLEAR() {
  LC.setColumn(0,6,B00000000);
  LC.setColumn(0,7,B00000000);
  LC.setRow(0,5,B00000000);
  LC.setRow(0,6,B00000000);
  LC.setRow(0,7,B00000000);
  LC.setColumn(1,6,B00000000);
  LC.setColumn(1,7,B00000000);
  LC.setRow(1,5,B00000000);
  LC.setRow(1,6,B00000000);
  LC.setRow(1,7,B00000000);

}



// SECONDS COUNTER MODE
void L_ZERO(){
  LC.setRow(0,2,B01110000);
  LC.setRow(0,3,B10001000);
  LC.setRow(0,4,B10011000);
  LC.setRow(1,0,B10101000);
  LC.setRow(1,1,B11001000);
  LC.setRow(1,2,B10001000);
  LC.setRow(1,3,B01110000);
}

void L_ONE(){
  LC.setRow(0,2,B00100000);
  LC.setRow(0,3,B01100000);
  LC.setRow(0,4,B00100000);
  LC.setRow(1,0,B00100000);
  LC.setRow(1,1,B00100000);
  LC.setRow(1,2,B00100000);
  LC.setRow(1,3,B01110000);
}
void L_TWO(){
  LC.setRow(0,2,B01110000);
  LC.setRow(0,3,B10001000);
  LC.setRow(0,4,B00001000);
  LC.setRow(1,0,B00010000);
  LC.setRow(1,1,B00100000);
  LC.setRow(1,2,B01000000);
  LC.setRow(1,3,B11111000);
}
void L_THREE(){
  LC.setRow(0,2,B11111000);
  LC.setRow(0,3,B00010000);
  LC.setRow(0,4,B00100000);
  LC.setRow(1,0,B00010000);
  LC.setRow(1,1,B00001000);
  LC.setRow(1,2,B10001000);
  LC.setRow(1,3,B01110000);
}
void L_FOUR(){
  LC.setRow(0,2,B00010000);
  LC.setRow(0,3,B00110000);
  LC.setRow(0,4,B01010000);
  LC.setRow(1,0,B10010000);
  LC.setRow(1,1,B11111000);
  LC.setRow(1,2,B00010000);
  LC.setRow(1,3,B00010000);
}
void L_FIVE(){
  LC.setRow(0,2,B11111000);
  LC.setRow(0,3,B10000000);
  LC.setRow(0,4,B10000000);
  LC.setRow(1,0,B11110000);
  LC.setRow(1,1,B00001000);
  LC.setRow(1,2,B10001000);
  LC.setRow(1,3,B01110000);
}
void R_ZERO(){
  LC.setColumn(0,6,B00011000);
  LC.setLed(0,2,7,true);
  LC.setLed(0,5,3,true);
  LC.setRow(0,6,B01010000);
  LC.setRow(0,7,B01100000);
  LC.setColumn(1,6,B11100000);
  LC.setColumn(1,7,B01010000);
  LC.setRow(1,5,B00100100);
  LC.setRow(1,6,B00100000);
  LC.setRow(1,7,B00011100);
}
void R_ONE(){
  LC.setLed(0,3,7,true);
  LC.setRow(0,5,B01110000);
  LC.setRow(1,5,B00111100);
  LC.setLed(1,3,7,true);
  LC.setLed(1,6,2,true);
}
void R_TWO(){
  LC.setLed(0,3,6,true);
  LC.setLed(0,2,7,true);
  LC.setLed(0,5,3,true);
  LC.setLed(0,6,3,true);
  LC.setRow(0,7,B01100000);

  LC.setLed(1,3,6,true);
  LC.setColumn(1,7,B00110000);
  LC.setRow(1,5,B00101000);
  LC.setRow(1,6,B00100100);
  LC.setLed(1,7,2,true);
}

void R_THREE(){
  LC.setLed(0,2,6,true);
  LC.setLed(0,2,7,true);
  LC.setRow(0,5,B01010000);
  LC.setRow(0,6,B00110000);
  LC.setLed(0,7,3,true);

  LC.setLed(1,2,6,true);
  LC.setLed(1,3,7,true);
  LC.setLed(1,5,2,true);
  LC.setRow(1,6,B00100100);
  LC.setRow(1,7,B00011000);
}

void R_FOUR(){
  LC.setLed(0,4,7,true);
  LC.setLed(0,5,2,true);
  LC.setRow(0,6,B01110000);

  LC.setColumn(1,6,B11000000);
  LC.setLed(1,1,7,true);
  LC.setLed(1,5,4,true);
  LC.setRow(1,6,B00111100);
  LC.setLed(1,7,4,true);
}

void R_FIVE(){
  LC.setColumn(0,6,B00111000);
  LC.setLed(0,2,7,true);
  LC.setLed(0,5,3,true);
  LC.setLed(0,6,3,true);
  LC.setLed(0,7,3,true);

  LC.setColumn(1,6,B10100000);
  LC.setColumn(1,7,B10010000);
  LC.setRow(1,5,B00100100);
  LC.setRow(1,6,B00100100);
  LC.setRow(1,7,B00011000);
}

void R_SIX(){
  LC.setLed(0,4,6,true);
  LC.setLed(0,3,7,true);
  LC.setLed(0,5,3,true);
  LC.setLed(0,6,3,true);

  LC.setColumn(1,6,B11100000);
  LC.setColumn(1,7,B10010000);
  LC.setRow(1,5,B00100100);
  LC.setRow(1,6,B00100100);
  LC.setRow(1,7,B00011000);
}

void R_SEVEN(){
  LC.setLed(0,2,6,true);
  LC.setLed(0,2,7,true);
  LC.setLed(0,5,3,true);
  LC.setRow(0,6,B01010000);
  LC.setRow(0,7,B00110000);

  LC.setColumn(1,7,B01110000);
  LC.setLed(1,5,5,true);
}

void R_EIGHT(){
  LC.setColumn(0,6,B00011000);
  LC.setLed(0,2,7,true);
  LC.setLed(0,5,3,true);
  LC.setLed(0,6,3,true);
  LC.setRow(0,7,B01100000);

  LC.setColumn(1,6,B01100000);
  LC.setColumn(1,7,B10010000);
  LC.setRow(1,5,B00100100);
  LC.setRow(1,6,B00100100);
  LC.setRow(1,7,B00011000);
}

void R_NINE(){
  LC.setColumn(0,6,B00011000);
  LC.setLed(0,2,7,true);
  LC.setLed(0,5,3,true);
  LC.setLed(0,6,3,true);
  LC.setRow(0,7,B01100000);

  LC.setColumn(1,7,B10010000);
  LC.setRow(1,5,B00100100);
  LC.setRow(1,6,B00010100);
  LC.setRow(1,7,B00001100);
}

// for dot mode - clear the 4 dots only.
void P_CLEAR() {
  LC.setLed(0,5,0,false); // top left
  LC.setLed(0,5,7,false); // top right
  LC.setLed(1,5,0,false); // top left
  LC.setLed(1,5,7,false); // bottom right
}

Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1148
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Teil 3/3

Die RTC befehle (wobei die hälfte nicht benutzt  aus meinem andern Projekt)
Code:
/*
RTC Funktionen zur Steuerung der RTC DS1308
 */
void TimeRead(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.send(0x00);               // Pointer auf Sekunden
  Wire.endTransmission();
  Wire.requestFrom(RTC_ADDRESS, 3);
  ss= bcdToDec(Wire.receive() & 0x7f);
  mm= bcdToDec(Wire.receive());
  hh= bcdToDec(Wire.receive());

}

void HourRead(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.send(0x02);               // Pointer auf Sekunden
  Wire.endTransmission();
  Wire.requestFrom(RTC_ADDRESS, 1);
  hh= bcdToDec(Wire.receive());
  //Serial.println("Stundenlesen");
}

void MinuteRead(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.send(0x01);               // Pointer auf Sekunden
  Wire.endTransmission();
  Wire.requestFrom(RTC_ADDRESS, 1);
  mm= bcdToDec(Wire.receive());
  //Serial.println("Minutenlesen");
}

void SecondRead(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.send(0x00);               // Pointer auf Sekunden
  Wire.endTransmission();
  Wire.requestFrom(RTC_ADDRESS, 1);
  ss=bcdToDec(Wire.receive() & 0x7f);
  //Serial.println("Sekundenlesen");
}

void RTC_Set(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.send(0x00);
  Wire.send(decToBcd(ss));    // 0 to bit 7 starts the clock
  Wire.send(decToBcd(mm));
  Wire.send(decToBcd(hh));      // If you want 12 hour am/pm you need to set
  Wire.endTransmission();
}

byte decToBcd(byte val)
{
  return ((val/10)<<4)+(val%10);
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ((val>>4)*10)+val%16;
}


void SaveByte(byte x,byte y){                       // Funktion SaveByte("Position","Daten") Daten in Byte Format
  Wire.begin();                                     // Start I2C Kommunikation
  Wire.beginTransmission(RTC_ADDRESS);              // Beginn Kommunikation auf  Adresse 0x68
  Wire.send(x+7);                                // Speicher Register Adresse+0x07   
  Wire.send(y);                                     // zu Speicherndes Byte
  Wire.endTransmission(); 
}

byte ReadByte(byte x){                             // Funktion ReadByte ("Position") Daten in Byte Format
  byte z;
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.send(x+7);
  Wire.endTransmission();
  Wire.requestFrom(RTC_ADDRESS, 1);
  z=Wire.receive();
  return z;
}

Ich nutze die 0023 IDE weil mich die änderungen der 1.0 bzüglich I2C ankotzen. Ich kann nicht einefach 0x00 als Adresse angeben man muss das bei der 1.0 über ein zusätzliche Variable machen.
Ich habe sämtliche andeungen gemach und den Code soweit zusammenestrichen das ich von 10800bytes auf 9384bytes
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1148
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Laut Arduino Test Suite habe ich noch 1068byte Free Ram
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1148
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Keiner ein Idee?

Ich meine mit der watchdog funktioniert das ja auch. Ich habe jetzt noch den Bootloader rausgeworfen und mit ISP geflasht dann sieht man den Reset der Watchdog auch nicht mehr, aber ich würde es schon gern verstehen.
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21939
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo volvodani,
hängen meinst Du daß der Sketch nicht mehr weiterverarbeitet wird und Du den Arduino resettieren mußt?
Hat die Anzeige etwas mit dem blockieren zu tun? zb in der geleichen Stunde oder Minuten-Stundenkombination?
Wenn Du die Uhr immer mit 00:00 startest blockierst die sich nach einer zufälligen Zeit oder nach der gleichen Zeit?
Kannst Du uns einen Schaltplan geben?
Benutzt Du wirklich einen DS1308? (das ist ein DS1307 im ball grid array Gehäuse)

Zum Sketch:
Die RTC lesen:
Ich würde alle Register bein lesen maskieren und die nicht benutzten bits mittels &0x.. auf null setzen.
Während des Lesens der Zeit mit der Funktion TimeRead(){ solltest Du die RTC stoppen (CH bit im Sekunden auf 1 setzen) Sekunden , Minuten und Stunden lesen und dann die RTC wieder starten. So verhinderst Du beim Übergang von 59 auf 00  eine inkonsitenze Zeit.
Beispiel aus einer Bibiothek (written by  mattt on the Arduino forum and modified by D. Sjunnesson): Im Beispiel
Code:
void DS1307::stop(void)
{
  // set the ClockHalt bit high to stop the rtc
  // this bit is part of the seconds byte
  rtc_bcd[DS1307_SEC]=rtc_bcd[DS1307_SEC] | DS1307_CLOCKHALT;
  save();
}

void DS1307::start(void)
{
  // unset the ClockHalt bit to start the rtc
  // TODO : preserve existing seconds
  rtc_bcd[DS1307_SEC]=0;
  save();
}

Später mehr.
Grüße Uwe
« Last Edit: April 15, 2012, 03:49:01 am by uwefed » Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1148
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ist ja das kuriose die Uhr bleibt nach unterschiedlichen laufzeiten. Also nach 2 oder 5 oder 7std stehen. Die AVR ist komplett tot keine Serial ausgabe mehr kein "lifebit" auf der haertbeatLED und keine Reaktion auf irgendwas. Die RTC läuft weiter.
Es ist tatsächlich ein DS1307 von MAXIM (kleiner verschreiber).
Sie bleibt auch nicht bei bestimmten zeiten stehen. Die Frage ist nur. Gibt es bekannte Funktionen die "Reste" im RAM hinterlassen und den dann "vollspammen"? Das einzige was hier abhilfe geschaffen hat war halt die watchdog die zurückbeist wenn man sie nicht innerhalb 2s beisst.
Die RTC wird sowieso nur nach ablauf einer vollen Minuten ausgelen also 13:31:00 13:32:00 usw. das denke ich muss eigentlich keine inkonsitenten zeiten geben.

Schaltplan habe ich jetzt nichts schriftliches.
Die RTC hängt über I2C an den A4 und A5. Den RTC Puls(Pulldown)habe über intern Pullups an Klemme 2. Die MAX7221 hängen als Daisy Chain an der SPI Schnittstelle (13sck,11mosi,10cs). Ein Taster gegen GND über interne Pullups am Eingang 8. Mehr ist nicht.
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Mainz
Offline Offline
Newbie
*
Karma: 0
Posts: 48
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

so ein Fehler zu finden ist natuerlich schwer..
Ich wuerde das ganze mal im AVR Studio realisieren mit anderen Libs, vielleicht geht es dann..
Damnn waere irgend ein Bug in der Arduino Umgebung.

Gruss
Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1148
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi Odysee,
hast du gesehen wieviel Prog aufwand leider nix fertiges für AVR und MAX7721 gefunden. Und der aufwand lohnt sich kaum. es funktioniert ja so wie es ist. Ich persönlich finde das nicht zufriedenstellend, weil ich auf "meine" Fehler immer eine Antwort haben muss!!! Ich habe 3Tage lang alles mögliche ausprobiert aber ich bin zu keinem Ziel gekommen. Ich habe an die SPI-Sache gedacht aber der "schreibt" ja nur in Richtung Slave. Und ohne SPI geht das nicht weil im Shift OUt es immer kurz flackert, was halt unangenehm auffällt. 
Gruß
Daniel
« Last Edit: April 22, 2012, 05:11:56 am by volvodani » Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Pages: [1]   Go Up
Jump to: