hiv_sick, jakby Cię to interesowało, to cała matryca świeci duuuuużo jaśniej
Ustawiłem po prostu czas świecenia każdego wiersza na 40ms, wcześniej miałem go w mikrosekundach. Przy wyższej wartości matryca zaczyna migać, wiec tak jest optymalnie 


Do you prefer the English version of the page elektroda?
No, thank you Send me over therelord_dagoth wrote:hiv_sick, jakby Cię to interesowało, to cała matryca świeci duuuuużo jaśniejUstawiłem po prostu czas świecenia każdego wiersza na 40ms, wcześniej miałem go w mikrosekundach. Przy wyższej wartości matryca zaczyna migać, wiec tak jest optymalnie
#define F_CPU 1000000 //1MHz zegar procesora
#define CYCLES_PER_US ((F_CPU+500000)/1000000) //cpu cycles per microsecond
void delay(unsigned int us)
{
unsigned int delay_loops;
register unsigned int i;
delay_loops = (us+3)/5*CYCLES_PER_US;
for (i=0; i < delay_loops; i++) {};
}
void delayms(unsigned int ms)
{
unsigned int i;
for (i=0;i<ms;i++)
{
delay(999);
asm volatile ("WDR"::);
}
}
delayms(40);
$regfile = "m8def.dat"
$crystal = 1000000
Config Portd = Output
Config Portb = Output
Dim I As Byte
Portd = 255
Ser_ Alias Pinb.3
Sck Alias Pinb.5
Rck Alias Pinb.0
Sck = 1
Rck = 1
Ser_ = 1
Do
Loop
Ser_ = 0
Sck = 1
Sck = 0
Rck = 1
Rck = 0
Waitms 40
Ser_ = 1
Sck = 1
Sck = 0
Rck = 1
Rck = 0
Waitms 40
Sck = 1
Sck = 0
Rck = 1
Rck = 0
Waitms 40
Sck = 1
Sck = 0
Rck = 1
Rck = 0
Waitms 40
Sck = 1
Sck = 0
Rck = 1
Rck = 0
Waitms 40
Sck = 1
Sck = 0
Rck = 1
Rck = 0
Waitms 40
End
Dr.Vee wrote:Nie podłączyłeś wejście G (pin 13) rejestrów '595 - musisz je podłączyć pod GND, inaczej na wyjściach masz cały czas stan wysokiej impedancji.
Paweł Es. wrote:Jeżeli wrzucasz pełną sekwencję 20 bitów do rejestru, to możesz sobie odpuścić jego zerowanie i dajesz MR rejestrów=1 na stałe.
Wyzerować rejestr możesz wysyłając mu sekwencję 20 zer na dzień dobry.
SH_CP - SHIFT CLOCK PULSE - tym taktujesz (zbocze narastające) rejestr przesuwający
ST_CP - STORAGE CLOCK PULSE - tym przepisujesz (narastającym zboczem) dane z przesuwającego do rejestru wyjściowego
Czyli do rejestru doprowadzasz sygnały:
- DS (14) - dane szeregowe z procesora
- SH_CP (11) - taktowanie przesuwania danych (podajesz równolegle na wszystkie rejetry wyjściowe)
- ST_CP (12) - przepisanie wsuniętych danych na wyjście (jak wyżej)
OE (13) - ustawiasz na stałe 0
MR (10)- ustawiasz na stałe 1
Q7 (9) podajesz na DS (14) następnego stopnia
Config Portd = Output
Config Portb = Output
Dim I As Byte
Portd = 255
Ds Alias Portb.3
Sh_cp Alias Portb.5
St_cp Alias Portb.0
Do
Loop
For I = 1 To 8
Ds = 1
Sh_cp = 1
Sh_cp = 0
Next I
St_cp = 1
St_cp = 0
End
#define F_CPU 1000000 //1MHz zegar procesora
#define CYCLES_PER_US ((F_CPU+500000)/1000000) //cpu cycles per microsecond
void Init();//funkcja ustawia porty i piny na początkowe wartości
void SetRegister(int x);//funkcja wpisuje do rejestru 0 lub 1
void ReleaseLatch();//funkcja przepisuje dane wprowadzone do rejestrów na jego wyjścia (zwolnienie zatrzasku)
void SetUDN(int x);//Ustawia podaną kolumnę (1-20) na aktywną
void UnsetUDN(int x);//dezaktywuje podaną kolumnę (1-20)
void delay(unsigned int us);//odczekuje podana ilosc mikrosekund
void delayms(unsigned int ms);//odczekuje podana ilosc milisekund
void ClearTheRegister();//funkcja do wyzerowania calego rejestru
#include <avr\io.h>
#include "functions.h"
void Init()
{
DDRA = 0xFF; //ustawienie portu A jako wyjścia
DDRB = 0xFF; //ustawienie portu B jako wyjścia
DDRC = 0xFF; //ustawienie portu C jako wyjścia
DDRD = 0xFF; //ustawienie portu D jako wyjścia
PORTB &=~_BV(1);//Ustawienie pinu PB1 na 0 (enable dla rejestru, active low)
PORTB &=~_BV(3);//ustawienie 0 dla zegara
PORTB &=~_BV(2);//ustawienie zera dla pinu odpowiedzialnego za przepisywanie
}
void SetRegister(int x)
{
if (x==1)
{
PORTB |=_BV(0); //podanie jedynki na wejście szeregowe rejestru
PORTB |=_BV(3); //przesunięcie jedynki (zboczem narastającym)
PORTB &=~_BV(3); //ustawienie zera (z powrotem)
}
else
{
PORTB &=~_BV(0); //podanie zera na wejście szeregowe rejestru
PORTB |=_BV(3); //przesunięcie zera (zboczem narastającym)
PORTB &=~_BV(3); //ustawienie zera (z powrotem)
}
}
void ReleaseLatch()
{
PORTB |=_BV(2); //przepisanie danych na wyjścia '595
PORTB &=~_BV(2); //ustawienie zera (z powrotem)
}
void SetUDN(int x)
{
switch (x)
{
case 1: {PORTA |=_BV(0);break;}
case 2: {PORTA |=_BV(1);break;}
case 3: {PORTA |=_BV(2);break;}
case 4: {PORTA |=_BV(3);break;}
case 5: {PORTA |=_BV(4);break;}
case 6: {PORTA |=_BV(5);break;}
case 7: {PORTA |=_BV(6);break;}
case 8: {PORTA |=_BV(7);break;}
case 9: {PORTC |=_BV(7);break;}
case 10: {PORTC |=_BV(6);break;}
case 11: {PORTC |=_BV(5);break;}
case 12: {PORTC |=_BV(4);break;}
case 13: {PORTC |=_BV(3);break;}
case 14: {PORTC |=_BV(2);break;}
case 15: {PORTC |=_BV(1);break;}
case 16: {PORTC |=_BV(0);break;}
case 17: {PORTD |=_BV(7);break;}
case 18: {PORTD |=_BV(4);break;}
case 19: {PORTD |=_BV(5);break;}
case 20: {PORTD |=_BV(6);break;}
}
}
void UnsetUDN(int x)
{
switch (x)
{
case 1: {PORTA &=~_BV(0);break;}
case 2: {PORTA &=~_BV(1);break;}
case 3: {PORTA &=~_BV(2);break;}
case 4: {PORTA &=~_BV(3);break;}
case 5: {PORTA &=~_BV(4);break;}
case 6: {PORTA &=~_BV(5);break;}
case 7: {PORTA &=~_BV(6);break;}
case 8: {PORTA &=~_BV(7);break;}
case 9: {PORTC &=~_BV(7);break;}
case 10: {PORTC &=~_BV(6);break;}
case 11: {PORTC &=~_BV(5);break;}
case 12: {PORTC &=~_BV(4);break;}
case 13: {PORTC &=~_BV(3);break;}
case 14: {PORTC &=~_BV(2);break;}
case 15: {PORTC &=~_BV(1);break;}
case 16: {PORTC &=~_BV(0);break;}
case 17: {PORTD &=~_BV(7);break;}
case 18: {PORTD &=~_BV(4);break;}
case 19: {PORTD &=~_BV(5);break;}
case 20: {PORTD &=~_BV(6);break;}
}
}
void delay(unsigned int us)
{
unsigned int delay_loops;
register unsigned int i;
delay_loops = (us+3)/5*CYCLES_PER_US;
for (i=0; i < delay_loops; i++) {};
}
void delayms(unsigned int ms)
{
unsigned int i;
for (i=0;i<ms;i++)
{
delay(999);
asm volatile ("WDR"::);
}
}
void ClearTheRegister()
{
int i=1;
for(i;i<21;i++) //wpisanie do rejestru 20 zer
{
SetRegister(0);
}
ReleaseLatch(); //zwolnienie zatrzasku
}
/*funkcje zwiazane z wyswietlaniem roznych rzeczy*/
void LightEachDiode();//funkcja swieci kazda dioda po kolei
void LightEachLine();//funkcja swieci kazdy wiersz po kolei
void ZapalCalaMatryce();//funkcja swieci cala matryce
void ProceedArray(int array[20][20]);//Przetwarza podana tablice do wyswietlenia
void LightEachDiode()
{
int i=1,j=1;
for(i;i<21;i++) // pierwsza petla for, odpowiedzialna za kazdy wiersz
{
j=1;
SetUDN(i);
SetRegister(1);
ReleaseLatch();
delayms(3000);
for(j;j<20;j++) //druga petla for, odpowiedzialna za wpisanie do rejestru 20 cyfr
{
SetRegister(0); //wpisanie do rejestru 0
ReleaseLatch(); //zwolnienie zatrzasku rejestru
delayms(3000); //odczekanie
}
UnsetUDN(i);
}
}
void LightEachLine()
{
int i=1,j=0;
for(i;i<21;i++)
{
SetUDN(i);
j=0;
for(j;j<20;j++)
{
SetRegister(1);
}
ReleaseLatch();
delayms(6000);
UnsetUDN(i);
}
}
void ZapalCalaMatryce()
{
int i=1,j=0;
for(i;i<21;i++)
{
SetUDN(i);
j=0;
for(j;j<20;j++)
{
SetRegister(1);
}
ReleaseLatch();
delayms(40);
UnsetUDN(i);
}
}
void ProceedArray(int array[20][20])
{
int i=0;
for(i;i<20;i++)
{
SetUDN(i+1);
int j=0;
for(j;j<20;j++)
{
if (array[i][j]==1)
SetRegister(1);
else
SetRegister(0);
}
ReleaseLatch();
delay(2000);
UnsetUDN(i+1);
}
}
#include "functions.h"
int main ()
{
Init(); //inicjalizujemy wszystkie porty i piny
ClearTheRegister(); //czyscimy rejestr z poprzednich wartosci
for(;;) //rozpoczynamy nieskonczona petle
{
LightEachDiode();
}
return 0;
}
portd = &B01010101
rotate portd, left
waitms 10
BoskiDialer wrote:hiv_sick: Nie dziwię się, że nie są przesuwane. Nie masz żadnej pętli.