Error Arduino Uno 328P im AVR-Studio

Hallo alle zusammen!

Ich bekomme immer beim “builden” diesen Error

…/Sinus_PWM.c:163:1: error: expected declaration or statement at end of input

Wäre sehr dankbar, wenn mir wer von euch helfen könnte ! :slight_smile:

Danke, Christoph!

Hier der Code:


/*

  • Pulsweitenmodulation
  • PWM ATmega328P im Fast-PWM mode
  • mit Timer/Counter1
  • Ausgabe eines Dreieck-Signales
  • HTL St.Pölten

*/

#ifndef F_CPU
#define F_CPU 16e6
#endif

#define TEILER 250
#define PI 3.1415926536

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdbool.h>
#include <math.h>

volatile uint8_t lowbyte, highbyte; // LOW- und HIGH-Byte von ADC
volatile uint16_t ADC_ergebnis; // Variable für das ADC-Ergebnis
volatile float rechenwert; // normierter Wert im Programm {-1…+1}
volatile float Amp; //Amplitudenvariable

//----------------------------------------------------------------------------------------------

// Interrupt-routine zum ADC auslesen
ISR(ADC_vect)
{

ADC_ergebnis = ADCW;
lowbyte = ADCL;
highbyte = ADCH;

}

// interrupt service-routine:
ISR(TIMER1_COMPA_vect) {

static float u1,t; // Spg., Zeit

t += 0.001;

if (t >= 0.1) t=0;

if(t<0.03){
u1=((4/0.03)t51)*Amp;

if(t>0.03){
u1=(4-(4/0.075*(t-0.03))*51)*Amp;
}

OCR1B = u1; // Zeitdauer entspricht Höhe der Spannung
PORTD = u1; // Ausgabe auf PORTD (R2R-network) zur Messung (Vergleich mit PWM-Signal)

}

int main()
{

// ADC Initialisierung:

// ADCSRA-Regsiter:
// AD Control and Status Register A.
// In diesem Register stellen wir ein, wie wir den ADC verwenden werden

// Es wird u.a. der ADC-Takt eingestellt:
// Der resultierende Takt sollte beim AVR zwischen 50kHz und 200kHz liegen
// → bei 16MHz ist der Teilungsfaktor zwischen 80 und 320
// Den ADC aktivieren und Teilungsfaktor auf 128 stellen

ADCSRA = (1<<ADEN); // ADC aktivieren
ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // Teilungsfaktor festlegen
ADCSRA |= (1<<ADATE); // freerun-Mode wählen
ADCSRA |= (1<<ADIE); // ADC Conversion Complete Interrupt aktivieren
ADCSRA |= (1<<ADSC); // Start der Messung, im freerun-Mode nur 1x

// ADMUX-Regsiter:
// Mit diesem Register werden der zu messende Kanal
// und die Referenzspannung ausgewählt.

// Voltage Reference Selection:AVcc als Referenz benutzen
// REFS0: AVCC as reference
// result presented left adjusted by setting the ADLAR bit in ADMUX
// ADLAR: ADC Left Adjust Result

ADMUX = (1<<REFS0) | (1<<ADLAR);

//----------------------------------------------------------------------------------------------

// Digital IO-Initialisierung:

DDRD = 0xFF ; // alle Bit PORTD als Ausgang (zum Messen)

DDRB |= (1<<PB2); // OC1B ist PWM Ausgang, ist der gleiche pin wie PB2 (pin16)
// muss als Ausgang konfiguriert werden

//----------------------------------------------------------------------------------------------

/*

  • Das Setzen von CS10 (clock-selekt) setzt den timer ohne prescaler (max. Geschwindigkeit).
  • Das Setzen von CS11 (clock-selekt) setzt den timer auf CPU-Takt/8 = 16MHz/8 → T=0.5µs.
  • Das Setzen von CS10 und CS11 setzt den timer auf CPU-Takt/64 = 16MHz/64 → T=4µs.
  • WGNM: Mode 15 selektiert: Fast PWM, TOP = OCR1A;
    */

TCCR1A = _BV(COM1B1) | _BV(WGM11)| _BV(WGM10);
TCCR1B |= _BV(CS10) | _BV(CS11) | _BV(WGM12) | _BV(WGM13);

// TIMSK1: Timer/Counter1 Interrupt Mask Register
// OCIE1A: Timer/Counter1 Output Compare Match A Interrupt

TIMSK1 = (1<<OCIE1A);
OCR1A = TEILER;

//OCR1A = 125;
// Output Compare Register A → 4µs * 250 = 1ms
// Anmerkung: weniger als 1ms wird mit Simulation (Proteus) problematisch

/*

  • In der ISR wird der Wert fuer das OCR1B-Register veraendert
  • (= Vergleichswert zum Umschalten für PWM).
  • Die Konfigurationt (mit _BV(COM1B1) siehe oben) gibt an, dass
  • der Generator den pin OC1B setzt, wenn der timer auf null ist (BOTTOM) und
  • und den pin zurücksetzt, sobald der er den Wert im OCR1B Register erreicht.
  • Der Wert im OCR1A ist der Wert, bei dem der timer null gesetzt wird.
  • Das Verhältnis von OCR1B/OCR1A ist der Prozentwert der Zeit,
  • fuer die der pin gesetzt ist.
    */

//-----------------------------------------------------------------------

sei(); // interrupt enable

while (1)
{
rechenwert = (float)ADC_ergebnis/65472; // ADC-Ergebnis skalieren

Amp= rechenwert*255; // Ausgabe-Variable skalieren

}
}

Unbenannt.JPG

Dass du hier im Arduino Forum bist, ist dir klar ?

Irgendwo in der Mitte deines Sketch in ISR(TIMER1_COMPA_vect) fehlt ein } (oder ist eins zuviel, wahlweise)