- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

Thema: Timer 1 überfordert?

  1. #11
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Nun, das geht wohl dann doch ans Eingemachte. Da wird mit allgemeinen Vermutngen wohl nix zu machen sein, möööglich ist alles.
    Da wirst du nun wohl doch die Source rausrücken müssen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    04.11.2005
    Ort
    Erlangen
    Alter
    42
    Beiträge
    77
    gut du hast es nicht anders gewollt...
    hier ist alles was ich habe...:
    Code:
     Declare Sub Taste1()
     Declare Sub Taste2()
     Declare Sub Taste3()
     Declare Sub Taste4()
     Declare Sub Taste5()
     Declare Sub Move()
     Declare Sub Turn180()
     Declare Sub Stopnow()
     Declare Sub Anfahren()
     Declare Sub Turnleft()
     Declare Sub Turnright()
     Declare Sub Look()
    Declare Sub Bremsen()
    Declare Sub Rewind()
    Declare Sub Lcdout()
    Declare Sub Batteriespannung()
    Declare Sub Temp()
    
    Declare Function Tastenabfrage() As Byte
    
    $regfile = "m32def.dat"
    $crystal = 16000000
    $baud = 9600
    
    
    
    Config Adc = Single , Prescaler = Auto
    Const Ref = 5 / 1023
    
    Const Center = 109
    Dim Ton As Integer
    Dim Taste As Byte
    Dim Volt As Single
    Dim Dist(12) As Integer
    Dim Servopos As Integer
    Dim V As Integer
    Dim Result As Byte
    Dim Ms As Integer
    Dim A As Byte
    Dim Name As String * 20
    Name = "RP 005"
    Dim Text2 As String * 20
    Dim Text3 As String * 20
    Dim Dl As Integer
    Dl = 1
    
    'Ports für linken Motor
    Config Pinc.6 = Output                                      'Linker Motor Kanal 1
    Config Pinc.7 = Output                                      'Linker Motor Kanal 2
    Config Pind.4 = Output                                      'Linker Motor PWM
    'Ports für rechten Motor
    Config Pinb.0 = Output                                      'Rechter Motor Kanal 1
    Config Pinb.1 = Output                                      'Rechter Motor Kanal 2
    Config Pind.5 = Output                                      'Rechter Motor PWM
    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
    Pwm1a = 0
    Pwm1b = 0
    Tccr1b = Tccr1b Or &H02
    'ende motorports
    
    'In out für tasten
    Config Adc = Single , Prescaler = Auto                      'Für Tastenabfrage und Spannungsmessung
    Config Pina.7 = Input                                       'Für Tastenabfrage
    Porta.7 = 1                                                 'Pullup Widerstand ein
    'ende in out für tasten
    
    
    'timer config
    Config Timer1 = Timer , Prescale = 1024
    
    On Timer1 Timer_irq
    Const Timervorgabe = 3036
    Enable Timer1
    
     'timer config
    
    
    
    
    'servo config
    Config Servos = 1 , Servo1 = Porta.0 , Reload = 10
    Config Pina.0 = Output
    'ende servo config
    
    'taster config
    Config Pind.6 = Input
    Portd.6 = 1
    
    
    'lcd config
    Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portb.4 , Rs = Portb.3
    Config Lcd = 20 * 4
    
    'i2c config
    Config Scl = Portc.0
    Config Sda = Portc.1
    
    Dim Device As Byte
    Dim Deviceread As Byte
    Dim Lowtemp As Byte
    Dim Hightemp As Byte
    Dim Value As Single
    I2cinit
    
    Device = 144
    Deviceread = 145
    'ende I2C temp config
    
    Enable Interrupts
    
    
    
    
    
    
    
    'programm start
    Servopos = Center
    Servo(1) = Servopos
    
    Print "**** RN-Control ist startklar... Los  gehts!!! *****"
    Sound Portd.7 , 400 , 450                                   'BEEP
    Waitms 100
    Sound Portd.7 , 400 , 250
    Waitms 100                                                  'BEEP
    Sound Portd.7 , 400 , 450                                   'BEEP
    
    
    Cursor Off
    Text2 = "I am alive..."
    Call Lcdout
    Wait 1
    
    
    
    Text2 = "Erwarte Befehle"
    Call Lcdout
    
    
    
    Do
        Taste = Tastenabfrage()
       If Taste <> 0 Then
    
          Select Case Taste
             Case 1
                Call Taste1                                     'Taste 1  Servos
             Case 2
                Call Taste2                                     'Taste 2   Spannung an pin A5
             Case 3
                Call Taste3                                     'Taste 3
             Case 4
                Call Taste4                                     'Taste 4
             Case 5
                Call Taste5                                     'Taste 5
          End Select
          Sound Portd.7 , 400 , 500                             'BEEP
       End If
    
       Waitms 100
    Loop
    
    End
    
    
    
    
    
    Function Tastenabfrage() As Byte
    Local Ws As Word
    
       Tastenabfrage = 0
       Ton = 600
       Start Adc
       Ws = Getadc(7)
         If Ws < 500 Then
          Select Case Ws
             Case 400 To 450
                Tastenabfrage = 1
                Ton = 550
             Case 330 To 380
                Tastenabfrage = 2
                Ton = 500
             Case 260 To 305
                Tastenabfrage = 3
                Ton = 450
             Case 180 To 220
                Tastenabfrage = 4
                Ton = 400
             Case 90 To 130
                Tastenabfrage = 5
                 Ton = 350
    
          End Select
          Sound Portd.7 , 400 , Ton                             'BEEP
    
       End If
    
    
    End Function
    
    
    
    
      Sub Taste1()
    
    
      Text2 = "Servo Test"
     Call Lcdout()
      Wait 1
    
       Servopos = Center
      Servo(1) = Servopos
      Text2 = "Mitte"
      Call Lcdout()
      Wait 1
    
      Servopos = 60
      Servo(1) = Servopos
      Wait 1
       Text2 = "Rechtsdrehung"
       Call Lcdout()
       For Servopos = 60 To 160 Step 10
       Servo(1) = Servopos
       Waitms 10
       Next
    
       Wait 1
       Text2 = "Linksdrehung"
      Call Lcdout()
       For Servopos = 160 To 60 Step -10
       Servo(1) = Servopos
       Waitms 10
       Next
    
        Wait 1
        Text2 = "Mitte"
     Call Lcdout()
        Servopos = Center
       Servo(1) = Servopos
    
    
    
    
      End Sub
    
    
    
    Sub Taste2()
    
    Text2 = "Sensor Test"
    Call Lcdout()
     Call Look()
    
    
    End Sub
    
    
    Sub Taste3()
    
    Text2 = "Taster Test"
    Call Lcdout()
    
    Do
    
    If Pind.6 = 0 Then
     Sound Portd.7 , 800 , 800
    
    
    
       Text2 = "Upps sorry..."
       Call Lcdout()
       Call Turn180
       End If
    Waitms 300
    Loop
    
    End Sub
    
    
    
    Sub Taste4()
    
      Wait 1
      Call Turn180
    
    End Sub
    
    
    
    Sub Taste5()
    
    Text2 = "Volle Fahrt voraus"
    Call Lcdout()
    Wait 1
    Call Move()
    
    End Sub
    
    
    
    
    
    
    
    
    
    
    
    
    
    Sub Move()
    Text2 = "moving..."
    Call Lcdout()
        Local U As Integer
    
         Start Adc                                              'spannungsmessung starten
    
         Call Anfahren                                          'anfahren
    
    
       'Fahren
    
       Do
    
       'servo Rechtsdrehung"
       Servopos = 89
       For Servopos = 89 To 129 Step 4
       Servo(1) = Servopos
    
       If Pind.6 = 0 Then                                       'taster anstoss
       Text2 = "Upps sorry..."
       Call Lcdout()
       Call Stopnow
       Call Rewind
       Call Turn180
       Call Anfahren
      Text2 = "moving..."
    Call Lcdout()
       End If
    
       Waitms 80                                                'vorher 80
       U = Getadc(5)
    
       If U > 250 Then                                          'spannung am gp12d2 zu groß
       Text2 = "Hindernis gefunden"
      Call Lcdout()
       U = 0
       Call Stopnow
       Call Look
      Call Anfahren
     Text2 = "moving..."
    Call Lcdout()
    
       End If
    
       Next
    
    
    
       'servo Linksdrehung"
    
       For Servopos = 129 To 89 Step -4
       Servo(1) = Servopos
    
         If Pind.6 = 0 Then
        Text2 = "Upps sorry..."
       Call Lcdout()
       Call Stopnow
       Call Rewind
       Call Turn180
       Call Anfahren
       Text2 = "moving..."
    Call Lcdout()
       End If
    
    
       Waitms 80                                                'vorher 80ms
       U = Getadc(5)
       If U > 250 Then
       Text2 = "Hindernis gefunden"
      Call Lcdout()
       U = 0
       Call Stopnow
       Call Look
       Call Anfahren
       Text2 = "moving..."
    Call Lcdout()
       End If
    
       Next
       Loop
    
       'bremsen
       If V > 0 Then
       Call Bremsen
       End If
    
    
       Servopos = Center
       Servo(1) = Servopos
    
    End Sub
    
    
    
    
    
    Sub Look()
       Local Sp As Byte
       Servopos = 60
        Servo(1) = Servopos
          Cls
                                                            'clear the LCD display
    Text2 = "Suche weiteren Weg..."
    Call Lcdout()
    
    
        Waitms 200
       Sp = 1
    
    
       'Servo "Rechtsdrehung":
    
       For Servopos = 50 To 160 Step 10                         'vorher 170
    
       Servo(1) = Servopos
       Waitms 180
       Dist(sp) = Getadc(5)
       Incr Sp
    
       Next
      Servopos = Center
        Servo(1) = Servopos
    
    
       'suche nach kleinstem wert
       Result = 1
    
       For Sp = 1 To 12                                         'vorher 12
       If Dist(sp) < Dist(result) Then Result = Sp
       Next
    
    
    
         Ms = 0
       Select Case Result
             Case 1
             Ms = 600
                Call Turnleft
             Case 2
             Ms = 500
                Call Turnleft
             Case 3
             Ms = 400
                Call Turnleft
             Case 4
             Ms = 200
                Call Turnleft
             Case 5
             Ms = 100
               Call Turnleft
             Case 6
             Ms = 50
                Call Turnleft
             Case 7
             Ms = 50
                Call Turnright
             Case 8
             Ms = 100
                 Call Turnright
             Case 9
             Ms = 200
                 Call Turnright
             Case 10
             Ms = 400
                 Call Turnright
             Case 11
             Ms = 500
                 Call Turnright
             Case 12
             Ms = 600
                 Call Turnright
    
              Case Else
              Sound Portd.7 , 1000 , 200
    
          End Select
    
    End Sub
    
    
    
    
    Sub Turnleft()
    Text2 = "Linksdrehung"
    
    Call Lcdout()
    
    'Print "drehen um " ; Ms ; " nach  links"
    'servo auf mitte stellen
    Servopos = Center
    Servo(1) = Servopos
    
         'Linker Motor ein
       Portc.6 = 1                                              'bestimmt Richtung
       Portc.7 = 0                                              'bestimmt Richtung
       Portd.4 = 1                                              'Linker Motor EIN
    
       'Rechter Motor ein
       Portb.0 = 0                                              'bestimmt Richtung rechter Motor
       Portb.1 = 1                                              'bestimmt Richtung rechter Motor
       Portd.5 = 1                                              'rechter Motor EIN
    
       'beschleunigen der motoren
       V = 0
       Do
          Pwm1a = V
          Pwm1b = V
          Waitms 20
          V = V + 200
       Loop Until V > 1000
    
       Waitms Ms
       Call Bremsen
    
       Ms = 0
    
    End Sub
    
    
    
    
    Sub Turnright()
    Text2 = "Rechtsdrehung"
    
    Call Lcdout()
    
    'servo auf mitte stellen
    Servopos = Center
    Servo(1) = Servopos
    
    
        'Linker Motor ein
       Portc.6 = 0                                              'bestimmt Richtung
       Portc.7 = 1                                              'bestimmt Richtung
       Portd.4 = 1                                              'Linker Motor EIN
    
       'Rechter Motor ein
       Portb.0 = 1                                              'bestimmt Richtung rechter Motor
       Portb.1 = 0                                              'bestimmt Richtung rechter Motor
       Portd.5 = 1                                              'rechter Motor EIN
    
       'beschleunigen der motoren
       V = 0
       Do
          Pwm1a = V
          Pwm1b = V
          Waitms 20
          V = V + 200
       Loop Until V > 1000
    
       Waitms Ms
    
       Call Bremsen
    
       Ms = 0
    
      End Sub
    
    
    
    
      Sub Turn180()
    'servo auf mitte stellen
     Text2 = "180 Grad Drehung"
    Call Lcdout()
    
    
        'Linker Motor ein
       Portc.6 = 0                                              'bestimmt Richtung
       Portc.7 = 1                                              'bestimmt Richtung
       Portd.4 = 1                                              'Linker Motor EIN
    
       'Rechter Motor ein
       Portb.0 = 1                                              'bestimmt Richtung rechter Motor
       Portb.1 = 0                                              'bestimmt Richtung rechter Motor
       Portd.5 = 1                                              'rechter Motor EIN
    
       'beschleunigen der motoren
       If V = 0 Then
       Do
          Pwm1a = V
          Pwm1b = V
          Waitms 20
          V = V + 100
       Loop Until V > 1000
       End If
    
       Waitms 1250                                              'warten
    
    
       'ab
      Call Bremsen
    
    
    End Sub
    
    
    
    
    
    Sub Stopnow()
    Text2 = "Vollbremsung"
     Call Lcdout()
    V = 0
      Pwm1a = V                                                 'Linker Motor aus
      Pwm1b = V                                                 'rechter Motor aus
    End Sub
    
    
    Sub Anfahren()
    Text2 = "Anfahren"
     Call Lcdout()
     'Linker Motor ein
       Portc.6 = 0                                              'bestimmt Richtung
       Portc.7 = 1                                              'bestimmt Richtung
       Portd.4 = 1                                              'Linker Motor EIN
    
       'Rechter Motor ein
       Portb.0 = 0                                              'bestimmt Richtung rechter Motor
       Portb.1 = 1                                              'bestimmt Richtung rechter Motor
       Portd.5 = 1                                              'rechter Motor EIN
    
       'Beschleunigen
       V = 0
       Do
          Pwm1a = V
          Pwm1b = V
          Waitms 10
          V = V + 100
       Loop Until V > 1000
    End Sub
    
    
    
    
     Sub Bremsen()
     Text2 = "Bremsen"
     Call Lcdout()
    
     Do
          Pwm1a = V
          Pwm1b = V
          Waitms 20
          V = V - 200
       Loop Until V < 1
    
       Pwm1a = 0                                                'Linker Motor aus
       Pwm1b = 0
    
     End Sub
    
    
    
    
    
    
     Sub Rewind()
     Text2 = "Rewind..."
     Call Lcdout()
    
     'Linker Motor ein
       Portc.6 = 1                                              'bestimmt Richtung
       Portc.7 = 0                                              'bestimmt Richtung
       Portd.4 = 1                                              'Linker Motor EIN
    
       'Rechter Motor ein
       Portb.0 = 1                                              'bestimmt Richtung rechter Motor
       Portb.1 = 0                                              'bestimmt Richtung rechter Motor
       Portd.5 = 1                                              'rechter Motor EIN
    
       'Beschleunigen
       V = 0
       Do
          Pwm1a = V
          Pwm1b = V
          Waitms 10
          V = V + 100
       Loop Until V > 1000
    
       Waitms 100
    
     End Sub
    
    
     Sub Lcdout()
     Cls
     Locate 1 , 1
     Lcd Name
    
     Locate 2 , 1
     Lcd Text2
    
     Call Temp
     Locate 3 , 1
     Lcd "Temp= " ; Fusing(value , "#.#") ; " Grad " ; Dl
    
     Call Batteriespannung
      Locate 4 , 1
     Lcd "Ubatt= " ; Fusing(volt , "#.##") ; " V"
    
    
      Incr Dl
    
     End Sub
    
    
    
    
    
     Sub Batteriespannung()
    Local W As Word
    Local Z As String * 10
    
      Start Adc
       W = Getadc(6)
       Volt = W * Ref
       Volt = Volt * 5.2941
    
    End Sub
    
    
    
    
    Sub Temp()
    
    I2cstart
    I2cwbyte Device
    I2cwbyte &HEE
    I2cstop
    
    I2cstart
    I2cwbyte Device
    I2cwbyte &HAA
    I2cstop
    
    I2cstart
    I2cwbyte Deviceread
    I2crbyte Lowtemp , Ack
    I2crbyte Hightemp , Nack
    
    I2cstop
    
    Value = Lowtemp * 10
    If Hightemp = 128 Then
      Value = Value + 5
    End If
    Value = Value / 10
    
    End Sub
    
    
    Timer_irq:
      Timer1 = Timervorgabe
    
    Call Lcdout
    Return

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    04.11.2005
    Ort
    Erlangen
    Alter
    42
    Beiträge
    77
    also des problem ist nur wie aktualisieren ich meine display anzeige alle 1 sek ohne timer1
    thx

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    Hallo,

    > also des problem ist nur wie aktualisieren ich meine display anzeige alle
    > 1 sek ohne timer1

    Du nimmst Timer 0 oder Timer 2, Prescale = 1024 und dann zählst Du im OvF- Interrupt bis 61.

    Oder Du nimmst Timer 2 und spendierst ihm einen eigenen Quarz.

    Oder Du schreibst Dein Programm auf einen freilaufenden Timer1 um und verwendest die Output Compare Interrupts.

    Oder...

    Ciao,
    Werner

  5. #15
    Benutzer Stammmitglied
    Registriert seit
    04.11.2005
    Ort
    Erlangen
    Alter
    42
    Beiträge
    77
    servus werner,
    tja nächstes problem timer0 wird von den Servos verwendet oder?
    wie mach ich das dann mit timer 2 und hat den mein atmega 32 überhaupt?
    danke soweit

  6. #16
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    uiuiuiui.
    Timer0 für eine Sekunde, damit Timer1 frei wird:
    Ganz einfach: definiere 1/100 Sekunde Interrupts. im interrupt zählst du irgend ein (neues) Byte immer eins drauf. isses 100, dann ist eine Sekunde rum, du setzt das Zählbyte wieder auf 0.
    Das is mal das.

    Bei dir ist es gefährlich, da sich dein Programm mit der Interrupt routine um LCDOUT streitet und um den ADC.

    Wenn der Robby spinnt, dann verziche testweise mal auf den LCDOUT im Interrupt, und schau, ob es was verändert.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    04.11.2005
    Ort
    Erlangen
    Alter
    42
    Beiträge
    77
    servus nochmal,
    also ich kann den timer 0 leider net verwenden weil der für die servo ansteuerung von Bascom verwendet wird.
    oder hab ich da was falsch verstanden?
    und nen timer 2 hat der mega32 net oder?
    ja weil mit timer 0 hab ichs schon versucht dann gehen die Servos nimmer...
    auszug aus Bascom hilfe:
    " Resources used:
    TIMER0 is used to create the ISR."
    danke für euere mühen...

  8. #18
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Au weia, da werden wir wohl den Kopf schief halten müssen, damit das Hirn zusammenläuft und uns was einfällt. Timer 2 sollte es geben, aber da les ich erst lieber mal nach, ob's da was zu wissen gibt.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #19
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    Hallo Cassiopeia,

    > und nen timer 2 hat der mega32 net oder?

    das Datenblatt zum verwendeten µC ist häufig eine unerschöpfliche Quelle an Information!

    Auszug aus dem M32 Datenblatt der Firma Atmel:

    8-bit Timer/Counter2 with PWM and Asynchronous Operation

    Timer/Counter2 is a general purpose, single compare unit, 8-bit Timer/Counter module.

    The main features are:
    • Single Compare unit Counter
    • Clear Timer on Compare Match (Auto Reload)
    • Glitch-free, Phase Correct Pulse Width Modulator (PWM)
    • Frequency Generator
    • 10-bit Clock Prescaler
    • Overflow and Compare Match Interrupt Sources (TOV2 and OCF2)
    • Allows clocking from External 32 kHz Watch Crystal Independent of the I/O Clock

    Overview
    A simplified block diagram of the 8-bit Timer/Counter is shown in Figure 53. For the actual placement of I/O pins, refer to “Pinout ATmega32” on page 2. CPU accessible I/O Registers, including I/O bits and I/O pins, are shown in bold. The device-specific I/O Register and bit locations are listed in the “8-bit Timer/Counter Register Description” on page 123.


    Ciao,
    Werner

  10. #20
    Benutzer Stammmitglied
    Registriert seit
    04.11.2005
    Ort
    Erlangen
    Alter
    42
    Beiträge
    77
    danke an werner und picnick,
    ich habe alle verfügbaren neuralen ressourcen aktiviert und es nun geschafft der timer2 läuft und alles ist perfekt.
    danke für eure hilfe
    gruß und prost
    CP

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen