Gudd-Head писал(а):Тогда только софтово
Для такой маленькой частоты как раз.
Gudd-Head писал(а):Тогда только софтово
Код: Выделить всё
#include <io.h>
#include <delay.h>
// Alphanumeric LCD functions
#include <alcd.h>
// Declare your global variables here
// Voltage Reference: AVCC pin
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR))
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=(1<<ADSC);
// Wait for the AD conversion to complete
while ((ADCSRA & (1<<ADIF))==0);
ADCSRA|=(1<<ADIF);
return ADCW;
}
void main(void)
{
// Declare your local variables here
int q=0x2EE;
// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
// Port B initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(1<<DDB7) | (1<<DDB6) | (1<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=0 Bit6=0 Bit5=0 Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
// Port E initialization
// Function: Bit7=In Bit6=In Bit5=Out Bit4=Out Bit3=Out Bit2=In Bit1=In Bit0=In
DDRE=(0<<DDE7) | (0<<DDE6) | (1<<DDE5) | (1<<DDE4) | (1<<DDE3) | (0<<DDE2) | (0<<DDE1) | (0<<DDE0);
// State: Bit7=T Bit6=T Bit5=0 Bit4=0 Bit3=0 Bit2=T Bit1=T Bit0=T
PORTE=(0<<PORTE7) | (0<<PORTE6) | (0<<PORTE5) | (0<<PORTE4) | (0<<PORTE3) | (0<<PORTE2) | (0<<PORTE1) | (0<<PORTE0);
// Port F initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRF=(0<<DDF7) | (0<<DDF6) | (0<<DDF5) | (0<<DDF4) | (0<<DDF3) | (0<<DDF2) | (0<<DDF1) | (0<<DDF0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTF=(0<<PORTF7) | (0<<PORTF6) | (0<<PORTF5) | (0<<PORTF4) | (0<<PORTF3) | (0<<PORTF2) | (0<<PORTF1) | (0<<PORTF0);
// Port G initialization
// Function: Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRG=(0<<DDG4) | (0<<DDG3) | (0<<DDG2) | (0<<DDG1) | (0<<DDG0);
// State: Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTG=(0<<PORTG4) | (0<<PORTG3) | (0<<PORTG2) | (0<<PORTG1) | (0<<PORTG0);
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Non-Inverted PWM
// OC1B output: Non-Inverted PWM
// OC1C output: Non-Inverted PWM
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 8 us
// Output Pulse(s):
// OC1A Period: 8 us
// OC1B Period: 8 us
// OC1C Period: 8 us
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<COM1C1) | (0<<COM1C0) | (1<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x4E;
ICR1L=0x20;
OCR1AH=0x02;
OCR1AL=0xEE;
OCR1BH=0x02;
OCR1BL=0xEE;
OCR1CH=0x02;
OCR1CL=0xEE;
// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Fast PWM top=ICR3
// OC3A output: Non-Inverted PWM
// OC3B output: Non-Inverted PWM
// OC3C output: Non-Inverted
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 8 us
// Output Pulse(s):
// OC3A Period: 8 us
// OC3B Period: 8 us
// OC3C Period: 8 us
// Timer3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=(1<<COM3A1) | (0<<COM3A0) | (1<<COM3B1) | (0<<COM3B0) | (1<<COM3C1) | (0<<COM3C0) | (1<<WGM31) | (0<<WGM30);
TCCR3B=(0<<ICNC3) | (0<<ICES3) | (1<<WGM33) | (1<<WGM32) | (0<<CS32) | (1<<CS31) | (0<<CS30);
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x02;
OCR3AL=0xEE;
OCR3BH=0x02;;
OCR3BL=0xEE;
OCR3CH=0x02;
OCR3CL=0xEE;
// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
SFIOR=(0<<ACME);
// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTA Bit 1
// EN - PORTA Bit 2
// D4 - PORTA Bit 3
// D5 - PORTA Bit 4
// D6 - PORTA Bit 5
// D7 - PORTA Bit 6
// Characters/line: 16
lcd_init(16);
while (1)
{
// Place your code here
read_adc(0);
if (ADCW>=0) {
q=750+ADCW*1.4;
OCR1A=q;
delay_ms(150);
}
read_adc(1);
if (ADCW>=0) {
q=750+ADCW*1.4;
OCR1B=q;
delay_ms(150);
}
/*read_adc(2);
if (ADCW>=0) {
q=750+ADCW*1.4;
OCR1C=q; // ВОТ ЭТА ЕРУНДА НЕ РАБОТАЕТ!!!
delay_ms(150);
}*/
}
}Код: Выделить всё
OCR1CH=0x02;
OCR1CL=0xEE;Код: Выделить всё
while (1)
{
// Place your code here
read_adc(0);
if (ADCW>=0) {
q=750+ADCW*1.4;
OCR1A=q;
delay_ms(150);
}
read_adc(1);
if (ADCW>=0) {
q=750+ADCW*1.4;
OCR1B=q;
delay_ms(150);
}
/*read_adc(2);
if (ADCW>=0) {
q=750+ADCW*1.4;
OCR1C=q; // ВОТ ЭТА ЕРУНДА НЕ РАБОТАЕТ!!!
delay_ms(150);
}*/
}Код: Выделить всё
OCR1CH = q>>8;
OCR1CL = q&0xFF;Код: Выделить всё
OCR1C=q; // ВОТ ЭТА ЕРУНДА НЕ РАБОТАЕТ!!!Код: Выделить всё
sfrb ICR1L=0x26;
sfrb ICR1H=0x27;
sfrw ICR1=0x26; // 16 bit access
sfrb OCR1BL=0x28;
sfrb OCR1BH=0x29;
sfrw OCR1B=0x28; // 16 bit access
sfrb OCR1AL=0x2a;
sfrb OCR1AH=0x2b;
sfrw OCR1A=0x2a; // 16 bit accessКод: Выделить всё
#define OCR1C_WRITE(x) OCR1CH=x>>8; OCR1CL=x&0xFF;22.6 ADC Noise Canceler
...
1. Make sure that the ADC is enabled and is not busy converting. Single Conversion
mode must be selected and the ADC conversion complete interrupt must be
enabled.
Код: Выделить всё
#define OCR1CL (*(unsigned char *) 0x78)
#define OCR1CH (*(unsigned char *) 0x79)
#define TCCR1C (*(unsigned char *) 0x7a)Код: Выделить всё
16-bit Timer/Counter (Timer/Counter1 and Timer/Counter3)
15.11 Register DescriptionPlagueDoctor писал(а):uk8amk, здравствуйте! Когда в настройках таймера прописываю, то там ни на что не ругается. Вот дефайн в библиотеке лежит, а как им пользоваться, я ума не приложу.Код: Выделить всё
#define OCR1CL (*(unsigned char *) 0x78)
#define OCR1CH (*(unsigned char *) 0x79)
#define TCCR1C (*(unsigned char *) 0x7a)
С Вашей подсказкой нашёл и иностранный форум с этим же решением http://www.avrfreaks.net/forum/ocr1c-undefined-codevision , не пойму, как и что. Уже методом тыка проверяю, не выходит. У меня серводвигатель не встаёт в крайнее положение. Даже не шолохается. При OCR1A/B всё хорошо, встаёт и, когда пытаюсь рукой сдвинуть, ступор даёт. А с OCR1C вообще беда.
Код: Выделить всё
unsigned int OCR1C = (unsigned int *)OCR1CL;DronVolk писал(а):что бы из них сделать 16 число нужно припилить его через приведение типов
Код: Выделить всё
volatile uint16_t i;
*((uint16_t*)(0x78)) = (uint16_t) 0x01; // Какбы запись в OCR1C
i = *((uint16_t*)(0x78)); // его чтениеКод: Выделить всё
; 49 *((uint16_t*)(0x78)) = (uint16_t) 0x01;
LDI R30,LOW(1)
LDI R31,HIGH(1)
STS 120,R30
STS 120+1,R31
; 50
; 51 i = *((uint16_t*)(0x78));
LDS R30,120
LDS R31,120+1
ST Y,R30
STD Y+1,R31Код: Выделить всё
; Set TCNTn to 0x01FF
ldi r17,0x01
ldi r16,0xFF
out TCNTnH,r17
out TCNTnL,r16
; Read TCNTn into r17:r16
in r16,TCNTnL
in r17,TCNTnH