Code:
'Beschleunigungsmesser mit AT MEGA 8 A/D Wandler
'Version 0.1
'MaxWerte???
'Geschwindigkeit KM/h???
'zurückgelegte KM???
'Beschleunigung als Balkenanzeige??? XXXXXXXX | XXXXXXXX
'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m8def.dat" 'AT-Mega8
$crystal = 1000000 'Quarz: 1 MHz INTERN!!!
$baud = 2400 'Baudrate der UART: 2400 Baud
'Konfiguration LCD
'Dim Sresult As String * 16 At &H64 Overlay
'Dim Result(16) As Byte At &H64
'LCD
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.3 , Db6 = Portb.2 , Db7 = Portb.1 , E = Portd.7 , Rs = Portb.0
Cursor Off Noblink ' Cursor aus
'Timer
Config Timer1 = Timer , Prescale = 8 '1.000.000Hz/64=125.000Hz
Enable Timer1
Timer1 = 34285 'Sofort Timer1-Überlauf (Bei 16 Bit: 65535+1=0)
Enable Interrupts
On Timer1 Ontimer1overflow 'Timer1-Interruptroutine deklarieren
'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Ddrb = &B11111111 '1 Ausgang, 0 Eingang = Pin PB7-0 als Ausgang
Ddrc = &B0000000 '1 Ausgang, 0 Eingang = Pin PC6-0 als Eingang
Ddrd = &B11111111 '1 Ausgang, 0 Eingang = Pin PD7-0 als Ausgang
Portc = &B11111111 'PC0...PC7 auf High setzen
'===============================================================================
' Variablen
'===============================================================================
Dim Taster_gedrueckt As Bit 'zum "entprellen" / Taster zur Menüwahl
Dim Xout As Word '=0-1023 vom Analogeingang
Dim Yout As Word
Dim Xout_mv As Word 'in milliVolt gewandelt
Dim Yout_mv As Word
Dim Xout_g1 As Single 'von mV in Zwischenrechung (Integer wegen den negativen Zahlen)
Dim Yout_g1 As Single
Dim Xout_g As Single 'von Zwischenrechung in g (Integer wegen den negativen Zahlen)
Dim Yout_g As Single
Dim Xout_ms As Single 'Umrechnung von g in m/s²
Dim Yout_ms As Single
'Anzeige
Dim Anzeige As Byte 'zum Anzeige auswählen
Dim Balken_x As Byte 'Balkenanzeige
Dim Balken_y As Byte 'Balkenanzeige
'-------------------------------------------------------------------------------
'Programm:
'-------------------------------------------------------------------------------
'Start
Anzeige = 1
Start Adc
Do
'LCD wählen:
If Pinc.5 = 1 Then
Taster_gedrueckt = 0 'zum "entprellen"
End If
If Pinc.5 = 0 And Taster_gedrueckt = 0 Then 'Wenn Taster1 gedrückt wird = 0
Anzeige = Anzeige + 1 'Variable "Anzeige" + 1
Taster_gedrueckt = 1 'zum "entprellen"
End If
If Anzeige => 4 Then 'Wenn Variable "Anzeige" = > 4
Anzeige = 1 'Variable "Anzeige" auf 1 setzen
End If
'Analogeingänge auslesen:
Xout = Getadc(0) 'Wert aus Analogeingang laden
Yout = Getadc(1) 'Wert aus Analogeingang laden
'5000mV = 1023 -> 4,88758mV = 1
'3300mV = 1023 -> 3,2258 mV = 1 Spannungsversorgung von g-Sensor
'3000mV = 1023 -> 2,93255mV = 1
Xout_mv = 4.88758 * Xout 'Xout_mV hat den Wert in mV!!!
Yout_mv = 4.88758 * Yout 'Xout_mV hat den Wert in mV!!!
Xout_g1 = Xout_mv - 1650
Xout_g = Xout_g1 / 800
Yout_g1 = Yout_mv - 1650
Yout_g = Yout_g1 / 800
Xout_ms = Xout_g * 9.80665 '1g = 9,80665m/s²
Yout_ms = Yout_g * 9.80665
'Balkenanzeige:
Select Case Xout_mv
Case Is < 450 'in mV
Balken_x = 20 '0-20Balken für die Anzeige
' Case 510 To 451
' Balken_x = 19
' Case 570 To 511
' Balken_x = 18
' Case 630 To 571
' Balken_x = 17
' Case 690 To 631
' Balken_x = 16
' Case 750 To 691
' Balken_x = 15
' Case 810 To 751
' Balken_x = 14
' Case 870 To 811
' Balken_x = 13
' Case 930 To 871
' Balken_x = 12
' Case 990 To 931
' Balken_x = 11
' Case 1050 To 991
' Balken_x = 10
' Case 1110 To 1051
' Balken_x = 9
' Case 1170 To 1111
' Balken_x = 8
' Case 1230 To 1171
' Balken_x = 7
' Case 1290 To 1231
' Balken_x = 6
' Case 1350 To 1291
' Balken_x = 5
' Case 1410 To 1351
' Balken_x = 4
' Case 1470 To 1411
' Balken_x = 3
Case 1530 To 1471
Balken_x = 88
Case 1590 To 1531
Balken_x = 8
Case 1591 To 1709
Balken_x = 0
Case 1710 To 1769
Balken_x = 8
Case 1770 To 1829
Balken_x = 88
' Case 1830 To 1889
' Balken_x = 3
' Case 1890 To 1949
' Balken_x = 4
' Case 1950 To 2009
' Balken_x = 5
' Case 2010 To 2069
' Balken_x = 6
' Case 2070 To 2129
' Balken_x = 7
' Case 2130 To 2189
' Balken_x = 8
' Case 2190 To 2249
' Balken_x = 9
' Case 2250 To 2309
' Balken_x = 10
' Case 2310 To 2369
' Balken_x = 11
' Case 2370 To 2429
' Balken_x = 12
' Case 2430 To 2489
' Balken_x = 13
' Case 2490 To 2549
' Balken_x = 14
' Case 2550 To 2609
' Balken_x = 15
' Case 2610 To 2669
' Balken_x = 16
' Case 2670 To 2729
' Balken_x = 17
' Case 2730 To 2789
' Balken_x = 18
' Case 2790 To 2849
' Balken_x = 19
Case Is > 2850
Balken_x = 20
End Select
Loop
'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------
Ontimer1overflow: 'Timer1-Interruptroutine
Timer1 = 34285 'Nächster Überlauf soll in einer Viertel-Sekunde sein:
Gosub Anzeige
Return
'------------------------------------------
Anzeige:
If Anzeige = 1 Then
Gosub Anzeige1
End If
If Anzeige = 2 Then
Gosub Anzeige2
End If
If Anzeige = 3 Then
Gosub Anzeige3
End If
Return
'------------------------------------------
Anzeige1:
Cls 'Display löschen (IMMER ERST LCD LÖSCHEN UND DANN POSITION ANGEBEN!!!)
Locate 1 , 1
Lcd + Fusing(xout_g , "#.&&&") ; " g"
Locate 1 , 10
Lcd "|"
Locate 1 , 11
Lcd + Fusing(xout_ms , "##.&&") ; "m/s2"
Locate 2 , 1
Lcd + Fusing(yout_g , "#.&&&") ; " g"
Locate 2 , 10
Lcd "|"
Locate 2 , 11
Lcd + Fusing(yout_ms , "##.&&") ; "m/s2"
Locate 3 , 1
Lcd "12345678901234567890" 'nur als test
Locate 4 , 1
Lcd "12345678901234567(1)" 'nur als test
Return
'------------------------------------------
Anzeige2:
Cls
Locate 1 , 1
Lcd + Fusing(xout_g , "#.&&&") ; " g"
Locate 1 , 10
Lcd "|"
Locate 1 , 11
Lcd + Fusing(xout_ms , "##.&&") ; "m/s2"
Locate 2 , 1
Lcd + Str(xout_mv , "####.&&") ; "mV X-Achse" 'nur als test
Locate 3 , 1
Lcd + Fusing(yout_g , "#.&&&") ; " g"
Locate 3 , 10
Lcd "|"
Locate 3 , 11
Lcd + Fusing(yout_ms , "##.&&") ; "m/s2"
Locate 4 , 1
Lcd + Str(yout_mv , "####.&&") ; "mV Y-Achse" 'nur als test
Locate 4 , 18
Lcd "(2)" 'nur als test
Return
'------------------------------------------
Anzeige3:
Cls
Locate 1 , 1
Lcd + Fusing(xout_g , "#.&&&") ; " g"
Locate 1 , 10
Lcd "|"
Locate 1 , 11
Lcd + Fusing(xout_ms , "##.&&") ; "m/s2"
Locate 2 , 1
Lcd + Str(balken_x , "####") 'Balken als test
Locate 3 , 1
Lcd + Fusing(yout_g , "#.&&&") ; " g"
Locate 3 , 10
Lcd "|"
Locate 3 , 11
Lcd + Fusing(yout_ms , "##.&&") ; "m/s2"
Locate 4 , 1
Lcd + Str(yout_mv , "####.&&") ; "mV Y-Achse" 'nur als test
Locate 4 , 18
Lcd "(3)" 'nur als test
Return
'===============================================================================
'Pinbelegung µC Beschleunigungsmesser
'===============================================================================
' AT MEGA 8
'PD0 = RXD +---U---+
'PD1 = TXD Reset PC6 +1 28+ PC5 Taster1 Menüwechsel
'PD2 = RXD PD0 +2 27+ PC4 Taster2 MAX zurücksetzen
'PD3 = TXD PD1 +3 26+ PC3 Taster3
'PD4 = PD2 +4 25+ PC2
'PD5 = PD3 +5 24+ PC1 (ADC1) Y-OUT SENSOR
'PD6 = PD4 +6 23+ PC0 (ADC0) X-OUT SENSOR
'PD7 = LCD / E Vcc +7 22+ GND
'PB0 = LCD / RS GND +8 21+ AREF
'PB1 = LCD / DB7 x x Xtal PB6 +9 20+ AVCC
'PB2 = LCD / DB6 x x Xtal PB7 +10 19+ PB5
'PB3 = LCD / DB5 PD5 +11 18+ PB4 / LCD / DB4
'PB4 = LCD / DB4 PD6 +12 17+ PB3 / LCD / DB5
'PB5 = / LCD / E PD7 +13 16+ PB2 / LCD / DB6
'PB6 = / LCD / RS PB0 +14 15+ PB1 / LCD / DB7
'PB7 = +-------+
'PC0 = (ADC0) X-OUT SENSOR
'PC1 = (ADC1) Y-OUT SENSOR
'PC2 =
'PC3 = Taster3
'PC4 = Taster2
'PC5 = Taster1 (MENÜ)
'PC6 = nur Taster auf Platine!!!
'PC7 =
'===============================================================================
'Pinbelegung AM LCD!!!!!!! ACHTUNG!!!!!
'===============================================================================
'Pin 1: GND
'Pin 2: +5V
'Pin 3: Kontrast (kannste auf Masse legen, ist für 0-1v (0-5 auch ok)
'Pin 4: RS -> AVR
'Pin 5: R/W -> GND (read/write mode, wir writen nur)
'Pin 6: E -> AVR
'Pin 7-10: -> GND
'Pin 11-14: -> AVR -> 11=DB4 / 12=DB5 / 13=DB6 / 14=DB7
'Pin 15-16: Beleuchtung, wenn drinne und gebraucht wird, sonst frei
'===============================================================================
'Anmerkungen
'===============================================================================
' - Alle Taster schalten auf MASSE (keine Widerstände! nur software mäßige)
' - auch der Resettaster wird auf MASSE gelegt!!!
Lesezeichen