PWMの実験で、OCR1Aの値が知りたかった。
itoaはint(avrだと16bit)なので32766=(65535/2)までしかいかず、その上は負の数になる。
unsigned intを使いたいときは
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=74499&start=0
#include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #define FOSC 16000000UL #define BAUD 9600 #define MYUBRR ((FOSC/(16UL*BAUD))-1) void PB1_PWM_init(){ TCCR1A = _BV(COM1A1)|_BV(WGM11)|_BV(WGM10); //Fast PWM 10bit TCCR1B = _BV(WGM12); TIMSK1 = _BV(OCIE1A); //Timer max value 4ms: Total time ICR1 = 65000; } void USART_init(unsigned int ubrr){ UBRR0H = (ubrr>>8); UBRR0L = ubrr; UCSR0B = _BV(RXEN0)|_BV(TXEN0); //RX-TX enable UCSR0C = (3<<UCSZ00);//define data frame: CSZ = CharacterSiZe } void USART_Transmit(unsigned char data){ loop_until_bit_is_set(UCSR0A,UDRE0); UDR0 = data; } char USART_recv(void) { while(!(UCSR0A & (1<<RXC0))); return UDR0; } void putString(char msg[]) { int i; for(i=0;msg[i];i++){ USART_Transmit(msg[i]); } } void PB1_dim(){ int i; char buf[20]; for(i=0;i<10;i++){ unsigned long j; for(j=0;j<65000;j++){ } OCR1A = 6500 * i; unsigned int vh = OCR1AH; unsigned int vl = OCR1AL; unsigned int v = (vh<<8) +vl; putString(", OCRA1:"); utoa(v,buf,10); putString(buf); putString("\n"); _delay_ms(200); } } int main(void){ DDRB |= _BV(PORTB5); USART_init(MYUBRR); char data; putString("Hello\n"); putString("Hello\n"); while(1){ //data = USART_recv(); //USART_Transmit(data); PB1_dim(); } return 0; }