Stránka 1 z 1
ATTINY4313 výstupy a propojení čítačů
Napsal: 15 lis 2016, 19:36
od epes
1. Potřeboval bych poradit jak dosáhnout toho, aby výstup čítače TCNT0 byl na pinu PD5. Výstup na pin PB2 je bez problémů. Příkazy
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.
Napsal: 15 lis 2016, 20:27
od lesana87
Když používáš CTC režim, musíš nastavit OCR0A, protože určuje periodu. OCR0B pak musí mít menší nebo stejnou hodnotu jako OCR0A, aby se OC0B překlápěl.
Napsal: 15 lis 2016, 21:00
od epes
Pokud myslýš např. toto:
TCCR0A=0b01010010;
OCR0A=250;
OCR0B=250;
TCCR0B=0b00000100;
tak to jsem též zkusil a na pinu PD5 kde nictu nic.
Napsal: 15 lis 2016, 21:17
od kachle
A jaký použiješ programátor na tu ATTINY4313?
Napsal: 15 lis 2016, 21:48
od frpr666
Ano zapojit čítače do "kaskády" lze a taky se to tak dělá už několik let.
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.
Napsal: 15 lis 2016, 22:01
od epes
Kachle, používám programátor DRAGON.
S drátkem to umím, takže jsem datasheet nejspíš četl. Dotaz byl na bezdrátkové zapojeníé fr66...
Napsal: 16 lis 2016, 20:04
od lesana87
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
Napsal: 16 lis 2016, 20:31
od frpr666
@lesana OK rozumím, navrhované řešení využívá skutečnosti, že OC0B sdílí s T1 stejný pin.
Atmel má pěknou AN133 na téma kaskádování čítačů/časovačů.
Napsal: 17 lis 2016, 11:36
od epes
Tak se tak Lesanko hned nedurdi, to víš mužský občas myslí tvrdě. A že to mám blbý(é), to vím už dávno, zvlášť když jsem assembler viděl naposledy asi před 100 lety a tak vůbec nerozumím proč nastavuješ pin PB3 jako výstupní když výstup čítače0 je na pinu PB2. Dále vůbec nechápu význam příkazů
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?
Napsal: 17 lis 2016, 13:25
od lesana87
PB3 nastavuju na výstup proto, že mě zajímá výstup A čítače 1, abych viděla, že funguje to zřetězení. Naopak výstup A čítače 0 mě vůbec nezajímá, protože použitý je jen výstup B na pinu PD3.
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é.
Napsal: 17 lis 2016, 18:28
od epes
Přiznám se, že jsem netušil,že pull-up odpory snižují spotřebu procesoru, spíš jsem si myslel, že omezují možnost nákazy v tom sychravém povětří. Holt učit se, učit se musí člověk i na stará kolena, pak se možná i amatérům bude zdát i složitý zápis profíka trochu čitelnější.
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.
Napsal: 17 lis 2016, 20:13
od lesana87
Jak ti to může fungovat, když máš ddrd=0b0000000; tj. celý port D a tedy i pin PD5 jako vstupní?
Napsal: 17 lis 2016, 21:21
od epes
Á chybička se vloudila, naštěstí jen při přepisu. V originále je jednička.
Napsal: 17 lis 2016, 21:32
od lesana87
Když je takový problém sem zkopírovat ten skutečný program, ve kterém se má hledat chyba, tak to

Napsal: 17 lis 2016, 22:00
od epes
Tak se zase hned nedurdi, Lesanko, originál program Ti zaslat nemůžu neboť sedím cca 160km od svého bastlířského kutlochu a u sebe mám pouze papírovou verzi původníého programu. Z té původní verze zbylo pro potřeby ověření možnosti propojení čítačů jen pár řádků. Věř mi, že jsem si kombinováním a nastavením vyhrál hodně dlouho, než jsem se obrátil na toto forum. Až se v sobotu vrátím domů, zkusím nějakým způsobem přeložit Tvůj assemblerovský kod a naprogramovat třeba ATTINY2313 abych vyloučil eventuální chybu překladače a programátoru. No, apokud to nebude k ničemu a Ty už mi nic jiného neporadíš, budu nejspíše donucen jít dělat něco užitečnějšícho.
Dobrou noc