Arduino, shiftOut

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Camro
Inlägg: 34
Blev medlem: 6 april 2011, 23:34:07

Arduino, shiftOut

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino, shiftOut

Inlägg av sodjan »

Länk till MT9200?
Hittar inget...
Camro
Inlägg: 34
Blev medlem: 6 april 2011, 23:34:07

Re: Arduino, shiftOut

Inlägg av Camro »

Här kommer länken till HT9200 inte MT som jag skrev... :wink:

http://www.alldatasheet.com/datasheet-p ... 9200A.html
void
Inlägg: 119
Blev medlem: 8 juli 2007, 11:06:50
Ort: Enköping

Re: Arduino, shiftOut

Inlägg 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));\
}
.
void
Inlägg: 119
Blev medlem: 8 juli 2007, 11:06:50
Ort: Enköping

Re: Arduino, shiftOut

Inlägg 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;
	}
}
Camro
Inlägg: 34
Blev medlem: 6 april 2011, 23:34:07

Re: Arduino, shiftOut

Inlägg av Camro »

Tack för svaren, ska testa förslagen :)
Skriv svar