Forum: Mikrocontroller und Digitale Elektronik Arduino in C Convertieren für AVR-ISR MK2


von Basstler (Gast)


Lesenswert?

Hi ihr,
ich habe eine Frage.. und zwar ob ich diesen Arduino Code so richtig in 
C umgeschrieben habe und wie ich in der untersten Funktion Ton() die 
Ausgangspins setzen kann weil PORTB = 0b00000001 also Pin B0 = 1 nimmt 
er nich.... vermute mal dass es was mit der Sichtbarkeit zu tun hat also 
ob Globale Variable oder Lokale...

Ich muss dazu sagen ich bin totaler Anfänger in diesem Thema und naja 
boxe mich mit meinem Java Wissen etwas durch und einigen tutorials... 
aber alles kann man sich da halt nicht rauslesen...^^

Hatte zuerst versucht mit einem Arduino einen ATTINY 84 und einen 
ATMEGA8 zu flashen aber iwi gab das nur probleme deshalb bin ich jetzt 
kurzfristig auf das AVR-ISP-MK2 umgestiegen was ich aber erst am Montag 
bekomme. Wollte aber mal vorrab von euch wissen ob man das so machen 
kann.


Danke schonmal vielmals!!!



Hier der Arduino Code und weiter unten der Übersetzte C-Code für das 
AVR-Studio:

########################################################
########################################################
################### Arduino-Code #######################
########################################################
########################################################


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

// Lautsprecherausgang
const byte Ton = 10;



// Analog-Pins 0, 1, 2, 3,
const int TP1A = 0;
const int TP1B = 1;
const int TP2A = 2;
const int TP2B = 3;
const int TP3A = 4;
const int TP3B = 5;

// 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);

}


########################################################
########################################################
####################### C-Code #########################
########################################################
########################################################

#include <avr/io.h>
#include <util/delay.h>
#define NOTE1 1047
#define NOTE2 2048
#define NOTE3 3056

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

// Counter für die Lautstärkeregelung
uint16_t counter1 = 0;
uint16_t counter2 = 0;

// Caryflags für Sensorlogik
unsigned next:1  = 0;
unsigned wait:1  = 0;
unsigned play:1  = 0;
unsigned reset:1 = 0;
unsigned hupe1:1 = 0;
unsigned hupe2:1 = 0;

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

int main(void)
{
  // 0 = Output und 1 = Input
  DDRB = 0b00000001;

  // Alles entladen
  DDRA  = 0b00111111;
  PORTA = 0b00000000;

  _delay_us(5);

  Kalibration();

    while(1)
    {
    // 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();
    }
}

void Kalibrierung(){

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

    Kapazitaet();
    Kapazitaet();

    Kalibrationarray1[i] = readADC(0);
    Kalibrationarray2[i] = readADC(2);
    Kalibrationarray3[i] = readADC(4);
    _delay_ms(4);
    if(i>214){
      Kalibration1 = Kalibration1 + Kalibrationarray1[i];
      Kalibration2 = Kalibration2 + Kalibrationarray2[i];
      Kalibration3 = Kalibration3 + Kalibrationarray3[i];
      j++;
    }

  }

  Kalibration1 = Kalibration1 / j;
  Kalibration2 = Kalibration2 / j;
  Kalibration3 = Kalibration3 / j;

}

void Kapazitaet(){

  // damit keine Ladung abfliessen kann werden beide Als Input 
geschaltet
  // 0 = Output und 1 = Input
  DDRA  = 0b11111111;
  PORTA = 0b00000000;

  _delay_us(5);

  // C wird aufgeladen
  // Pin 0,2,4 werden zu OUTPUTS
  // Pin 0,2,4 werden High geschalten
  DDRA  = 0b11101010;
  PORTA = 0b00010101;

  _delay_us(5);

  DDRA  = 0b11111111;
  PORTA = 0b00000000;

  // Ladung aus C abfuehren auf GND
  // Pin 1,3,5 werden OUTPUT und LOW
  DDRA  = 0b11010101;
  PORTA = 0b00000000;
}

uint16_t readADC(uint8_t channel) {
  uint8_t i;
  uint16_t result = 0;

  // ADEN wird 1 gesetzt = ADC aktivieren
  // ADPS2 = 1 und ADPS1 = 1  beduetet:
  // Teilungsfaktor ist = 64
  // Quelle: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe#Messen_eines_Widerstandes
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);

  // ADMUX wählt den zu messenden Kanal
  // "channel" des Multiplexers waehlen
  // REFS1 = 1 und REGS0 = 1 Interne Referenzspannung verwenden (also 
2,56 V)
  // REFS1 = 0 und REGS0 = 0 Externe Regerenzspannung verwenden ()
  ADMUX = channel | (1<<REFS1) | (1<<REFS0);

  // ADCSRA initialisiert den ADC und definiert dessen Funktion
  // Den ADC initialisieren und einen sog. Dummyreadout machen
  // ADSC bleibt solange 1 bist die Konvertierung abgeschlossen ist
  ADCSRA |= (1<<ADSC);
  while(ADCSRA & (1<<ADSC));

  // Jetzt 3x die analoge Spannung and Kanal channel auslesen
  // und dann Durchschnittswert ausrechnen.
  for(i=0; i<3; i++) {
    // Eine Wandlung
    ADCSRA |= (1<<ADSC);
    // Auf Ergebnis warten...
    while(ADCSRA & (1<<ADSC));

    result += ADCW;
  }

  // ADC wieder deaktivieren
  ADCSRA &= ~(1<<ADEN);

  result /= 3;

  return result;
}

void Sensorlogik (){
  // Ermitteln und zuweißen des Werts am Analogen-Eingang A1 und A2
  sensorValue1 = readADC(0);
  sensorValue2 = readADC(2);
  sensorValue3 = readADC(4);

  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_ms(100);
    Tone(30);
    _delay_ms(100);
    Tone(20);
    _delay_ms(100);

  }

}

void Tone (uint8_t  Laenge){


  PIN0 = 0b00000001;
  _delay_us(Laenge);
  digitalWrite(Ton,LOW);
  _delay_us(Lange);

}

von Peter II (Gast)


Lesenswert?

Basstler schrieb:
> void Tone (uint8_t  Laenge){
>   PIN0 = 0b00000001;
>   _delay_us(Laenge);
>   digitalWrite(Ton,LOW);
>   _delay_us(Lange);
> }


Laenge != Lange

_delay_us funktioniert nur mit Konstanten werten, also keine Variabelen. 
Die Wartezeiten stimmen sonst nicht.

von Thomas E. (thomase)


Lesenswert?

Schön daß eine Maus ein Scrollrad hat. Wie wäre es trotzdem damit, die 
Codes als Datei anzuhängen?

mfg.

von Basstler (Gast)


Lesenswert?

oh ok sry auf die idee bin ich grad nich gekommen :D

von Basstler (Gast)


Lesenswert?

kann man den Post löschen dann mach ich nen neuen wo die Codes angehängt 
sind als Datei ;)

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.