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
@ 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.
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.ä."
> Hab ich da was ueber sehen?
Lass uns mal (den code) sehen, dann wir überlegen, was du vielleicht
übersehen hast.
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
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...
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"
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.
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!
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
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;
}
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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.