PWM Ausgabe

Hi,
ich hab zwei Programme, jedoch ist mir nicht klar warum das eine Funktioniert und das andere nicht.
Ich möchte ein PWM-Signal mit 2kHz Ausgeben
Am Eingang soll später eine Analogspannung gemessen werden, je nachspannungswert wird dann das Signal verändert.

!! Der Unterschied besteht nur im setup{},loo{} bzw main{} !!

Dieser hier funktioniert:

#include <avr/io.h>
void InitPort(void)
{
//Init PB1/OC1A and PB2/OC1B pins as output
DDRB|=(1<<DDB1)|(1<<DDB2);
}
void InitTimer1(void)
{
    //Set Initial Timer value
    TCNT1=0;
    //set non inverted PWM on OC1A pin
    //and inverted on OC1B
    TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<COM1B0);
    //set top value to ICR1
    ICR1=0x00FF;
    //set corrcet phase and frequency PWM mode
    TCCR1B|=(1<<WGM13);
    //set compare values
    OCR1A=0x0064;
    OCR1B=0x0096;
}
void StartTimer1(void)
{
//Start timer with prescaller 64
TCCR1B|=(1<<CS11)|(1<<CS10);
}
int main(void)
{
InitPort();
InitTimer1();
StartTimer1();
    while(1)
    {
        //do nothing
    }
}

Dieser nicht:

#include <avr/io.h>

void setup() {
DDRB|=(1<<DDB1)|(1<<DDB2);
//Set Initial Timer value
TCNT1=0;
//set non inverted PWM on OC1A pin
//and inverted on OC1B
TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<COM1B0);
//set top value to ICR1
ICR1=0x00FF;
//set corrcet phase and frequency PWM mode
TCCR1B|=(1<<WGM13);
//set compare values
OCR1A=0x0064;
OCR1B=0x0096;
TCCR1B|=(1<<CS11)|(1<<CS10);
}

// the loop routine runs over and over again forever:
void loop() {
 }

Hie bleibt der Ausgang einfach High..

Vielleicht hat ja von euch einer ne idee...

hi,

nur geraten:
setup und loop brauchen einen bootloader, Du spielst es auf ohne bootloader, dann wird's wie jedes c-programm eine main brauchen.

gruß stefan

Nukebold:
Hi,
ich hab zwei Programme, jedoch ist mir nicht klar warum das eine Funktioniert und das andere nicht.
[...]
!! Der Unterschied besteht nur im setup{},loo{} bzw main{} !!
[...]
Vielleicht hat ja von euch einer ne idee...

Ich hätte mal 'ne Idee:

Im ersten Programm kümmerst du dich ja anscheinend um alles selbst: eigenes main(), nicht das von der Arduino-IDE bereitgestellte main() verwendet und kein Aufruf von setup() oder loop(). Ist nicht schlimm, wenn man weiß, was man macht.

Im zweiten Fall scheinst du aber das main() der Arduino-IDE aufzurufen (Datei main.cpp - reinschauen schadet nicht :wink: ). Da wird (für dich verborgen) eine Funktion init() aufgerufen (zu finden in der Datei "wiring.c" - reinschauen macht klug). Und in dieser Funktion werden schon vorab einige Bits in den Registern des Timers 1 (TCCR1A, TCCR1B) gesetzt. Und du 'ODER'st jetzt im 2. Programm deine eigenen Bits noch zusätzlich rein. Die bisherigen bleiben aber gesetzt. In deinem ersten Programm sind die Register ja alle noch 'jungfräulich' auf 0 gesetzt, im 2. Beispiel aber nicht mehr. Setze doch mal versuchsweise im 2. Programm am Anfang von setup() die beiden Register TCCR1A, TCCR1B auf 0. setup() wird ja nach init() aufgerufen und beschreibt die Register neu. Vielleicht funktioniert dann auch das 2. Programm?
Als Konsequenz kann es dann natürlich sein, dass bestimmte Funktionen aus der Arduino-Core-Library nicht mehr funktionieren.

Viel Erfolg beim Test und teile mal mit, ob es daran gelegen hat.

Gruß
Wolfgang

Das gutel liegt oft so nah :wink:

Thx Problem beseitigt! So kann ich nähmlich das Unterprogramm von Arduino verwenden zum Analogspannung messen.
Wo kann ich mir eigentlich die Konfiguration von Arduino ansehen, die er bei loop und setup scheinbar aufruft.

#include <avr/io.h>
/*
  AnalogReadSerial
  Reads an analog input on pin 0, prints the result to the serial monitor.
  Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
 
 This example code is in the public domain.
 */
double eingang_nivau;
double prozent;
int sensorValue;
// the setup routine runs once when you press reset:
void setup() {
  Serial.begin(9600);
  TCCR1A=0x0000;
  TCCR1B=0x0000;
DDRB|=(1<<DDB1)|(1<<DDB2);
//Set Initial Timer value
TCNT1=0;
//set non inverted PWM on OC1A pin
//and inverted on OC1B
TCCR1A|=(1<<COM1A1)|(1<<COM1B1)|(1<<COM1B0);
//set top value to ICR1
ICR1=0x0FA0;
//set corrcet phase and frequency PWM mode
TCCR1B|=(1<<WGM13);
//set compare values
OCR1A=0x0001;
OCR1B=0x0001;
TCCR1B|=(1<<CS10);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
   eingang_nivau = analogRead(A0);
   
   prozent = 0.09765625*(eingang_nivau);
   Serial.println((prozent));
   sensorValue=(int)(prozent*40);
  
  OCR1A=sensorValue;
  OCR1B=sensorValue;
}

Nukebold:
Wo kann ich mir eigentlich die Konfiguration von Arduino ansehen, die er bei loop und setup scheinbar aufruft.

Bei loop() und setup() passiert nichts, was du nicht selber reinschreibst. Ansonsten wird vor dem Aufruf von setup() die Funktion init() aufgerufen. Den Code dafür findest du, wie in meinem obenstehenden Posting schon erwähnt, in der Datei "...\Arduino\arduino-1.0.3\hardware\arduino\cores\arduino\wiring.c" ab ca. Zeile 189.

Da werden im wesentlichen die Interrupts freigegeben, die Timer konfiguriert und der Analog-Digital-Wandler ein bißchen konfiguriert.