Ska programmera min AVR för att styra ett par vanliga rc-servon. Mha Timer1 vill jag generera 1-2ms långa pulser som återkommer var 20:e ms. Jag har aldrig arbetat med någon mikrokontroller förut och heller ej programmerat i C. Har dock programmerat förut.
Jag har lyckats styra servona först med delay och sedan med Timer0 med gott resultat. När jag använde Timer0 körde jag med faskorrekt PWM vilket tyvärr visade sig ge för dålig upplösning.
Nu tänker jag använda Timer1 (16bit) med snabb PWM för att få rejäl upplösning. Till problemet.
När jag skriver till 16-bitarsregistret OCR1A så funkar det fint. Den höga byten blir som den ska och den låga som den ska. Men efter ca 3 klockcyklar i whilesatsen så sätts den höga biten till 0000 0001, oavsett vad för värde där låg innan. I databladet står det hur man ska göra när man ska skriva till 16-bitars registers och nedan i kodexemplet ser ni min tolkning.
Vidare, hur många gånger jag än kollar WGM bitarna i TCCR1A/B så är dem rätt jämfört med databladet för att skapa snabb PWM med ICR1 definierad som TOP (jämför databladet sid 156). Likväl envisas simulatorn i AVR Studio4 att berätta för mig att räknarregistret TCNT1 räknar neråt (dekrementeras) vilket det inte ska göra med snabb PWM.
Kod: Markera allt
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
int main()
{
//Variabeldeklaration
unsigned char sreg;
//Clock prescale register --> 8MHz
CLKPR = 0x80;
CLKPR = 0x00;
//In- och utgångar
DDRC = 0x20;
//Initiera 16-bitreg
sreg = SREG;
SREG &= 0x7F;
OCR1A = 1500;
ICR1= 20000;
SREG = sreg;
//Timer1
TCCR1B |= (1<<WGM12) | (1<<WGM13) | (1<<CS11);
TCCR1A |= (1<<WGM11) | (1<<COM1A1);
while(1)
{
}
return 0;
}
EDIT: Länk till Datablad