- Modernes Energiemessgeraet    Werbung      
Ergebnis 11 bis 20 von 28

Thema: PWM und SOFTUART gleichzeitig

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #17
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    33
    Beiträge
    1.578
    Ok, das mit dem festen Senden von Daten und dem Blinken werd ich mal ausprobieren, damit ich weiß, was funktioniert und was nicht! Alternativ dazu möchte ich auch noch den PC über einen MAX232 anschließen, um die Input-Daten vom ATTINY ausgeben zu lassen. Mal sehen, was dabei rauskommt..
    @Richard:
    Kannst du mir sagen, wo der Unterschied zwischen Inputbin und Get liegt? Ich habe keinen gefunden, evtl. bin ich momentan etwas zu abgelenkt, ums zu sehen.. Wäre nett von dir.

    Gruß
    Chris

    EDIT:
    Habs jetzt endlich erfolgreich geschafft, das meiste so hinzubiegen, wie ich es will Bild  
    Hier mal die Codes:
    ATMEGA8:
    Code:
    $regfile = "m8def.dat"
    $crystal = 16000000
    $framesize = 80
    $hwstack = 80
    $swstack = 80
    $baud = 115000
    
    
    
    Config Timer2 = Timer , Prescale = 256
    On Timer2 Detectrxpause
    Enable Timer2
    
    Config Int1 = Rising
    On Int1 Getreceiver
    Enable Int1
    
    
    Config Pind.3 = Input
    Portd.3 = 0
    
    
    Const Start_byte = 127
    Const _maxchannel = 4
    
    Dim Bufferbyte As Byte
    Dim Kanal(_maxchannel) As Byte
    Dim Channel As Byte
    Dim _bl(_maxchannel) As Word
    Dim I As Byte
    Dim _crc As Word
    
    
    Enable Interrupts
    
    
    Do
    
    
    For I = 1 To 4
    _bl(i) = 63200
    Next I
    
    _crc = Crc16(_bl(1) , 4)
    
    
    Printbin Start_byte ; _bl(1) ; _bl(2) ; _bl(3) ; _bl(4) ; _crc
    
    Waitms 100
    
    
    Loop
    
    End
    
    
    Getreceiver:
    If Channel > 0 And Channel < 5 Then
      Kanal(channel) = Timer2
    End If
    Timer2 = 6
    Incr Channel
    Return
    
    Detectrxpause:
    Channel = 0
    Return
    ATTINY2313:
    Code:
    $regfile = "attiny2313.dat"
    $crystal = 16000000
    $framesize = 30
    $hwstack = 32
    $swstack = 30
    $baud = 115000
    
    
    Config Timer1 = Timer , Prescale = 8
    Timer1 = 62535
    On Timer1 Servoirq
    Enable Timer1
    
    
    Config Portd.2 = Output
    Config Portd.3 = Output
    Config Portd.4 = Output
    Config Portd.5 = Output
    
    
    Dim Kanal As Byte
    Dim Servo(4) As Word
    Dim _bl(4) As Word
    Dim I As Word
    Dim _crc As Word
    Dim _crcold As Word
    Dim _start As Byte
    
    'min: 61535, mitte 62535, max 63535 = 2000 schritte
    
    Const Start_byte = 127
    Const Min_servo = 63800
    Const Max_servo = 61535
    Const Diff_servo = Max_servo - Min_servo
    
    For I = 1 To 4
    _bl(i) = Min_servo
    Servo(i) = _bl(i)
    Next I
    
    
    Enable Interrupts
    Wait 3
    
    
    Do
    
    
    If Ischarwaiting() > 0 Then
     Inputbin _start
     If _start = Start_byte Then
      Inputbin _bl(1) , _bl(2) , _bl(3) , _bl(4) , _crc
      If _crc = Crc16(_bl(1) , 4) And _crc <> _crcold Then
       For I = 1 To 4
        Servo(i) = _bl(i)
       Next I
       _crcold = _crc
      End If
     Else
      For I = 1 To 4
       Servo(i) = Min_servo
      Next I
     End If
    End If
    
    
    Loop
    
    
    Servoirq:
    If Kanal = 0 Then
       If Portd.2 = 0 Then                                      'wenn port low
          Timer1 = Servo(1)                                     'dann timer auf entsprechende verzögerung
          Portd.2 = 1                                           'und port anschalten
       Else                                                     'das hier passiert erst bei dem darauf folgenden interrupt
          Portd.2 = 0                                           'dann port wieder ausschalten
          Incr Kanal                                            'und den nächsten kanal bearbeiten
       End If
    End If
    If Kanal = 1 Then
       If Portd.3 = 0 Then
          Timer1 = Servo(2)
          Portd.3 = 1
       Else
          Portd.3 = 0
          Incr Kanal
       End If
    End If
    If Kanal = 2 Then
       If Portd.4 = 0 Then
          Timer1 = Servo(3)
          Portd.4 = 1
       Else
          Portd.4 = 0
          Incr Kanal
       End If
    End If
    If Kanal = 3 Then
       If Portd.5 = 0 Then
          Timer1 = Servo(4)
          Portd.5 = 1
       Else
          Portd.5 = 0
          Incr Kanal
       End If
    End If
    
    If Kanal = 4 Then
      Timer1 = 65530                                            '40000 | eine pause von ca. 12ms bis zum nächsten interrupt. Bei guten Servos oder Brushlessreglern kann man hier bis auf 65530 gehen ==> ansteuerfrequenz von ~ 200Hz
      Kanal = 0
    End If
    Return
    End
    Der Unterschied liegt wirklich im Servo-Code! Danke für den Tip... Jetzt gehts auf die nächste Hürde zu, das Summensignal auf den Servo-Bereich umzuskalieren. Danach muss noch die WM+ eingebunden werden.
    Geändert von Che Guevara (15.05.2011 um 18:56 Uhr)

Ähnliche Themen

  1. 2 ISR gleichzeitig?
    Von DerSchatten im Forum C - Programmierung (GCC u.a.)
    Antworten: 15
    Letzter Beitrag: 26.01.2010, 09:48
  2. Problem ISP und USI als i2c gleichzeitig
    Von vklaffehn im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 16.08.2007, 14:46
  3. 8 Aufgaben gleichzeitig?
    Von Athlonxp2000 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 28.12.2006, 14:15
  4. 2 Interrupts gleichzeitig???
    Von x8r im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 23.01.2006, 18:49
  5. 16 IOs und LCD (quasi-gleichzeitig)
    Von lanzelot im Forum C-Control II
    Antworten: 13
    Letzter Beitrag: 01.02.2005, 04:21

Berechtigungen

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

    Werbung      Solar Speicher und Akkus Tests