板子是ATmega128 PWM 产生方波 用的语言为GCC 具体实现为编程产生一个方波。 其频率计算公式为fclock/(1+TOP),如取TOP为1,则频率为fclock/2;取如TOP为2,则频率为fclock/3。但是我如想取频率介于fclock/2和fclock/3之间的任意一值的话,该怎么实现呢?
一个引导程序,在擦除FLASH,执行FLASH页写入时,每页的前2个字节写入错误,其他的字节都对。何解? 采用的是ATmeag644单片机 下面是详细的程序 void boot_page_ew(uint p_address,uchar code) { asm("mov r30,r16n" "mov r31,r17n" "out 0x3b,r18n"); //将页地址放入Z寄存器和RAMPZ的Bit0中 SPMCSR = code; //寄存器SPMCSR中为操作码 asm("spmn"); //对指定Flash页进行操作 } void boot_page_fill(unsigned int address1,uint data1) { asm("mov r30,r16n" "mov r31,r17n" //Z寄存器中为填冲页内地址 "mov r0,r18n" "mov r1,r19n"); //R0R1中为一个指令字 SPMCSR = 0x01; asm("spmn"); } //等待一个Flash页的写完成 void wait_page_rw_ok(void) { while(SPMCSR & 0x40) { while(SPMCSR & 0x01); SPMCSR = 0x01;//0x11; asm("spmn"); } } //更新一个Flash页的完整处理 void write_one_page(uint address1) { uint i; boot_page_ew(address1,0x03); //擦除一个Flash页 wait_page_rw_ok(); //等待擦除完成 for(i=0;i
测试ATmega32A串口通信,使用内部1M振荡, 熔丝设置 通信发送ASCII码0~2,返回十六进制均为两个字节,3e 00, 4c 00, 66 00,如此简单的东西都无**常工作,令人费解。请大家帮帮忙,谢谢啦! //ICC-AVR application builder : 2015-09-05 10:23:35 // Target : M32 // Crystal: 1.0000Mhz #include #include void USART_Transmit( unsigned char data ); void port_init(void) { PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //UART0 initialize // desired baud rate: 9600 // actual: baud rate:9615 (0.2%) void uart0_init(void) { UCSRB = 0x00; //disable while setting baud rate UCSRA = 0x02; UCSRC = BIT(URSEL) | 0x06; UBRRL = 0x0C; //set baud rate lo UBRRH = 0x00; //set baud rate hi UCSRB = 0x98; } #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC void uart0_rx_isr(void) { //uart has received a character in UDR unsigned char i=0; i=UDR; USART_Transmit(i); } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); uart0_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } void USART_Transmit( unsigned char data ) { /* 等待发送缓冲器为空 */ while ( !( UCSRA & (1
ATtiny24a 的PIO change interrupt 中断,说明书中的意思是只要IO口状态有改变就能触发中断。 实际测试发现只有IO口由高电平变到低电平才会触发中断。IO口低电平变到高电平不会触发中断,求大神解释,这是为什么?
我现用的是AVR ATMEG16A单片机,在用USART串口通信时遇到了百思不得其解的问题,就是在调用串口发送函数发送完一串字符后,若紧接着再调用这个函数就会丢失后面的一次发送过程(就是在串口助手中没有收到(" !注意:字1111111!!!!!. "),若在这两次的中间加入200ms 的延时,就不会丢失,在串口助手中只能收到第一次和第三次的信息,代码如下: USART_txout("本产品支持中英文显示,最大显示32个汉字或64个字母/符号,自动换行。",66); USART_txout(" !注意:字1111111!!!!!. ",30); clear_screen(); display_graphic_32x32(1,64,hao); display_GB2312string(3,105,"!"); MS_delay(200); USART_txout(" !注意:字母或标点符号只支持英文输入法,否则不会显示. ",66); 发送函数如下: void USART_txout(uchar *data,uchar length) { unsigned char i=0; for(i=0;i
利用avr studio 6 编写简单的程序,生成hex文件后,怎么下载到单片机中。现有usbisp下载器。 (尝试过progisp下载,但简单的输出高电平程序也没有反应。D1~D7口反而始终呈现高电平。