Hallo Community, bin neu hier und versuche mein Glück jetzt einfach mal, vielleicht kann mir ja der eine oder andere auf die Sprünge helfen.
Derzeit sitze ich vor einem etwas komplizierteren Projekt und zwar soll von einem Drucksensor die Analogen-Werte mittels AD-Wandler in Digitale-Werte umgewandelt werden.
Einfach gesagt als getan. Die Auflösung beträgt 16 Bit des ADC, das Interface hab ich aus dem Internet (Arduino-Sketch) mittels Atmel-Studio 7 in eine .cpp Datei umgewandelt und dann in mein c-file eingefügt, jedoch weiß ich nicht warum es nicht funktioniert!!!!
Der Arduino-Sketch alleine funktioniert in Atmel-Studio, jedoch in Verbindung mit den Anderen Code-Elementen kann ich keine Messwerte aufzeichnen!
Zur Funktionsweise - Wie die Daten erfasst und gespeichert werden sollen:
- Aufnahme der Sensorwerte mit einer Abtastfrequenz von 100 Hz, alle 10ms soll in der Interruptservice-Routine des Timers der Messwert in einem Array abgespeichert werden.
Beim Übersetzen des c-Codes entstehen keine Fehler, jedoch erfolgt keine Datenerfassung.
Hier der Code!
//---------------------------------------------------------------------------------------------------------------
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <math.h>
#define ANZ 8000 //Anzahl Werte im Array//Globale Variablen
//Varibalen deklarieren
volatile unsigned int millisekunden=0;
volatile int start = 0;
volatile float werte[ANZ]; //Array für Messwerte
volatile int zaehler; //Schrittzähler des Timers, wie oft ISR ausgeführt
//Initialisierung von PORTB, PORTD sowie Interrupt 0
void mcu_init()
{
DDRB |= 0xFF; //Ausgang definieren an Register B für Ansteurung Pumpe, Ventil
DDRD |= 0x00; //Eingang definieren an Register D
PORTD |= 0x04; //Pull-up Widerstand, Read-Mode Einstellung für Taster
//Register setzen für Interrupt
PCICR |= (1<<PCIE0); //Pin Change Interrupt Control Register aktivieren int0, PB0
EIMSK |= (1<<INT0); //Externen INT 0 aktivieren
EICRA |= 0b00000010; //Einstellung wie reagiert werden soll (bei fallender Flanke hier zum Beispiel)
sei(); //enable interrupts
}
//Initialisierung Timer0 im CTC-Modus
void mcu_timer0()
{
// Timer 0 konfigurieren
TCCR0A |= (0<<COM0A0) | (1<<COM0A1) | (0<<COM0B0) | (0<<COM0B1); // compare Output Mode OC0A clear on compare match
TCCR0A |= (1<<WGM01); // CTC Modus
TCCR0B |= (1<<CS01) | (1<<CS00); // Prescaler 64
// ((16000000/64)/1000) = 250 (counts to 250, and 1ms has passed)
OCR0A = 250-1;
// Compare Interrupt A von Timer 0 erlauben
TIMSK0 = (1<<OCIE0A);
TCNT0=0x00; //zählt Zählschritte bis zum Comparematch - an Comparematch erfolgt vergleich mit OCR0A-Wert und löst Interrupt aus
// Global Interrupts aktivieren
sei();
}
/*
Der Compare Interrupt Handler
wird aufgerufen, wenn
TCNT0 = OCR0A = 250-1
ist (250 Schritte), d.h. genau alle 1 ms
*/
ISR(TIMER0_COMPA_vect)
{
millisekunden++;
if(millisekunden == 10)
{
if (zaehler == ANZ)
{
start=1;
}
else
{
werte[zaehler++] = Voltage(0);
}
}
}
//Interrupt-Service_Routine zum Ein und Ausschalten von Motor und Ventil
ISR(INT0_vect)
{
PORTB = 0b00000011; //Motor Start - Ventil Schließen
_delay_ms(10000);
PORTB = 0x00;
}
int main(void)
{
mcu_init();
mcu_timer0();
while (1)
{
}
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------------------------------------------
/*Arduino-Sketch für ADS1115 */
//Bibliotheken die benötigt werden sind hier eingefügt
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 ads(0x48);
float Voltage = 0.0;
void setup(void)
{
Serial.begin(9600); //Baudrate
ads.begin();
}
void loop(void)
{
int16_t adc0; // we read from the ADC, we have a sixteen bit integer as a result
adc0 = ads.readADC_SingleEnded(0);
Voltage = (adc0 * 0.1875) / 1000;
Serial.print("AIN0: ");
Serial.print(adc0);
Serial.print("\tVoltage: ");
Serial.println(Voltage, 7);
Serial.println();
//Serial.println("test");
delay(10); //Zeitabstände der gemessenen Werte einstellen auf eine Abtastung von 10ms
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------------------------------------------