hallo alle zusammen!
ich bekomme immer beim "builden" diesen error
../sinus_pwm.c:163:1: error: expected declaration or statement @ end of input
wäre sehr dankbar, wenn mir wer von euch helfen könnte !
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)*t*51)*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 , 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 reference
// result presented left adjusted setting 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 interrupt
timsk1 = (1<<ocie1a);
ocr1a = teiler;
//ocr1a = 125;
// output compare register -> 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
}
}
ich bekomme immer beim "builden" diesen error
../sinus_pwm.c:163:1: error: expected declaration or statement @ end of input
wäre sehr dankbar, wenn mir wer von euch helfen könnte !
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)*t*51)*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 , 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 reference
// result presented left adjusted setting 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 interrupt
timsk1 = (1<<ocie1a);
ocr1a = teiler;
//ocr1a = 125;
// output compare register -> 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
}
}
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)
irgendwo in der mitte deines sketch in isr(timer1_compa_vect) fehlt ein }
(oder ist eins zuviel, wahlweise)
Arduino Forum > International > Deutsch (Moderator: uwefed) > Error Arduino Uno 328P im AVR-Studio
arduino
Comments
Post a Comment