//Test NICAM decoder MSP 3415 sturing //RGK dec 2017 ver 1.0 #include #include //#include "strings.h" //#define MSP_resetPin A1//veron workshop bordje #define MSP_resetPin 10 // initialiseer de LCD library met de juiste pinnummers LiquidCrystal lcd(A2, A3, 4, 5, 6, 7); //defines voor de chip addressering #define MSP_ADDR 0x40 #define CTRL 0x00 #define WR_FP 0x10 #define RD_FP 0x11 #define WR_DFP 0x12 #define RD_DFP 0x13 #define MODUS 0x0030 #define STANDARD 0x0020 #define SPEAKER_VOL 0x0000 #define SPEAKER_SOURCE 0x0008 #define FM_PRESCALE 0x000E #define NICAM_PRESCALE 0x0010 #define ACB_REG 0x0013 #define STATUS 0x00110200 //Status register audio reception #define STANDARD_RES 0x0011007E //standard result register demodulator #define BG 0x0008 //standard select register settings #define I 0x000A #define AUTO 0x0001 void setup() { byte ack=0; Wire.begin(); lcd.begin(16, 2); // HW reset MSP chip pinMode(MSP_resetPin, OUTPUT); digitalWrite(MSP_resetPin,LOW); delay(100); digitalWrite(MSP_resetPin,HIGH); MSP_RESET(); set_standard(AUTO); MSP_LOAD(WR_DFP, SPEAKER_VOL, 0x7300); // Welkomstekst op het LCD lcd.clear(); lcd.print(" NICAM decoder"); lcd.setCursor(0, 1); lcd.print(" PE1CHY "); delay(2000);//welkomstekst showtime 2 sec show_standard(); } void loop() { static unsigned int Status=0; static char buffer[17]; static bool NICAM; static bool FM; Status = MSP_READ(STATUS); lcd.setCursor(0,0); lcd.print(" Mode: "); NICAM = bitRead(Status,5); FM = !(bitRead(Status,1)); if(NICAM){ lcd.print("NICAM "); } else{ if(FM)lcd.print("FM "); else lcd.print("no sound"); } //enter zoekmode als er geen nog geen standaard is gevonden if(Status ==6){ MSP_LOAD(WR_DFP, SPEAKER_VOL, 0x00);//mute set_standard(AUTO); delay(500); MSP_LOAD(WR_DFP, SPEAKER_VOL, 0x7300);//unmute show_standard(); } set_mspLEDs();//ledjes op de nicamprint aansturen } /// *** einde loop **** void show_standard(){ static int data; data=MSP_READ(STANDARD_RES); lcd.setCursor(0,1); lcd.print("Standard: "); lcd.setCursor(9,1); // lcd.print(data,HEX); if(data==0x00)lcd.print("Unknown"); if(data==0x08)lcd.print(" B/G "); if(data==0x0A)lcd.print(" I "); if(data==0x04)lcd.print("FM only"); } byte MSP_LOAD(byte subadr, int reg, int data){ byte ack; Wire.beginTransmission(MSP_ADDR); Wire.write(subadr);// FP/DFP subaddr Wire.write(highByte(reg)); Wire.write(lowByte(reg)); Wire.write(highByte(data)); Wire.write(lowByte(data)); ack=Wire.endTransmission(); return ack; } void MSP_RESET(void){ Wire.beginTransmission(MSP_ADDR); Wire.write(0x00); Wire.write(0x80); Wire.write(0x00); Wire.endTransmission(); Wire.beginTransmission(MSP_ADDR); Wire.write(0x00); Wire.write(0x00); Wire.write(0x00); Wire.endTransmission(); } int MSP_READ(unsigned long addr){ int data; Wire.requestFrom(MSP_ADDR,2,addr,3,true); byte hi=Wire.read();//lees high byte van i2c byte lo=Wire.read();//lees low byte van i2c data=word(hi,lo); return data; } void set_standard(unsigned int STD ){ MSP_LOAD(WR_FP, MODUS, 0x3001); MSP_LOAD(WR_DFP, SPEAKER_SOURCE,0x0320); MSP_LOAD(WR_DFP, FM_PRESCALE, 0x2403); MSP_LOAD(WR_DFP, NICAM_PRESCALE, 0x5A00); MSP_LOAD(WR_FP, STANDARD, STD); } void set_mspLEDs(void)//dit is geen al te fraai stukje... { unsigned int Status=0; bool nicamled; bool fmled; unsigned int data=0x0000; Status = MSP_READ(STATUS); nicamled = bitRead(Status,5); fmled = !(bitRead(Status,1)); if(nicamled)data |= 0x4000; if(fmled)data |= 0x8000; MSP_LOAD(WR_DFP, ACB_REG, data); }