ATTINY4313 výstupy a propojení čítačů
Moderátor: Moderátoři
ATTINY4313 výstupy a propojení čítačů
TCCR0A=0b01000010;
OCR0A=250;
TCCR0B=0b00000100;
zajistí výstupna pin PB2. Ovšem příkazy
TCCR0A=0b00010010;
OCR0B=250;
TCCR0B=0b00000100;
výstup na pin PD5 neprovedou. A já nejsem schopen zjistit proč.
2. Je vůbec možné propojit výstup čítače0 se vstupem čítače1 bez drátů?
Předpokládal jsem, že když nastavím výstup čítače0 na pin PD5 a zároveň nastavím pin PD5 jako externí vstup čítače1, že by to eventuálně mohlo fungovat. Jak je vidět předpoklad nebyl nejlepjší a proto hledám někoho kdo by mně poradil.
Díky za každou radu.
Oba TCNT0 i TCNT1 mají možnost externího vstupu.
Oba TCNT0 i TCNT1 mají možnost výstupu na pin.
Budeš potřebovat jeden drátek, kterým propojíš fyzicky výstup jednoho do vstupu druhého.
Lze takto TCNT0 -> TCNT1 nebo takto TCNT1 -> TCNT0
pozn. je třeba mít otevřený datasheet a udělat několik testů, než je sw odladěn.
- Přílohy
-
161115_atmel.jpg- (37.87 KiB) Staženo 154 x
epes píše:Pokud myslýš např. toto:
TCCR0A=0b01010010;
OCR0A=250;
OCR0B=250;
TCCR0B=0b00000100;
tak to jsem též zkusil a na pinu PD5 kde nictu nic.
Nemyslým, myslím. A to máš blbý, mně to tu na bastl desce bez problému funguje i s tím "bezdrátkovým" propojením T0 a T1. Co třeba nastavit pin PD5 jako výstupní?
Kód: Vybrat vše
.include "tn2313def.inc"
.cseg
.org 0
rjmp RESET ; Reset Handler
RESET: cli
ldi R16,low(RAMEND)
out SPL,R16 ; Zasobnik na konci RAM
ldi R16,(1<<3)
out DDRB,R16 ; PB3 out
ldi R16,$0FF
out PORTB,R16 ;
ldi R16,(1<<5)
out DDRD,R16 ; PD5 out
ldi R16,$0F7
out PORTD,R16 ;
rcall T0Ini ; Inicializace T0
rcall T1Ini ; Inicializace T1
lp0: rjmp lp0
;------------------------------------------------------------------------------
; Inicializace casovace 0
T0Ini: ldi R16,(1<<COM0B0)|(1<<WGM01) ; Toggle OC0B
out TCCR0A,R16
ldi R16,250
out OCR0A,R16
out OCR0B,R16
ldi R16,(1<<CS02) ; CTC, Clk / 256
out TCCR0B,R16
ret
;------------------------------------------------------------------------------
; Inicializace casovace 1
T1Ini: ldi R16,high(49)
out OCR1AH,R16
ldi R16,low(49)
out OCR1AL,R16
ldi R16,(1<<COM1A0)
out TCCR1A,R16 ; Toggle 0C1A
ldi R16,(1<<WGM12)|(1<<CS12)|(1<<CS11)
out TCCR1B,R16 ; CTC, Clk = T1
ret
Atmel má pěknou AN133 na téma kaskádování čítačů/časovačů.
- Přílohy
-
161116_an133.jpg- (19.93 KiB) Staženo 134 x
ldi R16,$0F7
out PORTD,R16 .
Jinak si myslím, že v mém céčkovském kodu je to samé, včetně příkazu na nastavení pinu PD5 jako výstupního pinu.
Při včerejším laborováním jsem zjistil, že když nastavím čítač0 na normální mod (0b01010000), tak se signál objeví na obou pinech. Takže nejspíš bude chybička někde v nastavení registrů, ale kde. Nenapadá Tě něco, Lesanko?
ldi R16,$0F7
out PORTD,R16
mělo být správně
ldi R16,$7F
out PORTD,R16
Ale to je celkem vedlejší, jen se tím nastavují na vstupních pinech pull-up odpory, aby vstupy nevlály ve vzduchu a procesor zbytečně moc nežral. Kde máš chybu v programu říct neumím, jelikož jsi ho sem celý nedal.
Jinak k tomu nastavování registrů je lepší používat názvy bitů + rotace, tj.
TCCR0A=(1<<COM0A0)|(1<<COM0B0)|(1<<WGM01);
místo
TCCR0A=0b01010010;
Je to mnohem přehlednější, vychytá se tím řada chyb (překlepů) a je to i částečně procesorově nezávislé.
Ten můj veleprogram vypadá následovně:
ddrd=0b0000000;
portd=0b0100000;
ddrb=0b11111111;
portb=0b00000000;
TCCR0A=0b01010010;
TCCR1A=0B01000000;
OCR0A=250;
OCR0B=250;
TCCR0B=0b00000100;
těchto pár příkazů mi vyexportuje podělený systémový kmitočet na pin PB2, ale na PD5 nikoli. A pokud změním TCCR0A=0b01010010; na TCCR0A=0b01010000; tak to funguje.
Podle tebe by pak stačil příkaz TCCR1B=0b00001111; a čítače by se propojily do kaskády tak, jak jsem si to představoval.
Teď už jen najít tu chybu.
Dobrou noc