Hallo, ich habe versucht die pwm des 8-bit timers eines ATmega 8 in C zu programmieren. #include<avr/io.h> void main(void) { DDRB |= (1<<DDB3); TCCR0 |= (1<<WGM00)|(1<<COM01)|(1<<CS00); while(1) { OCR0 = 0x11; } } Beim kompilieren über das Winavr plug-in für Avr-Studio gelang es mir nicht das Register OCR0 zu "beschreiben", sonst läuft alles. Mit einem externen Makefile war es möglich, ebenso direkt in Winavr. Hat jemand eine Ahnung, welche Einstellungen im Avr-Studio vorgenommen werden müssen um einen reibungsfreien Ablauf über das plug-in zu gewährleisten? Oder denkt Ihr, das ist sowieso totaler Schrott?
Wenn ich deinen Code durchjage, kriege ich
1 | avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -O0 -MD -MP -MT Forum3.o -MF dep/Forum3.o.d -c ../Forum3.c |
2 | ../Forum3.c:3: warning: return type of 'main' is not `int' |
3 | ../Forum3.c: In function `main': |
4 | ../Forum3.c:5: error: `WGM00' undeclared (first use in this function) |
5 | ../Forum3.c:5: error: (Each undeclared identifier is reported only once |
6 | ../Forum3.c:5: error: for each function it appears in.) |
7 | ../Forum3.c:5: error: `COM01' undeclared (first use in this function) |
8 | ../Forum3.c:8: error: `OCR0' undeclared (first use in this function) |
9 | make: *** [Forum3.o] Error 1 |
Da du die ersten 2 undefined references nicht kriegst, gehe ich mal davon aus, dass du keinen Mega8 eingestellt hast.
tschuldigung ein atmega 16, hab mich verschrieben. Mit dem 16-bit timer ist es das Gleiche.
1 | avr-gcc.exe -mmcu=atmega16 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT Forum3.o -MF dep/Forum3.o.d -c ../Forum3.c |
2 | ../Forum3.c:3: warning: return type of 'main' is not `int' |
3 | avr-gcc.exe -mmcu=atmega16 Forum3.o -o Forum3.elf |
4 | avr-objcopy -O ihex -R .eeprom Forum3.elf Forum3.hex |
5 | avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex Forum3.elf Forum3.eep |
6 | |
7 | AVR Memory Usage |
8 | ----------------
|
9 | Device: atmega16 |
10 | |
11 | Program: 178 bytes (1.1% Full) |
12 | (.text + .data + .bootloader) |
13 | |
14 | Data: 0 bytes (0.0% Full) |
15 | (.data + .bss + .noinit) |
kompiliert wunderbar.
Doch. Klappt wunderbar. Richte dein Augenmerk mal auf das Datenblatt, Seite 83. In der Tabelle 38, steht in der Zeile "PWM, Phase Correct" eindeutig, dass der OCR0 Wert erst dann ins eigentliche OCR0 Register übernommen wird, wenn der Zähler seinen TOP Wert erreicht hat. Und ganau das passiert. Der Zähler zählt hoch und hoch. In dem Moment, in dem er 0xFF erreicht hat, wird OCR0 zu 0x11 und der Zähler zählt wieder runter.
Erstmal danke, ich habs heute nochmal versuch und es funktoniert alles. Weiß nicht was ich falsch gemacht hab. Trotzdem vielen Dank Karl Heinz.
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.