---
Эта конструкция помогла - несколько резисторов, в другая схема, код и в Serial ... и все в порядке с ATtiny13A:
Restauration des fuses AVR ATtiny avec un Arduino
https://o0tad0o.wordpress.com/2013/05/1 ... n-arduino/
В этом варианте можно задавать значение полупериода в миллисекундах, от 1 до 65535 мсек.ARV писал(а):получить меандр 1,2 Гц или 2,73
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/boot.h>
#define OUTPIN_MASK _BV(PB3)
#define HALF_PERIOD 500 // 500 ms, 1 Hz
// Timer/Counter Compare Match A
// Every 1 ms
ISR(TIM0_COMPA_vect)
{
static uint16_t cntr = 0;
if(++cntr >= HALF_PERIOD) {
PINB |= OUTPIN_MASK;
cntr = 0;
}
}
int main(void)
{
uint8_t prescaler = 0;
uint8_t f_low = boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS);
uint8_t f_cksel = ~(FUSE_CKSEL0 & FUSE_CKSEL1) & f_low;
switch(f_cksel) {
case (uint8_t)~(FUSE_CKSEL0 & FUSE_CKSEL1): // Internal 128 kHz Oscillator
// Fcpu clkIO/2 = 64 kHz
prescaler = _BV(CLKPS0);
// T = (64*(0+1)) / 64000 Hz = 1 ms
OCR0A = 0;
break;
case (uint8_t)~FUSE_CKSEL1: // 9.6 MHz
// Fcpu clkIO/2 = 4.8 MHz
prescaler = _BV(CLKPS0);
// continue in 4.8 MHz section
case (uint8_t)~FUSE_CKSEL0: // 4.8 MHz
// T = (64*(74+1)) / 4800000 Hz = 1 ms
OCR0A = 74;
break;
}
// prescaler
if(prescaler) {
CLKPR = _BV(CLKPCE);
CLKPR = prescaler;
}
// Timer0 CTC mode 2, Toggle OC0A on Compare Match
TCCR0A = _BV(COM0A0) | _BV(WGM01);
// Timer0 clkIO/64
TCCR0B = _BV(CS01) | _BV(CS00);
// Timer/Counter0 Output Compare Match A Interrupt Enable
TIMSK0 = _BV(OCIE0A);
// output
DDRB |= OUTPIN_MASK;
// enable interrupts
sei();
while(1) {
;
}
}
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
int main(void){
DDRB |= 1;
while(1){
_delay_ms(500);
PINB |= 1;
}
}насколько я смог в протеусе посмотреть, длительность полупериода ровно 500 мс. до идей GoldenAndy было 24 байта...AVR Memory Usage
----------------
Device: attiny13
Program: 18 bytes (1.8% Full)
(.text + .data + .bootloader)
Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)
ровно до тех пор, пока тактовая частота должна делиться кратно возможностям делителя таймера...veso74 писал(а):Поэтому: с таймером: красиво, чисто и с предсказуемыми последствиями.
Код: Выделить всё
0 MHz to 12.5 MHz output frequency range
with a 25 MHz clock rate, resolution of 0.1 Hz can be achieved;
with a 1 MHz clock rate, the AD9833 can be tuned to 0.004 Hz resolutionКод: Выделить всё
Sinusoidal, triangular, and square wave outputsЭто как раз издержки точности _delay_ms и нет учета времени инверсии бита и джампа в цикле. Я об этом писал.ARV писал(а):более точные измерения показали, что мой код немножко привирает, на самом деле полупериод равен 501,128 мс
Такая зависимость есть и устраняется SLEEP.GoldenAndy писал(а):...зависит от того, какая инструкция выполнялась на момент возникновения флага прерывания.
Код: Выделить всё
;26.03.2022
.INCLUDE "tn13def.inc"
;.INCLUDE "tn13Adef.inc"
.equ Fo=9600000
;.equ Fo=1200000
.equ Fout=273 ; задаваемая частота на выходе *100
.CSEG
.ORG $000
RESET:
RJMP START
.ORG $006
T0_COMPA:
SBIW YL,1
BRCS COMPA_OUT
BRNE PC+2
OUT OCR0A,R17 ; длительность последнего интервала в полупериоде
RETI
COMPA_OUT:
SBI PINB,0
RET
;*******************
START:
SBI DDRB,0
GO:
LDI R17,(50*Fo/Fout-(50*Fo/Fout/128-1)*128-1)
LDI YH,HIGH(50*Fo/Fout/128-1)
LDI YL,LOW(50*Fo/Fout/128-1)
LDI R16,1<<SE
OUT MCUCR,R16
LDI R16,128-1
OUT OCR0A,R16
LDI R16,1<<WGM01
OUT TCCR0A,R16
LDI R16,1<<OCIE0A
OUT TIMSK0,R16
OUT TIFR0,R16
LDI R16,1<<CS00
OUT TCCR0B,R16
SEI
WAIT_05P:
SLEEP
BRIE WAIT_05P
RJMP GO
.EXIT