Forum: Mikrocontroller und Digitale Elektronik PWM settings mit sei()-aufruf weg?


von Mini M. (minimik)


Lesenswert?

Hallo an alle,

bin in der AVR bzw. ATTiny Welt neu und will einen kleinen Roboter 
bauen, der mit gehackten Servos laufen soll.

Dafuer hab ich mir den ATTiny13A mit PWM so programmiert, dass er das 
korrekte Signal ausgibt. imhappyitworks

Nun wollte ich einen Taster mit einbeziehen, der einen Interrupt 
ausloest und damit das PWM veraendert.

Leider kommt kein PWM-Signal mehr, wenn ich 'sei()' nach der 
PWM-Konfiguration aufrufe...!

Hab ich da was ueber sehen?

Danke schon mal und
schoene Gruesse
Michi

von Falk B. (falk)


Lesenswert?

@ Michael Meisinger (minimik)

>Hab ich da was ueber sehen?

Ja, die Netiquette und die Entprellung, welche dir sagt, dass 
man Taster viel besser per Timer-Interrut abfragt.

von m.n. (Gast)


Lesenswert?

Michael Meisinger schrieb:
> Hab ich da was ueber sehen?

Nein, Dein Code sieht doch gut aus!
Und Taster per Interrupt geht auch bestens.
Beitrag "Re: EIN-AUS mit Taster per Interrupt, ATtiny25 o.ä."

von Stefan F. (Gast)


Lesenswert?

> Hab ich da was ueber sehen?

Lass uns mal (den code) sehen, dann wir überlegen, was du vielleicht 
übersehen hast.

von ich (Gast)


Lesenswert?

m.n. schrieb:
> Nein, Dein Code sieht doch gut aus!

Deine Glaskugel möcht ich haben...

von Mini M. (minimik)


Lesenswert?

Hallo an alle,

vielen Dank schon mal fuer die schnellen Antworten....

War auch etwas ueberrascht, dass doch jemand meinen Code kennt, ohne ihn 
gesehen zu haben... ;^)))

Werd' heut Abend mal den Code hier reinhaengen. Ist aber sehr 
ueberschaubar.
Mein Problem ist uebrigens nicht, dass der Taster nicht funktioniert, 
sondern dass das PWM nicht mehr rauskommt.

Nur sehr von oben gesehen als pseudo Code:
 - Init Register damit PWM funktioniert
 - call 'sei();'
 - Endlosschleife
Damit passiert am Ausgang nix.

Wenn ich folgendes mache:
 - Init Register damit PWM funktioniert
 - Endlosschleife
Damit kommt am Ausgang 0 und 1 entsprechend dem konfigurierten PWM das 
Signal raus. (mit Oszi und Servo geprueft).

Ich haenge aber heut Abend mal den Source hier rein...

Danke nochmal und schoene Gruesse
Michi

von Justus S. (jussa)


Lesenswert?

ich schrieb:
> Deine Glaskugel möcht ich haben...

zusammen mit der zweiten Aussage über Taster und Interrupts ist doch 
auch der erste Teil eindeutig Ironie...

von ich (Gast)


Lesenswert?

Justus Skorps schrieb:
> ich schrieb:
>> Deine Glaskugel möcht ich haben...
>
> zusammen mit der zweiten Aussage über Taster und Interrupts ist doch
> auch der erste Teil eindeutig Ironie...

Ich glaube, seine zweite Aussage ist ernst gemeint gewesen. Er schwört 
doch auf Interrupts, z.B. "Encoder fragt man mit Interrupts ab"

von Karl H. (kbuchegg)


Lesenswert?

Michael Meisinger schrieb:

> Nur sehr von oben gesehen als pseudo Code:
>  - Init Register damit PWM funktioniert
>  - call 'sei();'
>  - Endlosschleife

Mein Auto hat 2 Türen, 3 Rückspiegel und 4 Reifen ...

> Damit passiert am Ausgang nix.

... trotzdem fährt es nicht, wenn ich das Handschuhfach schliesse.

von m.n. (Gast)


Lesenswert?

Michael Meisinger schrieb:
> Nur sehr von oben gesehen als pseudo Code:
>  - Init Register damit PWM funktioniert
>  - call 'sei();'
>  - Endlosschleife
> Damit passiert am Ausgang nix.

Es ist doch erahnbar: nach sei() wird ein unbedienter Interrupt 
ausgelöst, der den Prozessor zum vorzeitigen 'Abschied' drängt.
Auf der Anzeige erscheint dann: tilt!

von Jobst M. (jobstens-de)


Lesenswert?

m.n. schrieb:
> Es ist doch erahnbar: nach sei() wird ein unbedienter Interrupt
> ausgelöst

Sehe ich auch so. PWM sollte allerdings weiter laufen ...

Allerdings muss dann auch beim Timer der entsprechende IRQ erlaubt 
werden. Ich spekuliere einfach mal, dass das so ist.

@TO: Um Hardware im Controller laufen zu lassen, wird kein IRQ benötigt!
Der IRQ wird benötigt, um Software zu bestimmten Ereignissen aufzurufen.

Wird für Dein Ereigniss 'PWM' eine SW aufgerufen?
-> ja: Warum? Und was passiert dort?
-> nein: Warum wird dann ein IRQ benötigt?


Gruß

Jobst

von Mini M. (minimik)


Lesenswert?

Hallo an alle,

vielen Dank fuer die allen gut gemeinten Antworten...
Wie bereits angekuendigt, hier der Code, der mit den auskommentierten 
sei() das Signal liefert.
Sobald ich das sei() ausfuehren lasse, kommt kein Signal mehr...

Sieht da jemand auf die Schnelle was? Ich bin irgenwie auch nach 
mehrmaligem suchen im Datenblatt ratlos.

Vielen Dank schon mal und
schoene Gruesse
Michi


#include <avr/io.h>
#include <avr/interrupt.h>
//#ifndef F_CPU
#define F_CPU 1000000UL
//#endif // F_CPU
#include <math.h>
#include <stdint.h>
#include <stdlib.h>

#include <avr/sleep.h>
#include <util/delay.h>


#define STOP_SV  12
#define FWD_SV  15
#define REV_SV  9


void initCPU()
{
        uint8_t duty = REV_SV;

        DDRB = 1<<DDB4 | 1<<DDB3 | 1<<DDB1 | 1<<DDB0;

        //  WGM-Mode:5  (page 72)
        OCR0A = (121-1);// entspricht dem TOP-Wert
        OCR0B = (121-1);//Seite 70 & 74
        TIMSK0 |= (1 << OCIE0A) | (1 << OCIE0B) | (1 << TOIE0);
        TIFR0 =  (1<<TOV0);

        TCNT0 = 0;

        // corrected register
        TCCR0A = 0b10100001;//PWM-Modus 1
        TCCR0B |= 0 | (1<<CS00) | (1<<CS01);

        duty = 15; //direct;
        OCR0A=duty;//256 - 8;
        OCR0B=duty;//256 - 8;
}

int main (void)
{
    initCPU();
    //sei();
    while (1)  {
      ;
    }
    return 0;
}

von Marcus (Gast)


Lesenswert?

Michael Meisinger schrieb:
> TIMSK0 |= (1 << OCIE0A) | (1 << OCIE0B) | (1 << TOIE0);

Hier schaltest Du zahlreiche Interrupts ein, für die es gar keinen 
Interrupt-Handler gibt. Sobald einer davon eintritt, passiert wer weiß 
was.

von Mini M. (minimik)


Lesenswert?

@Marcus:
Vielen Dank fuer die Hilfe, da war ich wohl etwas falsch gewickelt. Ich 
dachte irgenwie, dass wenn keine Routine angegeben sei, dann wird halt 
nix ausgefuehrt...

Macht natuerlich auch Sinn, wie Du es schreibst... Ich mache mal dann 
einen Versuch und hoffe ...

Vielen Dank
Michi

P.S.
@Karl Heinz: Ich werd' das Handschuhfach mal schliessen, vielleicht 
faehrt das Auto dann... ;o)

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.