Forum: Mikrocontroller und Digitale Elektronik Attiny 44 an Ardunio problem.


von Simon F. (snape6666)


Lesenswert?

Hi ihr,
ich will mit dem Arudino Board einen Atiny programieren... kleinere 
Programme funktionieren auch anur mein richtiges mag er nicht...


und zwar sollen die Pins 0-5 als Analoge ins bzw outs funktionieren und 
dann 3 kleine Touchfelder abfragen und analog auslesen...

mit dem arduino board klappt das auch alles einwandfrei...

nur mit dem Attiny mag das nicht oO

Weder Töne noch sonst was gibt er mit im Loop aus... scheint so als 
würde er sich vorrher aufhängen....

hier mal der Quellcode... Hat jemand eine Ide??? =( =(





/*********************************************************************** 
***********
 * Allgemeine Deklaration
 ************************************************************************ 
**********/
#define NOTE1    40
#define NOTE2    30
#define NOTE3    20

// Lautsprecherausgang
const int Ton = 10;



// Analog-Pins 0, 1, 2, 3,
const int TP1A = A0;
const int TP1B = A1;
const int TP2A = A2;
const int TP2B = A3;
const int TP3A = A4;
const int TP3B = A5;

// Sensorwert
// unten für die Abfrage des Sensorwerts nötig
int sensorValue1 = 0;
int sensorValue2 = 0;
int sensorValue3 = 0;
// Counter für die Lautstärkeregelung
int counter1 = 0;
int counter2 = 0;

//Caryflags für Sensorlogik
byte next  = 0;
byte wait  = 0;
byte play  = 0;
byte reset = 0;
byte hupe1 = 0;
byte hupe2 = 0;

// Kalibration
// die ersten 256 Messwerte werden summiert und mit Hilfe der letzten 50 
Werte wird der Mittelwert bestimmt
int Kalibrationarray1[256];
int Kalibration1 = 0;
int Kalibrationarray2[256];
int Kalibration2 = 0;
int Kalibrationarray3[256];
int Kalibration3 = 0;




/*********************************************************************** 
***********
 * Hauptprogramm
 ************************************************************************ 
**********/
// Führt die Deklaration der Pins durch sowie die Kalibrierung der 
Sensorik
void setup(void){

  pinMode(Ton,OUTPUT);

  // Zuweisung der Pins für Sensorik
  pinMode(TP1A,OUTPUT);
  pinMode(TP1B,OUTPUT);
  pinMode(TP2A,OUTPUT);
  pinMode(TP2B,OUTPUT);
  pinMode(TP3A,OUTPUT);
  pinMode(TP3B,OUTPUT);

  // Alles entladen
  digitalWrite(TP1A, LOW);
  digitalWrite(TP1B, LOW);
  digitalWrite(TP2A, LOW);
  digitalWrite(TP2B, LOW);
  digitalWrite(TP3A, LOW);
  digitalWrite(TP3B, LOW);

  delayMicroseconds(5);


  Kalibrierung();

}

void loop(){

  digitalWrite(Ton,HIGH);
  delayMicroseconds(30);
  digitalWrite(Ton,LOW);
  delayMicroseconds(30);

  // Laed und entlaed die Kondensatoren stetig
  // und erzeugt eine konstante Spannung
  // deren Aenderung kann anschliessend gemessen werden
  Kapazitaet();
  Kapazitaet();

  // erkennt Spannungsaenderungen
  // leitet entsprechende Aktionen ein
  Sensorlogik();

}


/*********************************************************************** 
***********
 * Kalibrierung
 ************************************************************************ 
**********/
void Kalibrierung(){
  // 256 Messwerte werden summiert und anschließend die letzten 50 zur 
Bildung eines Mittelwerts benutzt
  for (int i=0; i<255; i++){

    Kapazitaet();
    Kapazitaet();

    Kalibrationarray1[i] = analogRead(TP1A);
    Kalibrationarray2[i] = analogRead(TP2A);
    Kalibrationarray3[i] = analogRead(TP3A);
    delay(4);

  }

  for(int i=215; i<255; i++){
    Kalibration1 = Kalibration1 + Kalibrationarray1[i];
    Kalibration2 = Kalibration2 + Kalibrationarray2[i];
    Kalibration3 = Kalibration3 + Kalibrationarray3[i];
  }

  Kalibration1 = Kalibration1 / 40;
  Kalibration2 = Kalibration2 / 40;
  Kalibration3 = Kalibration3 / 40;

}

/*********************************************************************** 
***********
 * Kapazitive Schaltung
 ************************************************************************ 
**********/
void Kapazitaet(){

  // damit keine Ladung abfliessen kann werden beide Als Input 
geschaltet
  pinMode(TP1A,INPUT);
  pinMode(TP1B,INPUT);
  digitalWrite(TP1A, LOW);
  digitalWrite(TP1B, LOW);
  pinMode(TP2A,INPUT);
  pinMode(TP2B,INPUT);
  digitalWrite(TP2A, LOW);
  digitalWrite(TP2B, LOW);
  pinMode(TP3A,INPUT);
  pinMode(TP3B,INPUT);
  digitalWrite(TP3A, LOW);
  digitalWrite(TP3B, LOW);


  delayMicroseconds(5);


  // C wird aufgeladen
  pinMode(TP1A,OUTPUT);
  digitalWrite(TP1A, HIGH);
  pinMode(TP2A,OUTPUT);
  digitalWrite(TP2A, HIGH);
  pinMode(TP3A,OUTPUT);
  digitalWrite(TP3A, HIGH);


  delayMicroseconds(5);


  pinMode(TP1A,INPUT);
  digitalWrite(TP1A, LOW);
  pinMode(TP2A,INPUT);
  digitalWrite(TP2A, LOW);
  pinMode(TP3A,INPUT);
  digitalWrite(TP3A, LOW);

  // Ladung aus C abfuehren auf GND
  pinMode(TP1B,OUTPUT);
  digitalWrite(TP1B, LOW);
  pinMode(TP2B,OUTPUT);
  digitalWrite(TP2B, LOW);
  pinMode(TP3B,OUTPUT);
  digitalWrite(TP3B, LOW);
}

/*********************************************************************** 
***********
 * Sensor Logik
 ************************************************************************ 
**********/

void Sensorlogik (){
  // Ermitteln und zuweißen des Werts am Analogen-Eingang A1 und A2
  sensorValue1 = analogRead(TP1A);
  sensorValue2 = analogRead(TP2A);
  sensorValue3 = analogRead(TP3A);

  if(sensorValue1 > Kalibration1 + 10  &&  sensorValue2 < Kalibration2 + 
11  &&  sensorValue3 < Kalibration3 + 11){

    Tone(40);

  }

  if(sensorValue2 > Kalibration2 + 10  &&  sensorValue2 < Kalibration1 + 
11  &&  sensorValue3 < Kalibration3 + 11){

    Tone(30);

  }

  if(sensorValue3 > Kalibration3 + 10  &&  sensorValue1 < Kalibration1 + 
11  &&  sensorValue2 < Kalibration2 + 11){

    Tone(20);

  }

  if(sensorValue1 > Kalibration1 + 10  &&  sensorValue2 > Kalibration2 + 
11){

    Tone(40);
    delay(100);
    Tone(30);
    delay(100);
    Tone(20);
    delay(100);

  }

}

void Tone (int Laenge){

  digitalWrite(Ton,HIGH);
  delayMicroseconds(Laenge);
  digitalWrite(Ton,LOW);
  delayMicroseconds(Laenge);

}

von Simon F. (snape6666)


Lesenswert?

wie geasgt mit Ardunio klappt ales einwadnfrei... nur mit dem Tiny 
noch...

was muss ich wie anderst deklarieren?? :'(



danke schonmal!!!

von Sam .. (sam1994)


Lesenswert?

Mal überlegt wie viel SRAM der Attiny hat?

von simon fritz (Gast)


Lesenswert?

also 4kbit speicher hat er sram kp oO meinste das reicht nich? oO shit..

von Sam .. (sam1994)


Lesenswert?

Im Datenblatt steht wieviel sram er hat. Die Größe der Datentypen hier: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Ganzzahlige_Datentypen_.28Integer.29

von simon fritz (Gast)


Lesenswert?

hättest du eine idee was ich kürzen könnte?

muss doch iwi gehn oder?^^

von simon fritz (Gast)


Lesenswert?

was wird denn alles ausgelagert?

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Notfalls Assembler nehmen, das spart sehr viel Platz.

Oder einfach auf den ATtiny84A umsteigen, der hat doppelt so viel 
Speicherplatz.

von simon fritz (Gast)


Lesenswert?

hm... kk mal schaun---

kann ich mit Aruino Assempler programieren?

wenn ja wie?^^

von Sam .. (sam1994)


Lesenswert?

Attiny84 reicht auch nicht, solange der so speicherfressend programmiert 
wird. Nicht der µC ist falsch, sondern das Konzept.

Welche Variablen belegen am meisten sram?
Bei über 1,5KB hast du Glück gehabt das dein Arduino Board noch gereicht 
hat.

von simon fritz (Gast)


Lesenswert?

wo kann ich das sehen? bin da leider noch recht neu in dem Gebiet... -.- 
sry^^

von simon fritz (Gast)


Lesenswert?

so is besser....

es kommt immrehin schon was aber es knallt nur... normal sollte der ton 
gehalten werden der in "ton" erzeugt wird...



/*********************************************************************** 
***********
 * Allgemeine Deklaration
 ************************************************************************ 
**********/
#define NOTE1    40
#define NOTE2    30
#define NOTE3    20

// Lautsprecherausgang
const byte Ton = 10;



// Analog-Pins 0, 1, 2, 3,
const byte TP1A = 0;
const byte TP1B = 1;
const byte TP2A = 2;
const byte TP2B = 3;


// Sensorwert
// unten für die Abfrage des Sensorwerts nötig
int sensorValue1 = 0;
int sensorValue2 = 0;
int sensorValue3 = 0;

int counter = 0;


// Kalibration
// die ersten 256 Messwerte werden summiert und mit Hilfe der letzten 50 
Werte wird der Mittelwert bestimmt
int Kalibration1 = 0;
int Kalibration2 = 0;





/*********************************************************************** 
***********
 * Hauptprogramm
 ************************************************************************ 
**********/
// Führt die Deklaration der Pins durch sowie die Kalibrierung der 
Sensorik
void setup(void){

  pinMode(Ton,OUTPUT);

  // Zuweisung der Pins für Sensorik
  pinMode(TP1A,OUTPUT);
  pinMode(TP1B,OUTPUT);
  pinMode(TP2A,OUTPUT);
  pinMode(TP2B,OUTPUT);


  // Alles entladen
  digitalWrite(TP1A, LOW);
  digitalWrite(TP1B, LOW);
  digitalWrite(TP2A, LOW);
  digitalWrite(TP2B, LOW);


  delayMicroseconds(5);

  for(int i=0; i <= 250; i++){
    Kapazitaet();
  }

  Kalibration1 = analogRead(TP1A);
  Kalibration2 = analogRead(TP2A);

}

void loop(){


  // Laed und entlaed die Kondensatoren stetig
  // und erzeugt eine konstante Spannung
  // deren Aenderung kann anschliessend gemessen werden
  Kapazitaet();


  // erkennt Spannungsaenderungen
  // leitet entsprechende Aktionen ein
  Sensorlogik();


}


/*********************************************************************** 
***********
 * Kapazitive Schaltung
 ************************************************************************ 
**********/
void Kapazitaet(){

  // damit keine Ladung abfliessen kann werden beide Als Input 
geschaltet
  pinMode(TP1A,INPUT);
  pinMode(TP1B,INPUT);
  digitalWrite(TP1A, LOW);
  digitalWrite(TP1B, LOW);
  pinMode(TP2A,INPUT);
  pinMode(TP2B,INPUT);
  digitalWrite(TP2A, LOW);
  digitalWrite(TP2B, LOW);




  delayMicroseconds(5);


  // C wird aufgeladen
  pinMode(TP1A,OUTPUT);
  digitalWrite(TP1A, HIGH);
  pinMode(TP2A,OUTPUT);
  digitalWrite(TP2A, HIGH);



  delayMicroseconds(5);


  pinMode(TP1A,INPUT);
  digitalWrite(TP1A, LOW);
  pinMode(TP2A,INPUT);
  digitalWrite(TP2A, LOW);


  // Ladung aus C abfuehren auf GND
  pinMode(TP1B,OUTPUT);
  digitalWrite(TP1B, LOW);
  pinMode(TP2B,OUTPUT);
  digitalWrite(TP2B, LOW);

}

/*********************************************************************** 
***********
 * Sensor Logik
 ************************************************************************ 
**********/

void Sensorlogik (){
  // Ermitteln und zuweißen des Werts am Analogen-Eingang A1 und A2
  sensorValue1 = analogRead(TP1A);
  sensorValue2 = analogRead(TP2A);

  if( sensorValue1 > Kalibration1 + 10  &&  sensorValue2 < Kalibration2 
+ 11){

    Tone(40);

  }

  if(sensorValue2 > Kalibration2 + 10  &&  sensorValue1 < Kalibration1 + 
11){

    Tone(30);

  }

  if(sensorValue1 > Kalibration1 + 10  &&  sensorValue2 > Kalibration2 + 
10){

    Tone(40);
    delay(100);
    Tone(30);
    delay(100);
    Tone(20);
    delay(100);

  }

}

void Tone (int Laenge){

  digitalWrite(Ton,HIGH);
  delayMicroseconds(Laenge);
  digitalWrite(Ton,LOW);
  delayMicroseconds(Laenge);

}

von simon fritz (Gast)


Lesenswert?

so......

es töner aber noch nicht richtig... aberimmerhin kommt schon was raus...

was kann ich noch vereinfachen finde nichts ehr =(




/*********************************************************************** 
***********
 * Allgemeine Deklaration
 ************************************************************************ 
**********/

// Lautsprecherausgang
const byte Ton = 10;

// Analog-Pins 0, 1, 2, 3,
const byte TP1A = 0;
const byte TP1B = 1;
const byte TP2A = 2;
const byte TP2B = 3;

int sensorValue1 = 0;
int sensorValue2 = 0;
int sensorValue3 = 0;

int Kalibration1 = 0;
int Kalibration2 = 0;





/*********************************************************************** 
***********
 * Hauptprogramm
 ************************************************************************ 
**********/

void setup(void){

  pinMode(Ton,OUTPUT);

  // Zuweisung der Pins für Sensorik
  pinMode(TP1A,OUTPUT);
  pinMode(TP1B,OUTPUT);
  pinMode(TP2A,OUTPUT);
  pinMode(TP2B,OUTPUT);


  // Alles entladen
  digitalWrite(TP1A, LOW);
  digitalWrite(TP1B, LOW);
  digitalWrite(TP2A, LOW);
  digitalWrite(TP2B, LOW);


  delayMicroseconds(5);

  for(byte i=0; i <= 150; i++){
    Kapazitaet();
  }

  Kalibration1 = analogRead(TP1A);
  Kalibration2 = analogRead(TP2A);

}

void loop(){


  Kapazitaet();


  Sensorlogik();


}


/*********************************************************************** 
***********
 * Kapazitive Schaltung
 ************************************************************************ 
**********/
void Kapazitaet(){

  pinMode(TP1A,INPUT);
  pinMode(TP1B,INPUT);
  digitalWrite(TP1A, LOW);
  digitalWrite(TP1B, LOW);
  pinMode(TP2A,INPUT);
  pinMode(TP2B,INPUT);
  digitalWrite(TP2A, LOW);
  digitalWrite(TP2B, LOW);




  delayMicroseconds(5);



  pinMode(TP1A,OUTPUT);
  digitalWrite(TP1A, HIGH);
  pinMode(TP2A,OUTPUT);
  digitalWrite(TP2A, HIGH);



  delayMicroseconds(5);


  pinMode(TP1A,INPUT);
  digitalWrite(TP1A, LOW);
  pinMode(TP2A,INPUT);
  digitalWrite(TP2A, LOW);


  pinMode(TP1B,OUTPUT);
  digitalWrite(TP1B, LOW);
  pinMode(TP2B,OUTPUT);
  digitalWrite(TP2B, LOW);

}

/*********************************************************************** 
***********
 * Sensor Logik
 ************************************************************************ 
**********/

void Sensorlogik (){
  // Ermitteln und zuweißen des Werts am Analogen-Eingang A1 und A2
  sensorValue1 = analogRead(TP1A);
  sensorValue2 = analogRead(TP2A);

  if( sensorValue1 > Kalibration1 + 10  &&  sensorValue2 < Kalibration2 
+ 11){

    Tone(40);

  }

  if(sensorValue2 > Kalibration2 + 10  &&  sensorValue1 < Kalibration1 + 
11){

    Tone(30);

  }

  if(sensorValue1 > Kalibration1 + 10  &&  sensorValue2 > Kalibration2 + 
10){

    Tone(40);
    delay(100);
    Tone(30);
    delay(100);
    Tone(20);
    delay(100);

  }

}

void Tone (int Laenge){

  for(byte i=0; i <= 250; i++){
  digitalWrite(Ton,HIGH);
  delayMicroseconds(Laenge);
  digitalWrite(Ton,LOW);
  delayMicroseconds(Laenge);
  }

}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.