hallo, habe mit folgendem code erfolglos versucht, die PWM zu initialisieren: _________ .include "m32def.inc" .def temp=r16 ldi temp, LOW(RAMEND) out SPL, temp ldi r25, HIGH(RAMEND) out SPH, temp ldi temp, 0xff out DDRD, temp ldi temp, 0b01100011 out TCCR1A, temp ldi temp, 0b00000100 out TCCR1B, temp ldi temp, 0x00 out OCR1AH, temp out OCR1AL, temp loop: rjmp loop _________ wie man sieht benütze ich den mega32. kann mir jemand sagen warum das so nicht funktioniert? habe den code so aus dem datenblatt erschlossen. mfg
Ich will mir jetzt nicht nochmal das Datenblatt reinziehen. 1tens: Wie hast du das getesteet? Als ichs mal probiert habe, da hatte der AVR-Simulator nen Bug (im AVR Studio) 2tens: ldi temp, LOW(RAMEND) out SPL, temp ldi r25, HIGH(RAMEND) out SPH, temp ==> 3te Zeile muss "ldi temp, .." heißen. 3tens: Warum lädst du 0x0000 in OCR1A ? Das kann ja fast nichts werden. dave
danke für deine antwort dave: 1stens: also ich bekomme da "Assembly complete, 0 errors. 0 warnings" 2tens: stimmt :) mist g. hab den fehler verbessert, aber ich brauch hier eh keinen stack. also es funktioniert immer noch nicht 3tens: jo habs mit 0xff und mal mit 0x00 probiert. hab ausversehn hier die 0xff version reingesetzt. noch wer ne idee? mfg
kann bitte jemand nochmal diesen code auf fehler prüfen? oder anders gesagt :) : wie habt ihr die register fürs pwm beladen? kann ja auch ein c code sein ;) mfg
Fang doch erstmal einfach an. Nimm mal den Timer 0 für deine PWM. Hier ein Beispiel .include "m32def.inc" .def temp = r16 .equ pwmwert = 150;Hier der PWM Wert eintragen(0-255) ldi temp, low(ramend) out spl, temp ldi temp, high(ramend) out sph, temp ldi temp, 0xff out DDRB, temp;bei Port B ist OCR0 ldi temp, pwmwert out OCR0, temp;den PWM Wert ins OCR0 register übertrage ldi temp, 0b01101001;Fast PWM, Set OC0 on compare match, no prescaling out TCCR0, temp main: rjmp main Gruß Avus
In C und am Mega32 mit 2 PWM die in serie funktionieren: // TIMER/COUNTER TCCR1A = (1 << COM1B0)|(1 << COM1B1)|(1 << COM1A1) |(1 << WGM12)|(1 << WGM11); // PWM konfiguration (9-Bit) [S.05] TCCR1B = (1 << WGM12); // Prescaler 1 (kein Prescaler) [S.108] . . . while ((CHARGE_STATUS==FAST) && (!(CHARGE_STATUS==ERROR)) {do // I = I_fast mit "Softstart" { // Schleife bis Strom = eingestelltem Strom (Soll = Ist) temp = MESSUNG(Strom_L); // Messung anstoßen if ((temp < (I_FAST_NICD)) && (OCR1A < 0x1FF)) //Dowm { OCR1A++; } if ((temp < (I_FAST_NICD)) && (OCR1B < 0x140) && (OCR1A==0x1ff)) //UP { OCR1B++; // Vergleichsregister inkrementieren } if ((temp > (I_FAST_NICD)) && (OCR1B > 0x0000)) { OCR1B--; } if ((temp > (I_FAST_NICD)) && (OCR1B == 0x0000) && (OCR1A > 0x0000)) { OCR1A--; // Vergleichsregister dekrementieren } } while ((temp<(I_FAST_NICD-2))||(temp>(I_FAST_NICD+2))); //Regelhysterese von +/- 2 zulassen
@raoul Was wolltest du überhaupt machen? Zwei PWM's mit 8 bit oder eine PWM mit 9 oder 10 bit? Gruß Avus
Ist für einen kombibnierten Step-Up/Step-Down Wandler. Wenn der Strom schon mit dem 1.PWM erreicht wird (Step-Dowm) dann OK. Wenn nicht,dann 2. PWM (Step-Up). Eingangsspannung 10-13V (7V funktionieren auch noch, wenn mann den Strom liefern kann), Ausgangsspannung bis 0-50V/6A, jedenfalls bei meiner Schaltung. Funktioniert einwandfrei.
Nachtrag: beide haben 9-Bit PWM. Kompromiss aus Auflösung und Schaltfrequenz.
Hallo, lade doch einfach mal das OCR1A register mit einem Wert größer als 0 und kleiner als 255. Bei 0 hast du dauernd low pegel, bei 255 dauernd high pegel. mfg Stefan
danke für all eure antworten! ich will zwei 8 bit pwm's machen um damit 2 motoren (mit einem l293d treiber) anzusteuern und die geschwindigkeit zu regeln. mfg
Hi raoul. Probiere es mal si wie im Anhang. Wenn du 2 PWM's haben willst, dann darfst du nicht ldi temp, 0x00 out OCR1AH, temp out OCR1AL, temp machen, weil OCR1AH wäre dann für ddi 9 oder 10 bit PWM. Deshalb ldi temp, 0x03 out ocr1al,temp; erste PWM out ocr1bl,temp; zweite PWM Gruß Avus
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.