- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 34

Thema: mega8 oder tiny2313 oder tiny45 oder ... ?

  1. #11
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    44
    Beiträge
    1.273
    Anzeige

    Powerstation Test
    Wieso bekomme ich denn auf einmal keine Benachrichtigungen mehr zu disem Thema...?
    Ich habe bisher schon 4 Servo PWMs mit ca. 300 Hz erzeugt, und das hat schon einigermaßen funktioniert, aber eben nur einigermaßen. Jetzt möchte ich es besser machen. Das mit der "SoftwarePause" ist gar nicht schlecht. Ich werde mal irgendwas in der Richtung probieren. Schade nur, dass ich kein Oszi habe und daher die Beurteilung der PWM Qualität nicht so richtig objektiv wird. Müsste ich evtl. im Flug testen... Das wird aber bei meinem Programmierstil (Trial + Error) ziemlich zeitaufwändig.
    Viele Grüße, William
    -> http://william.thielicke.org/

  2. #12
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    09.05.2007
    Beiträge
    202
    Hallo William,

    das was du vor hast, verwende ich schon länger, allerdings zu einem anderen Zweck. Ich habe ein paar ATMega8, welche als I2C-Slaves Befehle entgegennehmen und dementsprechend in PWM umsetzen. Sowohl I2C als auch PWM sind hardwaremäßig umgesetzt und alles in Bascom programmiert. Die ATMega8 habe 3 PWM-Ausgänge und Hardware-TWI (I2C). Bei der Programmumsetzung kann ich dir helfen.
    Gruß, Stefan

  3. #13
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    44
    Beiträge
    1.273
    Hi Stefan,
    das wäre natürlich fantastisch...! Sobald ich damit angefangen habe und die ersten Probleme auftauchen werde ich auf dich zukommen. Du benutzt PWM aber nicht um Servos anzusteuern, oder? Wie oft pro Sekunde reagieren die Mega8 auf Änderungen des I²C Sollwerts? Bei mir sollten das so ca. 400 Hz werden, ist das realistisch?
    Viele Grüße, William
    -> http://william.thielicke.org/

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    09.05.2007
    Beiträge
    202
    Hallo William,

    ich lasse den Prozessor bei einer Taktfrequenz von 8 MHz einfach eine Schleife laufen, die das TWCR-Register abfragt. Von da aus wird dann einfach verzweigt. 400 Hz sollte also kein Problem sein.
    Gruß, Stefan

  5. #15
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    09.05.2007
    Beiträge
    202
    Hallo William,

    ich habe mal kurz eines meiner Programme zurechtgestutzt:

    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    $lib "i2c_twi.lbx"
    
    $hwstack = 256
    $swstack = 256
    $framesize = 64
    
    
    'Subs deklarieren
    Declare Sub Twi_init_slave
    Enable Interrupts
    
    'Ports setzen
    Ddrb = &B0000111
    Portb = &B11111000
    Ddrd = &B11101111
    Portd = &B00010000
    
    'SDA und SCL definieren
    Config Sda = Portc.4
    Config Scl = Portc.5
    I2cinit
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
    'PWM1a auf Pinb.1; PWM1b auf Pinb.2
    Config Timer2 = Pwm , Compare Pwm = Clear Up
    'PWM2 auf Pinb.3
    
    Waitms 100
    
    Call Twi_init_slave                                         ' TWI aktivieren
    
    Dim I As Byte
    Dim J As Byte
    
    Const Maxanzahlbyte = 2                                     ' Wenn mehr Zeichen kommen werden diese verworfen !
    Dim Messagebuf(maxanzahlbyte) As Byte
    Dim Anzahlbuf As Byte                                       ' Anzahl Zeichen die gesendet wurden
    Dim Neuemsg As Byte                                         ' zeigt an wenn eine neue Message gültig ist
    
    Dim Twi_control As Byte                                     ' Controlregister lokale kopie
    Dim Twi_status As Byte
    Dim Twi_data As Byte
    Const Slaveid = &H82                                        'Adresse für I2C
    
    Twi_data = 0
    Anzahlbuf = 0
    Neuemsg = 0
    
    Do
    
        ' schauen ob TWINT gesetzt ist
        Twi_control = Twcr And &H80                             ' Bit7 von Controlregister auslesen
    
        If Twi_control = &H80 Then
            Twi_status = Twsr And &HF8                          ' Status ->Bit3 bis Bit7
    
            Select Case Twi_status
    
                ' Slave Adress received, wir sind gemeint !
                Case &H60 :
                    Twcr = &B11000100                           ' TWINT löschen, erzeugt ACK
                    Anzahlbuf = 0
                    Neuemsg = 0                                 ' Flag für Message ungültig
                ' Byte mit ACK
                Case &H80 :
                    If Anzahlbuf < Maxanzahlbyte Then
                        Incr Anzahlbuf                          ' zähler +1
                        Messagebuf(anzahlbuf) = Twdr
                    End If
                    Twcr = &B11000100                           ' TWINT löschen, erzeugt ACK
    
                ' Stop oder restart empfangen
                Case &HA0 :
                    Twcr = &B11000100                           ' TWINT löschen, erzeugt ACK
                    ' es müssen 2 Byte sein, damit das Paket OK ist
                    If Anzahlbuf = Maxanzahlbyte Then
                        Neuemsg = 1                             ' Flag für Message gültig
                    Else
                        Neuemsg = 0                             ' Flag für Message ungültig
                    End If
                ' was anderes empfangen
                Case Else :
                    Twcr = &B11000100                           ' TWINT löschen, erzeugt ACK
    
            End Select
        End If
    
        ' ein gültiges Paket angekommen
        If Neuemsg = 1 Then
          Neuemsg = 0                                           ' Flag wieder löschen
            Select Case Messagebuf(1)
            'Erster Wert
                   Case 1:
                      Pwm1a = Messagebuf(2)
                   Case 2:
                      Pwm1b = Messagebuf(2)
                   Case 3:
                      Compare2 = Messagebuf(2)
                   Case Else:
            End Select
        'Waitms 250
        End If
    Loop
    End
    
    
    ' TWI als slave aktivieren
    Sub Twi_init_slave
        Twsr = 0                                                ' status und Prescaler auf 0
        Twdr = &HFF                                             ' default
        Twar = Slaveid                                          ' Slaveadresse setzen
        Twcr = &B01000100                                       ' TWI aktivieren, ACK einschalten
    End Sub
    Ich habe es nicht getestet, aber wenn man 2 Bytes nacheinander schickt (erstes 1, 2 oder 3) sollte der zweite Wert auf den entsprechenen PWM-Kanal ausgegeben werden.
    Das Grundprogramm stammt übrigens aus dem RN-Wissen Artikelbereich.
    Gruß, Stefan

  6. #16
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    44
    Beiträge
    1.273
    Hi,
    @stevie, ich konnte dein Programm noch nicht übersetzen und testen, als erstes möchte ich aber sowieso erstmal erfolgreich ein Servo ansteuern (wenn irgendwie möglich per hardware PWM).
    Dazu habe mir mal die Grundlagen angeschaut, aber anscheinend einen Denkfehler, den die Theorie passt nicht zu meinen Beobachtungen...:
    Ich habe einen tiny45 mit 8MHz int. Takt. Clock divide by 8 ist erstmal an.
    den Timer0 habe ich als PWM konfiguriert:
    Code:
    Config Timer0 = Pwm , Compare B Pwm = Clear Up , Prescale = 1024
    Enable timer0
    Das PWM Signal soll auf PB.1 "herauskommen"
    Code:
    Config Portb.1 = Output
    Ocr0b = 128
    Angenommen, der Code oben wäre richtig, so sollte doch folgendes passieren:
    µC Frequenz=1MHz, Prescaler = 1024 ==> PWM frametime = 976,56 Hz
    Wenn Ocr0b jetzt auf 128 gesetzt ist, sollte Portb.1 doch eigentlich abwechselnd 1/(972,56/2) Sekunden an und aus sein. Tatsächlich blinkt die angeschlossene LED aber mit ca. 2 Hz. Was habe ich da falsch gedacht....? So wie es aussieht schaffe ich es eh nicht ein Servo per Hardware anzusteuern, da werde ich wohl oder übel auf software umsteigen müssen...
    Viele Grüße, William
    -> http://william.thielicke.org/

  7. #17
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wenn man bei 1 MHz Takt den Teiler auf 1024 setzt, hat man pro zeitschritt ca. 1 ms. Bei einem 8 Bit timer und 128 als PWM Wert sollte man dann 128 ms an und 128 ms aus bekommen, bei phasenrichtigem PWM sogar noch doppelt so lange.
    So direkt mit der Unterstützung von Bascom aus wird das mit dem PWM auch kaum gehen. Da wird man schon die register von hand Programmieren müssen.


    Für die Servo steuerung sollte auch der Code aus dem Wiki-bereich gehen:
    http://www.rn-wissen.de/index.php/Servoansteuerung.

    So schlecht ist das Beispiel nicht. Mit nur einem 8 Bit timer müßte man aber überlegen die Auflösung des Timers noch etwas erweitern, den man braucht ja pulse von 1-2 ms. Für 2 ms würde ein Timer Takt von 1/8 MHz noch gerade reichen. Wenn man mehr auflösung haben will, müßte man noch zusätzlich die Zahl der Überläufe runterzählen, und erst wenn man da 0 erreicht hat den Code zum umschalten der Pins ausführen.

    Ein Problem kann da nur ein weiterer Interrupt für I2C sein. Da sollte man sehen, dass man wenigsten I2C per hardware und ohne Interrupt hinkriegt. So kompliziert sollte das nicht sein, denn man muß ja nur Daten empfangen, nicht senden. Bei 100 kHz I2C Takt hat man ja immerhin 80 µs für eine Byte. So lange sollte die ISR fürs PWM Signal hoffentlich nicht brauchen. Notfalls muß man doch mit mehr als 1 MHz Takt arbeiten.

  8. #18
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    44
    Beiträge
    1.273
    Für die Servo steuerung sollte auch der Code aus dem Wiki-bereich gehen:
    http://www.rn-wissen.de/index.php/Servoansteuerung
    Der ist ja auch von mir ;-D. Ich habe ein Beispiel für I²C bekommen (vom RN-User Bammel), soweit ich das verstanden habe ist der in Hardware ausgeführt. Ich dachte, ich lasse den tiny mit 8 MHz laufen, nehme den 8bit Timer und einen prescaler von 8. Dann dauert ein Overflow 0,255 ms. Ich teile meinen Puls (Länge 1 bis 2 ms) dann einfach in mehrere Overflows auf, wie von dir vorgeschlagen. Also erst vier komplette Überlaufe (~1ms), dann variabel nochmal ca. 4 Überläufe (legen die Servoposition fest) und dann nochmal ca. 70 Überläufe (bzw. weniger, da ich ein "schnelles" signal für meine Regelung brauche.
    Viele Grüße, William
    -> http://william.thielicke.org/

  9. #19
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    44
    Beiträge
    1.273
    Jetzt stehe ich schon wieder auf dem Schlauch.... Entweder, der timer0 eines tiny45 hat einen versteckten prescaler von dem ich nichts weiss, oder ich überfordere den controller total mit meinem timer0 interrupt...
    Was ich versuche: Timer0 soll alle 4µs überlaufen. D.h. nach 250 overflows sind 1ms verstrichen, nach 500 overflows sind 2ms verstrichen. Das ist dann die Zeit in der mein Pin auf high geschaltet wird. Danach warte ich nochmal 5000 overflows ab (=20ms), das ist die typische Pause im Servo PWM Signal.
    Ich dachte, ich probiere es mal auf diese einfache Art und Weise, aber anscheinend haut da was überhaupt nicht hin. Alle Zeiten scheinen 10mal so lange zu dauern wie geplant. Fuse divideby8 ist aus, interner Oszillator ist auf 8MHz eingestellt und auch so im Code angegeben. Was läuft hier falsch...? Ist 4µs viiiiiiiel zu kurz für den µC?
    Code:
    'Settings
    $regfile = "attiny45.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 64
    $crystal = 8000000
    
    Dim Count As Word
    Dim Setcount As Word
    Dim Servopos As Word
    Dim Longpause As Bit
    Const Timervorgabe = 224
    
    Config Portb.1 = Output
    Portb.1 = 1
    Config Timer0 = Timer , Prescale = 1
    On Timer0 Timer0isr
    Timer0 = Timervorgabe
    Enable Interrupts
    Enable Timer0
    
    Do
    Servopos = 126                                              'ca. Mittelstellung (werte können zw 0 und 250 sein)
    Setcount = Servopos + 250                                   '==> setcount ist zwischen 250 und 500
    Waitms 2000                                                 'einfach mal nichts tun
    Loop
    End
    
    
    Timer0isr:
    Timer0 = Timervorgabe                                       'Vorgabe=224 ==> frequenz von 250000Hz oder 1/f = 4µs
    Incr Count                                                  'zähle wie oft 4µs verstrichen sind
    If Longpause = 0 Then                                       'longpause ist die pause von ca. 20ms beim servosignal
      If Count >= Setcount Then                                 '==> 1 bis 2 ms verstrichen
        Count = 0                                               'wieder bei null anfangen
        Portb.1 = 0                                             'pin auf low setzen
        Longpause = 1                                           '20 ms warten
      End If
    Else                                                        'longpause=1
      If Count >= 5000 Then                                     '==> 20 ms warten
        Count = 0                                               'nach 20 ms wieder bei null anfangen
        Longpause = 0                                           'das flag zurücksetzen
        Portb.1 = 1                                             'pin auf high setzen
      End If
    End If
    Return
    Viele Grüße, William
    -> http://william.thielicke.org/

  10. #20
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.01.2007
    Ort
    westliches Pannonien
    Beiträge
    123
    Hallo!

    Welche Bascom Version verwendest Du?
    Unter Vorbehalt:
    Bascom hatte ein Problem mit dem richtigen Initieren der Timer
    bei den Tiny 25/45/85

    Entweder Timerregister per Hand setzen oder auf 1.11.9.8
    updaten.

    Hoffe, ich konnte helfen.

    MfG
    Rone

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

12V Akku bauen