32x32 Matrix z číny a Atmega8

Byl jsi rychlejší. Tady přepínáš mezi následujícíma stavama :
R1=1, G1=0, B1=0
R1=0, G1=1, B1=0
R1=0, G1=0, B1=1

A znova dokola.

V každým případě náběžná hrana CLK nesmí přijít zárověň se změnou dat. Musíš po změně na datových vodičích nějakou tu mikrosekundu počkat a pak teprve poslat CLK pulz.

Takhle jsem to myslel, přepínám mezi barvou R, G a B, nechtěl jsem tu ukázku komplikovat. Myslím, že to už pobírám, jen mi tam nikam nepasuje OE.

Takže nastavím barvy, počkám pár mikrosekund, pošlu puls do CLK.

Zkusím napsat kód, snad to už půjde.

IO 74595 si určitě koupím, už jen z toho důvodu, že se mi tohle zdá bezvadné a využitelné, ušetřím spoustu výstupů.

[code]#define DELAY_BACKWARD_COMPATIBLE
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

int main(){

DDRB |= (1 << PB1);    // OC1A výstup

// REZIM 5 - Fast PWM 8bit,
TCCR1A |= (1 << COM1A1) | (1 << WGM10);
TCCR1B |= (1 << WGM12) | (1 << CS11); // preddelička 

OCR1A = 128;  //strida 1:1

OSCCAL = 0xA5;    // kalibracni bajt

sei(); // globalni preruseni

while(1){  	
}

return 0;

}[/code]

s PWN jsem dneska pracoval prvně, tak nevím zda to mám tip top. Takhle by to možná pracovalo s CLK, ale jak mám teď do jiného bitu nastavit data synchroně s časovačem? ba co hůř, potřebuji CLK o něco spozdit.

Časovač by se měl inkrementovat dokud nenarazí na střídu 128 a pak spadne na nulu že? Co kdybych napsal podmínku, pokud je časovač například 100 (?) tak nastav na výstup porty kde mám připojené vstupy RGB třeba logickou true, pak by mohla být data na portech ještě před CLK?

Na synchronní přenos se PWM nepoužívá. PWM signál bude pravděpodobně použitý na řízení jasu LEDek. Pro synchronní přenos můžeš použít buď HW modul SPI, který je v procesoru - to pokud přenášíš sériově jednu hodnotu. V tomhle případě, kdy přenášíš více než jednu hodnotu najednou, musíš SPI přenos zrealizovat softwareově.

Jo - a doplním - signál OE není součástí sériového přenosu. Třeba u té 74595-ky zapíná/vypíná výstupní piny IO. Pokud je OE neaktivní, pak jsou výstupy vypnuté (ve stavu vysoké impedance). Pokud je OE aktivní, na výstupech IO jsou logické úrovně odpoídající stavu výstupního Latch registru.

Tak jsem tu zpět, po zkouškovém mám opět čas se mrknout na tu atmegu.

Trochu chápu už styl komunikace, ale abych napsal softwarové SPI pro několik datových linek a přidal do toho OE, to je na mě krapet moc. Koukal jsem na netu, ale moc jsem toho nevyčetl, většina lidí využívá hardwarové SPI, netuším jak začít, jak generovat hodinový signál který je základem komunikace? K tomu jsem chtěl použít ten PWN, ale psal jsi, že ten bude spíše na ledky, asi nemáš při ruce nějaký příklad toho, jak by to mělo vypadat?

Tím PWM jsem spíš myslel nějak využít časovače, ne rovnou modulovat šířku pulzu, to je tady k ničemu, jen prostě nastavit frekvenci která by mi nastavovala ten CLK a nějakým přerušením spouštěla funkci ve který bych nastavoval data na porty?

DS k tomu LED driver cipu sa mi nechce citat, ale mohol by si sa inspirovat existujucimi rieseniami s arduinom. Ja som nejake nasiel, urcite ich najdes aj ty. Pozret sa na to nastavovanie bitov, komunikaciu. Tie casovace to ja zese iny problem, na zaciatok ti bude stacit pouzit delay, rozblikat to… Ked budes blikat/svietit, nahradis delay casovacom.

xpertvis: Přesně takhle jsem uvažoval, nejprve nějak primitivně rozsvítit jednu ledku a pak to zoptimalizovat…

Napsal jsem toto:

#define __DELAY_BACKWARD_COMPATIBLE__
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define R0 PD0
#define G0 PD1
#define B0 PD2
#define R1 PD3
#define G1 PD4
#define B1 PD5
#define R2 PD6
#define G2 PD7
#define B2 PC0
#define R3 PC1
#define G3 PC2
#define B3 PC3

#define PA PC4
#define PB PC5
#define PC PC6

#define CLK PB0
#define OE PB1
#define LAT PB2
#define SR PB3

int main(){
DDRD = 0xFF;
DDRC = 0xFF;
DDRB = 0x10;

	PORTD = 0B00000000;
	PORTC = 0B00000000;
	PORTB = 0B00000000;

	
	while(1){  
		PORTD = 0B00000000;
		PORTC = 0B00000000;
		PORTB = 0B00000000;  //reset portů
	
	
	for (int i = 0; i<32; i++){  //projeď všechny sloupce
     if (i==0){   //pokud se jedna o prvni sloupec
		 	PORTD = 0B00000011;  //nastav R0 a G0 na true
		 	PORTC = 0B00000000;	
	}
	else {
			PORTD = 0B00000000;
			PORTC = 0B00000000;
	}
	
	_delay_us(5); //pockej 5 mikrosekund jelikož mají být data dřív než dojde ke clocku
	
	PORTC = 0B00000001;
	_delay_us(495); //nyni je CLK na high a data jsou posilany do registrů
	PORTC = 0B00000000;
	_delay_us(500); //clc na low
	
	}
	PORTC = 0B00000100;  //všechny data by měli být v shift registrech tudíž nastavuju LAT na high
	
	
	return 0;
}
}

Podobá se to už trochu tomu, co potřebuji? Po nahrání do chipu samozřejmě žádná reakce, shlédl jsem plno návodů na tu 74595. Je mi jasné už jak se s tím už pracuje, jen je tam LATCH register, já tu mám LAT, v kódu jsem pracoval s tím, že je to to samé. Dále jsem v kódu nikam nepoužil OE registr, ten tedy nastavuje režim pro vykreslení diod na matici? Pokud budete mít někdo čas, můžete mi kód poupravit, aby to aspoň rozsvítilo ledku nebo poukázat co je špatně.

PS: rozmístění pinů na porty je podle tech maker nahoře. Na portu PORTD a PORTC mám ledky a A B C piny, na PORT B mám pak CLK, OE, LAT a SR… v kódu je to okomentováno

Mas v programe prasacky bordel. Naco si definujes, ze nejaky signal je napriklad #define CLK PB0

a potom sa tvaris ze s nim manipulujes nastavovanim hodnoty na porte C? A miesto toho cvicis so signalom B2. Si to cele prepis nejakym zrozumitelnym sposobom, napriklad

#define PORT_CLK PORTB
#define BIT_CLK  PB0

#define CLK_SET (PORT_CLK |= 1<<BIT_CLK) // nastavenie bitu na log.1
#define CLK_RES (PORT_CLK &= ~(1<<BIT_CLK); // nastavenie bitu na log.0


// dalej v kode
_delay_us(500); //clc na low
CLK_SET;
_delay_us(500); //clc na low
CLK_RES;

Alebo aspon

_delay_us(500); //clc na low
PORTB |= 1<<CLK; // nastavenie bitu na log.1
_delay_us(500); //clc na low
PORTB &= ~(1<<CLK); // nastavenie bitu na log.0

Jednak sa ten Tvoj zapis neda poriadne citat a jednak v nom mas sam dobry gulas. Si to cele zrozumitelne prepis a potom posli vysledok na forum.

Inak svabom s SPI rozhranim treba najako povedat, ze sa zacali alebo ukoncili cykly CLK. Podla

nxp.com/documents/data_sheet/74HC_HCT595.pdf

je pre 74HC595 signal SHCP analogicky signalom CLK. Jeho zmenou sa posuvaju data cez pamatove registre. Signal STCP je signal STROBE, alebo inde tiez nazyvany LATCH. Skratka odpamatavaci signal do vystupneho registra. Do 74595 mozes poslat klokov kolko chces, ale az spravnou hranou na STCP sa odpamata poslednych 8 bitov v posuvnom registry.

Ale napriklad daky AD prevodnik s SPI

ww1.microchip.com/downloads/en/D … 21290D.pdf

potrebuje signal /CS. Ten AD prevodniku povie, ze teraz ber signal CLK vazne a v jeho rytme vysielaj von data od zaciatku.

Martin: děkuju za reakci, máš pravdu měl jsem tam chybu, misto PORTB jsem napsal PORTC, ty piny jsem si namapoval na později, až bych ten kód optimalizoval, ale nevadí když je to špatně čitelné, přepsal jsem to do podoby kterou jsi mi poradil, snad je to takto lepší

#define __DELAY_BACKWARD_COMPATIBLE__
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define R0_SET (PORTD |= 1<<PD0);
#define R0_RES (PORTD &= ~(1<<PD0)); 
#define G0_SET (PORTD |= 1<<PD1);
#define G0_RES (PORTD &= ~(1<<PD1));
#define B0_SET (PORTD |= 1<<PD2);
#define B0_RES (PORTD &= ~(1<<PD2));
#define R1_SET (PORTD |= 1<<PD3);
#define R1_RES (PORTD &= ~(1<<PD3));
#define G1_SET (PORTD |= 1<<PD4);
#define G1_RES (PORTD &= ~(1<<PD4));
#define B1_SET (PORTD |= 1<<PD5);
#define B1_RES (PORTD &= ~(1<<PD5));
#define R2_SET (PORTD |= 1<<PD6);
#define R2_RES (PORTD &= ~(1<<PD6));
#define G2_SET (PORTD |= 1<<PD7);
#define G2_RES (PORTD &= ~(1<<PD7));
#define B2_SET (PORTC |= 1<<PC0);
#define B2_RES (PORTC &= ~(1<<PC0));
#define R3_SET (PORTC |= 1<<PC1));
#define R3_RES (PORTC &= ~(1<<PC1));
#define G3_SET (PORTC |= 1<<PC2);
#define G3_RES (PORTC &= ~(1<<PC2));
#define B3_SET (PORTC |= 1<<PC3);
#define B3_RES (PORTC &= ~(1<<PC3));
#define A_SET (PORTC |= 1<<PC4);
#define A_RES (PORTC &= ~(1<<PC4));
#define B_SET (PORTC |= 1<<PC5);
#define B_RES (PORTC &= ~(1<<PC5));
#define C_SET (PORTC |= 1<<PC6);
#define C_RES (PORTC &= ~(1<<PC6));
#define CLK_SET (PORTB |= 1<<PB0);
#define CLK_RES (PORTB &= ~(1<<PB0));
#define OE_SET (PORTB |= 1<<PB1);
#define OE_RES (PORTB &= ~(1<<PB1));
#define LAT_SET (PORTB |= 1<<PB2);
#define LAT_RES (PORTB &= ~(1<<PB2));
#define SR_SET (PORTB |= 1<<PB3);
#define SR_RES (PORTB &= ~(1<<PB3));
#define PORTD_RES (PORTD = 0x00);
#define PORTC_RES (PORTC = 0x00);
#define PORTB_RES (PORTB = 0x00);



int main(){
DDRD = 0xFF;
DDRC = 0xFF;
DDRB = 0x10;

	
	while(1){  
	LAT_RES;
	
	for (int i = 0; i<32; i++){  //projeď všechny sloupce
     if (i==0){   //pokud se jedna o prvni sloupec
			R0_SET; //nastav R0 a G0 na true
			G0_SET;
	}
	else {
			PORTD_RES;
			PORTC_RES;
	};
	
	_delay_us(5); //pockej 5 mikrosekund jelikož mají být data dřív než dojde ke clocku
	
	CLK_SET;
	_delay_us(495); //nyni je CLK na high a data jsou posilany do registrů
	CLK_RES;
	_delay_us(500); //clc na low
	
	};
	LAT_SET;  //všechny data by měli být v shift registrech tudíž nastavuju LAT na high
	
	
	return 0;
}
}

Jen připomenu, že to má být kód na tu matici, v minulém příspěvku jsem se zminoval o 74595 protože mi ji balů doporučil, abych se na ni naučil pracovat s posuvnými registry.

No blahozelam :slight_smile:

Uz sa v tom da na prvy pohlad vyznat.
Napriklad je vidiet, ze program zbehne len raz a potom opustis pomocou retur(0) funkciu main a kde to to skonci ako v kremikovom nebi nevedia :slight_smile:
Ak uz si napisal nekonecnu slucku s while(1), co je spravne,

potom miesto return(0), lebo totam fakt nema co robit, radsej vloz nejaky _delay_us aby medzi SET_LAT a naslednym RES_LAT prebehol nejaky cas.

Potom je vidiet, ze mas chaos v nastaveni smeru IO pinov. Ako chces aby sa na fyzickom vystupe CLK a LAT menila hodnota log.1 a log.0, ked tento pin bezostisne nastavujes ako vstupny?
Tomu sa uplne vyhni takym tym globalnym zapisom typu:

#define PORTD_RES (PORTD = 0x00);
#define PORTC_RES (PORTC = 0x00);
#define PORTB_RES (PORTB = 0x00);



int main(){
DDRD = 0xFF;
DDRC = 0xFF;
DDRB = 0x10;
 /...

   else {
         PORTD_RES;
         PORTC_RES;
   };
 
/ ...

To je tiez sucastou bordelu v programe, ktory sa Ti aj hned prejavuje.
Vobec sa neboj pracovat s kazdym bitom osve. Program to prakticky nepredlzi ani casovo a ani kodovo. Na tych par bajtov sa mozes kludne z vysoka …

#define __DELAY_BACKWARD_COMPATIBLE__
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define R0 PD0
#define G0 PD1
#define R0_OUT (DDRBD |= 1<<PD0);
#define R0_SET (PORTD |= 1<<PD0);
#define R0_RES (PORTD &= ~(1<<PD0));
#define G0_OUT (DDRBD |= 1<<PD1);
#define G0_SET (PORTD |= 1<<PD1);
#define G0_RES (PORTD &= ~(1<<PD1));
// ...

#define CLK_OUT (DDRB |= 1<<PB0);
#define CLK_SET (PORTB |= 1<<PB0);
#define CLK_RES (PORTB &= ~(1<<PB0));
// ... 

#define LAT_OUT (PORTB |= 1<<PB2);
#define LAT_SET (PORTB |= 1<<PB2);
#define LAT_RES (PORTB &= ~(1<<PB2));


int main(){
/* uplne nafigu zapis a aj sa Ti to vypomstieva
DDRD = 0xFF;
DDRC = 0xFF;
DDRB = 0x10;
*/
// miesto toho

LAT_OUT;
R0_OUT;
G0_OUT;
CLK_OUT;
   
   while(1){ 
      LAT_RES;
      for (int i = 0; i<32; i++){  //projeď všechny sloupce
         if (i==0){   //pokud se jedna o prvni sloupec
            R0_SET; //nastav R0 a G0 na true
            G0_SET;
         }
         else {
/* Tento zapis je vhodny len za urcitych okolnosti. 
// teraz by som vsak pouzil pre testovanie nieco jednojednoznacne
// a nazornejsie aby sa moznost chyb minimalizovalo.
            PORTD_RES;
            PORTC_RES;
*/
            R0_RES; //nastav R0 a G0 na nulu
            G0_RES;

// alebo ked uz chces silou mocou setrit na par bajtoch programu, 
// tak zapis, ale este sa aj tak budes mylit,
// ci je dany pin naozaj na tom porte. 
// Nedajboze budes menit hw a tak budes taketo zbytocnosti opravovat v celom programe. 
// Preto je potrebne pisat kod tak, aby si zmeny bitov a portov urcoval
// iba raz na zaciatku programu alebo v prislusnom headri.

            PORTD &= ~((1<<R0) + (1<<G0));
         }
   
         _delay_us(5); //pockej 5 mikrosekund jelikož mají být data dřív než dojde ke clocku
   
         CLK_SET;
         _delay_us(495); //nyni je CLK na high a data jsou posilany do registrů
         CLK_RES;
         _delay_us(500); //clc na low
      }
      LAT_SET;  //všechny data by měli být v shift registrech tudíž nastavuju LAT na high
      _delay_us(500); 
   }
} 

A davaj si velky pozor na odsadzovanie zatvoriek a vnoreni. Vyhnes sa chybam a lahsie sa to po Tebe bude citat inym.

Vůbec nevim, kde se mi tam ten return vzal :smiley: asi jak jsem zkoušel všemožné příklady.

Děkuju za optimalizaci kódu, tu bychom snad měli.

#define __DELAY_BACKWARD_COMPATIBLE__
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define R0_OUT (DDRD |= 1<<PD0);
#define R0_SET (PORTD |= 1<<PD0);
#define R0_RES (PORTD &= ~(1<<PD0)); 
#define G0_OUT (DDRD |= 1<<PD1);
#define G0_SET (PORTD |= 1<<PD1);
#define G0_RES (PORTD &= ~(1<<PD1));
#define B0_OUT (DDRD |= 1<<PD2);
#define B0_SET (PORTD |= 1<<PD2);
#define B0_RES (PORTD &= ~(1<<PD2));
#define R1_OUT (DDRD |= 1<<PD3);
#define R1_SET (PORTD |= 1<<PD3);
#define R1_RES (PORTD &= ~(1<<PD3));
#define G1_OUT (DDRD |= 1<<PD4);
#define G1_SET (PORTD |= 1<<PD4);
#define G1_RES (PORTD &= ~(1<<PD4));
#define B1_OUT (DDRD |= 1<<PD5);
#define B1_SET (PORTD |= 1<<PD5);
#define B1_RES (PORTD &= ~(1<<PD5));
#define R2_OUT (DDRD |= 1<<PD6);
#define R2_SET (PORTD |= 1<<PD6);
#define R2_RES (PORTD &= ~(1<<PD6));
#define G2_OUT (DDRD |= 1<<PD7);
#define G2_SET (PORTD |= 1<<PD7);
#define G2_RES (PORTD &= ~(1<<PD7));
#define B2_OUT (DDRC |= 1<<PC0);
#define B2_SET (PORTC |= 1<<PC0);
#define B2_RES (PORTC &= ~(1<<PC0));
#define R3_OUT (DDRC |= 1<<PC1);
#define R3_SET (PORTC |= 1<<PC1));
#define R3_RES (PORTC &= ~(1<<PC1));
#define G3_OUT (DDRC |= 1<<PC2);
#define G3_SET (PORTC |= 1<<PC2);
#define G3_RES (PORTC &= ~(1<<PC2));
#define B3_OUT (DDRC |= 1<<PC3);
#define B3_SET (PORTC |= 1<<PC3);
#define B3_RES (PORTC &= ~(1<<PC3));
#define A_OUT (DDRC |= 1<<PC4);
#define A_SET (PORTC |= 1<<PC4);
#define A_RES (PORTC &= ~(1<<PC4));
#define B_OUT (DDRC |= 1<<PC5);
#define B_SET (PORTC |= 1<<PC5);
#define B_RES (PORTC &= ~(1<<PC5));
#define C_OUT (DDRC |= 1<<PC6);
#define C_SET (PORTC |= 1<<PC6);
#define C_RES (PORTC &= ~(1<<PC6));
#define CLK_OUT (DDRB |= 1<<PB0);
#define CLK_SET (PORTB |= 1<<PB0);
#define CLK_RES (PORTB &= ~(1<<PB0));
#define OE_OUT (DDRB |= 1<<PB1);
#define OE_SET (PORTB |= 1<<PB1);
#define OE_RES (PORTB &= ~(1<<PB1));
#define LAT_OUT (DDRB |= 1<<PB2);
#define LAT_SET (PORTB |= 1<<PB2);
#define LAT_RES (PORTB &= ~(1<<PB2));
#define SR_OUT (DDRB |= 1<<PB3);
#define SR_SET (PORTB |= 1<<PB3);
#define SR_RES (PORTB &= ~(1<<PB3));

#define PORTD_RES (PORTD = 0x00);
#define PORTC_RES (PORTC = 0x00);
#define PORTB_RES (PORTB = 0x00);



int main(){
CLK_OUT;
OE_OUT;
R0_OUT;
B0_OUT;
OE_OUT;

	
  while(1){ 
       LAT_RES; 
       for (int i = 0; i<32; i++){  //projeď všechny sloupce 
          if (i==0){   //pokud se jedna o prvni sloupec 
             R0_SET; //nastav R0 a G0 na true 
             G0_SET; 
          } 
          else {  
             R0_RES; //nastav R0 a G0 na nulu 
             G0_RES; 
          } 
     
          _delay_us(5); //pockej 5 mikrosekund jelikož mají být data dřív než dojde ke clocku 
     
          CLK_SET; 
          _delay_us(495); //nyni je CLK na high a data jsou posilany do registrů 
          CLK_RES; 
          _delay_us(500); //clc na low 
       } 
       LAT_SET;  //všechny data by měli být v shift registrech tudíž nastavuju LAT na high 
       _delay_us(500); 
    } 
 }

To bychom tedy měli, jak teď rozsvítit ledku? Zkouším měnit a nastavovat různé porty a kombinace ale pořád se mi nedaří… matici zatím napájim ze svého zdroje z počítače a atmegu mám napájenou lipol baterii. Data snad nepotřebují moc velký proud ne? Měla by na to stačit baterka?

Všimnul jsem si, že když spustím atmegu bez toho abych připojil kšandu k matici mohu připojit na port CLK diodu a ta svítí (clk tedy průběžně bliká tedy vše funguje). Když ale připojim kšandu a pokusim se o komunikaci a poté připojim ledku na port abych zjistitl jestli to šlape, ledka nesvítí. Žeby docházelo ke zkratu a nebo si to odebírá moc proudu? Zkusím voltmetrem ještě překontrolovat všechny spoje.

A mrknu ráno na nějaké arduino matice jak mají řešené komunikace, ale to bude asi na dlouhé lokte vyznat se v té jejich knihovně.

poslední post se zřejmě neodeslal správně tak znovu

Zdravím.
Tak tu mám překvapivé zprávy, už jsem nevěděl co, tak jsem připojil LAT pin na CLK a světe div se, matice začla tak nějak podivně svítit. Proto sem taky píšu, jelikož si to nedovedu vysvětlit… svítí diody i mimo kvadrant A=0 B=0 C=0.

Zde je video: youtube.com/watch?v=aSbp84P5Wp4&feature=youtu.be
Sem se ještě mrkněte jak to vypadalo při druhém zapnutí:
goo.gl/TIj1uU

Zaráží mě, jak můžou svítit zeleně, když jsem v kodu neměl žádný pin G na log 1.

Pokud to někomu připadá zřejmé, rád bych věděl proč se to chová takto, proč nesvítí pouze jedna dioda nebo proč nesvítí pouze jeden řádek.

:arrow_right: administrator: přiloženy externí soubory

Tak mozno su tie vystupy negovane. Ak su diody zapojene so spolocnou anodou, rozsvecovat sa budu nastavením log.0

Logická dedukce… avšak já zapoměl ty piny nejdřív nastavit (R3_OUT) takze na nich byla log 1. Coz mi ale nepomohlo se zjistenim jak to funguje. Přidal jsem do kódu timer, příjde mi to jako lepší řešení… Prochazim si knihovnu

github.com/adafruit/RGB-matrix-Panel

Ale k porozumění mám daleko, tak zkouším co mě napadá… zatím kód vypadá takto:

pastebin.com/2AHG7Gk7

Mozná mám moc dlouze/krátce nastavený CLK nebo LAT, nebo je používám nevhodně, netuším, nezbývá než zkoušet.

:arrow_right: administrator: přiloženy externí soubory
2AHG7Gk7.txt (3.13 KB)
RGB-matrix-Panel-master.zip (26.5 KB)

No, ale už Ti to aspoň bliká a tak vidíš svetlo na konci tunela :slight_smile:

Jak jsem tam přidal ke všem portum OUT, tak to od tý doby už nebliká :smiley:

Takto to vypadá:
youtube.com/watch?v=K24a4uSi … e=youtu.be

Když jsem přidal do kódu časovač, pak jsem nacpal pin EO do pinu LAT. Pin SR permanentne uzemnil a rozeběhlo se to po tom, co jsem pin CLK na 5 sek vyndal a dal ho znovu do nepájivého pole… někdy musím 2-3x než to začne blikat… moc si to zatim nedovedu vysvětlit :smiley: Tady je nynější kód


#define __DELAY_BACKWARD_COMPATIBLE__
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define R0_OUT (DDRD |= 1<<PD0);
#define R0_SET (PORTD |= 1<<PD0);
#define R0_RES (PORTD &= ~(1<<PD0)); 
#define G0_OUT (DDRD |= 1<<PD1);
#define G0_SET (PORTD |= 1<<PD1);
#define G0_RES (PORTD &= ~(1<<PD1));
#define B0_OUT (DDRD |= 1<<PD2);
#define B0_SET (PORTD |= 1<<PD2);
#define B0_RES (PORTD &= ~(1<<PD2));
#define R1_OUT (DDRD |= 1<<PD3);
#define R1_SET (PORTD |= 1<<PD3);
#define R1_RES (PORTD &= ~(1<<PD3));
#define G1_OUT (DDRD |= 1<<PD4);
#define G1_SET (PORTD |= 1<<PD4);
#define G1_RES (PORTD &= ~(1<<PD4));
#define B1_OUT (DDRD |= 1<<PD5);
#define B1_SET (PORTD |= 1<<PD5);
#define B1_RES (PORTD &= ~(1<<PD5));
#define R2_OUT (DDRD |= 1<<PD6);
#define R2_SET (PORTD |= 1<<PD6);
#define R2_RES (PORTD &= ~(1<<PD6));
#define G2_OUT (DDRD |= 1<<PD7);
#define G2_SET (PORTD |= 1<<PD7);
#define G2_RES (PORTD &= ~(1<<PD7));
#define B2_OUT (DDRC |= 1<<PC0);
#define B2_SET (PORTC |= 1<<PC0);
#define B2_RES (PORTC &= ~(1<<PC0));
#define R3_OUT (DDRC |= 1<<PC1);
#define R3_SET (PORTC |= 1<<PC1);
#define R3_RES (PORTC &= ~(1<<PC1));
#define G3_OUT (DDRC |= 1<<PC2);
#define G3_SET (PORTC |= 1<<PC2);
#define G3_RES (PORTC &= ~(1<<PC2));
#define B3_OUT (DDRC |= 1<<PC3);
#define B3_SET (PORTC |= 1<<PC3);
#define B3_RES (PORTC &= ~(1<<PC3));
#define A_OUT (DDRC |= 1<<PC4);
#define A_SET (PORTC |= 1<<PC4);
#define A_RES (PORTC &= ~(1<<PC4));
#define B_OUT (DDRC |= 1<<PC5);
#define B_SET (PORTC |= 1<<PC5);
#define B_RES (PORTC &= ~(1<<PC5));
#define C_OUT (DDRB |= 1<<PB5);
#define C_SET (PORTB |= 1<<PB5);
#define C_RES (PORTB &= ~(1<<PB5));
#define CLK_OUT (DDRB |= 1<<PB0);
#define CLK_SET (PORTB |= 1<<PB0);
#define CLK_RES (PORTB &= ~(1<<PB0));
#define OE_OUT (DDRB |= 1<<PB1);
#define OE_SET (PORTB |= 1<<PB1);
#define OE_RES (PORTB &= ~(1<<PB1));
#define LAT_OUT (DDRB |= 1<<PB2);
#define LAT_SET (PORTB |= 1<<PB2);
#define LAT_RES (PORTB &= ~(1<<PB2));
#define SR_OUT (DDRB |= 1<<PB3);
#define SR_SET (PORTB |= 1<<PB3);
#define SR_RES (PORTB &= ~(1<<PB3));

#define CLK_NEG (PORTB ^= (1 << PB0));


void setup () {
	R0_OUT;
	R1_OUT;
	R2_OUT;
	R3_OUT;
	G0_OUT;
	G1_OUT;
	G2_OUT;
	G3_OUT;
	B0_OUT;
	B1_OUT;
	B2_OUT;
	B3_OUT;
	A_OUT;
	B_OUT;
	C_OUT;
	CLK_OUT;
	OE_OUT;
	SR_OUT;
	LAT_OUT;
	

}
void clear () {
	R0_RES;
	R1_RES;
	R2_RES;
	R3_RES;
	G0_RES;
	G1_RES;
	G2_RES;
	G3_RES;
	B0_RES;
	B1_RES;
	B2_RES;
	B3_RES;
	A_RES;
	B_RES;
	C_RES
	CLK_RES;
	OE_RES;
	SR_RES;
	LAT_RES;
}

volatile unsigned char i;
volatile unsigned char ABC;



ISR (TIMER0_OVF_vect){ 
	R0_RES;
	LAT_RES;
	A_RES;
	B_RES;
	C_RES;
	
	OE_SET;
	
	if (i%2==0){
	R0_SET;
	if (ABC==0)     {A_RES; B_RES; C_RES;}
	else if (ABC==1){A_SET; B_RES; C_RES;}
	else if (ABC==2){A_RES; B_SET; C_RES;}
	else if (ABC==3){A_SET; B_SET; C_RES;}
	else if (ABC==4){A_RES; B_RES; C_SET;}
	else if (ABC==5){A_SET; B_RES; C_SET;}
	else if (ABC==6){A_RES; B_SET; C_SET;}
	else if (ABC==7){A_SET; B_SET; C_SET;};		
	}
			i++;
			if (i==64){
				OE_RES;
				LAT_SET;
				i=0;
				ABC++;
				if (ABC==8)ABC=0;
			}
	_delay_us(5);
	CLK_NEG;

		
}
  
  
int main(){
	setup();
		TCCR0 |= (1 << CS01);
		TIMSK |= (1 << TOIE0);
		
	clear();
	sei();
	
	while(1){};
 }