RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#126 von DeMorpheus , 12.09.2014 15:52

Hallo,

jetzt habe ich alle Probleme die ihr mit den vorprogrammierten Controllern gar nicht erst habt gelöst

  • Den richtigen Programmcode aus dem pdf genommen und nutzbar gemacht. Bei Copy & Paste aus dem pdf werden überall Leerzeichen, Zeilennummern und statt einem Minus ein Trennstrich reingehauen.
    Der Code hier aus dem Thread liess sich zwar schön kopieren, ist aber für die ältere Hardware. Das konnte natürlich nicht funktionieren
  • Die passenden Fuses gesetzt um den externen Quarz zu nutzen. Die voreingestellten 1 MHz intern sind doch etwas langsam.


Ergebnis: Die Software funktioniert jetzt, irgendwo in meinem Aufbau muss aber noch ein kleiner Fehler stecken. Wenn ich auf die Temperaturanzeige umschalte reagiert er nur sehr verzögert, und generell verschleppt die Anzeige einige Zeichen nach links. Wenn z.B. auf der rechten Anzeige der mittlere waagerechte Balken leuchtet tut er das bei den drei Anzeigen links davon auch ... das macht das Ablesen momentan etwas schwierig.

Noch drei kleine Fehlerchen aus der Dokumentation:
1. R1 der Hauptplatine fehlt in der Stückliste
2. Die Induktivität ist im Bestückungsdruck nicht bezeichnet
3. Temperaturanzeige geht über F1 & F3, nicht F2 & F3

Weiter geht's dann am Montag oder so. Wenn alles läuft verrate ich euch auch was ich ein klein wenig modifiziert habe


Viele Grüße,
Moritz

'Nitwit! Blubber! Oddment! Tweak!'


 
DeMorpheus
Metropolitan (MET)
Beiträge: 3.731
Registriert am: 22.12.2010
Spurweite H0
Stromart Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#127 von entchen , 12.09.2014 16:30

Hallo zusammen,

Zitat

1. R1 der Hauptplatine fehlt in der Stückliste
2. Die Induktivität ist im Bestückungsdruck nicht bezeichnet
3. Temperaturanzeige geht über F1 & F3, nicht F2 & F3



Danke für die Anmerkungen, da werde ich die Dokumentation an entsprechender Stelle abändern.
Die voreingestellte Frequenz von 1 MHz wird wohl von Atmel selbst eingestellt; ich habe den µC schon so bekommen. Ein weiterer Punkt, den ich in die Doku aufnemen werde, ist der Hinweis, dass das FuseBit JTAGEN deaktiviert werden muss; dann sollte die Anzeige auch funktionieren.
Zur Zeitverzögerung der Temperaturanzeige: Dies ist schon richtig; auch bei mir reagiert die Anzeige verzögert. Das liegt daran, dass ich für die Temperaturmessung einen Mittelwert über 1000 Messungen nehme. Ich stelle den Code heute Abend nochmals als Copy&Paste-Variante ins Forum.

Noch weiterhin viel Spaß beim Aufbauen,
Oliver


Bastelprojekt mit Mikrokontroller - Bluetooth Verbindung: Selbstbau HO Messwagen mit Atmega16


 
entchen
InterRegioExpress (IRE)
Beiträge: 455
Registriert am: 19.01.2011


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#128 von DeMorpheus , 12.09.2014 17:26

Hallo Oliver,

dann besteht ja Hoffnung dass ich doch alles richtig gemacht habe
Wird Montag ausprobiert und berichtet.

In der Dokumentation habe ich noch ein paar Kleinigkeiten entdeckt (Bildunterschrift, Rechtschreibung ... solche Dinge springen mir immer ins Auge) und schicke dir nachher per PN eine kleine Korrekturliste. Dann kannst du gleich alles auf einmal ändern.


Viele Grüße,
Moritz

'Nitwit! Blubber! Oddment! Tweak!'


 
DeMorpheus
Metropolitan (MET)
Beiträge: 3.731
Registriert am: 22.12.2010
Spurweite H0
Stromart Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#129 von Lokmaster , 12.09.2014 19:56

Hallo Oliver

Man sollte in die Doku noch ein Bild mit dem Hallsensor und Anschluss an die Platine machen,das es auch für die Hobbybastler ersichtlich ist!


Gruß
Armin

H0 mit Intellibox DCC
Roco,Piko,Lima.usw Loks sind viel zuviel und bei den Wagons ist es genauso


 
Lokmaster
EuroCity (EC)
Beiträge: 1.346
Registriert am: 26.06.2006
Ort: Bruchertseifen
Spurweite H0
Steuerung Intellibox Neo
Stromart Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#130 von entchen , 13.09.2014 10:00

Guten Morgen zusammen,

ich habe die Dokumentation überarbeitet (es fehlen noch 2 Bilder, die füge ich noch ein). Vielen Dank für euer Feedback. Ebenfalls möchte ich nochmals auf die korrekte Einbauposition des Flachbandkabels hinweisen; das kam anfangs in der Dokumentation nicht so genau herüber:

WICHTIG: Die Steckerbelegung der Platinen ist identisch. Damit das Flachbandkabel richtig herum angeschlossen wird und eine Verpolung ausgeschlossen ist, muss die rote Linie des Kabels auf beiden Platinen in dieselbe Richtung zeigen! Ferner sind die schwarzen Kabelstecker auf jeder Platine von derselben Seite anzulöten! Ein Beispiel:\Der Stecker der Hauptplatine ist auf der Vorderseite montiert, die rote Linie zeigt nach oben (siehe Abb. 3.4) --> Anschluss der Anzeigeplatine wie Abb. 2.1, der Stecker liegt ebenfalls auf der Vorderseite, die Markierung des Kabels zeigt nach oben.

Noch viel Spaß beim Basteln
Oliver


Bastelprojekt mit Mikrokontroller - Bluetooth Verbindung: Selbstbau HO Messwagen mit Atmega16


 
entchen
InterRegioExpress (IRE)
Beiträge: 455
Registriert am: 19.01.2011


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#131 von Lokmaster , 13.09.2014 14:42

Hi Oliver

Läuft Supergut! Bei F 1 und F3 zeigt er Error an,ist ds normal?


Gruß
Armin

H0 mit Intellibox DCC
Roco,Piko,Lima.usw Loks sind viel zuviel und bei den Wagons ist es genauso


 
Lokmaster
EuroCity (EC)
Beiträge: 1.346
Registriert am: 26.06.2006
Ort: Bruchertseifen
Spurweite H0
Steuerung Intellibox Neo
Stromart Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#132 von entchen , 13.09.2014 15:20

Hallo Armin,
ja das ist richtig so. Die Tastenkombination F1 und F3 sind (noch) keiner Funktion zugeordnet. Daher die Fehlermeldung
Vielleicht kommt da in weiter Zukunft noch eine weitere Funktion hinzu (Steigungsmessung), aber das ist noch Zukunftsmusik...

Gruß
Oliver


Bastelprojekt mit Mikrokontroller - Bluetooth Verbindung: Selbstbau HO Messwagen mit Atmega16


 
entchen
InterRegioExpress (IRE)
Beiträge: 455
Registriert am: 19.01.2011


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#133 von Lokmaster , 13.09.2014 15:31

Hi Oliver

Danke
In der Stückliste sind 2 Magneten aber nur einer ist da was ist richtig?


Gruß
Armin

H0 mit Intellibox DCC
Roco,Piko,Lima.usw Loks sind viel zuviel und bei den Wagons ist es genauso


 
Lokmaster
EuroCity (EC)
Beiträge: 1.346
Registriert am: 26.06.2006
Ort: Bruchertseifen
Spurweite H0
Steuerung Intellibox Neo
Stromart Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#134 von DeMorpheus , 13.09.2014 16:08

Zitat von Lokmaster
Bei F 1 und F3 zeigt er Error an,ist ds normal?

Echt? Bei mir liegt auf F1 & F3 die Temperatur, der Error kommt bei F2 & F3.


Viele Grüße,
Moritz

'Nitwit! Blubber! Oddment! Tweak!'


 
DeMorpheus
Metropolitan (MET)
Beiträge: 3.731
Registriert am: 22.12.2010
Spurweite H0
Stromart Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#135 von Lokmaster , 13.09.2014 16:22

Hi Moritz
Du hast es in der Controller Software geändert?
F2 un F3 ist bei mir die Temp.
F5-F7 passen auch nicht richtig,aber das gute Stück läuft und das wollten wir ja.


Gruß
Armin

H0 mit Intellibox DCC
Roco,Piko,Lima.usw Loks sind viel zuviel und bei den Wagons ist es genauso


 
Lokmaster
EuroCity (EC)
Beiträge: 1.346
Registriert am: 26.06.2006
Ort: Bruchertseifen
Spurweite H0
Steuerung Intellibox Neo
Stromart Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#136 von entchen , 13.09.2014 16:28

Hi zusammen,

hmm, komisch, bei mir liegt die Funktion Temperatur auch auf F2 und F3...

F5, F6 und F7 können vertauscht sein, da das Standartprogramm von Sven Brandt eine andere Funktionsreihenfolge besitzt. Dies kann aber mittels Programmiertaster behoben werden.

Gruß
Oliver


Bastelprojekt mit Mikrokontroller - Bluetooth Verbindung: Selbstbau HO Messwagen mit Atmega16


 
entchen
InterRegioExpress (IRE)
Beiträge: 455
Registriert am: 19.01.2011


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#137 von Lokmaster , 13.09.2014 16:38

Hi Oliver
Das mit F5-F7 ist doch egal,da werden nur Beleuchtungen mit ein und aus geschaltet.
Habe einen Moba Kollegen hier,der ist schon ganz nass.


Gruß
Armin

H0 mit Intellibox DCC
Roco,Piko,Lima.usw Loks sind viel zuviel und bei den Wagons ist es genauso


 
Lokmaster
EuroCity (EC)
Beiträge: 1.346
Registriert am: 26.06.2006
Ort: Bruchertseifen
Spurweite H0
Steuerung Intellibox Neo
Stromart Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#138 von DeMorpheus , 13.09.2014 18:45

Hallo,

ich werde das am Montag nachschauen, ich möchte nicht ausschließen dass ich Funktionen vertauscht habe. Das hätte ich aber eigentlich an den anderen Funktionen merken müssen.

Die Software habe ich jedenfalls wie im pdf vorliegend übernommen, die sollte also mit eurer übereinstimmen. Ich werde aber auch nochmal nachschauen wie die Funktionen da aufgeschlüsselt sind.


Viele Grüße,
Moritz

'Nitwit! Blubber! Oddment! Tweak!'


 
DeMorpheus
Metropolitan (MET)
Beiträge: 3.731
Registriert am: 22.12.2010
Spurweite H0
Stromart Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#139 von Lokmaster , 14.09.2014 09:26

Hi

Hier mal ein paar Bilder vom Umbau mit dem Bausatz von Oliver.


Gruß
Armin

H0 mit Intellibox DCC
Roco,Piko,Lima.usw Loks sind viel zuviel und bei den Wagons ist es genauso


 
Lokmaster
EuroCity (EC)
Beiträge: 1.346
Registriert am: 26.06.2006
Ort: Bruchertseifen
Spurweite H0
Steuerung Intellibox Neo
Stromart Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#140 von sbetamax , 14.09.2014 21:14

Nabend,
ich habe die Platinen nun auch fertig bestückt und auch schon mal kurz getestet. Dazu habe ich den Temperaturfühler angelötet, den HAL noch nicht.
Ich kan die verschiedenen Anzeigen abfragen. Bei der Temperatur kommt jedoch E2 und die Zeit läuft auch.
Liegt E2 am fehlenden HAL oder hab ich was verbraten? Die Spannung am Temperatursensor hat bei Raumtemperatur 2,53 V. Den HAL wollte ich erst anlöten wenn ich mit dem Wagen so weit bin. Dazu muss ich ihn erstmal wieder finden. ops:


Gruß Stephan
Modellbahn ist nur ein Teil meiner Hobbys
Technisches
Zentrale: 6021, MS1, MS2, CS1 60212 und CS2 60214 (HW4.33) mit Mainstation, das ganze auf dem Teppich mit mfx. Oder mit dem ZX81 in MM1.


 
sbetamax
EuroCity (EC)
Beiträge: 1.329
Registriert am: 26.11.2005
Homepage: Link
Spurweite H0
Stromart AC, Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#141 von entchen , 14.09.2014 21:29

Hallo Stephan,

du hast mit Sicherheit nichts verbraten. E2 zeigt an, dass die ermittelte Temperatur außerhalb des normalen Messbereichs liegt. Ich tippe mal ganz stark darauf, dass da ein Kurzschluss zwischen der eingebauten Drossel und der darunter liegen Durchkontaktierung besteht (wenn möglich mit einem Multimeter messen). Die Durchkontaktierung ist im Layout etwas unglücklich platziert. Der gemessene Spannungswert stimmt; das bedeutet, dass der Spannungsteiler richtig arbeitet.

Gruß
Oliver


Bastelprojekt mit Mikrokontroller - Bluetooth Verbindung: Selbstbau HO Messwagen mit Atmega16


 
entchen
InterRegioExpress (IRE)
Beiträge: 455
Registriert am: 19.01.2011


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#142 von sbetamax , 14.09.2014 21:43

Ich glaub ich habs gefundern!
Mir fehlt L1 im alten Bestückungsplan war sie ja nicht drinnen. Ich hatte mich schon über die freien Pads gewundert. Mal sehen wo ich die hin geschlampt hab.

Edit:
Hallo Oliver, danke für die Tipps, deine Antwort hat sich mit meinem Aha efekt gerade überschnitten.


Gruß Stephan
Modellbahn ist nur ein Teil meiner Hobbys
Technisches
Zentrale: 6021, MS1, MS2, CS1 60212 und CS2 60214 (HW4.33) mit Mainstation, das ganze auf dem Teppich mit mfx. Oder mit dem ZX81 in MM1.


 
sbetamax
EuroCity (EC)
Beiträge: 1.329
Registriert am: 26.11.2005
Homepage: Link
Spurweite H0
Stromart AC, Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#143 von entchen , 14.09.2014 22:31

Hallo Stephan,

hat es geklappt?

Hier nochmals der C-Code für den Atmel:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 

// Messwagen für Maerklin
 

 
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "routines.h"
 
ISR(TIMER2_OVF_vect)
{
task_segments();
}
 
ISR(TIMER1_COMPA_vect)
{
uint32_t impulse=getimpulse();
gettime();
getpath(impulse);
getspeed(impulse);
}
 

int main(void)
{
init();
_delay_ms(1000); //start-up time
sei();
while(1)
{
getswitch();
}
}
 
 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
 

#include <avr/io.h>
#include <util/delay.h>
#include "routines.h"
 
uint8_t pos = 0;
uint16_t zeit=0;
uint64_t strecke=0;
float geschwindigkeit=0;
uint16_t maxgeschwindigkeit=0;
int64_t temperatur =0;
uint8_t i =0;
float summe =0;
uint8_t dimmer = 0;
 
uint8_t display[]= { 0, 0, 0, 0, 0};

const uint8_t segments[] = {0b01111011, 0b01010000, 0b00111101, 0b01110101, 0b01010110, 0b01100111, 0b01101111, 0b01010001, 0b01111111, 0b01110111, 0b11111011, 0b11010000, 0b10111101,0b11110101, 0b11010110, 0b11100111, 0b11101111, 0b11010001, 0b11111111, 0b11110111 };
 
void init(void)
{
DDRA=0x00;
DDRB=0b00000000;
DDRC=0xFF;
DDRD=0xFF;
 
timer_enable0();
timer_enable1();
timer_enable2();
adc_init();
}
 

void timer_enable0(void) // for multiplexing
{
TCCR2=2; //activate Timer0 with CPU-clock/8
TCNT2=0; //reset Timer0
TIMSK|=(1<<TOIE2); // Timer Overflow Interrupt enable
}
 

void timer_enable1(void) // for 1s time intervall
{
TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
TIMSK |= (1 << OCIE1A); // Enable CTC interrupt
OCR1A = 5858;
TCCR1B |= (1 << CS10) | (1 << CS12); //prescaler of 1024
}
 

void timer_enable2(void) // for counting Hallsensor
{
TCCR0=6;// activate Counter at rising edge at TO pin
TCNT0=0;
}
 

void adc_init(void)
{
ADCSRA |= (1<<ADEN) | (1<<ADATE) | (1<<ADPS2) | (0<<ADPS1) | (1<<ADPS0) | (1<<ADSC);
ADMUX|= (1<<REFS0) | (0<<REFS1)| (0<<ADLAR) ;
SFIOR|= (0<< ADTS2)| (0<<ADTS1)| (0<<ADTS0);
ADMUX|= (0<<MUX0) | (0<<MUX1) | (0<<MUX2) | (0<<MUX3)| (0<<MUX4) ;
}
 

void getswitch(void) // get switches from multidecoder
{
uint8_t fxdecoder=PINA;
fxdecoder = fxdecoder & 0b00011110;
 
if (fxdecoder==0) // off
{
display[0]=0x00;
display[1]=0x00;
display[2]=0x00;
display[3]=0x00;
dimmer=1;
}
 
else if (fxdecoder==2) // Geschwindigkeit f1
{
uint16_t temp = geschwindigkeit*0.6264;

uint8_t tausend = temp/1000;
uint8_t hundert = (temp%1000)/100;
uint8_t zehner = (temp%100)/10;
uint8_t einer = (temp%10);

display[0]=segments[einer];
display[1]=segments[zehner+10];
display[2]=segments[hundert];
display[3]=segments[tausend];
dimmer=1;
}
 
else if (fxdecoder==4) // Strecke f2
{
uint16_t streckeraw = strecke*0.01;
uint8_t hundert = streckeraw/1000;
uint8_t zehner = (streckeraw%1000)/100;
uint8_t einer = (streckeraw%100)/10;
uint8_t komma = (streckeraw%10);

display[0]=segments[komma];
display[1]=segments[einer+10];
display[2]=segments[zehner];
display[3]=segments[hundert];
dimmer=1;
}
 
else if (fxdecoder==8) // Fahrzeit f3
{
uint16_t minutenraw=zeit/60;
uint8_t stunden1 = (minutenraw/60);
uint8_t minuten2 = (minutenraw%60)/10;
uint8_t minuten1 = (minutenraw%10);

display[0]=segments[minuten1];
display[1]=segments[minuten2];
display[2]=segments[stunden1+10];
display[3]=0b00000000;
dimmer=1;
}
 

else if (fxdecoder==6) //Vmax f1 + f2
{
uint16_t temp = maxgeschwindigkeit*0.6264;

uint8_t tausend = temp/1000;
uint8_t hundert = (temp%1000)/100;
uint8_t zehner = (temp%100)/10;
uint8_t einer = (temp%10);

display[0]=segments[einer];
display[1]=segments[zehner+10];
display[2]=segments[hundert];
display[3]=segments[tausend];
dimmer=1;
}
 

else if (fxdecoder==10) //Temperatur f1 + f2
{
dimmer=1;
set_segments(gettemperature());
}
 
else if (fxdecoder==14) // RESET f1 + f2 + f3
{
zeit=0;
strecke=0;
geschwindigkeit=0;
maxgeschwindigkeit=0;
 
display[0]=0b00000100;
display[1]=0b00000100;
display[2]=0b00000100;
display[3]=0b00000100;
dimmer=1;
}
 
else if (fxdecoder==16) // off
{
display[0]=0x00;
display[1]=0x00;
display[2]=0x00;
display[3]=0x00;
dimmer=2;
}
 
else if (fxdecoder==18) // Geschwindigkeit f1 + f4
{
uint16_t temp = geschwindigkeit*0.6264;

uint8_t tausend = temp/1000;
uint8_t hundert = (temp%1000)/100;
uint8_t zehner = (temp%100)/10;
uint8_t einer = (temp%10);

display[0]=segments[einer];
display[1]=segments[zehner+10];
display[2]=segments[hundert];
display[3]=segments[tausend];
dimmer=2;
}
 
else if (fxdecoder==20) // Strecke f2 + f4
{
uint16_t streckeraw = strecke*0.01;
uint8_t hundert = streckeraw/1000;
uint8_t zehner = (streckeraw%1000)/100;
uint8_t einer = (streckeraw%100)/10;
uint8_t komma = (streckeraw%10);

display[0]=segments[komma];
display[1]=segments[einer+10];
display[2]=segments[zehner];
display[3]=segments[hundert];
dimmer=2;
}
 
else if (fxdecoder==24) // Fahrzeit f3 + f4
{
uint16_t minutenraw=zeit/60;
uint8_t stunden1 = (minutenraw/60);
uint8_t minuten2 = (minutenraw%60)/10;
uint8_t minuten1 = (minutenraw%10);

display[0]=segments[minuten1];
display[1]=segments[minuten2];
display[2]=segments[stunden1+10];
display[3]=0b00000000;
dimmer=2;
}
 

else if (fxdecoder==22) //Vmax f1 + f2 + f4
{
uint16_t temp = maxgeschwindigkeit*0.6264;

uint8_t tausend = temp/1000;
uint8_t hundert = (temp%1000)/100;
uint8_t zehner = (temp%100)/10;
uint8_t einer = (temp%10);

display[0]=segments[einer];
display[1]=segments[zehner+10];
display[2]=segments[hundert];
display[3]=segments[tausend];
dimmer=2;
}
 

else if (fxdecoder==26) //Temperatur f1 + f2 + f4
{
dimmer=2;
set_segments(gettemperature());
}
 
else if (fxdecoder==30) // RESET f1 + f2 + f3+ f4
{
zeit=0;
strecke=0;
geschwindigkeit=0;
maxgeschwindigkeit=0;
 
display[0]=0b00000100;
display[1]=0b00000100;
display[2]=0b00000100;
display[3]=0b00000100;
dimmer=2;
}
 
else
{
// display error
display[0]=0b00000000;
display[1]=0b00001100;
display[2]=0b00001100;
display[3]=0b00101111;
}

}
 

int64_t gettemperature(void)
{
int64_t temp_raw =0;
float hilf =0;
int16_t i;
int64_t temp1=0;
int64_t temp2=0;
int64_t temp3=0;
 
for(i = 0; i<1000 ; i++)
{
temp_raw +=ADC;
_delay_ms(5);
}
temp_raw=temp_raw*0.01;
hilf = (0.0002*5000*temp_raw*4.8828125)/(50000-(temp_raw*4.8828125));
 
temp1=hilf*hilf*hilf*2854;
temp2=hilf*hilf*15850;
temp3=hilf*47480;
 
temperatur=temp1-temp2+temp3-31985; // Kennlinie des PTC
temperatur+=110;//Kalibrierung um 1.1 Grad
return temperatur;
}
 

void task_segments(void)
{
switch(pos)
{
case 0: PORTD=display[4]; PORTC &= ~(1<<PC2); if(dimmer!=1){_delay_us(1750);}else{_delay_ms(1);}; PORTC |= (1<<PC0); PORTD=display[pos]; pos++; break;
case 1: PORTD=display[4]; PORTC &= ~(1<<PC0); if(dimmer!=1){_delay_us(1750);}else{_delay_ms(1);}; PORTC |= (1<<PC1); PORTD=display[pos]; pos++; break;
case 2: PORTD=display[4]; PORTC &= ~(1<<PC1); if(dimmer!=1){_delay_us(1750);}else{_delay_ms(1);}; PORTC |= (1<<PC3); PORTD=display[pos]; pos++; break;
case 3: PORTD=display[4]; PORTC &= ~(1<<PC3); if(dimmer!=1){_delay_us(1750);}else{_delay_ms(1);}; PORTC |= (1<<PC2); PORTD=display[pos]; pos=0; break;
}
}
 

uint32_t getimpulse(void)
{
uint32_t zaehler= TCNT0;
TCNT0=0;
return zaehler;
}
 
void set_segments(int64_t val)
{

if(val<(-9999)) // return Error E1
{
display[0]=0b00000000;
display[1]=0b00000000;
display[3]=0b00101111;
display[2]=0b01010000;
return;
}
 

if(val>9999) // return Error E2
{
display[0]=0b00000000;
display[1]=0b00000000;
display[3]=0b00101111;
display[2]=0b00111101;
return;
}
 
// Ausgabe Temperatur
 
if(val>=0)
{
uint8_t tausend = (val%10000)*0.001;
uint8_t hundert = (val%1000)*0.01;
uint8_t zehner = (val%100)*0.1;
 
if(tausend==0)
{
display[2]=0b00000000;
}
 
else
{
display[2]=segments[tausend];
}
 
display[1]=segments[hundert+10];
display[0]=segments[zehner];
display[3]=0b00000000;
}
 
if(val<0)
{
val=-val;
uint8_t hundert = (val%1000)*0.01;
uint8_t zehner = (val%100)*0.1;
display[2]=0b00100000; // minus
display[1]=segments[hundert+10];
display[0]=segments[zehner];
display[3]=0b00000000;
}
}
 
void getpath(uint32_t val)
{
strecke= strecke+(val*raddurchmesser*3.14);
}
 
void getspeed(uint32_t val)
{
float wert = val*raddurchmesser*3.14; // mm pro sec
summe+=wert;
i++;
if (i==5)
{
geschwindigkeit=summe;
i=0;
summe=0;
}


if (geschwindigkeit>maxgeschwindigkeit)
{
maxgeschwindigkeit=geschwindigkeit;
}
}
 
void gettime(void)
{
zeit++;
}
 
 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 

 
#define raddurchmesser 10.5
 

//Initialisierung ADC/Timer
void init( void );

//Initialisierung Timer0
void timer_enable0(void);

//Initialisierung Timer1
void timer_enable1(void);
 
//Initialisierung Timer2
void timer_enable2(void);
 
//Initialisierung ADC
void adc_init(void);
 
//Einlesen der Switches von Multidecoder
void getswitch(void);
 
//Berechnung Temperatur
int64_t gettemperature(void);
 
//Ausgabe Temperatur
void set_segments(int64_t val);
 
//Ausgabe Impulse
uint32_t getimpulse(void);
 
//Multiplexen der Anzeige
void task_segments(void);
 
//Berechnung Fahrstrecke
void getpath(uint32_t val);
 
//Berechnung Geschwindigkeit
void getspeed(uint32_t val);
 
//Berechnung Zeit
void gettime(void);
 
 



Gruß
Oliver


Bastelprojekt mit Mikrokontroller - Bluetooth Verbindung: Selbstbau HO Messwagen mit Atmega16


 
entchen
InterRegioExpress (IRE)
Beiträge: 455
Registriert am: 19.01.2011


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#144 von sbetamax , 15.09.2014 18:43

Hallo Oliver,
die Spule ist spurlos verschwunden, ich hab ne neue bei Reichelt bestellt. Ich denke aber das es dann geht.


Gruß Stephan
Modellbahn ist nur ein Teil meiner Hobbys
Technisches
Zentrale: 6021, MS1, MS2, CS1 60212 und CS2 60214 (HW4.33) mit Mainstation, das ganze auf dem Teppich mit mfx. Oder mit dem ZX81 in MM1.


 
sbetamax
EuroCity (EC)
Beiträge: 1.329
Registriert am: 26.11.2005
Homepage: Link
Spurweite H0
Stromart AC, Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#145 von aftpriv , 15.09.2014 19:03

Zitat von Lokmaster
Hi

Hier mal ein paar Bilder vom Umbau mit dem Bausatz von Oliver.



Hi Armin

herzlichen Dank für die Bilder, helfen mir sicher wenn ich zum Bauen komme.

Gruß

Alf


Pickel-Bahner seit 1958 / K-Gleis + ZIMO-Decoder (MX633P22/MX645P22)
RocRail & RocNetNode jeweils auf RasPi
Email bezüglich MobaLedLib-Belange: LedLib@yahoo.com


aftpriv  
aftpriv
EuroCity (EC)
Beiträge: 1.279
Registriert am: 03.04.2012
Ort: MKK, Hessischer Spessart
Gleise K-Gleis und Selbsbau-Pickel-Gleis (DC-Gleis mit Mittelleiter ausrüsten)
Spurweite H0
Steuerung Rocrail + Rocnetnode auf Raspi
Stromart Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#146 von DeMorpheus , 15.09.2014 21:29

Hallo,

jetzt läuft alles, der Tipp mit dem FuseBit JTAGEN war der entscheidende. Prima!

Die Temperatur liegt immer noch auf F1 + F3, alle anderen Funktionen stimmen mit der Tabelle in der Dokumentation überein. Den Quelltext habe ich unverändert aus dem pdf bzw. Beitrag oben (in der Hinsicht identisch) übernommen, wenn man sich die Funktion getswitch anschaut sieht man auch dass F1 + F3 richtig ist (fxdecoder == 10, 10 ist 2 + 8, also F1 + F3).
Es könnte jetzt natürlich sein dass ihr aus irgendeinem Grund eine andere Software habt oder, was ich für wahrscheinlicher halte, ihr habt F1 und F2 vertauscht: Vom großen PIC 16F630 mit Zusatzausgängen gehen die beiden Ausgänge im Vergleich zum kleinen PIC 16F629 nämlich über Kreuz zum ATMega (liegt an der von Sven Brandt geschriebenen Software, nicht daran dass die Pins im PIC intern anders zugeordnet sind). Wenn man dann beim Adressen Lernen die Funktionstasten der Reihenfolge nach vergibt vertauscht man die Tasten für aktuelle Geschwindigkeit (dann F2) und gefahrene Strecke (dann F1) gegeneinander. Da die Temperatur bei „Geschwindigkeit + Strecke“ angezeigt wird ist das bei euch dann F2 + F3. Bei mir ist das dann F1 + F3 weil ich die Funktionen „richtig“, d.h. so wie im Schaltplan benannt und (bis auf Temperatur) in der Software ausgewertet, zugeordnet habe.

Um die Funktionen laut Schaltplan „richtig“ zu vergeben muss man sie beim großen PIC in folgender Reihenfolge einlernen: F2, F1, F3, F4, F6, F7, F5
 
Beim kleinen PIC einfach aufsteigend und alles ist genau so wie in der Tabelle dargestellt, mit Temperatur auf F2 + F3.


Die träge Reaktion bei der Temperaturanzeige hat mir nicht gefallen. Besonders bei aktivierter Dunkelschaltung lag die Reaktionszeit teilweise um die 5 Sekunden. Ich habe den Messzyklus in der Software verkürzt, jetzt wird nur noch der Mittelwert über 100 Messungen gebildet. Die Reaktionszeit verkürzt sich dadurch auf maximal 0,5 Sekunden, allerdings springt die Anzeige auch mal ein wenig. Wenn der Sensor halbwegs geschützt im Fahrwerk eingebaut wird tritt das aber kaum auf.


Armin, was hast du mit der Klemmleiste am Anzeigemodul gemacht? Ist das eine andere, flachere oder hast du die gelieferte irgendwie flacher bekommen? Ich habe mir da eine andere Lösung einfallen lassen um den Anschluss nicht über die Anzeigen hinausstehen zu lassen, aber eine Klemmleiste wäre schöner.


Oliver, danke für den kopierbaren Quelltext. In den Comments stecken ein paar kleinere Fehler (beim reverse engineering bemerkt man die natürlich) --> PN.


Fotos (und evtl. ein kleines Video) gibt's morgen, ich brauche dafür Tageslicht.


Viele Grüße,
Moritz

'Nitwit! Blubber! Oddment! Tweak!'


 
DeMorpheus
Metropolitan (MET)
Beiträge: 3.731
Registriert am: 22.12.2010
Spurweite H0
Stromart Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#147 von entchen , 15.09.2014 22:02

Hallo zusammen,

@Armin: Toller Zusammenbau, sehr sauber gearbeitet! Danke für die Bilder

@Moritz: Das freut mich, dass jetzt alles funktioniert. Du hast Recht, in den Kommentare des Programms sind wohl einige Fehler gewesen. Diese sind nun korrigiert; ich habe gestern Abend einfach das Programm ins Forum kopiert, ohne auf die Kommentare zu achten

@all: Jeder hat von mir dieselben Stecker zum Flachbandkabel bekommen. Diese Stecker waren diejenigen mit der geringsten Höhe, die ich im Angebot von Farnell finden konnte. Ferner wäre es auch möglich, die Stecker jeweils von der Rückseite beider (!) Platinen anzulöten. Dann lässt sich die Anzeigeplatine bündig in den Wagen einbauen.

Einen schönen Abend,
Oliver


Bastelprojekt mit Mikrokontroller - Bluetooth Verbindung: Selbstbau HO Messwagen mit Atmega16


 
entchen
InterRegioExpress (IRE)
Beiträge: 455
Registriert am: 19.01.2011


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#148 von Lokmaster , 16.09.2014 08:27

Hi Moritz @all
Erst einmal Danke für die Blumen.Ich Baue seit ca.30 jahren Loks auf Digital um,da muss sauber gearbeitet werden sons gibt es einen Gau.
Ich hatte auch das Problem mit dem Stecker auf der Anzeigeplatine.Ich habe nach dem Aufpressen des Kabels den Deckel vom Stecker abgebaut,damit war der Stecker flach genug das die Anzeigen bündig mit den Fenstern wahren.
Habe damit das Kabel nicht abgeht den Stecker von oben mit 2 K Kleber vergossen.
Das geht leider nie mehr ab.
Ich hatte aber erst die Überlegung das Flachkabel durch normale Kabel zu ersetzen.
Bei mir ist auch F1 und F2 vertauscht,ich weiss aber nicht ob ich beim Programieren einen Fehler gemacht habe,Ich passe meine Bedientabelle an und gut ist.
Hier noch 2 Bilder meiner Arbeiten die ich so um 1989-1990 gemacht habe,was ist den das woll Lokdecoder Ist einer der Prototypen 1-2 Generation
Hier die Bilder.


Gruß
Armin

H0 mit Intellibox DCC
Roco,Piko,Lima.usw Loks sind viel zuviel und bei den Wagons ist es genauso


 
Lokmaster
EuroCity (EC)
Beiträge: 1.346
Registriert am: 26.06.2006
Ort: Bruchertseifen
Spurweite H0
Steuerung Intellibox Neo
Stromart Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#149 von DeMorpheus , 17.09.2014 19:34

Hallo,

heute ist schon übermorgen, und es gibt noch drei Bilder. Viel neues gibt's nicht zu sehen, Armin hat ja die gleiche Elektronik gebaut wie ich.

Weil mich die hochstehende Klemmleiste störte habe ich das Flachbandkabel einfach direkt verlötet (und das andere Ende bis zum endgültigen Einbau einfach lang gelassen).
 
[0039]

Dafür wurden die Einzeladern getrennt, wie beim Weben abwechselnd nach oben und unten gebogen, jede zweite gleichmäßig gekürzt, und dann alle abisoliert und verzinnt. Die verzinnten Enden der kürzeren Adern wurden um 90° abgeknickt und in die Lötaugen der Platine eingefädelt, dann von der Rückseite verlötet. Das gleiche Spiel danach mit den längeren Adern.
Sicherlich nicht für die Großserie geeignet, aber für Einzelstücke doch eine saubere Lösung und gar nicht so kompliziert wie es klingt.
 
[0040]

Und so sieht die Hauptplatine am anderen Ende aus, aber das kennt ihr ja schon. Das Flachbandkabel ist hier im Moment noch (unsichtbar) verlötet, beim Einbau wird das dann mit einer trennbaren Verbindung aus verpolungssicherem Wannenstecker und Pfostenbuchse gelöst.
 
[0041]


Kleine Randbemerkung, ich habe ein bisschen herumgespielt: Reserven für den Modellbahn-Alltag hat der Wagen genug. Ich habe gerade Temperaturen über 70°C und Geschwindigkeiten über 530 km/h gemessen
(Wie das geht? So:)

Ich habe den Temperatursenor auf den Endstufentransistor meiner halbkaputten MS2-Gleisbox gelegt, eines der beiden Gleisanschlusskabel über den Hallsensor gelegt und dann einen Kurzschluss erzeugt. Meine MS2 schaltet bei dem Kurzschluss nicht ab, ich muss nur alle 3 Sekunden kurz dem Kondensator auf der Messplatine Zeit geben sich wieder aufzuladen. 535,5 km/h und 73,2°C habe ich geschafft (und mir die Finger heftig verbrannt)



Edit 2015-03-22: Bilder von imageshack auf dropbox umgezogen


Viele Grüße,
Moritz

'Nitwit! Blubber! Oddment! Tweak!'


 
DeMorpheus
Metropolitan (MET)
Beiträge: 3.731
Registriert am: 22.12.2010
Spurweite H0
Stromart Digital


RE: Messwagen - Selbstbau mit Atmel µC: ATtiny24 als Decoder

#150 von entchen , 17.09.2014 21:20

Hallo zusammen,
der Temperaturfühler kann theoretisch (laut Datenblatt) in einem Temperaturbereich von -55 bis 150 °C betrieben werden. Ausprobiert habe ich dies an einer Herdplatte bzw. dem Tiefkühlfach des Kühlschranks. So konnte ich zumindest einen Temperaturbereich von -20 bis +90°C erreichen
Allerdings würde es mich auch interessieren, wie man auf über 500 km/h kommt .

Gruß
Oliver


Bastelprojekt mit Mikrokontroller - Bluetooth Verbindung: Selbstbau HO Messwagen mit Atmega16


 
entchen
InterRegioExpress (IRE)
Beiträge: 455
Registriert am: 19.01.2011


   

Ersatz für Relais
Problem bei Programmierung von Lok Sound 5

  • Ähnliche Themen
    Antworten
    Zugriffe
    Letzter Beitrag
Xobor Einfach ein eigenes Forum erstellen
Datenschutz