hi rco,
danke für deine antwort.
ich werde jetzt mal versuchen das gelernte umzusetzen und in einem programm zum laufen zu bringen.
werde meine versuche hier mal posten (inkl. erfolg / nicht erfolg meldung)
gruß orko
Druckbare Version
hi rco,
danke für deine antwort.
ich werde jetzt mal versuchen das gelernte umzusetzen und in einem programm zum laufen zu bringen.
werde meine versuche hier mal posten (inkl. erfolg / nicht erfolg meldung)
gruß orko
hi,
ich habe mal versucht das mit dem pwm umzusetzen.
leider ohne erfolg.
der motor läuft zwar,
aber er läuft immer gleich egal wie ich die werte setze.
ich wollte mal eine langsam fahrt machen, bekomme ich nicht hin.
hmm...
irgendwo habe ich noch einen fehler.
hier kommt mein code:
void main (void)
{
pwminit();
SREG |= (1<<7);
DDRB = 0b11111111;
PORTB |= ((1<<5) | (1<<6));
for( ; ; ){};
}
void pwminit()
{
// Nachfolgend wird Modus 14 gesetzt fast pwm top = ICRn
TCCR1A = (1<<WGM11);
TCCR1B = (1<<WGM13) | (1<<WGM12);
//Nachfolgend wird Prescaler clk/1024 gesetzt
TCCR1B = (1<<CS10) | (1<<CS12);
// COM* = OC1A/B sind aktiv, bei Comparematsch wird der Ausgang gesetzt bei TOP geloescht
TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<COM1B1) | (1<<COM1B0);
// OCIE1B = Output Compare Interrupt Enable 1B
// TOIE1 = Timer Overflow Interrupt Enable
TIMSK = (1<<TOIE1) | (1<<OCIE1B);
// ICR1 = Obergrenze
ICR1 = 200;
OCR1AH = 0;
OCR1AL = 10;
OCR1BH = 0;
OCR1BL = 10;
}
was macht eigentlich de befehl SREG |= (1<<7); genau???
gruß orko
Hi Okro,
SREG aktiviert nur den Globalen Interrupt, das brauchst du hier nicht, da kein Interrupt ausgelöst wird.
ICR1 ist mMn garnicht nötig. Auch TIMSK bracuhst du eigentlich nicht, dass ist auch nur für Interrupts.
Wenn du die Register setzt musst du immer | schreiben, sonst werden nur die nachfolgenden Werte gesetzt und alle anderen gelöscht.
Z.B.:
TCCR1A = (1<<COM1A1);
löscht alle gesetzten Bits und setzt nur COM1A1.
(Schau mal wie ich das oben gamacht habe.
>>TCCR1B = (1<<CS10) | (1<<CS12);
löscht das was du darüber gesagt hast.
Es kann sein, dass du auch noch einiges einbinden musst, sowas wie io.h, aber da bin ich nicht sicher.
hi,
ich habe nun mein code angepasst und deine änderungen eingebaut.
sieht wie folgt aus:
void pwm_main (void)
{
pwminit();
DDRB = 0b00111111;
PORTB |= ((1<<5) | (1<<6));
for( ; ; ){};
}
void pwminit()
{
TCCR1A = (1<<WGM11) | (1<<COM1A1) | (1<<COM1A0) | (1<<COM1B1) | (1<<COM1B0);
TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10) | (1<<CS12);
OCR1AH = 0;
OCR1AL = 1;
OCR1BH = 0;
OCR1BL = 1;
}
jetzt läuft nichts mehr.
ich verstehe es einfach nicht
Hi Orko,
Sorry, ich habe übersehen, dass du gar nicht mehr Modus 7 benutzt.
Dann kannst du natürlich ICR... nicht löschen.
Also probier folgendes mal aus:
Ich habe leider gerade keinen Compiler und keinen AVR zu Hand, daher ist es für mich im Moment schwer zu überprüfen, ob ich ncih irgendwas vergessen habe.Code:#include <avr/io.h>
void pwminit()
{
TCCR1A = (1<<WGM11) | (1<<WGM10) | (1<<COM1A1) | (1<<COM1B1) | (1<<COM1A0) | (1<<COM1B0);
TCCR1B = (1<<WGM12) | (1<<CS11);
OCR1AH = 1;
OCR1AL = 1;
OCR1BH = 1;
OCR1BL = 1;
}
void main (void)
{
DDRB = 0b11111111;
pwminit();
for( ; ; ){};
}
jo,
das sieht schon besser aus. :)
der motor läuft jetzt schön langsam vor sich hin.
erstmal danke.
nun noch eine frage:
ich habe nun den modus 7, er zählt bis 1024.
OCR1AH = 1; -> wird hier der ausgang auf high gesetz?
OCR1AL = 1; -> wird der ausgang auf low gesetzt?
warum sind beide gleich??
gruß orko
Sehr gut!Zitat:
jo,
das sieht schon besser aus. :)
der motor läuft jetzt schön langsam vor sich hin.
Nein, das meint es nicht. H und L steht für High- und Lowbyte.Zitat:
nun noch eine frage:
ich habe nun den modus 7, er zählt bis 1024.
OCR1AH = 1; -> wird hier der ausgang auf high gesetz?
OCR1AL = 1; -> wird der ausgang auf low gesetzt?
warum sind beide gleich??
Die Auflösung ist ja 10 Bit. Ein Byte hat nur 8 Bit. Deshalb gibt es zwei Bytes um diese Werte auszudrücken.
OCR1AH = 1;
OCR1AL = 1;
heit also 1x256 und 1x1, also der Wert 257.
Willst du z.B. den Wert 800 setzen, dann ist das:
OCR1AH = 3;
OCR1AL = 32;
Das hieße dann, dass der Ausgang 1 - 800/1024 high ist.
(Oder auch nur 1023, bin mir da nicht ganz sicher)
Das 1 - ist wegen dem Inverting Mode.
Der Ausgang wird beim Inverting Mode beim Überlauf also 1024 zurückgesetzt.
hi rco,
super lieben dank.
habe durch deine hilfe viel gelernt.
ich bin jetzt soweit, dass ich jetzt mit den richtigen geschwindigkeiten experimentiere.
damit habe ich jetzt erstmal was zu tun.
wenn alles so läuft wie gewünscht, werde ich mich mal melden.
als nächstes ziel habe ich mir dann die programmsteuerrung über interrupts vorgenommen.
schönen abend noch
gruß orko