ATTINY4313 výstupy a propojení čítačů

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
epes
Příspěvky: 120
Registrován: 05 srp 2008, 00:00
Bydliště: Praha 5

ATTINY4313 výstupy a propojení čítačů

#1 Příspěvek 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.
Uživatelský avatar
lesana87
Příspěvky: 4397
Registrován: 20 zář 2014, 00:00

#2 Příspěvek 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.
Uživatelský avatar
epes
Příspěvky: 120
Registrován: 05 srp 2008, 00:00
Bydliště: Praha 5

#3 Příspěvek 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.
Uživatelský avatar
kachle
Příspěvky: 276
Registrován: 23 lis 2015, 00:00

#4 Příspěvek od kachle »

A jaký použiješ programátor na tu ATTINY4313?
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#5 Příspěvek od frpr666 »

Ano zapojit čítače do "kaskády" lze a taky se to tak dělá už několik let. :D
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
Uživatelský avatar
epes
Příspěvky: 120
Registrován: 05 srp 2008, 00:00
Bydliště: Praha 5

#6 Příspěvek 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...
Uživatelský avatar
lesana87
Příspěvky: 4397
Registrován: 20 zář 2014, 00:00

#7 Příspěvek 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
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#8 Příspěvek 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čů.
Přílohy
161116_an133.jpg
(19.93 KiB) Staženo 134 x
Uživatelský avatar
epes
Příspěvky: 120
Registrován: 05 srp 2008, 00:00
Bydliště: Praha 5

#9 Příspěvek 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?
Uživatelský avatar
lesana87
Příspěvky: 4397
Registrován: 20 zář 2014, 00:00

#10 Příspěvek 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é.
Uživatelský avatar
epes
Příspěvky: 120
Registrován: 05 srp 2008, 00:00
Bydliště: Praha 5

#11 Příspěvek 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.
Uživatelský avatar
lesana87
Příspěvky: 4397
Registrován: 20 zář 2014, 00:00

#12 Příspěvek od lesana87 »

Jak ti to může fungovat, když máš ddrd=0b0000000; tj. celý port D a tedy i pin PD5 jako vstupní?
Uživatelský avatar
epes
Příspěvky: 120
Registrován: 05 srp 2008, 00:00
Bydliště: Praha 5

#13 Příspěvek od epes »

Á chybička se vloudila, naštěstí jen při přepisu. V originále je jednička.
Uživatelský avatar
lesana87
Příspěvky: 4397
Registrován: 20 zář 2014, 00:00

#14 Příspěvek od lesana87 »

Když je takový problém sem zkopírovat ten skutečný program, ve kterém se má hledat chyba, tak to :hojahoj:
Uživatelský avatar
epes
Příspěvky: 120
Registrován: 05 srp 2008, 00:00
Bydliště: Praha 5

#15 Příspěvek 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
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“