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;
}

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')

.

 

STM32 pierwsze kroki

Najtańsza płytka: stm32f103c8t6 (72MHz, USB device, 2 kwarce 8MHz i 32KHz, 64KB Flash, 20KB RAM, 2xADC; nie ma: DAC, FPU, EEPROM, )

Programator : ST-Link V2

Wyświetlanie Float przez printf:

Bug w STM32CubeMX w wersji 4.20.0, przy ustawieniu HSE – zewnętrznego kwarcu

W pliku main.c jest:

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI |RCC_OSCILLATORTYPE_HSE |RCC_OSCILLATORTYPE_LSE;

Powinno być:

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE |RCC_OSCILLATORTYPE_LSE;

źródło: https://community.st.com/thread/39340-bug-cubemx-v420-rcc-initialization-fail-with-hse-selected
 

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

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.

 

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