Forum: Projekte & Code AVR Synthesizer mit ATxmega128A1


von Ulrich B. (ulrich_b665)


Lesenswert?

Hallo Rolf,

ich bin gerade bei den Vorüberlegungen für einen DIY-Midicontroller und 
suche dafür gute Drehencoder. Welche verwendest du denn in deinem Synth?

Danke & Grüße,
Ulrich

von Rolf D. (rolfdegen)


Lesenswert?


von Ulrich B. (ulrich_b665)


Lesenswert?

Danke Rolf, die werde ich mir mal ansehen.

:) Ulrich

Beitrag #4974510 wurde vom Autor gelöscht.
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallöchen..

Es tut mir leid wenn ich zur Zeit wenig schreibe. Aber wir stecken
mitten in der Vorbereitung für die Superbooth Messe in Berlin. Andre hat
für unseren
Prototyp auf die Schnelle ein Gehäuse aus Plexiglas und Holzseitenteilen
gebaut. Es ist noch nicht ganz fertig, aber sieht doch schon gut aus wie
ich finde.

Bild 1+2: Das DE-GENERATOR Gehäuse


Zur Superbooth:
Die Superbooth 17 findet vom 20 - 22.April in Berlin im FEZ (Kinder-,
Jugend- und Familienzentrum) statt. Insgesammt 167 Aussteller sollen
dort sein. Hab mal gekuckt wer da noch so da ist zB die Firma Kurzweil,
Yamaha, Steinberg, Nativ Instruments, Roland, Moog Music, Ableton,
Doepfer uvm
Wer uns besuchen möchte findet uns am Stand 0503 von Sonic Potions im
2.OG (siehe 3.Bild gelber Pfeil).

Bild 3: Unser Stand in der Superbooth 17

: Bearbeitet durch User
von J. S. (engineer) Benutzerseite


Lesenswert?

Modernes Weiss-Blau gepaart mit Holzverkleidung wie beim Virus. Sieht 
nicht schlecht aus. :-)

Würde Ich mir schon mal ansehen, aber nach Berlin komme Ich momentan 
nicht.

Geht der auch in den Verkauf?

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Danke. Ja.. ist angedacht. Es gibt noch ein paar Bilder von Andre..

: Bearbeitet durch User
von min (Gast)


Lesenswert?

sieht gut aus!

von Rolf D. (rolfdegen)


Lesenswert?

Hallo liebe Freunde..

Zur Zeit arbeite ich am Code im DE-GENERATOR und versuche diesen etwas 
zu verkleinern. Der
Programmspeicher (Flash) im ATXmega128 hat eine maximale Größe von 128 
KByte. Meine Code-
Größe lag bei 110 KByte. Durch das Anlegen eines großen String-Arrays im 
Flash und das Ändern
von Optimierungs Flags von -OS (Standarteinstellung) auf -O1 in einigen 
Funktionen konnte ich
die Code-Größe von 110 KByte auf 99 KByte reduszieren.

String-Array im Flash
1
gui.c
2
//*************************************************************************
3
// string table
4
//*************************************************************************
5
const char string_000[] PROGMEM = "SOUND PATCHES";
6
const char string_001[] PROGMEM = "PATCH.NR";
7
const char string_002[] PROGMEM = "BANK";
8
const char string_003[] PROGMEM = "PAT:";
9
const char string_004[] PROGMEM = "BNK:";
10
const char string_005[] PROGMEM = "PRG:---";
11
const char string_006[] PROGMEM = "BNK:---";
12
const char string_007[] PROGMEM = "Shape";
13
const char string_008[] PROGMEM = "Prm.";
14
const char string_009[] PROGMEM = "Op.";
15
...
16
17
18
PGM_P const String_Tab[] PROGMEM = {
19
    
20
    string_000,
21
    string_001,
22
    string_002,
23
    string_003,
24
    string_004,
25
    string_005,
26
    string_006,
27
    string_007,
28
    string_008,
29
    string_009,
30
    ...
31
};
32
33
gui.h
34
// string tabel
35
extern PGM_P const String_Tab[];

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Leider ist mir am Wocheende ein kleines Missgeschick passiert. Ich habe 
von meinem Freund Andre
Laska aus Oer-Erkenschwick ein kleines Päckchen mit Bauteilen für einen 
dritten DE-GENERATOR
bekommen und bei der Post abgeholt. Unter anderem war auch ein neues 
TFT-Display für den
DE-GENERATOR enthalten, dass ich am Wochenende mal testen wollte. Beim 
Aussteigen aus dem Bus
habe ich das verdammte Päckchen dann auf meinem Sitzplatz liegen 
gelassen. Ein sofortiger Anruft
bei der hiesigen Bus-Leitzentrale informierte den Busfahrer, dass er auf 
der Rücktour nach dem
Päckchen ausschau halten sollte. Leider hat er nichts gefunden.

Werde am Montag dann mal zum Fundbüro fahren und nach dem Päckchen 
forschen. Aber vielleicht
hats ja jemand gefunden und baut sich jetzt einen singenden 
Weihnachtsbaum daraus  holy-willi

Bild 1+2: Neues TFT-Display (ER-TFTM032-3)

von Rolf D. (rolfdegen)



Lesenswert?

Habs Päckchen im Fundbüro abhohlen könne. War noch alles drin. Echt 
nette Fahrgäste in Wuppertal  ebueb


Ach herrje..

Ich tüfftel jetzt schon seit einige Stunden an einer Anpassung für das 
neue Display am DE-GENERATOR herrum. Leider musste ich nach geraumer 
Zeit feststellen, dass das neue TFT Display defekt ist. Beim Zeichnen 
einer Linie wird nur an jeder geraden XY-Koordinate ein Pixel gesetzt. 
Bei ungeraden Koordinaten werden die Pixel an ganz anderen Stellen zB am 
Displayrand gesetzt  verwirrt (Bild2).

Da die Initialisierung des Display richtig funktioniert, ist ein Defekt 
am Datenbus oder ein Übertragungsfehler ausgeschlossen. Auch 
Softwareseitig scheint alles ok zu sein. Beim initialisieren ist 
allerdings ein Streifenmuster auf dem Display zu erkennen (Bild 1).

Bild 1: Streifenmuster nach der Initialiesierung des Displays
Bild 2: Nur gerade Pixeladressen werden richtig gezeichnet

Display Initialisierung
1
void init_LCD(void)
2
{
3
    
4
// init ILI9341 TFT Controller --------------------------------------------
5
    // set LCD Reset and CS
6
    SET_RESET;
7
    _delay_ms(10);
8
    CLR_RESET;
9
    _delay_ms(10);
10
    SET_RESET;
11
    CLR_CS;
12
    _delay_ms(10);
13
    
14
    // write command and data
15
    
16
    write_com(0xCB);  //Power control A
17
    write_data(0x39); 
18
    write_data(0x2C); 
19
    write_data(0x00); 
20
    write_data(0x34); 
21
    write_data(0x02); 
22
23
    write_com(0xCF);  //Power control B
24
    write_data(0x00); 
25
    write_data(0XC1); 
26
    write_data(0X30); 
27
28
    write_com(0xE8);  //Driver timing control A
29
    write_data(0x85); 
30
    write_data(0x00); 
31
    write_data(0x78); 
32
33
    write_com(0xEA);  //Driver timing control B
34
    write_data(0x00); 
35
    write_data(0x00); 
36
 
37
    write_com(0xED);  //Power on sequence control
38
    write_data(0x64); 
39
    write_data(0x03); 
40
    write_data(0X12); 
41
    write_data(0X81); 
42
 
43
    write_com(0xC0);    //Power control 
44
    write_data(0x23);   //VRH[5:0] 
45
 
46
    write_com(0xC1);    //Power control 
47
    write_data(0x10);   //SAP[2:0];BT[3:0] 
48
49
    write_com(0xC5);    //VCM control 
50
    write_data(0xF0);   //Contrast
51
    write_data(0xF0); 
52
    
53
 
54
    write_com(0xC7);    //VCM control2 
55
    write_data(0x86);   //--
56
 
57
    write_com(0x36);    // Memory Access Control 
58
    write_data(0x48);   
59
60
    write_com(0x3A);    // Pixel format   
61
    write_data(0x55); 
62
63
    write_com(0xB1);    // Frame Rate Control (In Normal Mode/Full Colors)
64
    write_data(0x00);  
65
    write_data(0x18); 
66
 
67
    write_com(0xB6);    // Display Function Control 
68
    write_data(0x08); 
69
    write_data(0x82);
70
    write_data(0x27);  
71
72
    write_com(0x11);    //Exit Sleep 
73
    _delay_ms(130); 
74
                
75
    write_com(0x29);    //Display on
76
}

Hab jetzt an den Lieferanten BuyDisplay.com geschrieben und ein neues 
Muster angefordert. Mal schaun ob es dann funktioniert.

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallo liebe Freunde..

Mit viel Geduld und Mühe ist es mir gelungen das Display doch noch zu 
einer richtigen Anzeige von Linien und Texten zu bewegen. Ursache war 
eine falsche Adressierung der Pixel Koordinaten in den entsprechenden 
Registern des ILI9341 Controllers.

Adressierung der XY Koordinaten
1
//*************************************************************************
2
// set  xy for TFT (ILI9341 or SSD1289)
3
//*************************************************************************
4
void TFT_set_xy(uint16_t x1, uint8_t y1, uint16_t x2, uint8_t y2)
5
{
6
    
7
    // SSD1289 ------------------------------------------------------------
8
    TFT_write_com_data(0x44,(y2 << 8) + y1);
9
    TFT_write_com_data(0x45,x1);
10
    TFT_write_com_data(0x46,x2);
11
    TFT_write_com_data(0x4e,y1);
12
    TFT_write_com_data(0x4f,x1);
13
    TFT_write_com(0x22);
14
    
15
16
    //  ILI9341 -----------------------------------------------------------
17
    TFT_write_com(0x2a);
18
    TFT_write_data(x1);
19
    TFT_write_data(x2);
20
    TFT_write_com(0x2b);
21
    TFT_write_data(y1);
22
    TFT_write_data(y2);
23
    TFT_write_com(0x2c);    
24
}
25
26
//*************************************************************************
27
// write command and data (SSD1289)
28
//*************************************************************************
29
void TFT_write_com_data(uint8_t addr, uint16_t num)
30
{
31
    // set Com-Register
32
    LCD_CLR_RS;
33
    // write Addr-Register
34
    VPORT0.OUT = addr;
35
    // WR-Puls
36
    CLR_WR;
37
    SET_WR;
38
39
    // Set Data-Register
40
    LCD_SET_RS;
41
    // send 16Bit Data
42
    VPORT0.OUT = num >> 8;
43
    SET_LE;
44
    CLR_LE;
45
    VPORT0.OUT = num;
46
    // WR-Puls
47
    CLR_WR;
48
    SET_WR;
49
}
50
51
52
//*************************************************************************
53
// write command TFT
54
//*************************************************************************
55
void TFT_write_com(uint8_t data)
56
{
57
    // set Com-Register
58
    LCD_CLR_RS;
59
    // write Addr-Register
60
    VPORT0.OUT = data;
61
    CLR_WR;
62
    SET_WR;
63
}
64
65
//*************************************************************************
66
// write 16 Bit Data TFT
67
//*************************************************************************
68
void TFT_write_data(uint16_t data)
69
{
70
    // set Data-Register
71
    LCD_SET_RS;
72
    // set high Byte to LCD Port
73
    VPORT0.OUT = data >> 8;
74
    SET_LE;
75
    CLR_LE;
76
    
77
    // set low byte to LCD Port
78
    VPORT0.OUT = data;
79
    // wr-puls
80
    CLR_WR;
81
    SET_WR;
82
}

Bild 1: Menüseite auf neuem TFT Display
Großes Bild: 
https://plus.google.com/photos/photo/114442997071623735927/6422198826292846738?icm=false&authkey=CL6X6ovG7fix7gE&hl=de

Gruß Rolf

: Bearbeitet durch User
von Rolf D. (rolfdegen)


Lesenswert?

Die Bug-Liste vom DE-GENERATOR

Software Versionen DE-GENERATOR
Version Datum Änderung

Vers. 3.001 05.01.17
- Fehler bei der Encoder-Entprellung beseitigt

Vers. 3.002 09.01.17
- Fehler bei der AD-Wandlung (Sampling) beseitigt
- Zoom-Funktion im Sample-Editor implementiert (noch nicht fertig)

Vers. 3.004 12.01.2017
- Encoder Dynamic (Beschleunigung) in Systempage einstellbar

Vers. 3.006 21.01.2017
- Im Sample Editor kann man jetzt Loop-Punkte setzen. Werden aber z.Z. 
noch nicht im Sample gespeichert. Ferner kann man einen markierten 
Bereich löschen, Stille einführen oder revers machen. Sample-Files 
können jetzt gezoom werden. Bei hohen Zoom-Werten funktioniert die 
Darstellung des markierten Bereichs noch nicht.
- Threshold funktioniert jetzt ohne Fehler.
- Fehler beim Abspeichern von aufgenommenen Samples beseitigt

Vers. 3.007 22.01.2017
- lineare Attack-Phase

Vers. 3.008 29.01.2017
- Systemabsturz in Monitorfunktion im Sample Editor beseitigt
- es können jetzt Loop points in Wav-Files gespeichert und geladen 
werden
- Samples könne jetzt im Osc-Menü editiert werden (cut,silence,loop 
function)
- Osc werden jetzt über "Mode" im Osc Menü ausgeschaltet (Früher nur 
über Shape möglich)
- Auswahl von Filtertyp (DEG/SMR4) in Systempage möglich

Vers. 3.009 01.02.2017
- Fehler bei der Editierung von Loop-Punkten im Osc-Menü beseitigt
- Page Encoder im Sample-Edit Menü gesperrt. Man muss erst wieder zurück 
ins Main-Menü um Page Encoder zu entsperren
- Osc-Menü wird grau wenn Osc im Off Modus. Subpages sind im Off Modus 
gesperrt

Vers. 3.010 03.02.2017
- Fehler beim Laden und Speichern von Sample-Files im Oscillator 
beseitigt (Knackser)

Vers. 3.011 11.02.2013
- Dateizugriffsfehler bei der Bankauswahl von Waves und Samples 
beseitigt wenn Bank nicht existiert. Der Fehler verursachte das Löschen 
kompletter Ordnerinhalte. Jetzt wird eine Info "File not found" 
eingeblendet und der Dateizugriff ordnungsgemäß beendet.
- Für bessere Entprellung der Encoder wurde die Abtastgeschwindigkeit am 
74HC165 geändert. Von 1 msec auf 2 msec.
- Fehler beim Speichern von Samples beseitigt, wenn kein Ordner 
vorhanden ist. Es wird dann automatisch ein neuer Ordner erstellt.

Vers. 3.012 16.02.2017
- Änderung Filteransteuerung PB5 und PB6 sind im Schaltplan vertauscht

Vers. 3.013 21.02.2017
- Fehler in der Encoder-Routine beseitigt. Fehler verursachte 
Software-Abstürzen im Oszillator Menü.
- Fehler bei der Editierung von Parametern im Oszillator Menü beseitigt.
- Notenhänger im Envelope Menü beseitigt. Globale Variablen ersetzt 
durch static Variablen in Real-Env Routine.
- Audioausgänge im SMR4 Filter sind vertauscht (Links & Rechts). Lösung: 
DAC Ausgänge in der Software getauscht.
- Fehler bei der Editierung von Parametern in der Modulationsmatrix 
beseitigt.
- Modulationsfehler wenn LFO den VCA moduliert beseitigt. Ursache: Es 
wurden falsche Incrementwerte berechnet. Incrementwerte werden jetzt aus 
einer Log. Tabelle geladen
- Noise (rosa Rauschen bis 20KHz) im Osc funktioniert wieder
- Änderung im LFO Menü: jetzt 17 Wellenformen + S&H. Die Sync und 
OneShot Funktion ist jetzt im LFO Mainmenü einstellbar.
- LFO Frequenz von 0.015 Hz bis 120 Hz einstellbar.
- VCA Pan & Fx Pan in Modulationsmatrix aktiviert.
- Key Track Funktion im OSC Menü implementiert. Feste Note (A6 ~ 440Hz) 
kann mit Range Parameter in Halbtöne von +24 bis -36 geändert werden.
- init Preset implementiert. Ist der Systemparameter "Autoload" im 
Systemmenü auf off, dann wird nach einem Neustart ein init Preset 
geladen. Ist "Autoload" on, dann wird der zuletzt geladene Preset 
geladen.

Vers. 3.014
- Im Envelope Menü werden jetzt in der Headline die Modulationsziele 
angezeigt.
- Fehlerbeseitigung: Falsches Grafik Symbol für Wellenform oder Sample 
in der Patchliste.

Vers. 3.015 06.03.2017
- Fehler beim speichern von Ktrack Paramter im Patch beseitigt.
- Fine pich Paramter für beide Oscillatoren in der Modulationsmatrix 
ergänzt.

Vers. 3.016 06.03.2017
- Fehler in Modulationsmatrix beseitigt.

Vers. 3.017 07.03.2017
- Im Osc-Menü zusätzliche Shape Waveform "Nois" implementiert. Das 
Rauschspektrum kann für jeden Oszillator getrennt mit dem Prm. Regler 
von dunkel auf hell eingestellt werden.
- Modulationsmatrix: Sources: Offset hinzugefügt. Destinations: VCA-BAL 
, VCF-BAL und Fx-PAN hinzugefügt.

Vers. 3.018a 09.03.2017
- Vorabversion Sequencer/Arpeggiator Funktion

Vers. 3.018b 03.04.2017
- Arpeggiator: Octave Funktion hinzugefügt.

Build 3.19a 11.04.2017
- Arpeggiator: Range auf 4 Octave erweitert und Notenbegrenzung 
hinzugefügt
- Arpeggiator: Notenhänger beim ausschalten beseitigt
- Loop Fehler in Osc1&2 beseitigt

Build 3.20 15.04.2017
- Arpeggiator: Direction Fehler verursachte Systemabsturz. Läuft jetzt 
problemlos
- Fehler beim automatisches Anlegen von Preset und Sample Ordnern 
beseitigt
- und ein paar Kleinigkeiten

Build 3.20a 16.04.2017 -
Fehler bei der inversen Anzeige von Loop-Punkten im Editor beseitigt

Build 3.20b 16.04.2017
- Ein Fehler in der Speicherverwaltung der Samples beseitigt

Build 3.20c 16.04.2017
- Fehler in der Modulationmatrix. Slot Werte verändern sich willkürlich 
beim scrollen. Lag an doppelt Zuweisung von Enc.Values

Build 3.21 17.04.2017
- Fehler im Datei System: Alte Sample-Files und Data.bin Dateien wurden 
im Sound Ordner nicht gelöscht sondern nur überschrieben.
Das hat beim Abspeichern von neuen Presets manchmal mehrer Sekunden 
Wartezeit verursacht.


Build 3.22 17.04.2017
- Tasten- und Encoder Sperre bei verschiedenen Funktion nicht richtig

Build 3.23 18.04.2017
- Ordner Fehler beim Abspeichern von Samples beseitgt.

Build 3.27 30.04.2017
- Warnhinweise im Code in Atmel Studio 7 beseitigt (noch 556 
Warnhinweise vorhanden)
- Fehler beim laden von 1.Sample beim Umschalten auf andere Bank 
beseitigt

Build 3.27a 01.05.2017
- Warnhinweise im Code in Atmel Studio 7 beseitigt (noch ca. 90 
Warnhinweise vorhanden). Ursache für die meisten Warnungen war ein 
falsches setzen der Operanten in den static inline functionen. Die 
restlichen Warnungen beziehen sich auf falsche Übergabe von 
Namen-Strings an das Fat-Filesystem. Fat-Arbeitet mit uint8_t und nicht 
mit char.

Build 3.28 05.05.2017
- Große String Tabelle im Programmspeicher (Flash) angelegt. Spart Code 
im Flash und SRAM
- Optimierungseinstellung in ATMEl STUDIO 7 in oscillators.c und voice.c 
auf -O2 gesetzt. Rest ist -OS

Build 3.31 21.05.2017
- Display Treiber für ILI9341 und SSD1289 angepasst
- Save Dialog jetzt mit kleiner ASCII Tabelle für die Auswahl von 
Zeichen
- Einige Verbesserungen in der GUI
- Sample Editor: Nach der Editierung eines Sample wurde die 
Wellenformdarstellung im Osc-Menü nicht neu gezeichnet (redraw). Fehler 
beseitigt
- OscMix Value wurde beim Umschalten auf Osc-Page nicht aktualliesiert. 
Fehler beseitigt
- Wenn Shape nicht auf "USER" steht und es wird versucht auf die SubPage 
"User Waveform" zu schalten, dann erscheint ein Warnhinweis.
- LCD Flacker Problem beseitigt. Lösung: XY Register (0x44 - 0x46) 
müssen vor dem Setzen eines Pixel gelöscht werden.
- Jetzt nur noch 44 Warnhinweise in ATMEL Studio übrig. Die meisten 
stammen vom SD Karten Treiber



.. und noch kein Ende  Augenzwinkern

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Hallo liebe Freunde..

Andre und ich sind noch fleißig am arbeiten. Das neue TFT Display hat im 
Vergleich zum alten
Display leider keinen externen Anschluss für die 
LED-Hintergrundbeleuchtig. Diese ist über die
3.3Volt Versorgungsspannung auf dem Display fest verdrahtet. Dies führte 
aber zu einer höheren
Belastung des 7805 Festspannungsregler auf dem Motherboard und zu höhren 
Temperaturen im
Gerät (> 64C). Der Kühlkörper des 7805 war im geschlossenen Gehäuse am 
kochen. Aus diesem
Grund haben wird den 7805 durch einen Schaltregler ersetzt.

Wir haben einen DCDC-Konverter TRACO TSR 1-2450 verwendet. Er ist nicht 
billig, hat aber einen
hohen Wirkungsgrad von 94%. Die Schaltfrequenz des Konverter liegt bei 
500KHz. Ein integrierter
Filter sorgt für einen niedrigen Ausgangsrippel und Noise von 50mVp-p. 
Der max. Ausgangsstrom
liegt bei 1A.

Günstiger ist der R-78W5.0-0.5 von RECOM. Die Effizienz und 
Ausgangsrippel ist fast gleich.
Allerdings ist die Schaltfrequenz im Vergleich zum Traco Regler etwas 
niedriger und liegt bei
330KHz. Der max. Ausgangsstrom ist 500mA.

In meiner Grabbelkiste hatte ich noch einen Traco TSR 1-2450 rumliegen 
den ich sofort in den DE-
ENERATOR gelötet habe. Die Gehäusetemperatur lag jetzt unter 30C. Ripple 
und Noise am Audio-
ausgang betrug weniger als 5mVp-p. Da der Traco Regler nicht ganz billig 
ist ( ca. 4,42 bei Völkner)
werden wir den etwas günstigen Regler von RECOM mal antesten.


Bild 1: Motherboard mit Traco TSR 1-2450 DCDC Konverter
Bild 2: Ripple und Noise am Audioausgang mit Traco TSR 1-2450

Gruß Rolf

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Temperaturmessung mit ATxmega

Hallöchen. Im DE-GENERATOR werkelt bekanntlich ein ATxmega128A1AU 
(ältere Version) bzw ein
ATxmega128A1U (neuere Version). Beide Prozessoren besitzen von Hause aus 
einen internen
Temperatur Sensor. Dieser Sensor kann über die ADC Register im ATxmega 
ausgelesen werden.
Das habe ich mir zu nutze gemacht, um festzustellen, wie hoch die 
ungefähre Gehäuseinnen-
temperatur im DE-GENERATOR ist. Nach ein paar "komplizierten" 
Berechnungen wird die Tempe-
ratur im Systemmenü in Grad Celsius angezeigt.

Bild 1: Systemmenü & ATxmega CPU auf dem CPU Board

Code Beispiel im DE-GENERATOR
1
//*************************************************************************
2
// init temperature sensor in CPU
3
//*************************************************************************
4
void init_temp_sensor(void)
5
{
6
    // init ADC for CPU temperature measurement ---------------------------
7
    ADCA.CTRLB = ADC_CONMODE_bm | ADC_RESOLUTION_12BIT_gc | ADC_FREERUN_bm;
8
    ADCA.REFCTRL = ADC_REFSEL_INT1V_gc | ADC_TEMPREF_bm;
9
    ADCA.EVCTRL = ADC_SWEEP_0_gc;
10
    ADCA.PRESCALER = ADC_PRESCALER_DIV512_gc;
11
    ADCA.CAL = ADCon.temp_calval;
12
    ADCA.CH0.CTRL = ADC_CH_GAIN_1X_gc | ADC_CH_INPUTMODE_INTERNAL_gc;
13
    ADCA.CH0.MUXCTRL = ADC_CH_MUXINT_TEMP_gc;
14
    ADCA.CTRLA = ADC_ENABLE_bm;
15
    ADCA.CH0.CTRL = ADC_CH_START_bm;
16
}
17
18
//*************************************************************************
19
// read adc calibrate values
20
//*************************************************************************
21
void read_ADC_calval(void)
22
{
23
    #define ADCACAL0_offset 0x20  // read ADC Calibration Byte 0
24
    #define ADCACAL1_offset 0x21  // read ADC Calibration Byte 1
25
    
26
    #define TempCAL0_offset 0x2E  // read Temp.Sensor Calibration Byte 0
27
    #define TempCAL1_offset 0x2F  // read Temp.Sensor Calibration Byte 1
28
29
    uint8_t cal_l = read_calibration_byte(PROD_SIGNATURES_START+ADCACAL0_offset);
30
    uint8_t cal_h = read_calibration_byte(PROD_SIGNATURES_START+ADCACAL1_offset);
31
    ADCon.calval = (cal_h << 8) | cal_l;
32
    
33
    cal_l = read_calibration_byte(PROD_SIGNATURES_START+TempCAL0_offset);
34
    cal_h = read_calibration_byte(PROD_SIGNATURES_START+TempCAL1_offset);
35
    ADCon.temp_calval = (cal_h << 8) | cal_l;
36
}
37
uint8_t read_calibration_byte( uint8_t index )
38
{
39
    uint8_t result;
40
41
    /* Load the NVM Command register to read the calibration row. */
42
    NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc;
43
    result = pgm_read_byte(index);
44
45
    /* Clean up NVM Command register. */
46
    NVM_CMD = NVM_CMD_NO_OPERATION_gc;
47
48
    return( result );
49
}
50
51
//*********************************************************************
52
// read case temperature
53
//*********************************************************************
54
uint8_t read_temperature(void)
55
{
56
    uint8_t temp_offset = 18; // CPU temperature offset
57
    uint16_t result_ = ADCA.CH0RES;
58
    uint16_t calval_ = (uint32_t)(ADCon.temp_calval-200)*2048/(4096-200);
59
    uint8_t temperature = (((uint32_t)358*result_)/calval_) - (273+temp_offset);
60
    
61
    return ( temperature);
62
}

Am Anfang wird der ADC initialisiert und die Calibration Bytes für den 
Temperatur Sensor gesetzt.
Danach folgt die Abfrage der 12Bit breiten Sensor Daten im ADC Daten 
Register und die Um-
rechnung in Grad Celsius. Da der Prozessor eigentlich nur seine Kern 
Temperatur misst, habe ich
bei meiner Berechnung einen Offset-Wert mit berücksichtigt um dann die 
ungefähre Gehäuse-temperatur zu berechnen. Man oder frau sollte 
beachten, dass der erste Temperaturwert nach
dem Start des ADC kein gültiger Messwert ist und in den Mülleimer gehört 
Augenzwinkern

Gruß Rolf

von Audiomann (Gast)


Lesenswert?

Welche Bedeutung hat die Temperatur im Bezug auf die Audioerzeugung? 
Oder sollte der thread woanders hin?

von Rolf D. (rolfdegen)


Lesenswert?

Danke für deine Frage. Aber die Temperaturanzeige ist Bestandteil der 
Software im Synthesizer. In meinem Synthesizer Projekt behandel ich ja 
alle Themen rund um die Elektronik und Softwareentwicklung. Ich finde so 
Rand-Themen sind da eine gute Abwechslung und machen den Blog sehr 
interessant.

Gruß Rolf

von H-G S. (haenschen)


Lesenswert?

Ich habe letztens DEN Tiefton-Sound schlechthin gehört  :-)
Von einer kleinen fahrenden Kehrmaschiene, die draussen die Strassen 
kehrt.


Der Ton bestand aus zwei gleichzeitigen "Brummgeräuschen", ähnlich wie 
Flügelschlagen einer riesigen Hummel oder sowas. Die zwei 
Flattergeräusche waren verschieden und resonierten irgendwie fantastisch 
im Körper und erzeugten Euphorie ...

von Rolf D. (rolfdegen)


Lesenswert?

Es ist schon sehr interessant in was für einem Klangkosmos wir leben. 
Man muss nur die Ohren spitzen ;)

von Rolf D. (rolfdegen)


Angehängte Dateien:

Lesenswert?

Der Synthesizer "Degenerator" ist fertig und wird offizell  als Bausatz 
auf tubeohm.com verkauft.

Hier mein "Degenerator" Block: 
https://www.sequencer.de/synthesizer/threads/avr-synthesizer-wave-1-de-generator.87599/page-19

Mein aktuelles Projekt ist ein Modularer Synthesizer 
https://www.sequencer.de/synthesizer/threads/memodular-modularer-diy-synth.148901/

Gruß Rolf

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.