Hallo ans Forum.
Da ich mir das auch selber immer wünsche hier der fertige und vor allem laufende Code mit Anmerkungen
Code:
$regfile = "m88def.dat"
$hwstack = 128
$framesize = 128
$swstack = 128
Config Timer1 = Timer , Prescale = 8
Config Timer0 = Timer , Prescale = 1024
'Die Sensoren sollen auf Masse-Kontakt auslösen
Config Int0 = Falling
Config Int1 = Falling
'Auf Sensoren anspringen
On Int0 Ges 'Geschwindigkeit
On Int1 Dre 'Drehzahl
'Auf Timer-Überläufe anspringen
On Timer1 Timer1_irq
On Timer0 Timer0_irq
'Den ganzen Kram anschalten
Enable Int0
Enable Int1
Enable Timer1
Enable Timer0
Enable Interrupts
'Ports configurieren
Config Sda = Portc.4
Config Scl = Portc.5
Config Portd.2 = Input
Config Portd.3 = Input
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output
Config Portb = Output
Pind.2 = 1
Pind.3 = 1
'Variablen festlegen
Dim C1 As Byte
Dim C0 As Byte
Dim G_pre As Long
Dim G_set As Long
Dim G_out As Long
Dim G_out_2 As Long
Dim G_out_3 As Long
Dim G_out_calc As Single
Dim D_pre As Long
Dim D_set As Long
Dim D_out As Long
Dim D_out_2 As Long
Dim Zehner As Byte
Dim Einer As Byte
C1 = 0
C0 = 0
Do
'Abwägung, wieviele LED's je nach Drehzahl leuchten sollen
Select Case D_out_2
Case Is < 146 '>7000
Portb = &B111111XX
Portd.7 = 1
Portd.6 = 1
Portd.5 = 1
Case Is < 170 '>6000
Portb = &B111111XX
Portd.7 = 1
Portd.6 = 1
Portd.5 = 0
Case Is < 205 '>5000
Portb = &B111111XX
Portd.7 = 1
Portd.6 = 0
Portd.5 = 0
Case Is < 255 '>4000
Portb = &B111111XX
Portd.7 = 0
Portd.6 = 0
Portd.5 = 0
Case Is < 340 '>3000
Portb = &B111110XX
Portd.7 = 0
Portd.6 = 0
Portd.5 = 0
Case Is < 510 '>2000
Portb = &B111100XX
Portd.7 = 0
Portd.6 = 0
Portd.5 = 0
Case Is < 1020 '>1000
Portb = &B111000XX
Portd.7 = 0
Portd.6 = 0
Portd.5 = 0
Case Is < 1360 '>750
Portb = &B110000XX
Portd.7 = 0
Portd.6 = 0
Portd.5 = 0
Case Is < 2030 '>500
Portb = &B100000XX
Portd.7 = 0
Portd.6 = 0
Portd.5 = 0
Case Else
Portb = &B000000XX
Portd.7 = 0
Portd.6 = 0
Portd.5 = 0
End Select
'Berechnungen der Geschwindigkeit und Ausgabe über I2C
'an einen MAX6958.
If G_out_2 < 1000000 Then
G_out_calc = 1 / G_out_2
G_out_calc = G_out_calc * 1473081
G_out_3 = G_out_calc
Else
G_out_3 = 0
End If
Zehner = G_out_3 / 10
Zehner = Zehner Mod 10
Einer = G_out_3 Mod 10
I2cstart
I2cwbyte &B01110000 'Chip-Adresse
I2cwbyte &B00000001 'Erste Adresse (Autoincr.)
I2cwbyte &B00000011 'decode
I2cwbyte &B00001000 'helligkeit
I2cwbyte &B00000011 'scan limit
I2cwbyte &B00000001 'nomal Operation
I2cstop
I2cstart
I2cwbyte &B01110000
I2cwbyte &B00100000 'Adresse
I2cwbyte Zehner 'Zehner
I2cwbyte Einer 'Einer
I2cstop
'Um bei den langen Intervallen der Geschwindigkeitsmessung
'auch geringe messen zu können, lass ich den 16bit Timer ziemlich
'schnell durchlaufen und dafür mehrmals (100x) durchlaufen
'und multipiziere mit C1.
'Der 8bit Timer sorgt in regelmäßigen Abständen dafür, dass bei
'Ergebnislosigkeit der Interupts die Zehler wieder als Ergebnis 0
'anzeigen
If C1 = 100 Then C1 = 0
If C0 = 50 Then
G_out_2 = 1000000
D_out_2 = 2500
C0 = 0
End If
Loop
'Geschwindigkeit INT
Ges:
G_out = G_set - G_pre
G_pre = G_set
G_set = C1 * 65535
G_set = G_set + Timer1
If G_out > 0 Then G_out_2 = G_out
Return
'Drehzahl INT
Dre:
D_out = D_set - D_pre
D_pre = D_set
D_set = C1 * 65535
D_set = D_set + Timer1
If D_out > 0 Then D_out_2 = D_out
Return
'Überlauf 16bit Timer
Timer1_irq:
C1 = C1 + 1
Return
'Überlauf 8bit Timer
Timer0_irq:
C0 = C0 + 1
Return
End
Lesezeichen