- LiFePO4 Speicher Test         
Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 39 von 39

Thema: UART geht mit AT90S2313 und nicht mit ATtiny 2313?!?

  1. #31
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Wenn Du an den Fuses nix gemacht hast, läuft der mit 1MHz.

    Den AVR interessiert es überhaupt nicht, was Du in deinem Programm bei $crystal hinschreibst, das ist nur für Bascom intern um die Zeiten auszurechnen, wenn zB. Wartezeiten für Waitms usw. berechnet werden.
    Also das bei Waitms 100 auch 100ms gewartet werden und nicht irgendwas anderes, was bei Dir jetzt anscheinend passiert ist, weil der Wert mit der echten MHz nicht zusammengepasst hat !

  2. #32
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Ach so. Ich habe jetzt die Fuse Bits und $Crystal auf 20MHz geändert(externen Quarz angeschlossen) und die Werte für z.B. "Pulsein" angepasst.

    Aber nun möchte ich noch eine Wartezeit im Unterprogramm "Ledcount:" einbauen.

    Wenn die Variable Led1 = 255 oder Led1 = 0 dann soll er ca 1 sekunde warten. Wie kann ich das am einfachseten realisieren? Ich habe es mit einer Loop Schleife versucht, damit der Rest vom Programm weiter läuft - aber leider komme ich aus dieser Loopschleife nicht mehr raus weil sich dann der Wert von Led1 nicht mehr ändert...
    Wie kann ich das ändern?

    Code:
    Ledcount:                                                  'Farbwechsel über Timer0
    
        Timer0 = 1                                              'Geschwindigkeit mit der die LED´s die Farbe wechseln
    
    
    
      If Led1 = 255 Then
    
       Do
       Print "Led1Pause: " ; Led1pause
       Incr Led1pause                                           'Erhöhe Variable Led1pause Um 1
       Loop Until Led1pause = 100                               'Wenn Led1pause = 100 , verlasse Schleife
    
      Else
    
        '---LED1---
        If Led1 = 255 Then                                      'Wenn Led1 100% dann Merker zum hochzählen setzen
         Led1m = 0
        End If
    
    
        If Led1 = 0 Then                                        'Wenn Led1 0% dann Merker zum runterzählen setzen
         Led1m = 1
        End If
    
        'Zähler1 hoch/runter
        If Led1m = 1 Then
         Incr Led1                                              'Wenn Merker Led1m = 1 -> um 1 hochzählen
        End If
    
        If Led1m = 0 Then
         Decr Led1                                              'um 1 runterzählen
        End If
    
    
        '---LED2---
        If Led2 = 255 Then
         Led2m = 0
        End If
    
        If Led2 = 0 Then
         Led2m = 1
        End If
    
        'Zähler1 hoch/runter
        If Led2m = 1 Then
         Incr Led2                                              'um 1 hochzählen
        End If
    
        If Led2m = 0 Then
         Decr Led2                                              'um 1 runterzählen
        End If
    
    
     End If
    
    
    
    
        If Led1pause = 100 Then
        Led1pause = 0
        End If
    
    Return

  3. #33
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2006
    Ort
    Biberach
    Alter
    34
    Beiträge
    485
    Du kannst einfach Wait bzw. Waitms und einen Wert dahinter verwenden. Zum Beispiel:
    Wait 1 'Warte 1 Sekunde
    Waitms 10 'Warte 10 Millisekunden

    Dabei bleibt das ganze Programm stehen.

    MfG

  4. #34
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Ja, hab´s probiert.
    Aber dann funktioniert ja der ganze Rest für eine Sekunde nicht mehr - also auch wenn ich ene Taster drücke wird der nicht mehr abgefragt...

    Gibt es da noch eine andere Möglichkeit?

    Code:
    Ledcount:                                                  'Farbwechsel über Timer0
    
        Timer0 = 1                                              'Geschwindigkeit mit der die LED´s die Farbe wechseln
    
    
    
        '---LED1---
        If Led1 = 255 Then                                      'Wenn Led1 100% dann Merker zum hochzählen setzen
         Led1m = 0
        Wait 1
        End If
    
    
        If Led1 = 0 Then                                        'Wenn Led1 0% dann Merker zum runterzählen setzen
         Led1m = 1
         Wait 1
        End If
    
        'Zähler1 hoch/runter
        If Led1m = 1 Then
         Incr Led1                                              'Wenn Merker Led1m = 1 -> um 1 hochzählen
        End If
    
        If Led1m = 0 Then
         Decr Led1                                              'um 1 runterzählen
        End If
    
    
        '---LED2---
        If Led2 = 255 Then
         Led2m = 0
        End If
    
        If Led2 = 0 Then
         Led2m = 1
        End If
    
        'Zähler1 hoch/runter
        If Led2m = 1 Then
         Incr Led2                                              'um 1 hochzählen
        End If
    
        If Led2m = 0 Then
         Decr Led2                                              'um 1 runterzählen
        End If
    
    
    
    
    
    Return

  5. #35
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Hat denn keiner eine Idee, wie ich das mit einer Schleife realisieren kann, so dass der µC nicht für 1! Sekunde lamgelegt ist?

  6. #36
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Tobias,

    dein Unterprog Ledcount: ist ja eigentlich eine ISR, also eine Interruptroutine. Da drin darfst du sowieso keine Pause einbauen, weil - wie du auch gesagt hast - ja dann alles blockiert wird.
    Eine ISR sollte so schnell wie möglich ablaufen, damit das Hauptprogramm nicht unterbrochen wird.

    Die Logik wäre also Folgende:
    In der ISR erzeugst du nur einen "Takt" (z.B. als Zähler, der hochgezählt wird oder als Flag, das immer in der ISR 1 wird und im Hauptprogramm wieder gelöscht wird,- da gibt es mehrere Möglichkeiten.)
    Das eigentliche Ein-/Ausschalten von LEDs o.ä. geschieht im Hauptprogramm, aber getriggert von dem Takt der ISR.
    Wenn deine ISR z.B. einen Takt von 10 Hz (10x / Sek.) vorgibt, dann kann im Hauptprogramm z.B. bei jedem 10. Takt eine LED ein- oder ausgeschaltet werden, ...

    Also: Programm umstricken wird empfohlen.

    Gruß Dirk

  7. #37
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Danke für die Antwort,
    also wenn ich in der ISR nur hoch und runterzählen soll, bleibt ja nur noch die Auswertung ob hoch oder runter gezählt werden soll über. (Also das setzten oder Rücksetzen von Variable "Led1m" und "Led2m") Das würde meinen µC etwas beschleunigen.

    Aber das löst ja noch nicht das Problem mit der Wartezeit oder hab ich da etwas überlesen?


    Eigendlich müsste ich doch nur eine weitere Variable setzen/rücksetzen?
    'Zähler1 hoch/runter
    If Led1m = 1 AND LED1PAUSE = 0 Then
    Incr Led1 'Wenn Merker Led1m = 1 -> um 1 hochzählen
    End If

    würde das reichen?

    Dann fehlt noch das setzen/rücksetzen von LED1PAUSE? Wie könnte man das machen - mit einer Loopschleife?

    If Led1 = 255 Then
    Led1Pause = 1

    do
    INCR Warten1
    loop Until Warten1 = 100

    Led1Pause = 0
    End if


    Tobias

  8. #38
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    Pausen

    Hallo Tobias,

    wie gesagt: In der ISR am besten keine Warteschleife, sondern ich würde den ganzen Ablauf in das Hauptprogramm nehmen. Da kann man immer Pausen einfügen, wenn nötig.
    Eine Timer-ISR sollte nur regelmäßige, genau definierte kurze Aktionen durchführen, die unabhängig vom Hauptprogramm eintreten müssen.

    Gruß Dirk

  9. #39
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Also ich habe nun diese Warteschleife in das Hauptprogramm geschrieben:

    'Warteschleife für 100% BLAU und 100% ROT

    If Led1 = 250 Or Led1 = 0 Then
    Led1Pause = 1
    Incr Warten1
    End If

    If Warten1 = 20 Then
    Led1pause = 0
    Warten1 = 0
    End If

    Funktioniert super!

    Tobias

    P.S. nun ist das Program fertig

    Code:
    '-------------------------------------------------------------------------------
    ' Modellbauschalter 4/8Kanal mit ATtiny2313 und hardware PWM
    '-------------------------------------------------------------------------------
    'Beschreibung:
    
     '4Steuerkanäle von Fernsteuerung auf 8 µC - Ausgänge
     'Das Hi-Signal vom Empfänger wird mit "Pulsein" ermittelt!
     'Knüppelstellung mitte hat ca. 121 Zeiteinheiten bei einem 3.6864 MHz Quarz!
     'guter Schaltbereich für:
     'oben  einschalten ca.: 140 ->  bei 8 MHz int. = 9 ->  bei 20 MHz = 200 ->  bei 1 MHz = 100
     'unten einschalten ca.: 100 ->  bei 8 MHz int. = 6 ->  bei 20 MHz = 100 ->  bei 1 MHz =  50
     'Der mit "Pulsein" gemessene Wert wird in Pulsbreite1-4 ausgegeben.
     'Kanal1-3u/o wird zum speichern benutzt, damit damit nicht bei jedem Durchlauf
     'über "toggle" geschaltet wird, sondern erst wieder,
     'wenn der Knüppel vorher in Nullstellung gewesen ist!
     '"toggle" schaltet den Ausgang von Hi auf Low und wieder zurück!
     'Der PNP Transistor BD 238 schaltet bei einem LOW Signal 5V auf die LED
     'Nicht angeschlossene Kanäle müssen auf einen angeschlossenen Kanal gebrückt
     'werden, damit der Eingang nicht abgefragt wird - da kein Signal kommt wartet
     'das Programm, bis ein ERROR nach ca.650ms kommt!
    
     'Wenn beide Funktionen von Kanal 2 geschaltet haben wird die
     'Unterbodenbeleuchtung im wechsel über PWM gesteuert!
    
    
     'FUSE BITs SETZEN!!!!!!
     'Wenn er mit 8 MHz intern laufen soll (also kein externer Quarz):
     'Fusebit A987 wie es war (0100:intern RC 8MHz)
     'Fusebit C -> 1:Divide clock by 8 disabled
     '1. Ein neuer tiny2313 hat einen INTERNEN 8 MHz RC-Oszillator und teilt den internen Takt durch 8 (Fusebit C = 0). Damit läuft ein neuer tiny mit 1 MHz und das muss dann auch im Programm mit $crystal = 1000000 angegeben werden.
    
    '2. Setzt du NUR Fusebit C auf 1, wird der Teiler : 8 deaktiviert und du hast einen internen (RC-Oszillator-) Takt von 8 MHz ($crystal = 8000000).
    
    '3. Willst du auf einen externen Quarz (XTAL) umstellen, hast du primär 3 Möglichkeiten für A987:
    '1111:1111 von 8 MHz bis 20 MHz
    '1111:1110 von 3 MHz bis 8 MHz
    '1111:1101 von 0,9 bis 3 MHz
    
    'Zu deinen Fragen:
    'Beim neuen tiny2313 nutzt du immer zuerst den internen Takt, wie unter 1. beschrieben.
    'Erst durch Manipulationen an A987 kannst du auf externe Taktquelle oder Quarz/RC-Oszillator umstellen.
    
    '-------------------------------------------------------------------------------
    'Konfiguration µC:
    $regfile = "ATtiny2313.dat"                                 'ATtiny2313-Deklarationen
    $crystal = 20000000                                         'externer Quarz 20MHz
    $baud = 9600                                                'Baudrate der UART: 9600 Baud
    
    '-------------------------------------------------------------------------------
    'Ein- Ausgänge:
    Ddrd = &B1000011                                            '1 Ausgang, 0 Eingang = Pin PD6,1+0 als Ausgang / PD5-2 als Eingang
    Ddrb = &B11111111                                           '1 Ausgang, 0 Eingang = Pin PB7-0 als Ausgang
    Portb = &B11111111                                          'PB0...PB7 auf High setzen
    
    '-------------------------------------------------------------------------------
    'Variablen auswertung FB
     Dim Pulsbreite1 As Word                                    'Knüppelstellung Knüppel 1                  '
     Dim Pulsbreite2 As Word
     Dim Pulsbreite3 As Word
     Dim Pulsbreite4 As Word
    
     Dim Kanal1o As Bit                                         'Speicher von Knüppel 1 OBEN
     Dim Kanal1u As Bit                                         'Speicher von Knüppel 1 UNTEN
     Dim Kanal2o As Bit
     Dim Kanal2u As Bit
     Dim Kanal3o As Bit
     Dim Kanal3u As Bit
    
     Dim Led1 As Byte
     Dim Led1m As Bit                                           'LED1 Merker
     Dim Led2 As Byte
     Dim Led2m As Bit
     Dim Led1pause As Word                                      'Als Pause zwischen den Lichteffekten für die UnterBodenbel.
     Dim Warten1 As Word
    
     Dim Portb3 As Bit                                          'PWM
     Dim Portb4 As Bit                                          'PWM
    
    
    '-------------------------------------------------------------------------------
    'Konfiguration Timer:
     Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
     Config Timer0 = Timer , Prescale = 1024                    'Teiler
     Enable Timer0                                              'timer einschalten
     On Timer0 Ledcount                                         'Unteprogramm aufrufen
     Enable Interrupts                                          'interrupts  einschalten
    
    
    '-------------------------------------------------------------------------------
    ' HAUPTPROGRAMM
    '-------------------------------------------------------------------------------
     Led1 = 255                                                 'PWM Startwert vorgeben
     Led2 = 0                                                   'PWM Startwert vorgeben
    
    
    Do                                                          'Do Loop Schleife
    'Print "Pulsbreite2: " ; Pulsbreite2
    'Print "U-Boden toggle: " ; Portb3
    'Print "U-Boden toggle: " ; Portb4
    'Print "Led1blau: " ; Led1
    'Print "Led2rot: " ; Led2
    'Print "Led1pause: " ; Led1pause
    'Print "Warten1: " ; Warten1
    
    'Hardware PWM mit Timer1   U N D
    'FB auswerten: Umschaltung von normal auf PWM
    
     If Portb3 = 0 And Portb4 = 0 Then
    
     Compare1a = Led1                                           '=PB3  /  max 255
     Compare1b = Led2                                           '=PB4  /  max 255
    
     Else
       If Portb3 = 0 Then
       Compare1a = 255
       Else
       Compare1a = 0
       End If
    
       If Portb4 = 0 Then
       Compare1b = 255
       Else
       Compare1b = 0
       End If
    
     End If
    
    'Warteschleife für 100% BLAU und 100% ROT
    
    If Led1 = 250 Or Led1 = 0 Then
    Led1Pause = 1
    Incr Warten1
    End If
    
    If Warten1 = 20 Then
    Led1pause = 0
    Warten1 = 0
    End If
    
    
    
    
    'FB auswerten:
    
    'Kanal 1 LICHT HINTEN:
    '____________________
    
    Pulsein Pulsbreite1 , Pind , 5 , 1                          'Pulsbreite auslesen (1=High Impuls)
    'Knüppel rastend OBEN
        If Pulsbreite1 > 200 And Kanal1o = 0 Then               'wenn Knüppel oben und Kanal1oben=0 dann
        Toggle Portb.1                                          'Pin 1 mal schalten (entweder auf Hi oder Low je nach vorherigem zustand)
        Kanal1o = 1                                             'Variable Kanal1o setzen damit nicht neu getoggled werden kann
        End If
        If Pulsbreite1 < 200 Then                               'Wenn Knüppel nicht oben dann
        Kanal1o = 0                                             'Variable Kanal1o RÜCKsetzen damit neu getoggled werden kann
        End If
    'Knüppel rastend UNTEN
        If Pulsbreite1 < 100 And Kanal1u = 0 Then
        Toggle Portb.0
        Kanal1u = 1
        End If
        If Pulsbreite1 > 100 Then
        Kanal1u = 0
        End If
    
    
    
    'Kanal 2 UNTERBODEN:
    '___________________
    
    Pulsein Pulsbreite2 , Pind , 4 , 1                          'Pulsbreite auslesen (1=High Impuls)
    'Knüppel rastend OBEN
        If Pulsbreite2 > 200 And Kanal2o = 0 Then
        Toggle Portb3
        Kanal2o = 1
        End If
        If Pulsbreite2 < 200 Then
        Kanal2o = 0
        End If
    'Knüppel rastend UNTEN
        If Pulsbreite2 < 100 And Kanal2u = 0 Then
        Toggle Portb4                                           'ACHTUNG PB4!!! nicht PB2!!!
        Kanal2u = 1
        End If
        If Pulsbreite2 > 100 Then
        Kanal2u = 0
        End If
    
    
    
    'Kanal 3:
    '________
    
    Pulsein Pulsbreite3 , Pind , 3 , 1                          'Pulsbreite auslesen (1=High Impuls)
    'Knüppel rastend OBEN
        If Pulsbreite3 > 200 And Kanal3o = 0 Then
        Toggle Portb.5
        Kanal3o = 1
        End If
        If Pulsbreite3 < 200 Then
        Kanal3o = 0
        End If
    'Knüppel rastend UNTEN
        If Pulsbreite3 < 100 And Kanal3u = 0 Then
        Toggle Portb.2                                          'ACHTUNG PB2!!!  nicht PB4!!!
        Kanal3u = 1
       End If
        If Pulsbreite3 > 100 Then
        Kanal3u = 0
        End If
    
    
    
    'Kanal 4 (Taster / Taster):
    '________
    
    Pulsein Pulsbreite4 , Pind , 2 , 1                          'Pulsbreite auslesen (1=High Impuls)
    'Knüppel tastend OBEN
        If Pulsbreite4 > 200 Then                               'Knüppel oben
        Portb. 7 = 0                                            'Port PB 7 setzen
        Else                                                    'sonst
        Portb. 7 = 1                                            'Port PB 7 zurücksetzen
        End If
    'Knüppel tastend UNTEN
        If Pulsbreite4 < 100 Then                               'Knüppel unten
        Portb. 6 = 0                                            'Port PB 6 setzen
        Else                                                    'sonst
        Portb. 6 = 1                                            'Port PB 6 zurücksetzen
        End If
    
    
    
    'Automatikfunktion für Scheinwerfer:    GEPRÜFT MIT HARDWARE OK
    '___________________________________
    
        If Portb.0 = 0 Or Portb.1 = 0 Then                      'Wenn PB0 oder PB1 Hi sind dann
        Portd.6 = 0                                             ' PD6 setzen
        Else                                                    'sonst
        Portd.6 = 1                                             'PD6 RÜCKsetzen
        End If
    
     Loop
    
    
    
     'Unterprogramme:
     '_______________
    
     Ledcount:                                                  'Farbwechsel über Timer0
    
        Timer0 = 1                                              'Geschwindigkeit mit der die LED´s die Farbe wechseln
    
     'Zähler für PWM vor oder zurücklaufenlassen ( Led1m & Led2m )
    
     '---LED1---
        If Led1 = 255 Then                                      'Wenn Led1 100% dann Merker zum hochzählen setzen
         Led1m = 0
        End If
    
    
        If Led1 = 0 Then                                        'Wenn Led1 0% dann Merker zum runterzählen setzen
         Led1m = 1
        End If
    
        'Zähler1 hoch/runter
        If Led1m = 1 And Led1pause = 0 Then
         Incr Led1                                              'Wenn Merker Led1m = 1 -> um 1 hochzählen
        End If
    
        If Led1m = 0 and Led1Pause = 0 Then
         Decr Led1                                              'um 1 runterzählen
        End If
    
    
        '---LED2---
        If Led2 = 255 Then
         Led2m = 0
        End If
    
        If Led2 = 0 Then
         Led2m = 1
        End If
    
        'Zähler1 hoch/runter
        If Led2m = 1 and Led1Pause = 0 Then
         Incr Led2                                              'um 1 hochzählen
        End If
    
        If Led2m = 0 and Led1Pause = 0 Then
         Decr Led2                                              'um 1 runterzählen
        End If
    
    
    
    
    
    Return
    
    '================================================================================
    'Pinbelegung µC
    '===============================================================================
    '                                      AtmelATtiny2313
    'PD0 = Frei                               +---U---+
    'PD1 = ResetTaster            (Reset) PA2 +1    20+ Vcc +5V
    'PD2 = Kanal 4                 FREI ->PD0 +2    19+ PB7 Zusatzfunktion 3 tastend
    'PD3 = Kanal 3                 FREI ->PD1 +3    18+ PB6 Hupe / tastend
    'PD4 = Kanal 2           x x Xtal 2 / PA1 +4    17+ PB5 Zusatzfunktion 2 rastend
    'PD5 = Kanal 1           x x Xtal 1 / PA0 +5    16+ PB4 Licht Boden  2 / rastend  (OC1B)PWM
    'PD6 = Licht vorne           Kanal 4->PD2 +6    15+ PB3 Licht Boden  1 / rastend  (OC1A)PWM
    'PB0 = Licht hinten 1        Kanal 3->PD3 +7    14+ PB2 Zusatzfunktion 1 rastend  (OC0A)PWM
    'PB1 = Licht hinten 2        Kanal 2->PD4 +8    13+ PB1 Licht hinten 2 / rastend
    'PB2 = Licht Boden  1        Kanal 1->PD5 +9    12+ PB0 Licht hinten 1 / rastend
    'PB3 = Licht Boden  2                 GND +10   11+ PD6 Licht vorne
    'PB4 = Zusatzfunktion 1                   +-------+
    'PB5 = Zusatzfunktion 2
    'PB6 = Hupe
    'PB7 = Zusatzfunktion 3

Seite 4 von 4 ErsteErste ... 234

Berechtigungen

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

12V Akku bauen