Hallo, ich habe ein Problem mit dem PWM und zwar, kommt einfach gar nichts bei dem Pin raus(PD5/ 0CR1A). Ich habe es jetzt schon zweimal versucht, einmal mit meinem Code und ein zweites mal mit einem aus dem Internet. In beiden fällen passiert einfach gar nichts. #define PULSE_WIDTH 0x40 #include <avr/io.h> #include <stdint.h> // TCCR1A = 0x81 // |COM1A1|COM1A0|COM1B1|COM1B0|FOC1A|FOC1B|WGM11|WGM10| // 1 0 0 0 0 0 0 1 // 8 bit PWM mode - nicht invertierende PWM //====================================================== // TCCR1B = 0x04 // |ICN1|ICES1| - |WGM12|WGM12|CS12|CS11|CS10| // 0 0 0 0 0 1 0 0 // takt = cpu*/256 void pwm(){ //ausgabe auf PortD pin5 'OC1A' OCR1AL = PULSE_WIDTH; //Load Pulse width OCR1AH = 0; DDRD |= (1<<5); //PortD.5 as o/p TCCR1A = 0x81; //8-bit, Non-Inverted PWM TCCR1B = 0x04; //Start PWM } Die Funktion rufe ich dann in einer Endlossschleife in main auf. Das ist die Version aus dem Internet. Man könnte doch jetzt erwarten das die LED etwas leuchtet, nur tut sie gar nichts. :( Ich glaub ich übersehe hier irgendwas?
Du musst vorher das BSR (beamtenstatusregister) ausschalten, damit er was tut.
> To do a 16-bit write, the High byte must be written before the Low byte.
Außerdem, wohin kehrt PWM() nach Ende zurück ?
NBLM schrieb: > Die Funktion rufe ich dann in einer Endlossschleife in main auf. D.h. du startest die PWM ständig neu? Du musst das ganze nur ein mal aufrufen, und dann in der main() eine Endlosschleife laufen lassen, die gar nichts tut:
1 | while (1); |
Danke, das wusste ich nicht. So sieht es jetzt aus: #define F_CPU 1000000UL //Den Takt des µC angeben für delay.h #define PULSE_WIDTH 0x40 // kopiert #include <avr/io.h> #include <stdint.h> #include <util/delay.h> // TCCR1A = 0x81 // |COM1A1|COM1A0|COM1B1|COM1B0|FOC1A|FOC1B|WGM11|WGM10| // 1 0 0 0 0 0 0 1 // 8 bit PWM mode nicht invertierende PWM //====================================================== // TCCR1B = 0x04 // |ICN1|ICES1| - |WGM12|WGM12|CS12|CS11|CS10| // 0 0 0 0 0 1 0 0 // void pwm(){ //ausgabe auf PortD pin5 'OC1A' OCR1AH = 0; OCR1AL = PULSE_WIDTH; //Load Pulse width TCCR1A = 0x81; //8-bit, Non-Inverted PWM TCCR1B = 0x04; //Start PWM } int main (void) { DDRD = 0x20; //port von D pin 5 'OC1A' auf Ausgang setzen pwm(); while(1); return 0; } leider geht es noch immer nicht?
Das BSR (beamtenstatusregister) "cli();" ist immer noch gesetzt. Schalte mal die Interrupts an. btw. Beamtenstatusregister geiles Wort "yksihW"
Das hat mit dem Interrupt-Flag cli () nichts zu tun. Welchen Mikrocontroller verwendest du? Kann es sein, dass du den falschen Pin verwendest? Beim ATmega8 liegt das Ausgabesignal am Pin "OC1A" bzw. PB1, also Pin Nr. 15, ganz unten rechts, an. Daher musst du auch folgenden Code zum Konfigurieren des Ports ausführen:
1 | DDRB |= (1 << PB1) |
Wie sieht's mit klassischem Portpin toggeln aus ? Klappt das ? Bootlader drauf ? Wie sieht's mit der BOOTRST Fuse aus ?
Ich habe jetzt versucht mal ein paar LEDs an PORTD zusteuern hab die sonst auf PortA sitzen. Nach einem kurzen Umbau und Änderungen im Code stell ich fest das meine Pins bei D alle tot sind, ich kann sie weder als Eingänge noch als Ausgänge benützen. Ist der jetzt kaputt, oder muss man irgendwelche fuses oder sonstwas setzen? Oder hat man mich um 4,95€ betrogen :<
Schalten mit dem neuen Code die Pins wenn du es mit dem Simulator probierst? Wenn ja dürfte der Code OK sein. Hängt an den Pins irgend etwas dran was stören kann? Pin offen lassen und sehr langsam schalten, dann reicht schon ein Multimeter, wenn man keinen Oszi hat. Schalten die "offenen" Pins nicht auf einfache ON/OFF-Befehle ist vermutlich der µC reif für die Tonne.
Beschaltung ok, beide GNDs angeschlossen, nichts was den Port blockiert ? Ungewöhnlich, wenn ein kompletter Port ausgefallen wäre.
OK jetzt weis ich was los ist, bei meinem ausgeborgten Steckbrett ist eine Leiste (ground) unterbrochen deshalb kann da nichts raus kommen. Dadurch ist die untere Hälfte abgeschnitten. Hab die jetzt umgesteckt und ein längeres Kabel direkt zum (-)pol ohne Umwege spendiert. Die funktionieren jetzt auch nur pin 1-5 der gruppe C hat nur 1,6V alle anderen bringen die 5V keine Ahnung was da passiert. Ich nehme an PWM funktioniert jetzt auch, hab es aber bis her noch nicht probiert. Vielen Dank für eure Hilfe.
NBLM schrieb: > Die funktionieren jetzt auch nur pin 1-5 der gruppe C > hat nur 1,6V alle anderen bringen die 5V keine Ahnung was da passiert. PC2..5 ist JTAG.
Aha wusste ich nicht, ich programmiere mit ISP. Kann man JTAG abschalten damit ich normale 5V I/O habe?
NBLM schrieb: > Aha wusste ich nicht, ich programmiere mit ISP. Kann man JTAG abschalten > damit ich normale 5V I/O habe? Ja, dauerhaft per Fuse oder temporär per Code indem man zweimal innerhalb 4 Zyklen eine 1 auf das JTD Bit im MCUCSR schreibt.
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.