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.
Arduino, shiftOut
Re: Arduino, shiftOut
Här kommer länken till HT9200 inte MT som jag skrev...
http://www.alldatasheet.com/datasheet-p ... 9200A.html

http://www.alldatasheet.com/datasheet-p ... 9200A.html
Re: Arduino, shiftOut
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:
.
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
Något i den här stilen (snabbt ihopkokat, inga garantier att koden är ok):Camro skrev:Hej
... MT9200 vill bara ha fem bitar, hur programmerar jag detta? ...
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;
}
}