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