- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: AT Mega 8 "stürzt nach 10-20sec ab" ?!?!?! Analogs

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627

    AT Mega 8 "stürzt nach 10-20sec ab" ?!?!?! Analogs

    Anzeige

    Praxistest und DIY Projekte
    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:

    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
    
    
    
    
    '-------------------------------------------------------------------------------
    '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!!!

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    noch eine Sache:
    die 4. Zeile vom LCD flackert...
    hat da jemand eine Erklärung? Ist ein 4*20Zeichen LCD.

    Tobias

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Naja, 4x20 ist nicht gleich 4x20 LCD, um genauer zu sagen
    warum das was macht müsste man wissen welches
    LCD, bzw. welchen Controller das hat.
    Aber im Allgemeinen hängt sich ein µC nicht
    so einfach weg. Ich tippe mal auf "verseuchte" Betriebsspannung,
    sprich Spannungsspitzen oder Einbrüche auf der Stromversorgung.
    Haste schön große Kapazitäten in der Schaltung zum Puffern
    und auch die kleinen 100nF direkt an den µC nicht vergessen?
    Eventuell zum Test mal den "BrownOut Reset" über die Fuses deaktivieren
    obs dann besser wird.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Hallo,
    also die Schaltung hängt an 6 akku´s = 7,2V. Dann kommt ein 7805 Festspannungsregler mit je 100nf am Eingang / Ausgang und ein 100µF Elko am Ausgang - sollte eigendlich reichen denk ich mal so. Keine LCD Beleuchtung und keine LED´s oder andere Verbraucher. Der gSensor zieht max 800µA - also auch ein Witz

    LCD von Reichelt.de: LCD 204B LED

    -COB-Technologie für Anzeige-Treiber
    und Controller.keine Ahnung?!
    -Interface mode with ,KS0063B
    -The KS0076B automatically initializes (resets) when the power is on using the internal reset circuit. The following
    instruction are executed in initialization. The busy flag is kept in busy state (BF=1) until initialization ends. The busy state
    is 10ms after VDD rises to 4.5V.

    Was ist / macht "BrownOut Reset"?

    Tobias

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    der brown out sorgt dafür, das der Controller bei Spanungseinbrüchen
    eben nicht in einen undefinierten Zustand geht, sondern nen reset
    durchführt, also wieder in einen definierten Anfangszustand zurück
    geht. Ich hatte schon Probleme mit Servos, die im Anlaufstrom
    so hoch waren, das der Controller dann eben diesen Reset durchgeführt
    hat weil die Versorgungsspannung nachgegeben hat ... aber das sollte in
    deinem Fall nicht passieren mit der Versorgung und der Last.

    Auch eine Falle beim Bascom sind die Einstellungen für Stack und Frame.
    Du hast zwar nur wenige Variablen deklariert und lokale gleich garnicht,
    da sollte es zwar dann keine Probleme geben, aber Interrupts verwendest
    Du schon, daher evtl. mal in den Einstellungen mit höheren Werten probieren.

    ach so, warum hier overlay?
    Dim Sresult As String * 16 At &H64 Overlay ?¿

    hier unnötig:
    Baud

    Ach so, eins noch ... versuch mal die Anzeige aus dem Timerinterrupt
    raus zu nehmen. Ist nicht besonders schön, weil das LCD für gewöhnlich
    die Handbremse am µC ist, sprich das Ding ist meist laaaaaaaaangsam.
    Wenn ich mit LCD arbeite gehe ich hin uns setze einfach n Flag in der
    Interrupt serviceroutine, das der Timerevent eben erreicht wurde
    , verarbeite dann in der Mainloop die Ausgabe und lösche das Flag wieder.
    Es kann sonst passieren, das der µC durch andauerndes Interrupt
    garnichtmehr aus der Routine raus kommt ... ein Symptom für die
    Geschichte währe z.B. ne flackernde Zeile am LCD
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Hallo,

    >Auch eine Falle beim Bascom sind die Einstellungen für Stack und Frame.
    Was sollte ich den da verändern? Hab damit noch nicht viel gemacht...Bild im Anhang.

    >Dim Sresult As String * 16 At &H64 Overlay
    >Dim Result(16) As Byte At &H64
    die beiden Zeilen habe ich zusammen mit der LCD Routine aus einem alten Programm "mit"-kopiert.... Jetzt habe ich beide rausgenommen

    >Baud
    nur soo, wollte "irgendwann" noch den PC vielleicht anschließen


    >Wenn ich mit LCD arbeite gehe ich hin uns setze einfach n Flag in der
    Interrupt serviceroutine, das der Timerevent eben erreicht wurde
    , verarbeite dann in der Mainloop die Ausgabe und lösche das Flag wieder.

    Kanst du mir da mal ein Beispiel geben Was ist ein nFlag? Und wie oft - so in etwa- wird das LCD dann aktualisiert?

    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!!!
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken fusebit.jpg  

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    also, das $baud ist schon klar, das brauchste für die Kommunikation
    über Hardware UART, das zweite Baud ist überflüssig.

    Overlayvariablen machen nur sinn, wenn sie auch irgendwo "drüber"
    liegen.

    Wie setze ich ein Flag ... also man definiere eine Variable, z.B.

    Dim Flag as Byte

    dann setze ich da einen Wert bei bestimmtem Event, z.B.

    Timeroverflowevent:
    Flag = 1
    return
    end

    Das hat den Effekt, dass mein Controller schnell wieder aus der Interrupt-
    routine raus kommt und so der nächste Interrupt, z.B. UART oder
    externer INT0 oder TIMER2 etc. dann nicht verloren geht.

    Dann frage ich das Flag in der Mainloop ab, also in etwa:

    do
    If Flag=1 then
    LCD-Ansteuerung etc ...
    Code was weiß ich ...

    Flag =0
    end if
    loop

    Ganz wichtig, das Flag nach Abarbeitung der Funktion zurücksetzen.
    Thats it

    Der Vorteil ist, wenn innerhalb der Abarbeitung der Unterfunktion
    ein neuer Interrupt über den Timer ausgelöst wird, na und?
    Das gesetzte Flag wird wieder gesetzt, who cares.
    Nur wenn die Unterfunktion ganz abgearbeitet wurde und
    das Flag eben zurückgesetzt ist wird ein neuer Effekt ausgelöst.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    >$baud
    ich glaube das 2. Baud ist der Kommentar...oder?

    >Flag
    also so wie ich das verstehe geht es darum, nur ganz kurz aus der Hauptschleife raus zu gehen, damit rausgegangen werden kann, wenn z.B. der Timer kommt - richtig?!


    Tobias

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    ...ähh ich glaube jetzt stürzt der µC nicht mehr ab...

    ich habe "Gosub Anzeige" nicht über den Timer aufgerufen sondern aus der normalden Do...loop!
    Wie ruft ihr denn eine LCD Routiene auf?

    Tobias

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    es geht einfach darum den Controller nicht zu lange im
    Interrupt zu fesseln, weil wenn er in einer Interruptroutine
    ist kann er keine weiter Interrupts annehmen, bzw. wenn
    zwischenzeitlich ein weiterer Interrupt kommt kann er diesen
    erst nach Erledigung des ersten Interrupts abarbeiten.
    Das ist wie in Deinem Fall nicht unbedingt sinnvoll.
    Der Controller kommt kaum mehr aus den Interrupts raus
    und kann so seine Hauptaufgabe nicht mehr ausführen.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress