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

  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.

Podle nastavení čítače odhaduju, že chceš stavět hodiny nebo něco podobnýho.

Jeden detail - máš CTC nastaveno na 251 cyklů. Čítač čítá 0-OCR0A a do nuly přeteče až při dosažení OCR0A+1 …


To je proto, že nastavuješ CTC režim čítače a pokud nastavíš jenom OCR0B a ne OCR0A, pak čítač počítá jenom do 0.

Tohle by mělo pracovat s pinem D5:
TCCR0A=0b00010010;
OCR0A=250;
OCR0B=250;
TCCR0B=0b00000100;

A tohle by mělo pracovat s pinem D5 i B2:
TCCR0A=0b01010010;
OCR0A=250;
OCR0B=250;
TCCR0B=0b00000100;


Následným nastavením bitů CS12:0 čítače 1 bys měl teoreticky dosahnout toho, že čítač 0 Ti bude sloužit jako vstup
hodin pro čítač 1. Myslím, že PCINTx umí generovat přerušení i při změně na výstupním pinu, tak by mohlo fungovat
i tohle - chce to vyzkoušet.


A že jsem tak zvědavý - když chceš takhle generovat hodiny pro čítač 1, nebylo by lepší udělat čítání pomocí sotfwaru ?

TCCR0A=0b00000010; // Nastavit CTC mode, všechny porty nechat jako IO piny
OCR0A=249; // Nastavit čítání na 0-249 (250 cyklů hodin)
TCCR0B=0b00000100; // Prescaler na 256
TIMSK=(1<<OCIE0A);

V tomto nastavení při 8 MHz SysCLK dochází k přerušení 125x za sekundu.
SysCLK/Prescaler/TimerCounts = 8000000/256/250=125

A na přerušovací vektor TIMER0_COMPA pak posadit v podstatě sofwarový čítač 1 ?

Odhaduješ správně, chci udělat jednoduchý časovač - spínač ale na dlouhé i krátké časy.
ad1) Asi jsem vyzkoušel všechny možné kombinace nastavení a stejně na pin D5 nic neleze. Zkusím ještě znovu zkontrolovat zapojení a naprogramovat jen část kodu týkajícího se čítačů. Uvidím jestli se něco změní a dám vědět.
Co se týče SW čítaní, tak to jsem měl původně v úmyslu, ale nedostatek paměti (4kB) mne od toho odradil.
Zatím díky.

Já nevím, ale 4kB paměti je spousta místa. Nacpal jsem časovač pro osvitku ovládanou rotačním kodérem s časem nastavitelným od 1 sekundy do 2 hodin a zobrazením času na 3,5 místném LCD buzeným pomocí 4 ks IO 74595 zapisovaných pomocí SPI do ATtiny13A s 1 kB programové paměti. A to si ještě pamatuje v EEPROM poslední startovací čas, takže po vypnutí a zapnutí je nastavený čas posledního spuštění… K tomu je SPI port taky softwarový, protože ATtiny13 nemá HW SPI port. Navíc jsem musel multiplexovat výstupní signál DATA se vstupem tlačítka enkodéru, protože pro 74595-ky potřebuju 3 piny, pro enkodér taky 3, ale na ATtiny13A (bez použití RESET pinu, abych mohl program v případě potřeby upravovat) je jich k dispozici jenom 5.

Z toho důvodu si myslím, že nacpat v podstatě shodný program do 4 kB by neměl být problém.

Můj problém s pamětí spočívá hlavně v mé lenosti naučit se pořádně Céčko. Používám MikroC od Mikroelektroniky. Ten jejich systém má sice velmi pěkné IDE, zato jejich knihovny jsou stašný žrouti paměti. Taková knihovna pro ovládání displaje spolkne snad 1KB, knihovna pro OneWire je to samé, interní fce Delay také není žádný drobek. Nejspíš mi teď poradíš abych si naprogramoval lepší rutiny, jenomže nejsou lidi a hlavně buňky. Ale kdybys měl nějaký tip odkud ty rutiny importovat, tak se zlobit nebudu.
Jinak jsem ještě laboroval s čítačema a zjistil jsem, že když nastavím normální mod čítače a nikoli CTC ( TCCR0A=0b01010000) tak se výstupní signál objeví na obou portech. Takže problém je nejspíše někde v nastavení registrů, ale kde. Začínám podezřívat překladač i programátor, chip jsem už vyměnil - bez výsledku.

No jo, jenže když nastavíš normální režim a ne CTC, tak z čítače nedostaneš tech 125 Hz, ale 122,0703125 Hz.

Jinak z věty “Můj problém s pamětí spočívá hlavně v mé lenosti naučit se pořádně Céčko.” mi plyne, že “nejsou lidi a hlavně buňky.” asi nebude úplně pravda, protože jak můžeš vědět, že nejsou buňky, když nejsou lidi a je lennost.

[code] TCCR0A=0b00010010;
OCR0A=249;
OCR0B=249;
TCCR0B=0b00000100;

        TCCR1B=0b00000110;

[/code]
Výše zmíněný kód jsem zkoušel v AVR Studiu a tváří se, že normálně funguje.

[code] TCCR0A=0b01010010;
OCR0A=249;
OCR0B=249;
TCCR0B=0b00000100;

        TCCR1B=0b00000110;

[/code]
A tenhle druhý kmitá oběma pinama.
Oba kódy slouží jako zdroj hodin pro Timer 1. Jen musíš počítat s tím, že hodiny pro Timer 1 mají poloviční kmitočet - tedy 62,5 Hz. Musíš upravit hodnoty OCR0x, abys dostal požadovaný kmitočet.

Na reálném mcu jsem to zatím nezkoušel, ale chodilo jak v AVR Studiu, tak i v simulátoru, který používám při vývoji zařízení.

Mimochodem - stejně si myslím, že softwarové čítání Tě bude stát pár bytů, bude mnohem jednodušší, ušetříš pin a časovač. Kromě toho, když v tom přerušení budeš i načítat tlačítka, pak máš velmi jednoduše ošetřené zákmity, rozlišené dlouhé a krátké stisky apod.


A teď ke zbytku :

"Taková knihovna pro ovládání displaje spolkne snad 1KB, knihovna pro OneWire je to samé, interní fce Delay také není žádný drobek. Nejspíš mi teď poradíš abych si naprogramoval lepší rutiny, jenomže nejsou lidi a hlavně buňky. Ale kdybys měl nějaký tip odkud ty rutiny importovat, tak se zlobit nebudu."

Funkci Delay se vyhybej jako čert kříži. Tu používej maximálně na čekání v jednotkách ms a i to je pro mcu věčnost.

Stahováním knihoven se nic nenaučíš. Ovládání znakovýho LCD není vůbec nic složitýho a zabere jenom minimální místo v paměti. Když si vezmeš k ruce datasheet, máš všechny funkce řadiče naprogramovaný za odpoledne a ještě se něco naučíš. Ovládání 7-segmentových čísel je jenom o malinko složitější, než blikání LEDkou. Totéž platí i pro 7-segmentové LCD displeje. Obzvlášť pro ty, které mají jenom jednu BP.

OneWire je také jednoduché - obzvlášť, pokud bys měl připojené jenom jedno čidlo na pinu. Algoritmus pro zjištění počtu čidel je o něco složitější, ale komunikace je shodná, jako když komunikuješ jenom s jedním. Jde jenom o data… Ale opět to chce vzít do ruky datasheet a testovat.

Pro zajímavost :
1-wire knihovna + ovládání 1-wire teploměru (2 knihovny dohromady)

  • se čtením počtu a kódů 1-wire zařízení = 934 bytů - hlavně kvůli vyhledávacímu algoritmu a při čtení se data rozhazují podle toho, z jakého čidla se četlo.
    Pro čipy, které mají instrukci “mul” (čipy ATmega) je to méně - u ATtiny4313 (a myslím, že u všech ATtiny) se musí násobení dělat softwarově.
  • pro jeden 1-wire teploměr na pinu = 386 bytů

Knihovna pro znakový LCD :
Délka překladu se liší podle použité komunikace s displejem (podmíněný překlad)

  • 8-bitová komunikace : 156 bytů
  • 4-bitová komunikace : 226 bytů
  • SPI interface 1 (8-bitová data přes 74595 + signály WR a EN ) : 186 bytů
  • SPI interface 2 (8-bitová data přes 74595 včetně WR a EN - vlastní modul) : 278 bytů
  • I2C interface (SW I2C pro čip PCA9555) : 618 bytů

Nějak tedy nevidím důvod, proč používat pro LCD knihovnu, která zabere 1 kB, když si mohu napsat svojí a ještě se něco naučit. Kdybych tenkrát při prvním použití displeje sedl k Internetu a hledal knihovnu, tak bych do dneška lepil zapojení podle knihovny. To, co jsem vypsal jsou jenom ty způsoby komunikace, které jsem už použil.

Je mi jasný, že namítneš “Proč bych měl programovat něco, co se dá někde najít a stáhnout.”.
Na to já odpovídám : "Aby ses něco naučil."

Věř mi, že pokud uvidíme snahu, pak pomůžeme/poradíme. Nebudeme tady ale řešit domácí úkoly, což na nás tady více či méně zaobaleně také někteří zkouší - poradíme, nasměrujeme, ale neřešíme.

Nevím jaké potřebuješ rozsahy času a jemnost nastavení, ale pokud bys přistoupil na dělení 1ms, tak toho se dá snadno dosáhnout na časovači 0 - bude Ti generovat přerušení přesně s periodou 1ms a pak už si s tím uděláš cokoliv. Takový kód zabýrá 180 B což je 4.4% kapacity čipu.

Add. učení C: Konstrukce která umožňuje mnou výše popsané, je natolik primitivní, že se nedá hovořit o programování. To je o tom, popřemýšlet o zadání a pak si prostudovat katalogový list od procesoru. Nic víc.