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
Hallo Ulrich Die Drehencoder von Bourns sind ganz gut. Siehe Link: http://www.mouser.de/ProductDetail/Bourns/PEC11R-4220F-S0024/?qs=%2fha2pyFaduidMAYXvh4P%252bAmmmn%2faRUELZLMmGu%2fISIOQfv3P2vO97dZBRdf7IkCt Gruß Rolf
Beitrag #4974510 wurde vom Autor gelöscht.
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
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?
Danke. Ja.. ist angedacht. Es gibt noch ein paar Bilder von Andre..
:
Bearbeitet durch User
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[]; |
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)
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
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
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
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
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
Welche Bedeutung hat die Temperatur im Bezug auf die Audioerzeugung? Oder sollte der thread woanders hin?
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
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 ...
Es ist schon sehr interessant in was für einem Klangkosmos wir leben. Man muss nur die Ohren spitzen ;)
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
Hallo Simon Leider kann man keinen "Degenerator" Bausatz mehr kaufen. Aktuell gibt es aber die "Jeannie". Jeannie ist ein polyhoner DIY Synthesizer Bausatz mit VA und Wavetable Synthese. Mehr dazu hier... DIY Blog: https://www.sequencer.de/synthesizer/threads/jeannie-polyphonic-diy-synthesizer.160564/ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.