Уважаемые форумчане, подскажите...
Код:
#include <io.h>
#include <delay.h>
#include <spi.h>
/*void SPI_MasterInit(void)
{
}
void SPI_MasterTransmit(void)
{
}
*/
void main(void)
{
PORTD=0b00000000;
DDRD=0b00010000;
PORTC=0b00000000;
DDRC=0b00000011;
PORTB=0b11110000;
DDRB=0b11111000;
//SPSR=0x00;
OCR1AH=0x5DC;
OCR1AL=1500;
TCCR1A=0b10000010;
TCCR1B=0b00011001;
ICR1H=20000;
ICR1L=20000;
while (1)
{
if(PIND.0==0)
{
//PORTD.5=1;
OCR1A=OCR1A+10;
delay_ms(20);
//PORTC.0=1;
//spi('1');
}
else
{
//spi('0');
//PORTC.0=0;
};
if(PIND.1==0)
{
//PORTD.5=1;
OCR1A=OCR1A-10;
delay_ms(20);
//PORTC.1=1;
//spi('1');
}
else
{
//spi('0');
//PORTC.1=0;
};
}
}
Не могу разобраться в настройке таймера. Сколько перечитал, не доходит. Где ошибаюсь?
Вот ещё код ассемблера.
Код:
;//#include <mega16.h>
;#include <delay.h>
;#include <spi.h>
;
;/*void SPI_MasterInit(void)
;{
;
;}
;
;void SPI_MasterTransmit(void)
;{
;
;}
;*/
;void main(void)
; 0000 0011 {
.CSEG
_main:
; .FSTART _main
; 0000 0012
; 0000 0013
; 0000 0014 PORTD=0b00000000;
LDI R30,LOW(0)
OUT 0x12,R30
; 0000 0015 DDRD=0b00010000;
LDI R30,LOW(16)
OUT 0x11,R30
; 0000 0016
; 0000 0017 PORTC=0b00000000;
LDI R30,LOW(0)
OUT 0x15,R30
; 0000 0018 DDRC=0b00000011;
LDI R30,LOW(3)
OUT 0x14,R30
; 0000 0019
; 0000 001A PORTB=0b11110000;
LDI R30,LOW(240)
OUT 0x18,R30
; 0000 001B DDRB=0b11111000;
LDI R30,LOW(248)
OUT 0x17,R30
; 0000 001C
; 0000 001D //SPSR=0x00;
; 0000 001E
; 0000 001F OCR1AH=0x5DC;
LDI R30,LOW(220)
OUT 0x2B,R30
; 0000 0020 OCR1AL=1500;
OUT 0x2A,R30
; 0000 0021 TCCR1A=0b10000010;
LDI R30,LOW(130)
OUT 0x2F,R30
; 0000 0022 TCCR1B=0b00011001;
LDI R30,LOW(25)
OUT 0x2E,R30
; 0000 0023 ICR1H=20000;
LDI R30,LOW(32)
OUT 0x27,R30
; 0000 0024 ICR1L=20000;
OUT 0x26,R30
; 0000 0025
; 0000 0026
; 0000 0027 while (1)
_0x3:
; 0000 0028 {
; 0000 0029 if(PIND.0==0)
SBIC 0x10,0
RJMP _0x6
; 0000 002A {
; 0000 002B //PORTD.5=1;
; 0000 002C
; 0000 002D OCR1A=OCR1A+10;
IN R30,0x2A
IN R31,0x2A+1
ADIW R30,10
RCALL SUBOPT_0x0
; 0000 002E delay_ms(20);
; 0000 002F
; 0000 0030 //PORTC.0=1;
; 0000 0031 //spi('1');
; 0000 0032 }
; 0000 0033
; 0000 0034 else
_0x6:
; 0000 0035 {
; 0000 0036 //spi('0');
; 0000 0037 //PORTC.0=0;
; 0000 0038 };
; 0000 0039
; 0000 003A if(PIND.1==0)
SBIC 0x10,1
RJMP _0x8
; 0000 003B {
; 0000 003C //PORTD.5=1;
; 0000 003D OCR1A=OCR1A-10;
IN R30,0x2A
IN R31,0x2A+1
SBIW R30,10
RCALL SUBOPT_0x0
; 0000 003E delay_ms(20);
; 0000 003F
; 0000 0040 //PORTC.1=1;
; 0000 0041 //spi('1');
; 0000 0042 }
; 0000 0043
; 0000 0044 else
_0x8:
; 0000 0045 {
; 0000 0046 //spi('0');
; 0000 0047 //PORTC.1=0;
; 0000 0048 };
; 0000 0049 }
RJMP _0x3
; 0000 004A }
_0xA:
RJMP _0xA
; .FEND
#ifndef __SLEEP_DEFINED__
#define __SLEEP_DEFINED__
.EQU __se_bit=0x40
.EQU __sm_mask=0xB0
.EQU __sm_powerdown=0x20
.EQU __sm_powersave=0x30
.EQU __sm_standby=0xA0
.EQU __sm_ext_standby=0xB0
.EQU __sm_adc_noise_red=0x10
.SET power_ctrl_reg=mcucr
#endif
.CSEG
.CSEG
;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES, CODE SIZE REDUCTION:2 WORDS
SUBOPT_0x0:
OUT 0x2A+1,R31
OUT 0x2A,R30
LDI R26,LOW(20)
LDI R27,0
RJMP _delay_ms
.CSEG
_delay_ms:
adiw r26,0
breq __delay_ms1
__delay_ms0:
__DELAY_USW 0x7D0
wdr
sbiw r26,1
brne __delay_ms0
__delay_ms1:
ret
;END OF CODE MARKER
__END_OF_CODE:
Как мне подсказал знающий человек ассемблер, то в таймере, он записывает LOW значения, а HIGHT не хочет, почему, ни он, ни я понять не можем. Может, здесь смогут помочь?