Rejestr szeregowy wejść 74HC165 i Arduino + NES + SNES

Poniżej przykładowy kod do Arduino obsługujący rejestr szeregowy 74HC165. Jest to rejestr typu paraller In – serial Out – umożliwia odczyt stanów 8 wejść cyfrowych poprzez protokół SPI.  Po drobnej modyfikacji kod może posłużyć do komunikacji z kontrolerami do gier Nintendo NES oraz SNES. Są one oparte o podobny układ CMOS 4021. Kontroler NES zawiera jeden rejestr, natomiast SNES – 2, co daje 16 bitów (nie wszystkie są wykorzystane). Ponieważ przyciski zwierają wejścia typu pull-up do masy, kontroler bez wciśniętych przycisków wysyła same jedynki. Jeżeli w naszym układzie wejście DATA złącza połączymy przez rezystor np. 1MΩ do masy, pozwoli to na wykrycie czy kontroler jest podpięty – niepodłączenie prześle same zera.

//Connect IC to the Arduino:
#define HC165CLK 3 //Pin 2 of 74HC165, CLK
#define HC165LD 4 //Pin 1 of 74HC165, SH/~LD
#define HC165D 5 //Pin 9 if 74HC165, Qh

void setup() {
Serial.begin(9600);
pinMode(HC165CLK, OUTPUT);
pinMode(HC165LD, OUTPUT);
pinMode(HC165D, INPUT);

}

void loop() {
Serial.println(hc165ReadByte(),2); //Print readout in binary format
delay(100);
}

byte hc165ReadByte(void){
byte data=0;
digitalWrite(HC165LD, LOW);
//delay(1);
digitalWrite(HC165LD, HIGH);

for(byte i=0; i<8;i++){
data = (data <<1) | (digitalRead(HC165D) & 1);
digitalWrite(HC165CLK, HIGH);
//delay(1);
digitalWrite(HC165CLK, LOW);
}
return data;
}

byte NESReadByte(void){
/*
* Bit order (from LSB to MSB):
* 0: A
* 1: B
* 2: Select
* 3: Start
* 4: Up
* 5: Down
* 6: Left
* 7: Right
*/

byte data=0;
digitalWrite(HC165LD, HIGH);
//delay(1);
digitalWrite(HC165LD, LOW);

for(byte i=0; i<8;i++){
data = (data <<1) | (digitalRead(HC165D) & 1);
digitalWrite(HC165CLK, HIGH);
//delay(1);
digitalWrite(HC165CLK, LOW);
}
return data;
}

uint16_t SNESReadByte(void){
/*
* Bit order (from LSB to MSB):
* 0: B
* 1: Y
* 2: Select
* 3: Start
* 4: UP
* 5: DOWN
* 6: LEFT
* 7: RIGHT
* 8: A
* 9: X
* 10: L trigger
* 11: R trigger
* 12: ?
* 13: ?
* 14: ?
* 15: ?
*/
uint16_t data=0;
digitalWrite(HC165LD, HIGH);
//delay(1);
digitalWrite(HC165LD, LOW);

for(byte i=0; i<16;i++){
data = (data <<1) | (digitalRead(HC165D) & 1);
digitalWrite(HC165CLK, HIGH);
//delay(1);
digitalWrite(HC165CLK, LOW);
}
return data;
}
Kontynuuj czytanie... || Napisał dnia: 01.05.17 || Brak Komentarzy »

WordPress NextGEN Gallery nie działa z niektórymi motywami – obejście problemu

Objawy:

  • Edytor wizualny w zapleczu nie działa;
  • Opcje wtyczki NextGen nie pokazują się;
  • Wszystko zaczyna działać po przełączeniu motywu na jeden z domyślnych, np. „tweenty-eleven”;
  • W kodzie źródłowym strony możesz odnaleźć błędne linki do plików CSS i JS ze zduplikowaną nazwą domeny;

Wersjes: WordPress 4.7.3; NextGen: 2.2.1
Rozwiązanie:

Zakomentuj linię numer ok. 191 w pliku „wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/mvc/package.module.mvc.php”:

$retval = '/' . $retval;

Właściwe rozwiązanie:

Autor motywu powinien poprawnie ustawić:

current_theme_supports('soil-relative-urls') || current_theme_supports('root-relative-urls')

.

 

Kontynuuj czytanie... || Napisał dnia: 02.04.17 || Brak Komentarzy »

Windows 7 – Nie aktualizuje się po reinstalacji

  1. Aktywuj system, lub upewnij się że jest aktywowany
  2. Wykonaj „Clean Boot”: msconfig.exe, selektywne uruchomienie, tylko usługi Windows
  3. Zainstaluj https://support.microsoft.com/en-us/kb/3020369
  4. Zainstaluj https://support.microsoft.com/en-us/kb/3172605
  5. Restart

Źródło: http://superuser.com/questions/951960/windows-7-sp1-windows-update-stuck-checking-for-updates

Kontynuuj czytanie... || Napisał dnia: 18.12.16 || Brak Komentarzy »

Linki o tematyce RF

Zdzisław Bieńkowski – Poradnik ultrakrótkofalowca

Układ do pomiaru o pomiaru zniekszta niekształceń intermodulacyjnych

Waldemar Sznajder 3Z6AEF – Pomiary podstawowych parametrów amatorskich urządzeń radiowych

SQ7JHM – Generatory

Strojenie anten jednopasmowych

 

Kontynuuj czytanie... || Napisał dnia: 18.12.16 || Brak Komentarzy »

Windows – problemy z usypianiem i wybudzaniem

Sprawdzanie, co blokuje przycisk „Uśpij”:

powercfg -a

powercfg-a

Co wybudziło komputer ze stanu uśpienia:

powercfg –lastwake

Jaki sprzęt może wybudzić komputer:

powercfg -devicequery wake_armed
Kontynuuj czytanie... || Napisał dnia: 18.12.16 || Brak Komentarzy »

XYC-WB-D Microwave Radar Sensor – analiza widma częstotliwości, pomiar emisji.

Płytka kupiona tutaj: http://www.ebay.com/itm/141964183194

Sprzęt: Rohde&Schwarz FSEA 30 (nieskalibrowany niestety)

IMG_20160812_134005_HDR IMG_20160812_134008_HDR IMG_20160812_134016_HDR IMG_20160812_134020_HDR IMG_20160812_134045_HDR IMG_20160812_134051_HDR IMG_20160812_134430_HDR

Kontynuuj czytanie... || Napisał dnia: 13.08.16 || Brak Komentarzy »

RS232, UART – Timing. Jak na oscyloskopie określić baudrate.

Załóżmy, że na oscyloskopie zobaczyliśmy coś takiego jak powyżej. Jest to 1 paczka danych z UART badanego urządzenia.
uart_timing

Bit STOP ma wartość 1 i jest niewidoczny, jeżeli odbieramy tylko jeden bajt na raz, ponieważ „zlewa się” ze stanem wysokim linii, który występuje w stanie spoczynku.

Dla transmisji 8N1 (8 bitów danych, bez bitu parzystości, 1 bit stopu), zależności czasowe wyglądają tak:

Baudrate – Długość ramki z rysunku – Długość jednego bitu:

  • 1200 – 7,480ms – 831,11μs
  • 2400 – 3,740ms – 415,56μs
  • 4800 – 1,870ms – 207,78μs
  • 9600 – 936,0μs – 104.167μs

(Wyniki uzyskane eksperymentalnie) Jak widać, jeżeli czas trwania jednego bitu jest okresem, to Baudrate jest częstotliwością. Np. 1/9600 [Baud] = 104,16(6)μs

Ponieważ na jedną ramkę przypada 10 bitów razem z bitem STOP, to przy Baudrate=9600 można przesłać 960B/s użytecznych danych.

 

Kontynuuj czytanie... || Napisał dnia: 20.07.16 || Brak Komentarzy »

AVR C – przekazywanie portu do funkcji

void pulseLed(volatile uint8_t *port, uint8_t pin_bm)
{
	*(port-1) |= pin_bm; //*(port-1) = *(ddr); set pin as output
	*port |= pin_bm;
	_delay_ms(100);
	*port &= ~pin_bm;
}

void main(void)
{
	pulseLed(&PORTC, _BV(2) );
}

Źródło: http://www.atmel.com/webdoc/AVRLibcReferenceManual/FAQ_1faq_port_pass.html

Kontynuuj czytanie... || Napisał dnia: 18.07.16 || Brak Komentarzy »

Definicja i inicjalizacja struktury w C

Definicja typu:

typedef struct
{
	volatile uint8_t *port;
	uint8_t pin_bm;
	volatile uint16_t pulse_high;
	volatile uint16_t pulse_low;
} aparat;

Użycie:

aparat canon = {&PORTC, _BV(PC3),100,200};

Lub w postaci tablicy:

aparat aparaty[4] = {
		{&PORTC, _BV(PC3),10,100},
		{&PORTC, _BV(PC2),20,100},
		{&PORTC, _BV(PC1),30,100},
		{&PORTC, _BV(PC0),40,100}
	};

Źródło: http://stackoverflow.com/questions/2641473/initialize-static-array-of-structs-in-c

Kontynuuj czytanie... || Napisał dnia: 18.07.16 || Brak Komentarzy »

Optiboot bootloader i Atmega88 – wgranie, używanie, kompilacja.

TL;DR dla Atmega88(PA), F_CPU=16MHz upload baudrate: 115200:
1. Wgraj hex’a programatorem z Fusebitami: LOW = 0xFF; HIGH= 0xDF; EXT= 0xFC; optiboot_atmega88
2. Odpal upload.bat z paczki, wgrywając wcześniej do niej swój program jako firmware.hex, oraz ustawiając w pliku upload.bat odpowiedni port szeregowy optiboot_upload

Kompilacja Optiboot z konsoli w folderze z Arduino:

C:\Program Files (x86)\Arduino\Arduino ERW 1.0.5\hardware\arduino\bootloaders\optiboot
omake AVR_FREQ=16000000UL LED_START_FLASHES=0 atmega88
Kontynuuj czytanie... || Napisał dnia: 19.06.16 || Brak Komentarzy »