corni's Link- und Fundstücktonne

blog.cpoth.de
Subscribe

Artikel der Kategorie ‘TI’

DC/DC Converter oder Datenwandler finden

Dezember 16, 2015 Von: corni Kategorie: Elektrotechnik, TI Noch keine Kommentare →

Auf www.dcdcselector.com findet sich eine Datenbank mit vielen unterschiedlichen Convertern, Controllern und Datenwandlern unterschiedlicher Hersteller.

Halbleitermarkt 2013 – Rückblick

April 27, 2014 Von: corni Kategorie: Elektrotechnik, TI Noch keine Kommentare →

Ein paar Quellen:

Gartner: Halbleitermarkt 2013 um 5 Prozent gewachsen

Und die Originalquelle zum heise-Artikel: Worldwide Semiconductor Revenue Grew 5 Percent in 2013, According to Final Results by Gartner

Semiconductor Sales Recover in 2013; Micron Surges to Fourth Place in Global Chip Market

IC Insights: Top 13 Foundries Account for 91% of Total Foundry Sales in 2013

Halbleiterhersteller

August 02, 2013 Von: corni Kategorie: Hardware, TI Noch keine Kommentare →

Der Halbleitermarkt ist stark fragmentiert – es gibt unglaublich viele kleine Firmen die Chips für spezielle Anwendungen entwickeln und produzieren. Was mir bisher über den Weg gelaufen ist (ich schmeiße bewusst Foundries, Fabless und Fab owners zusammen):

acam ist spezialisiert auf Messanwendungen, vor allem Zeitmessungen im ns-Bereich wie beispielsweise Ultraschallmessungen, Kapazitätsmessunge, Dehnstreifenauswertung und Rotationsmessungen bis 400.000 rpm.

AMICCOM bietet eine Vielzahl von RF Radios an: sub 1 GHz und 2,4 GHz.

ASPEED baut vor allem Spezialchips zur Fernwartungn von Servern (Remote Management), Desktop Virtualisierung und PC/AV Erweiterungen.

EM Micro stellt RFID, SmartCard IC’s und RF Radios her. Außerdem sind ein paar Microcontroller, Timer, Displayansteuerungen und CapTouch Controller im Angebot.

EMULEX produziert vor allem für den Computer/Servermarkt high speed Netzwerkkarten und Spezialchips für das Remote Management von Servern.

Melexis ist vor allem auf den Automobilmarkt spezialisiert und bietet ASICs für eine Menge Bereiche an: Wireless/Keyless entry, LIN SBCs and BUS Transceivers, NFC, Tire Pressure Monitoring Systems, Interior Lighting, Motor control, Optical sensors,…

nuvoTon ist eine Ausgliederung aus Winbond und ist spezialisiert auf die Folgenden Bereiche:
– Computer: Super IO(SIO), Embedded Controllers(EC), Trusted Platform Modules(TPM), Power Management
– Microcontrollers: ARM® Cortex™ M0 plus ARM®7/ ARM®9 with others in development plus 8051 families
– Mixed Signal: Speech Playback and Record Products with embedded Flash. Audio Products including Power Amplifiers, Audio ADC’s/DAC’s and CODECS

Trinamic baut Spezial-ICs Motorsteuerungen.

X-FAB ist ein Auftragsfertiger für Halbleiter, spezialisiert auf Mixed-Signal Chips und MEMS.

Und jetzt die, die man kennt (ohne Garantie auf Vollständigkeit):
Intel
Samsung Semiconductor (Memory and much more)
TSMC (Foundry)
Texas Instruments
Toshiba
Renesas
SK Hynix (Memory)
Qualcomm
Micron
ST
Broadcom
Sony Semiconductors
AMD
Infineon
Global Foundries (Foundry)
NXP
NVIDIA
Fujitsu
Freescale
UMC (Foundry)
Mediatek
Elpedia (Memory)
ON Semiconductor
ROHM Semiconductor
Panasonic Semiconductor
ADI (Analog Devices)
Marvell Technology
Maxim
Xilinix
Altera
Silicon Labs
Linear Technology
Spansion (Memory, acquired Fujitsu’s Microcontroller devision in 2013)
Cypress
Atmel
Realtek
Lattice
IBM
Nichia
Intersil
Bosch
Microchip
Nordic Semiconductor
SMIC Semiconductor Manufacturing International Corporation (Foundry)
HHGrace Huahong Grace Semiconductor Manufacturing Corporation (Foundry)
TowerJazz (Foundry)
DongbuHiTek (Foundry)
MagnaChip (Foundry, IGBTs, FETs, PMICs, RF/Power/Audio Switches,…)
Win Semiconductors (Foundry)
Powerchip (Foundry)
VIS Vanguard International Semiconductor (Foundry)
MediaTek (SoC’s für Router, Set-top boxes, smartphones, tablets,…)
Taiwan Semiconductor
MACOM (RF, Power FETs, GaN FETs, LNAs, Converters)
Micronas (Sensors)
Rockchip ARM SoCs
Nanya (Memory)
International Rectifier (Power FETs, Power Products, acquired by Infineon in August 2014)
Ramtron (Memory, acquired by Cypress in 2012)
Energy Micro (acquired by Silicon Labs in 2013)
Luminary Micro (acquired by Texas Instruments in 2009)
Chipcon (acquired by Texas Instruments in 2006)
Qimonda (former memory devision of Infineon, bankruptcy in 2009, liquidated in 2009)
Peregrine Semiconductor (RF Switches, Digital Attenuators,…)
Microsemi (ASICs, FPGAs, SoCs, RF Switches/Diodes/Amplifier, Discretes, Power)
rfmd (Attenuators, GaN, Transistors, RF)
rfmd + TriQuint = Qorvo (RF Amplifiers, Filter, LNAs,…)
IDT Integrated Device Technology (PMIC, PMUs, Logic, High Speed Interface, RF Products)
Avago Technologies (ASICs, ASSPs, Fibre products, Optical/LEDs, RF + Microwave)
LSI (RAID/Storage Controllers, ASICs, Processors, acquired by Avago Technologies in December 2013)
Enpirion (Power Management, DC/DC Converter Modules, acquired by Altera in May 2013)

Ein paar interessante MSP430 Infos

August 02, 2013 Von: corni Kategorie: Hardware, TI Noch keine Kommentare →

Eine schöne Auflistung der ASM Befehle des MSP430 gibt es bei 0xdec.de.

Bei Energia findet man eine gute Übersicht über die Pins der LaunchPads.

MSP430: Pipeline Architektur

Mai 24, 2013 Von: corni Kategorie: Programmieren: C, TI Noch keine Kommentare →

Nach außen ist der MSP430 der MSP430. Allerdings hat sich am CPU Kern auch einiges getan und nicht alles wird offensiv kommuniziert. TI dokumentiert etwa im Code Composer Studio User’s Guide for MSP430 (Revision SLAU157Y, stand Mai 2013) im Kapitel „Using the Integrated Debugger, Breakpoint Types“ drei unterschiedliche Architekturen, MSP430, MSP430X und MSP430Xv2, allerdings bleiben bis auf die Erweiterung des Adressbusses auf 20 bit bei den X-Architekturen weitere Details verborgen.

Ein weiterer erheblicher Unterschied zwischen MSP430 und MSP430X ist die neu eingeführte three stage pipeline architecture. Dabei werden Taktzyklen in denen der Bus ungenutzt bliebe, etwa während die CPU einen Befehl verarbeitet, genutzt um den nächsten Befehl schon zu holen (siehe auch Wikipedia Artikel zur Pipeline Architektur).

Mit folgendem Programm lassen sich Auswirkungen dieser Architekturänderung demonstrieren:

#include <msp430.h>

void main(void) {
    WDTCTL = WDTPW | WDTHOLD;	// Stop watchdog timer

    P1OUT &= ~BIT0;			// Reset P1.0
    P1DIR |= BIT0;			// P1.0 Output

    P1OUT |= BIT0;			// P1.0 high
    __delay_cycles(1000);		// 1 ms @ 1 MHz, DCO default
    P1OUT &= ~BIT0;   			// P1.0 low

    while(1);				// 
}

Lässt man das Programm zum Beispiel auf einem MSP430F5529 oder MSP430F5438A (MSP430Xv2) laufen und misst die Zeit welche der Port 1.0 ein high Signal liefert beträgt diese Zeit 1 ms, also 1000 Zyklen. Die Funktion __delay_cycles() fügt 1000 NOP Befehle ein, der DCO läuft in der Grundeinstellung mit 1 MHz.
Wird an der while(1) Schleife allerdings ein Breakpoint gesetzt ändert sich die delay Zeit von 1 ms auf rund 4 ms (zumindest beim MSP430F552x und beim MSP430F543xA). Diesen Effekt kann man bei MSP430 Derivaten welche nicht die MSP430X oder Xv2 Architektur haben nicht feststellen. Hier bleibt die delay Zeit immer 1 ms, egal ob an der while(1) Schleifen ein Breakpoint gesetzt wird oder nicht (etwa beim MSP430G2452 bzw. allen MSP430G2xxx Derivaten).

Wird der Breakpoint gesetzt passiert folgendes:
Der aktuelle Befehl 1 (P1OUT &= ~BIT0;) wird gerade ausgeführt, der Befehl 2 (hier ist der Breakpoint gesetzt) wird in die Pipeline geladen. Die EEM „sieht“ beim Befehl 2 einen Breakpoint und hält die CPU an welche allerdings noch an Befehl 1 arbeitet. Die EEM schaut auf den Bus, weiß allerdings nicht was die CPU gerade wirklich tut. Nun ist Befehl 1 halb ausgeführt, die CPU allerdings angehalten. In diesem Zustand (Befehl 1 noch nicht fertig ausgeführt) findet dann einiges an JTAG Kommunikation statt und die Pipeline wird geleert. Wenn die Pipeline leer ist wird Befehl 1 noch fertig ausgeführt. So kommt es zu den 4 ms delay bis der Port wieder getoggelt wird.
Die ursprüngliche MSP430 Architektur ohne Pipeline holt den nächsten Befehl (die while(1) Schleife mit dem Breakpoint) erst wenn der alte Befehl vollständig abgearbeitet wurde (der Port wieder auf low ist).

Sollte der Effekt beim debuggen stören kann er durch einfügen von zwei NOP Befehlen (also zwei __no_operation(); vor der while(1) Schleife) beseitigt werden. Dann werden die zwei NOPs in die Pipeline geladen und befinden sich in der Ausführung, wenn die while(1) Schleife mit dem Breakpoint geladen wird. Das Port toggeln ist dann schon fertig abgearbeitet und das delay dauert genau 1 ms. Zwei NOP Befehle, da die Pipleline drei Stages (Stufen) hat. Es können also zusätzlich zum aktuellen Befehl immer schon bis zu zwei folgende Befehle geladen werden.

MSP430 LaunchPad Firmware Update

März 22, 2013 Von: corni Kategorie: TI Noch keine Kommentare →

Bei manchen MSP430 LaunchPads der Rev. 1.4 kam es mit dem MSP430G2452 zu Problemen wenn man mit CCS debuggen wollte:

MSP430: Trouble Writing Memory Block at 0xfff4 on Page 0 of Length 0x2: Could not write device memory
MSP430: GEL: File: C:\Users\XXXX.out: Load failed.“

Nach einem Firmware Update funktioniert alles Problemlos.

CCS: nur benötigte Daten ins Flash laden

November 21, 2012 Von: corni Kategorie: Software, TI Noch keine Kommentare →

Wer ein MSP430 Derivat mit viel Flash nutzt oder größere Microcontroller einsetzt die teilweise einige Megabyte Flash haben können muss nicht jedes mal ewig warten bis das ganze Programm in den Controller geladen ist um es zu debuggen. Im Code Composer Studio Debugger versteckt sich im Properties Menu des Projekts eine Funktion die es erlaubt nur die benötigten Daten zu laden und nicht jedes mal das gesammte Flash neu zu beschreiben. Zu finden per Rechtsklick auf das Projekt -> Properties -> Debug:

Project (right klick) -> Properties -> Debug

MSP-EXP430FR5739: ADC10B Sequenz per DMA in Array ablegen

August 17, 2012 Von: corni Kategorie: Programmieren: C, TI Noch keine Kommentare →

Das Beispielprogramm ruft mit 50 Hz den ADC auf welcher eine Serie an Messungen macht (Channel A1, dann A0). Der ADC triggert nach jeder Messung die DMA welche das Messergebnis abholt und in das Array ADC_Result schreibt. Das alles läuft völlig ohne CPU Interaktion.

#include "msp430fr5739.h"

unsigned int ADC_Result[2];

void main(void)
{
	WDTCTL = WDTPW + WDTHOLD;				// Stop WDT

	// Setup clock system
	CSCTL0_H = 0xA5;						// Password
	CSCTL1 |= DCOFSEL0 + DCOFSEL1;          // DCO 8 MHz
	CSCTL2 = SELA_3 + SELS_3 + SELM_3;      // set ACLK = SMCLK = DCO/8

	// Port Setup
	P1SEL0 |= BIT0;                      	// P1.0 is input for ADC
	P1SEL1 |= BIT0;							// Channel A0
	P1SEL1 |= BIT1;							// P1.1 is input for ADC
	P1SEL0 |= BIT1;							// Channel A1

	// Setup der DMA
	DMACTL0 |= DMA0TSEL__ADC10IFG;			// ADC10 interrupt soll die DMA triggern
	__data16_write_addr((unsigned short)&DMA0SA,(unsigned long) &ADC10MEM0);
					// DMA soll das ADC Ergebnis lesen...
	__data16_write_addr((unsigned short)&DMA0DA,(unsigned long) &ADC_Result[0]);
					// ...und ins array ADC_Result[] schreiben
	DMA0SZ = 2;								// One word per transfer
	DMA0CTL |= DMADT_4;						// Repeated single transfer
	DMA0CTL &= ~DMADSTBYTE;					// DMA destination is a word
	DMA0CTL &= ~DMASRCBYTE;					// DMA source is a word
	DMA0CTL |= DMASRCINCR_0;				// Source address is unchanged (immer gleiches Register)
	DMA0CTL |= DMADSTINCR_3;				// Destination address is incremented (nächstes array element)
	DMA0CTL &= ~DMALEVEL;					// Trigger on low level (otherwise DMA is too fast)
	DMA0CTL |= DMAIE;						// Enable Interrupts
	DMA0CTL |= DMAEN;						// Enable DMA

	// Setup Timer
	TA0CCR0 = 20000 - 1;					// PWM Period 50 Hz
	TA0CCTL1 = OUTMOD_7;					// CCR1 reset/set
	TA0CCR1 = 2000;							// CCR1 PWM duty cycle 10 %
	TA0CTL = TASSEL_2 + MC_1 + TACLR;		// SMCLK, up mode, clear TAR

	// Setup ADC
	ADC10CTL0 &= ~ADC10ENC;
	ADC10CTL1 |= ADC10CONSEQ_3;				// Repeat-Sequence-of-Channels Mode
	ADC10CTL1 |= ADC10SHS_1;				// Set PWM as trigger source
	ADC10CTL1 &= ~ADC10SHP;					// Bypass Sample timer
	ADC10CTL2 |= ADC10RES;                  // 10-bit conversion results
	ADC10MCTL0 |= ADC10INCH_1;				// Start Sequence with Channel A1
	ADC10CTL0 |= ADC10ON;					// ADC on
	ADC10CTL0 |= ADC10ENC;					// Enable ADC conversation

	_BIS_SR(GIE);							// General interrupt enable

	while(1) __bic_SR_register(CPUOFF);		// CPU off
}


#pragma vector=DMA_VECTOR
__interrupt void DMA0_ISR (void)
{
	switch(__even_in_range(DMAIV,16))
	{
		case  0: break;						// No interrupt
		case  2:
			// ADC and DMA are ready, values are now stored in Array ADC_Result
			__no_operation();				// Set breakpoint here
			break;							// DMA0IFG
		case  4: break;						// DMA1IFG
		case  6: break;						// DMA2IFG
		case  8: break;						// Reserved
		case 10: break;						// Reserved
		case 12: break;						// Reserved
		case 14: break;						// Reserved
		case 16: break;						// Reserved
		default: break;
	}
}

Enter MSP430F5xxx LPMx.5

August 13, 2012 Von: corni Kategorie: Programmieren: C, TI Noch keine Kommentare →

Das geht in C so:

	PMMCTL0_H = PMMPW_H;					// Enter PMM password
	PMMCTL0_L |= PMMREGOFF;					// Enter LPMx.5 when PMMREGOFF is set

	__bis_SR_register([LPM3;LPM4]_bits);	// Enter LPM

MSP-EXP430FR5739: ADC10B Sequenz mit PWM triggern

August 08, 2012 Von: corni Kategorie: Programmieren: C, TI Noch keine Kommentare →

Der ADC10B des MSP430 kann auch automatisch mehrere Kanäle nacheinander messen, ohne dass manuell hin und her geschaltet werden muss.
Das folgende Programm misst zunächst Kanal A1 und dann A0. Der ADC fängt immer beim höchsten in ADC10MCTL0 eingestellen Kanal an und zählt dann herunter. Nach jeder Messung wird in diesem Programm ein Interrupt ausgelöst und der gerade gemessene Wert kann ausgelesen werden.

#include "msp430fr5739.h"

unsigned int ADC_Result;

void main(void)
{
	WDTCTL = WDTPW + WDTHOLD;				// Stop WDT

	// Setup clock system
	CSCTL0_H = 0xA5;						// Password
	CSCTL1 |= DCOFSEL0 + DCOFSEL1;          // DCO 8 MHz
	CSCTL2 = SELA_3 + SELS_3 + SELM_3;      // set ACLK = SMCLK = DCO/8

	// Port Setup
	P1SEL0 |= BIT0;                      	// P1.0 is input for ADC
	P1SEL1 |= BIT0;							// Channel A0
	P1SEL1 |= BIT1;							// P1.1 is input for ADC
	P1SEL0 |= BIT1;							// Channel A1

	// Setup Timer
	TA0CCR0 = 20000 - 1;						// PWM Period 50 Hz
	TA0CCTL1 = OUTMOD_7;						// CCR1 reset/set
	TA0CCR1 = 2000;								// CCR1 PWM duty cycle 10 %
	TA0CTL = TASSEL_2 + MC_1 + TACLR;			// SMCLK, up mode, clear TAR

	// Setup ADC
	ADC10CTL0 &= ~ADC10ENC;
	ADC10CTL0 |= ADC10SHT_2 + ADC10ON;      // ADC10ON, S&H=16 ADC clks
	ADC10CTL1 |= ADC10CONSEQ_3;				// Repeat-Sequence-of-Channels Mode
	ADC10CTL1 |= ADC10SHS_1;				// Set PWM as trigger source
	ADC10CTL1 &= ~ADC10SHP;					// Bypass Sample timer
	ADC10CTL2 |= ADC10RES;                  // 10-bit conversion results
	ADC10MCTL0 |= ADC10INCH_1;				// Start Sequence with Channel A1
	ADC10IE |= ADC10IE0;                    // Enable ADC conv complete interrupt
	ADC10CTL0 |= ADC10ENC;					// Enable ADC conversation

	_BIS_SR(GIE);

	while(1) __bic_SR_register(CPUOFF);
}

#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
	__no_operation();
  switch(__even_in_range(ADC10IV,12))
  {
    case  0: break;                          // No interrupt
    case  2: break;                          // conversion result overflow
    case  4: break;                          // conversion time overflow
    case  6: break;                          // ADC10HI
    case  8: break;                          // ADC10LO
    case 10: break;                          // ADC10IN
    case 12:
    	ADC_Result = ADC10MEM0;
    	__no_operation();
        __bic_SR_register_on_exit(CPUOFF);
        break;

    default: break;
  }
}