Sida 1 av 1

Arduino, shiftOut

Postat: 27 oktober 2013, 14:17:14
av Camro
Hej
Ska styra en MT9200 DTMF encoder med Arduino. Tänkte använda shiftOut för att mata ut data till encodern. MT9200 vill bara ha fem bitar, hur programmerar jag detta? Finns det någon bättre lösning än att använda shiftOut? Har läst tutorial ang shiftOut, hittar inget klart svar på att använda färre bitar än 8. Datan ska anges med decimaltal.

Re: Arduino, shiftOut

Postat: 27 oktober 2013, 14:41:54
av sodjan
Länk till MT9200?
Hittar inget...

Re: Arduino, shiftOut

Postat: 27 oktober 2013, 15:11:57
av Camro
Här kommer länken till HT9200 inte MT som jag skrev... :wink:

http://www.alldatasheet.com/datasheet-p ... 9200A.html

Re: Arduino, shiftOut

Postat: 27 oktober 2013, 15:42:27
av void
Har du prövat? Jag tycker att det borde fungera bra med ShiftOut(). Jag tolkar det som att HT9200x avkodar de sista 5 bitarna som klockats in, så om du skriver ShiftOut(datapin, clockpin, LSBFIRST, B11100001) så borde den börja med "Digit 1" och vänta på två bitar till. 5 ettor i följd stänger av, och eftersom du redan skickat 3 räcker det med 2 två till, men då du vill jobba med hela byte kan du använda ShiftOut(datapin, clockpin, LSBFIRST, B11111111) för att stänga av.

Eftersom jag inte använder Arduino skulle jag nog skriva en egen funktion (men det funkar nog även med Arduino) som sätter datapinne och togglar klockpinne eller använda några makron:

Kod: Markera allt

// Sätta/nolla bit
#define SET(port,pin,onoff) \
{ \
	if (onoff) \
		*port |= (1 << (pin)); \
   	else \
	  	*port &= ~(1 << (pin));\
} 

// Toggla bit
#define CLK(port,pin) \
{ \
	*port |= (1 << (pin)); \
	asm volatile("nop"::); \
	*port &= ~(1 << (pin));\
}
.

Re: Arduino, shiftOut

Postat: 27 oktober 2013, 18:32:05
av void
Camro skrev:Hej
... MT9200 vill bara ha fem bitar, hur programmerar jag detta? ...
Något i den här stilen (snabbt ihopkokat, inga garantier att koden är ok):

Kod: Markera allt

#define HT9200port PORTD
#define HT9200data 0
#define HT9200clk 1
#define SETBIT(PORT,BIT) (PORT |= (1<<BIT))
#define CLEARBIT(PORT,BIT) (PORT &= ~(1<<BIT))

void send_5bit_serial_data(uint_8 data) {
	uint_8 i;
	
	// sänd bit 0..4
	for (i = 0; i < 5; i++) {
		// maska ut LSB
		if (data & 0x01)
			SETBIT(HT9200port,HT9200data);
		else
			CLEARBIT(HT9200port,HT9200data);
 
		// klocka in
		SETBIT(HT9200port,HT9200clk);
		asm volatile("nop"::);
		CLEARBIT(HT9200port,HT9200clk);

		// shift höger
		data >>= 1;
	}
}

Re: Arduino, shiftOut

Postat: 27 oktober 2013, 19:25:27
av Camro
Tack för svaren, ska testa förslagen :)