TobiasBlome
29.04.2007, 20:31
Hallo,
ich habe mir den Beschleunigungssensor aus der letzten ELEKTOR bestellt.
Also ich bekomme vom Sensor das Analogsignal (0,05V bis 2,85V) und möchte es über den µC auswerten und auf einem LCD anzeigen
- geht auch ganz gut - ABER NUR EIN PAAR SEKUNDEN!!! mal länger und mal kürzer ](*,) Das LCD steht und der µC reagiert nicht auf den Taster!
Der Mega 8 macht nichts anderes als den Sensor auszuwerten. Wenn ich den Sensor "Abziehe" (Sensor steckbar) dann stürzt den µC trotzdem ab...
Hat jemand eine Idee?
Eine zweite nicht soo wichtige Sache:
Wenn der Wert auf dem LCD negativ wird, kommt ein "Minusvorzeichen" dazu und dann verschiebt sich der Wert auf dem LCD um eine Stelle. Wie kann ich einen "Platzfreihalter" für das "-" einbauen, damit sich nicht jedesmal der Wert verschiebt?
'---schnipp
Locate 1 , 1
Lcd + Fusing(xout_g , "#.&&&") ; " g"
'---schnipp
Danke schon mal,
Tobias
hier mein Programm:
'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
'-------------------------------------------------------------------------------
'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
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
Loop
'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------
Ontimer1overflow: 'Timer1-Interruptroutine
Timer1 = 34285 'Nächster Überlauf soll in einer Sekunde sein:
Gosub Anzeige
Return
Anzeige:
If Anzeige = 1 Then
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 "12345678901234567890" 'nur als test
End If
'------------------------------------------
If Anzeige = 2 Then
Cls
Locate 1 , 1
Lcd + Fusing(xout_g , "#.&&&") ; " Anzeige2"
End If
'------------------------------------------
If Anzeige = 3 Then
Cls
Locate 1 , 1
Lcd + Fusing(xout_g , "#.&&&") ; " Anzeige3"
End If
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!!!
ich habe mir den Beschleunigungssensor aus der letzten ELEKTOR bestellt.
Also ich bekomme vom Sensor das Analogsignal (0,05V bis 2,85V) und möchte es über den µC auswerten und auf einem LCD anzeigen
- geht auch ganz gut - ABER NUR EIN PAAR SEKUNDEN!!! mal länger und mal kürzer ](*,) Das LCD steht und der µC reagiert nicht auf den Taster!
Der Mega 8 macht nichts anderes als den Sensor auszuwerten. Wenn ich den Sensor "Abziehe" (Sensor steckbar) dann stürzt den µC trotzdem ab...
Hat jemand eine Idee?
Eine zweite nicht soo wichtige Sache:
Wenn der Wert auf dem LCD negativ wird, kommt ein "Minusvorzeichen" dazu und dann verschiebt sich der Wert auf dem LCD um eine Stelle. Wie kann ich einen "Platzfreihalter" für das "-" einbauen, damit sich nicht jedesmal der Wert verschiebt?
'---schnipp
Locate 1 , 1
Lcd + Fusing(xout_g , "#.&&&") ; " g"
'---schnipp
Danke schon mal,
Tobias
hier mein Programm:
'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
'-------------------------------------------------------------------------------
'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
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
Loop
'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------
Ontimer1overflow: 'Timer1-Interruptroutine
Timer1 = 34285 'Nächster Überlauf soll in einer Sekunde sein:
Gosub Anzeige
Return
Anzeige:
If Anzeige = 1 Then
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 "12345678901234567890" 'nur als test
End If
'------------------------------------------
If Anzeige = 2 Then
Cls
Locate 1 , 1
Lcd + Fusing(xout_g , "#.&&&") ; " Anzeige2"
End If
'------------------------------------------
If Anzeige = 3 Then
Cls
Locate 1 , 1
Lcd + Fusing(xout_g , "#.&&&") ; " Anzeige3"
End If
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!!!