Forum: Mikrocontroller und Digitale Elektronik ADC + Schieberegister + PORTA


von Rulexx (Gast)


Angehängte Dateien:

Lesenswert?

Hallo an alle,

Ich bin gerade dabei einen Atmega32 mit LED-Drehzahlanzeige (74HC595) 
und Accelerometer und Sd-karte auszurüsten. Doch nicht alles ist ein 
Poneyhof, und bei mir springt die LED-Anzeige von dem Schiberegister 
jedes mal kurzzeitig auf, wenn es an der sd karte gespeichert wird.

Erstmal dachte es wäre weil die Accelerometer ADC eingänge den PORT.A 
mit dem Schiberegister teilen, deswegen wird der Schiberegister bei jede 
messung gestört. Allerding auch wenn ich die GETADC(x) auskommentiere 
tritt mein Problem weiterhin auf.

Die schaltung ist relativ kompliziert, deswegen poste ich die wichtigste 
Teile davon.

Die anzeige wird bei jede Interrupt von timer2 (prescaler 256) 
aktualsiert und die daten werden jede sekunde gespeichert (natürlich mit 
einem Disable Interrupt davor). Ich wäre für jede Hilfe dankbar!

Ich bin kein Bascom expert, obwohl ich mich in diesem relativ 
aufwendiger Projekt hinein gewagt habe.

Code:
1
'################################################# ################################################## ##############################
2
'#
3
'# Hauptprogramm
4
'#
5
'################################################# ################################################## ##############################
6
7
8
Do
9
10
Wait 1
11
12
Disable Interrupts
13
14
Drehzahl1 = Frequenz
15
16
Drehzahl2 = Frequenz2
17
18
Porta.0 = 0
19
Porta.1 = 0
20
21
Waitms 5
22
23
'Xachse = Getadc(6)
24
25
Waitms 1
26
27
'Yachse = Getadc(5)
28
29
Waitms 1
30
31
'Zachse = Getadc(4)
32
33
Waitms 3
34
35
Xachse = Xachse - Ruhelage_x
36
Yachse = Yachse - Ruhelage_y
37
Zachse = Zachse - Ruhelage_z
38
39
Gosub Getdatetime
40
41
42
'Set Ledvermelho
43
44
'~~~ In eine Datei schreiben ~~~
45
46
'Datei zum Schreiben öffnen
47
'Open Datei2 For Output As #10
48
' 'Altervative:
49
Open Datei2 For Append As #10
50
'Output 'schreibt die Datei neu (vorhandene Daten werden gelöscht!)
51
'append 'fügt Daten an die Datei an (vorhandene Daten bleiben erhalten und werden ergänzt)
52
53
'Fehler beim Öffnen der Datei?
54
If Gbdoserror <> 0 Then
55
' Fehler beim Öffnen der Datei
56
Print "Die Datei " ; Datei2 ; " konnte nicht zum Schreiben geöffnet werden! Fehlercode: " ; Gbdoserror
57
58
Goto Sd_init
59
Else
60
' Datei erfolgreich geöffnet, ein paar Daten schreiben
61
Print "Schreibe in Datei " ; Datei2 ; " ..."
62
63
' Daten schrieben
64
Print #10 , _day ; "." ; _month ; "." ; _year ; ";" ; _hour ; ":" ; _min ; ":" ; _sec ; ";" ; Drehzahl1 ; ";" ; Drehzahl2 ; ";" ; Xachse ; ";" ; Yachse ; ";" ; Zachse
65
66
If Gbdoserror <> 0 Then Print "Fehler beim Schreiben in Datei " ; Datei2 ; "! Fehlercode: " ; Gbdoserror
67
68
' Datei wieder schließen
69
Close #10
70
End If
71
72
'Reset Ledvermelho
73
74
75
'Reset alle variabeln
76
Drehzahl1 = 0
77
Drehzahl2 = 0
78
Xachse = 0
79
Yachse = 0
80
Zachse = 0
81
82
Enable Interrupts
83
Loop
84
End
85
86
87
'################################################# ########################
88
'#
89
'# Overflow für RPM-LEDs
90
'#
91
'################################################# ########################
92
93
Onoverflow2:
94
95
Select Case Frequenz2
96
97
Case 0:
98
99
Rpmwert = &B0000000000000000
100
101
Case 1 To 120:
102
103
Rpmwert = &B0000000000000001
104
105
Case 121 To 240:
106
107
Rpmwert = &B0000000000000011
108
109
Case 241 To 360:
110
111
Rpmwert = &B0000000000000111
112
113
Case 361 To 480:
114
115
Rpmwert = &B0000000000001111
116
117
Case 481 To 620:
118
119
Rpmwert = &B0000000000011111
120
121
Case 621 To 840:
122
123
Rpmwert = &B0000000000111111
124
125
Case 841 To 960:
126
127
Rpmwert = &B0000000001111111
128
129
Case 961 To 1080:
130
131
Rpmwert = &B0000000011111111
132
133
Case 1081 To 1200:
134
135
Rpmwert = &B0000000111111111
136
137
Case 1201 To 1320:
138
139
Rpmwert = &B0000001111111111
140
141
Case 1321 To 1440:
142
143
Rpmwert = &B0000011111111111
144
145
Case 1441 To 1560:
146
147
Rpmwert = &B0000111111111111
148
149
Case 1561 To 1680:
150
151
Rpmwert = &B0001111111111111
152
153
Case 1681 To 1800:
154
155
Rpmwert = &B0011111111111111
156
157
Case 1801 To 1920:
158
159
Rpmwert = &B0111111111111111
160
161
End Select
162
163
Gosub Rpm
164
'
165
Return
166
167
'################################################# ########################
168
'#
169
'# Subprogramme für RPM und RPM-LEDs
170
'#
171
'################################################# ########################
172
173
Rpm: ' *** set initial conditions for I/O ***
174
175
' Porta.0 to SCK (Dip pin 11, flat pack pin 14).
176
' Porta.7 to SER (Dip pin 14, flat pack pin 1.
177
' Porta.1 to RCK (Dip pin 12, Flat pack pin 15).
178
'-----------------------------------------------------------------------
179
180
'Set Ledamarelo
181
182
' send byte array to shift regs
183
For I = 0 To 16 'Dein Bit-Zaehler
184
185
Porta.7 = Rpmwert.15 'Das sind die Datenbits zum reinschieben
186
187
'Wenn du also 01101011 im 74595 stehen haben willst,
188
'dann mußt du das hier in entsprechender Reihenfolge
189
'so setzten (0 oder 1)
190
'01101011 <- Bits am Ausgang des 74595
191
'ABCDEFGH <- Ausgang vom 74595
192
'12345678 <- Schleifendurchlauf Nr. x
193
194
Porta.0 = 1 : Porta.0 = 0 'Damit erzeugst du ne negative Flanke
195
196
Rotate Rpmwert , Right
197
198
Next I 'naechstes Bit
199
200
Porta.1 = 1 : Porta.1 = 0 'Das erzeugt den Impuls zur uebernahme ins Latch
201
202
'Reset Ledamarelo
203
204
Return

von Rulexx (Gast)


Lesenswert?

Und alles mit 16mhz quarz!

von Karl H. (kbuchegg)


Lesenswert?

Als erstes würde ich mal feststellen wollen, ob nicht der Wert in 
Frequenz2 schon im A... ist.

Dazu lass ich die Ausgabe mit einem bekannten Wert loslegen und sieh 
nach ob damit das Problem weg ist. Wenn es weg ist, dann ist der Wert in 
Frequenz2 wahrscheinlich fehlerhaft und man muss weiter rumsuchen, wie 
das zu Stande kommen kann. Wenn das Problem nach wie vor da ist, dann 
untersucht man die Ausgabefunktion genauer auf mögliche Nebeneffekt.

Die Änderung zum Testen wäre bei mir erst mal so
1
Onoverflow2:
2
  Frequenz2 = 800
3
4
Select Case Frequenz2
5
6
Case 0:
7
  ....

von Rulexx (Gast)


Lesenswert?

Hallo!

Danke für die antwort!

Wenn ich die frequenz nicht ändern bleibt die LED-anzeige gestoppt. Aber 
wenn ich die Speicherungsabstand ändern z.B. von 1seg zu 200ms tritt 
diesem Phänomen genau so oft ein wie die Speicherung, obwohl die 
SD-karte in sich nichts mit dem PORTA zu tun hat!

von Rulexx (Gast)


Lesenswert?

Hat definitiv mit der Speicherung zu tun.

Jetzt aktualisiert er bei jedem overflow die anzeige und gibt das zum 
computer aus. Das sieht dann so aus:


Schreibe in Datei schreib.txt ...
Gespeichert!
733
1502
1502
1502
1502
564
564
564
564
564
564
567
567
567
565
565
565
565
566
566
566
566
566
566
566
566
566
564
564
564
.
.
.
.
hz2: 566
Schreibe in Datei schreib.txt ...
Gespeichert!
1445
1445
1445
836
836
836
564
564
564
.
.
.
.

Also normalerweise ist den ersten Wert noch normal aber dann springt er 
plötzlich in die Höhe! und dabei sind Interrupts Disable während der 
Speicherung.. Bin ein bisschnen Ratlos!

von Rulexx (Gast)


Lesenswert?

Hier den ganzen code, vlt. hillft das:

Code:
1
$regfile = "m32def.dat"
2
$crystal = 16000000
3
$baud = 38400
4
5
$hwstack = 200
6
$swstack = 200
7
$framesize = 200
8
9
Config Adc = Single , Prescaler = Auto , Reference = Aref   'Für Spannungsmessung
10
Start Adc
11
12
Config Porta.2 = Output                                     'LED amarelo                                     '
13
Config Porta.3 = Output                                     'LED vermelho
14
15
Config Portd.3 = Input                                      'Botao Salvar
16
17
18
Config Portb.2 = Input
19
Config Portd.2 = Input
20
21
22
Portc.2 = 0
23
24
25
26
Ledamarelo Alias Porta.2
27
Ledvermelho Alias Porta.3
28
Botaosalvar Alias Portd.3
29
30
31
Portd.3 = 1
32
33
34
Dim Dummi As Integer
35
36
Dim Rpm1 As Integer
37
Dim Rpm2 As Integer
38
39
Dim Drehzahl1 As Integer
40
Dim Drehzahl2 As Integer
41
42
Dim Saveflag As Boolean
43
44
Saveflag = 0
45
46
Config Debounce = 30
47
48
'#################################################################################################################################
49
'#
50
'# LCD
51
'#
52
'#################################################################################################################################
53
54
' Einstellen des LCD Display's von myAVR in BASCOM
55
'Config Lcdpin = Pin , Db4 = Portc.7 , Db5 = Portc.6 , Db6 = Portc.5 , Db7 = Portc.4 , E = Portc.3 , Rs = Portd.7
56
'Config Lcd = 16 * 2
57
58
59
'#################################################################################################################################
60
'#
61
'# Accelerometer
62
'#
63
'#################################################################################################################################
64
65
'Acelerometro
66
Config Portc.2 = Output
67
Config Portb.0 = Output
68
Config Portb.1 = Output
69
70
Portb.0 = 0
71
Portb.1 = 0
72
73
74
Config Porta.6 = Input
75
Config Porta.5 = Input
76
Config Porta.4 = Input
77
78
Dim Xachse As Integer
79
Dim Yachse As Integer
80
Dim Zachse As Integer
81
82
Dim Ruhelage_x As Integer
83
Dim Ruhelage_y As Integer
84
Dim Ruhelage_z As Integer
85
86
Const Toleranz_x = 100
87
Const Toleranz_y = 100
88
Const Toleranz_z = 100
89
90
Waitms 5
91
92
Ruhelage_x = Getadc(6)
93
Waitms 10
94
Ruhelage_y = Getadc(5)
95
Waitms 10
96
Ruhelage_z = Getadc(4)
97
98
Waitms 5
99
100
101
102
'#################################################################################################################################
103
'#
104
'# Variabeln für RPM-LEDs
105
'#
106
'#################################################################################################################################
107
108
' Porta.0 to SRCLK (Dip pin 11, flat pack pin 14).
109
' Porta.7 to SER (Dip pin 14, flat pack pin 18).
110
' Porta.1 to RCLK (Dip pin 12, Flat pack pin 15).
111
'-----------------------------------------------------------------------
112
113
Config Porta.0 = Output
114
Config Porta.1 = Output
115
Config Porta.7 = Output
116
117
Dim Rpmwert As Word
118
Dim Low_byte As Byte At Rpmwert Overlay
119
Dim High_byte As Byte At Rpmwert + 1 Overlay
120
121
Dim I As Integer
122
Dim J As Integer
123
124
Low_byte = &B10000000
125
High_byte = &B00000000
126
127
'Set Ledamarelo
128
129
130
For J = 0 To 16
131
' send byte array to shift regs
132
For I = 0 To 16                                             'Dein Bit-Zaehler
133
134
Porta.7 = Rpmwert.6                                         'Das sind die Datenbits zum reinschieben
135
136
'Wenn du also 01101011 im 74595 stehen haben willst,
137
'dann mußt du das hier in entsprechender Reihenfolge
138
'so setzten (0 oder 1)
139
'01101011 <- Bits am Ausgang des 74595
140
'ABCDEFGH <- Ausgang vom 74595
141
'12345678 <- Schleifendurchlauf Nr. x
142
143
Porta.0 = 1 : Porta.0 = 0                                   'Damit erzeugst du ne negative Flanke
144
145
Rotate Rpmwert , Right
146
147
Next I                                                      'naechstes Bit
148
149
Porta.1 = 1 : Porta.1 = 0                                   'Das erzeugt den Impuls zur uebernahme ins Latch
150
151
'Reset Ledamarelo
152
153
Waitms 50
154
155
Next J
156
157
Declare Sub Rpm
158
159
160
161
'#################################################################################################################################
162
'#
163
'# Variabeln für die Uhr
164
'#
165
'#################################################################################################################################
166
167
'configure the scl and sda pins
168
Config Sda = Portc.1
169
Config Scl = Portc.0
170
171
'address of ds1307
172
Const Ds1307w = &HD0                                        ' Addresses of Ds1307 clock
173
Const Ds1307r = &HD1
174
175
Config Clock = User                                         ' this will dim the bytes automatic
176
'dim other needed variables
177
' Datumsformat deutsch Tag.Monat.Jahr und als Trennzeichen den Punkt
178
Config Date = Dmy , Separator = .
179
180
Dim Weekday As Byte
181
182
I2cinit
183
184
_day = 26
185
_month = 01
186
_year = 12
187
_sec = 59
188
_min = 05
189
_hour = 00
190
191
192
Gosub Setdate
193
Gosub Settime
194
195
196
'#################################################################################################################################
197
'#
198
'# Variabeln für die SD-Karte
199
'#
200
'#################################################################################################################################
201
202
203
' Variablen festlegen
204
Dim Fsiniterror As Byte                                     ' Fehlercode beim Dateisysteminit
205
Dim Temp As String * 100                                    ' Zwischenspeicher für Strings
206
Dim Z As Integer                                            ' Zählvariable
207
Const Datei1 = "lesen.txt"                                  ' Datei zum Lesen
208
Const Datei2 = "schreib.txt"                                ' Datei zum Schreiben
209
' Achtung:
210
'  Dateinamen müssen im Format 8.3 sein.
211
'  Also Maximal 8 Zeichen vor und 3 nach dem .
212
213
214
Const Cmmc_soft = 0
215
216
217
#if Cmmc_soft = 0
218
219
' --------- Start of Section for HW-SPI ----------------------------------------
220
221
   ' define Chip-Select Pin
222
' ->
223
' -> Dieser Pin wird für Chip-Select benutzt.
224
   Config Pinb.4 = Output                                   ' define here Pin for CS of MMC/SD Card
225
   Mmc_cs Alias Portb.4
226
   Set Mmc_cs
227
228
229
230
   ' Define here SS Pin of HW-SPI of the CPU (f.e. Pinb.0 on M128)
231
   ' If an other Pin than SS is used for MMC_SS, SS must be set to OUTPUT and high for proper work of SPI
232
   ' otherwise AVR starts SPI-SLAVE if SS-Pin is INPUT and goes to LOW
233
' ->
234
' -> Hier muss der SS-Pin des Hardware-SPI angegeben werden. (Auch wenn ein anderer Pin für Chip-Select benutzt wird.)
235
' -> Dieser muss als Ausgang konfiguriert sein und auf 1 gehalten werden, da sonst automatisch der SPI-Slave-Modus aktiviert wird.
236
 Config Pinb.4 = Output                                     ' define here Pin of SPI SS
237
 Spi_ss Alias Portb.4
238
 Set Spi_ss                                                 ' Set SPI-SS to Output and High por Proper work of
239
                                                            ' SPI as Master
240
241
   ' HW-SPI is configured to highest Speed
242
243
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1
244
'   Spsr = 1                                       ' Double speed on ATMega128
245
   Spiinit                                                  ' Init SPI
246
247
' --------- End of Section for HW-SPI ------------------------------------------
248
249
#else                                                       ' Config here SPI pins, if not using HW SPI
250
251
' --------- Start of Section for Soft-SPI --------------------------------------
252
253
   ' Chip Select Pin  => Pin 1 of MMC/SD
254
   Config Pinb.4 = Output
255
   Mmc_cs Alias Portb.4
256
   Set Mmc_cs
257
258
   ' MOSI - Pin  => Pin 2 of MMC/SD
259
   Config Pinb.5 = Output
260
   Set Pinb.5
261
   Mmc_portmosi Alias Portb
262
   Bmmc_mosi Alias 5
263
264
   ' MISO - Pin  => Pin 7 of MMC/SD
265
   Config Pinb.6 = Input
266
   Mmc_portmiso Alias Portb
267
   Bmmc_miso Alias 6
268
269
   ' SCK - Pin  => Pin 1 of MMC/SD
270
   Config Pinb.7 = Output
271
   Set Pinb.7
272
   Mmc_portsck Alias Portb
273
   Bmmc_sck Alias 7
274
275
276
277
278
' --------- End of Section for Soft-SPI ----------------------------------------
279
280
#endif
281
282
Print "Initialisierung der SD-Card ... " ;
283
284
Const Cperrdrivereset = 225                                 ' Error response Byte at Reset command
285
Const Cperrdriveinit = 226                                  ' Error response Byte at Init Command
286
Const Cperrdrivereadcommand = 227                           ' Error response Byte at Read Command
287
Const Cperrdrivewritecommand = 228                          ' Error response Byte at Write Command
288
Const Cperrdrivereadresponse = 229                          ' No Data response Byte from MMC at Read
289
Const Cperrdrivewriteresponse = 230                         ' No Data response Byte from MMC at Write
290
Const Cperrdrive = 231
291
Const Cperrdrivenotsupported = 232                          ' return code for DriveGetIdentity, not supported yet
292
293
Waitms 1                                                    ' Wait some time before initialising MMC/SD
294
Dim Gbdriveerror As Byte                                    ' General Driver Error register
295
Dim Gbdriveerrorreg As Byte                                 ' Driver load Error-Register of HD in case of error
296
Dim Gbdrivestatusreg As Byte                                ' Driver load Status-Register of HD on case of error
297
Dim Gbdrivedebug As Byte
298
$lib "MMC.LIB"                                              ' link driver library
299
$external _mmc
300
Gbdriveerror = Driveinit()                                  ' Init MMC/SD Card
301
302
' 'Fehler beim init?
303
If Gbdriveerror = 0 Then
304
   Print "ok"
305
306
   ' 'Config_AVR-DOS einbinden
307
' 'Puffergrößen, Anzahl von Datei-Handles usw. müssen in dieser Datei angepasst werden!
308
Print "Initialisierung des Dateisystems ..." ;
309
$include "config_avr-dos.bas"
310
311
 'Dateisystem starten
312
Fsiniterror = Initfilesystem(1)
313
If Fsiniterror = 0 Then
314
   Print "ok"
315
316
Else
317
   Print "Fehler bei der Initialisierung des Dateisystems! Fehlercode: " ; Fsiniterror
318
319
End If
320
321
' 'SD-Card erfolgreich gestartet
322
Print "SD-Card wurde erfolgreich gestartet!"
323
Print
324
325
Else
326
327
   Print "Fehler bei der Initialisierung der SD-Card! Fehlercode: " ; Gbdriveerror
328
329
End If
330
331
332
'#################################################################################################################################
333
'#
334
'# Interrupt für RPM
335
'#
336
'#################################################################################################################################
337
338
'Rpm2
339
Dim Icount As Long
340
Dim Wcountlo As Word At Icount Overlay
341
Dim Wcounthi As Word At Icount + 2 Overlay
342
Dim Zahl1 As Long
343
Dim Zahl2 As Long
344
Dim Zahl As Long
345
Dim Frequenz As Long
346
347
Config Timer1 = Timer , Prescale = 1 , Capture Edge = Rising
348
349
Config Int2 = Falling
350
351
On Int2 Oncapture
352
Enable Int2
353
354
On Ovf1 Onoverflow1
355
356
Enable Ovf1
357
358
359
'Rpm1
360
Dim Icount2 As Long
361
Dim Wcount2_high As Word At Icount2 Overlay
362
Dim Wcount2_low As Word At Icount2 + 2 Overlay
363
Dim Conta1 As Long
364
Dim Conta2 As Long
365
Dim Conta As Long
366
Dim Frequenz2 As Long
367
Const Interval = 156
368
369
Config Timer0 = Timer , Prescale = 1
370
371
Config Int0 = Falling
372
373
On Int0 Oncapture2
374
Enable Int0
375
376
On Ovf0 Onoverflow0
377
378
Enable Ovf0
379
380
381
382
'Speichern
383
Dim Overflowcount As Long
384
Config Timer2 = Timer , Prescale = 1024
385
386
On Ovf2 Onoverflow2
387
388
Config Int1 = Falling
389
On Int1 Save
390
Enable Int1
391
392
Enable Timer2
393
394
Enable Interrupts
395
396
397
398
399
400
'#################################################################################################################################
401
'#
402
'# Hauptprogramm
403
'#
404
'#################################################################################################################################
405
406
407
Do
408
409
Waitms 250
410
411
Disable Interrupts
412
413
Waitms 5
414
415
'Xachse = Getadc(6)
416
417
Waitms 1
418
419
'Yachse = Getadc(5)
420
421
Waitms 1
422
423
'Zachse = Getadc(4)
424
425
Waitms 3
426
427
Xachse = Xachse - Ruhelage_x
428
Yachse = Yachse - Ruhelage_y
429
Zachse = Zachse - Ruhelage_z
430
431
Gosub Getdatetime
432
433
434
 '~~~ In eine Datei schreiben ~~~
435
436
 'Datei zum Schreiben öffnen
437
'Open Datei2 For Output As #10
438
' 'Altervative:
439
 Open Datei2 For Append As #10
440
 'Output                                                     'schreibt die Datei neu (vorhandene Daten werden gelöscht!)
441
 'append                                                    'fügt Daten an die Datei an (vorhandene Daten bleiben erhalten und werden ergänzt)
442
443
 'Fehler beim Öffnen der Datei?
444
If Gbdoserror <> 0 Then
445
   ' Fehler beim Öffnen der Datei
446
   Print "Die Datei " ; Datei2 ; " konnte nicht zum Schreiben geöffnet werden! Fehlercode: " ; Gbdoserror
447
448
   Goto Sd_init
449
Else
450
   ' Datei erfolgreich geöffnet, ein paar Daten schreiben
451
   Print "Schreibe in Datei " ; Datei2 ; " ..."
452
453
   ' Daten schrieben
454
    Print #10 , _day ; "." ; _month ; "." ; _year ; ";" ; _hour ; ":" ; _min ; ":" ; _sec ; ";" ; Frequenz ; ";" ; Frequenz2 ; ";" ; Xachse ; ";" ; Yachse ; ";" ; Zachse
455
456
   If Gbdoserror <> 0 Then Print "Fehler beim Schreiben in Datei " ; Datei2 ; "! Fehlercode: " ; Gbdoserror
457
458
   ' Datei wieder schließen
459
   Close #10
460
461
462
End If
463
464
'Reset Ledvermelho
465
466
467
'Reset alle variabeln
468
469
Xachse = 0
470
Yachse = 0
471
Zachse = 0
472
473
Print "Gespeichert!"
474
475
476
Enable Interrupts
477
478
Waitms 250
479
480
481
482
Loop
483
484
End
485
486
'#################################################################################################################################
487
'#
488
'# Subprogramme für Interrupt
489
'#
490
'#################################################################################################################################
491
492
493
Save:
494
495
Gosub Sd_init
496
497
Print "Saved"
498
499
Return
500
501
502
Oncapture:
503
504
      Disable Interrupts
505
506
      Wcountlo = Timer1
507
      Timer1 = 0
508
      Zahl1 = Wcounthi
509
      Zahl2 = Wcountlo
510
      Wcounthi = 0
511
      Zahl = Zahl1 * 65536
512
      Zahl = Zahl + Zahl2
513
      Frequenz = 480000000 / Zahl
514
515
      Enable Interrupts
516
517
Return
518
519
520
521
522
Oncapture2:
523
524
      Disable Interrupts
525
      Wcount2_low = Timer0
526
      Timer0 = 0
527
      Conta1 = Wcount2_high
528
      Conta2 = Wcount2_low
529
      Wcount2_high = 0
530
      Conta = Conta1 * 255
531
      Conta = Conta + Conta2
532
      Frequenz2 = 480000000 / Conta
533
534
      Print "Rpm1:" ; Frequenz2
535
536
      Enable Interrupts
537
538
Return
539
540
541
Onoverflow1:
542
543
Incr Wcounthi
544
545
Return
546
547
548
Onoverflow0:
549
550
Incr Wcount2_high
551
552
Return
553
554
555
Onoverflow2:
556
557
Disable Interrupts
558
559
Rpmwert = Frequenz
560
561
Print Rpmwert
562
563
Select Case Rpmwert
564
565
Case 0:
566
567
Rpmwert = &B0000000000000000
568
569
Case 1 To 120:
570
571
Rpmwert = &B0000000000000001
572
573
Case 121 To 240:
574
575
Rpmwert = &B0000000000000011
576
577
Case 241 To 360:
578
579
Rpmwert = &B0000000000000111
580
581
Case 361 To 480:
582
583
Rpmwert = &B0000000000001111
584
585
Case 481 To 620:
586
587
Rpmwert = &B0000000000011111
588
589
Case 621 To 840:
590
591
Rpmwert = &B0000000000111111
592
593
Case 841 To 960:
594
595
Rpmwert = &B0000000001111111
596
597
Case 961 To 1080:
598
599
Rpmwert = &B0000000011111111
600
601
Case 1081 To 1200:
602
603
Rpmwert = &B0000000111111111
604
605
Case 1201 To 1320:
606
607
Rpmwert = &B0000001111111111
608
609
Case 1321 To 1440:
610
611
Rpmwert = &B0000011111111111
612
613
Case 1441 To 1560:
614
615
Rpmwert = &B0000111111111111
616
617
Case 1561 To 1680:
618
619
Rpmwert = &B0001111111111111
620
621
Case 1681 To 1800:
622
623
Rpmwert = &B0011111111111111
624
625
Case 1801 To 1920:
626
627
Rpmwert = &B0111111111111111
628
629
End Select
630
631
632
Gosub Rpm
633
                                              '
634
Return
635
636
637
'#################################################################################################################################
638
'#
639
'# Subprogramme RS-232 Kummunikation
640
'#
641
'#################################################################################################################################
642
643
644
''''''''''''''';called from ds1307clock.lib
645
Getdatetime:
646
I2cstart                                                    '''''''''''''''; Generate start code
647
I2cwbyte Ds1307w                                            '''''''''''''''; send address
648
I2cwbyte 0                                                  '''''''''''''''; start address in 1307
649
650
I2cstart                                                    '''''''''''''''; Generate start code
651
I2cwbyte Ds1307r                                            '''''''''''''''; send address
652
I2crbyte _sec , Ack
653
I2crbyte _min , Ack                                         '''''''''''''''; MINUTES
654
I2crbyte _hour , Ack                                        '''''''''''''''; Hours
655
I2crbyte Weekday , Ack                                      '''''''''''''''; Day of Week
656
I2crbyte _day , Ack                                         '''''''''''''''; Day of Month
657
I2crbyte _month , Ack                                       '''''''''''''''; Month of Year
658
I2crbyte _year , Nack                                       '''''''''''''''; Year
659
I2cstop
660
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
661
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
662
Return
663
664
Setdate:
665
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
666
I2cstart                                                    '''''''''''''''; Generate start code
667
I2cwbyte Ds1307w                                            '''''''''''''''; send address
668
I2cwbyte 4                                                  '''''''''''''''; starting address in 1307
669
I2cwbyte _day                                               '''''''''''''''; Send Data to SECONDS
670
I2cwbyte _month                                             '''''''''''''''; MINUTES
671
I2cwbyte _year                                              '''''''''''''''; Hours
672
I2cstop
673
Return
674
675
Settime:
676
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
677
I2cstart                                                    '''''''''''''''; Generate start code
678
I2cwbyte Ds1307w                                            '''''''''''''''; send address
679
I2cwbyte 0                                                  '''''''''''''''; starting address in 1307
680
I2cwbyte _sec                                               '''''''''''''''; Send Data to SECONDS
681
I2cwbyte _min                                               '''''''''''''''; MINUTES
682
I2cwbyte _hour                                              '''''''''''''''; Hours
683
I2cstop
684
Return
685
686
687
'#################################################################################################################################
688
'#
689
'# Subprogramme für die SD-Karte
690
'#
691
'#################################################################################################################################
692
693
Sd_init:
694
695
696
Print "Initialisierung der SD-Card ... " ;
697
698
$external _mmc
699
Gbdriveerror = Driveinit()                                  ' Init MMC/SD Card
700
701
' 'Fehler beim init?
702
If Gbdriveerror = 0 Then
703
   Print "ok"
704
705
   ' 'Config_AVR-DOS einbinden
706
' 'Puffergrößen, Anzahl von Datei-Handles usw. müssen in dieser Datei angepasst werden!
707
Print "Initialisierung des Dateisystems ..." ;
708
$include "config_avr-dos.bas"
709
710
 'Dateisystem starten
711
Fsiniterror = Initfilesystem(1)
712
If Fsiniterror = 0 Then
713
   Print "ok"
714
715
Else
716
   Print "Fehler bei der Initialisierung des Dateisystems! Fehlercode: " ; Fsiniterror
717
      Do
718
      Waitms 500
719
      Saveflag = 0
720
      Goto Sd_init
721
      Loop
722
End If
723
724
' 'SD-Card erfolgreich gestartet
725
Print "SD-Card wurde erfolgreich gestartet!"
726
Print
727
   Saveflag = 1
728
   Print "saveflag aktiviert"
729
Else
730
731
   Print "Fehler bei der Initialisierung der SD-Card! Fehlercode: " ; Gbdriveerror
732
      Do
733
      Waitms 500
734
      Saveflag = 0
735
      Goto Sd_init
736
      Loop
737
End If
738
739
740
Return
741
742
743
'#################################################################################################################################
744
'#
745
'# Subprogramme für RPM und RPM-LEDs
746
'#
747
'#################################################################################################################################
748
749
Rpm:                                                        ' *** set initial conditions for I/O ***
750
751
752
' Porta.0 to SCK (Dip pin 11, flat pack pin 14).
753
' Porta.7 to SER (Dip pin 14, flat pack pin 18).
754
' Porta.1 to RCK (Dip pin 12, Flat pack pin 15).
755
'-----------------------------------------------------------------------
756
757
'Set Ledamarelo
758
759
760
761
' send byte array to shift regs
762
For I = 0 To 16                                             'Dein Bit-Zaehler
763
764
Porta.7 = Rpmwert.15                                        'Das sind die Datenbits zum reinschieben
765
766
'Wenn du also 01101011 im 74595 stehen haben willst,
767
'dann mußt du das hier in entsprechender Reihenfolge
768
'so setzten (0 oder 1)
769
'01101011 <- Bits am Ausgang des 74595
770
'ABCDEFGH <- Ausgang vom 74595
771
'12345678 <- Schleifendurchlauf Nr. x
772
773
Porta.0 = 1 : Porta.0 = 0                                   'Damit erzeugst du ne negative Flanke
774
775
Rotate Rpmwert , Right
776
777
Next I                                                      'naechstes Bit
778
779
Porta.1 = 1 : Porta.1 = 0                                   'Das erzeugt den Impuls zur uebernahme ins Latch
780
781
782
'Reset Ledamarelo
783
Enable Interrupts
784
785
Return

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.