- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: RC-Empfängers an PCINT1/2 bei ATMEGA88

  1. #11
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    Anzeige

    Powerstation Test
    ...wollte eigentlich auch im vorletzten Beitrag schon mit rein geschrieben haben, dass ich das ProgTool aus einem bestimmten Grund zum Fusen vorziehe: Dort steht nämlich die Frequenz dabei Könnte ja helfen das Problem zu lösen, wenn man nicht weiß was 111111 oder so bedeuten soll.
    Ich weiß das nämlich auch nicht, aber ich weiß wo es steht.

    Wie kann es sein das Dein Chip auf 16Mhz läuft aber du es dem Programm nicht mitteilst? - ich hatte Dich drauf hingewiesen, jetzt also nochmal die konkrete Frage.
    Meinst Du es bringt Dir und dem Chip etwas wenn Du das Timing selbst durch einen (nicht kaufbaren/unmöglichen) Quarz manipulierst? - ich meine nicht.
    Hast Du denn auch einen 16Mhz Quarz angeschlossen? - sieht eher so aus als wenn Du nur schreibst Du hast es eingestellt.

    Bascom gibt es vom Hersteller.

    EDIT: ProgTool hyperlinked
    Geändert von HeXPloreR (19.08.2013 um 16:25 Uhr)

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    15.08.2013
    Ort
    Güstrow
    Beiträge
    31
    Nein. es hängt ein 16 Mhz dran. Spreizung der Timerergebnisse erhöhte sich aber, umso geringer die Frequenz war. ich weiß nicht wieso.

  3. #13
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    Deinem Programm nutzt es aber nichts wenn der Quarz zwar dran ist, sogar eingestellt in den Fuses - was bleibt jetzt noch zu tun?

    Tipp: $crystal = 512000 ' ist sicher falsch wenn eine 16000000Hz Quarzangabe auch vom Compiler benutzt werden soll

    EDIT:Leider habe ich mich entweder vertan mit der Quarzangabe oder es wurde in den neueren Versionen etwas verändert in der Ansicht beim ProgTool...ich bin mir sicher man konnte dort direkt z.B. einen 16Mhz Quarz sehen. Schade das war irgendwie immer sehr einfach.
    Geändert von HeXPloreR (19.08.2013 um 21:30 Uhr)

  4. #14
    Benutzer Stammmitglied
    Registriert seit
    15.08.2013
    Ort
    Güstrow
    Beiträge
    31
    Nein, ich verwende verwende einen 16 Mhz Quarz und habe in den Fuses auch, meiner Meinung nach, 16 Mhz eingestellt.
    Und ja ich habe trotzdem 512 Khz eingestellt. Einfach, weil die Differenz der Werte des Timers zwischen bei 512khz am größten ist. Die Umrechnungsvariablen sind jetzt auf diese Spreizung angepasst. Solange ich kein Display an dieser Schaltung habe und die Werte vernünftig auslesen kann, lasse ich es jetzt dabei.

    Mir ist beim Testen aufgefallen, dass ich wohl einen Denkfehler, was die High/Low- und enable-Beschaltung angeht. Ich gebe den FET-Treibern jetzt einfach ein 1 für die eine und ein 254 für die andere Richtung. (keine 0/255 weil die Bootstrap-Schaltung der Teiber den oberen Fet nicht auslösen würde) Über den Enable-Eingang gebe ich jetzt das PWM-Signal für die Geschwindigkeit.

    Ich weiß nicht genau, ob man so eine H-Brücke treibt, aber das funktioniert noch besser und ich hab keine Verslustleistung in Neutral-Stellung. Weitere Anregungen nehme ich gern entgegen.

    Wen's interessiert, hier der geänderte Code
    Code:
    'Autosteuerung
    $regfile = "m88def.dat"
    $crystal = 512000
    $hwstack = 40
    $swstack = 40
    $framesize = 40
    
    '** Ports/Pins *********************************************************************************
    Config Portd.5 = Output                           '11 PWM_L_vor/zurück
    Config Portd.6 = Output                           '12 PWM_L_enable (PWM)
    Config Portb.3 = Output                           '17 PWM_R_enable (PWM)
    Config Portd.3 = Output                           '05 PWM_R_vor/zurück
    Config Portc.3 = Output                           '26 Status_LED
    
    Config Pinc.4 = Input                             '27 correction Left
    Config Pinc.1 = Input                             '24 corrention Right
    Config Pind.2 = Input                             '04 Taster
    Config Pinc.0 = Input                             '23 rechte Eingabe Poti
    Config Pinc.5 = Input                             '28 Linke Eingabe Poti
    
    '** Ports benennen *****************************************************************************
    Correct_l Alias Pinc.4                            'pin 27
    Correct_r Alias Pinc.1                            'pin 24
    Taster Alias Pind.2                               'pin 04
    Led Alias Portc.3                                 'pin 26
    R_poti Alias Portc.0                              'pin 23
    L_poti Alias Portc.5                              'pin 28
    'RC_L_in Pin 06
    'RC_R_in Pin 25
    
    '** Variablen **********************************************************************************
    Dim In_l As Integer                               'Eingabevariablen Signal
    Dim In_r As Integer
    Dim L_direction As Bit                            'Richtung der Kanäle festlegen
    Dim R_direction As Bit
    Dim L_quotient As Single                          'Runterrechnen auf Bytewert
    Dim R_quotient As Single
    Dim L_verschiebung As Word                        'Verschieben des Mittelwertes
    Dim R_verschiebung As Word
    Dim L_korrekt As Single                           'Anpassen unterschiedlicher Motoren
    Dim R_korrekt As Single
    Dim Calc_l As Single                              'Berechnung PWM
    Dim Calc_r As Single
    Dim Pwm_l As Integer                              'Ausgabe PWM
    Dim Pwm_r As Integer
    Dim I As Word                                     'allgemeine Variable
    
    '** Configs ************************************************************************************
    Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256
    Config Timer1 = Counter , Prescale = 8 , Noise Cancel = 1
    Config Timer2 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Enable Timer0
    Enable Timer1
    Enable Timer2
    Start Adc
    Enable Interrupts
    Enable Pcint1
    Enable Pcint2
    Pcmsk1 = &B00000000
    Pcmsk2 = &B00000000
    Pcmsk1.pcint10 = 1
    Pcmsk2.pcint20 = 1
    
    On Pcint1 Rc_in_r
    On Pcint2 Rc_in_l
    
    '** Display Einrichten *************************************************************************
    'Config Lcdpin = Pin , _
    '       Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portb.4 , Rs = Portb.5
    'Config Lcd = 16 * 2
    'Cursor Off
    'Cls
    
    '** Variablen zuweisen *************************************************************************
    Taster = 1
    L_quotient = 6.867
    R_quotient = 6.621
    L_verschiebung = 277
    R_verschiebung = 293
    
    '** Initialisierung ****************************************************************************
    
    Pwm0a = 0                                         'Enable Aus
    Pwm2a = 0
    
    Do                                                'Programm freigeben
    Loop Until Taster = 0
    
    '** Hauptschleife ******************************************************************************
    Go:
    Do
    
      Led = 1                                         'Frequenzmessung möglich
    
      'Locate 1 , 1 : Lcd " " ; In_l ; " "
      'Locate 2 , 1 : Lcd " " ; In_r ; " "
    
    
      If In_l > 4000 Or In_l < 1500 Or In_r > 4000 Or In_r < 1500 Then Goto Fehler
    
      Calc_l = In_l
      Calc_r = In_r
    
      'Linearregelung ******************************************************************************
      Calc_l = Calc_l / 6.867
      Calc_l = Calc_l - 277
    
      Calc_r = Calc_r / 6.621
      Calc_r = Calc_r - 300
    
      Led = 0
    
      '** Variablenübergabe ************************************************************************
    
      Pwm_l = Calc_l                                  'Linker Kanal
    
      Pwm_l = Pwm_l * 2
      Pwm_l = Pwm_l - 256
    
      If Pwm_l > 0 Then
         L_direction = 1
      Else
         L_direction = 0
         Pwm_l = -pwm_l
      End If
    
      If Pwm_l > 254 Then Pwm_l = 254
      If Pwm_l < 1 Then Pwm_l = 1
    
      Pwm_r = Calc_r                                  'rechter Kanal
    
      Pwm_r = Pwm_r * 2
      Pwm_r = Pwm_r - 256
    
      If Pwm_r > 0 Then
         R_direction = 1
      Else
         R_direction = 0
         Pwm_r = -pwm_r
      End If
    
      If Pwm_r > 254 Then Pwm_r = 254
      If Pwm_r < 1 Then Pwm_r = 1
    
      '** PWM umsetzen *****************************************************************************
    
      If L_direction = 1 And Pwm_l > 7 Then           'links vorwärts
         Pwm0a = Pwm_l
         Pwm0b = 1
      End If
    
      If L_direction = 0 And Pwm_l > 7 Then           'links rückwärts
         Pwm0a = Pwm_l
         Pwm0b = 254
      End If
    
      If Pwm_l <= 7 Then                              'links neutral
         Pwm0a = 0
         Pwm0b = 128
      End If
    
        If R_direction = 1 And Pwm_r > 7 Then         'rechts vorwärts
         Pwm2a = Pwm_r
         Pwm2b = 1
      End If
    
      If R_direction = 0 And Pwm_r > 7 Then           'rehts vorwärts
         Pwm2a = Pwm_r
         Pwm2b = 254
      End If
    
      If Pwm_r <= 7 Then                              'rechts vorwärts
         Pwm2a = 0
         Pwm2b = 128
      End If
    
    Loop
    
    '** Empfängerdaten auslesen ********************************************************************
     Rc_in_r:                                         'rechten RC-Kanal einlesen
      If Pinc.2 = 1 Then
         Timer1 = 0
      Else
          In_r = Timer1
      End If
     Return
    
     Rc_in_l:                                         'linken RC-Kanal einlesen
      If Pind.4 = 1 Then
         Timer1 = 0
      Else
          In_l = Timer1
      End If
     Return
    
    
    '** Fehlerroutine ******************************************************************************
    Fehler:
      Pwm0a = 0
      Pwm0b = 128
      Pwm2a = 0
      Pwm2b = 128
    
    Do
    Led = 1
    Waitms 3000
    Led = 0
    Waitms 3000
    Loop

  5. #15
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo,
    auf die Timer hat die abweichende Frequenzangabe überhaupt keinen Einfluß. Also wofür diese Tricks?
    Bei dem ADC wird es aber bestimmt Probleme geben, weil du über Prescaler=Auto eine Abtastfrequenz gewählt hast, die bei 16MHz auf das 32-fache hoch geht.

    Deine Waitms 3000 am Ende werden auch nur 100ms dauern.

    Noch etwas, was ich ändern würde:
    Taster=1 wird durch den Alias zu Pind.2=1, was keinen Sinn macht. Du willst ja wahrscheinlich den PullUp einschalten. Da wäre Portd.2=1 richtig.
    Durch eine Besonderheit der Register funktioniert deine Version evtl beim M88, bei anderen Controllern sicher nicht.

    Die Variablen ln_r und ln_l würde ich zu Word Typen machen. Durch die Integer bekommst du evtl. negative Werte, falls der Timer in den ISRs mal einen Wert>=2^15 hat. Müsste man mal ausprobieren. Und solange du nicht an negativen Werten interessiert bist, würde ich auch nur positive Typen verwenden. Dadurch kann man Programme viel robuster und stabiler machen.
    Gleiches gilt für pwm_l und pwm_r.

    Edit: Ich sehe gerade, dass du die neg. Werte im Programm behandelst, evtl ist es dann doch ok.

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. [ERLEDIGT] Pwm Motorsteuerung mit PCINT1
    Von Balu18 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 12
    Letzter Beitrag: 09.03.2013, 18:48
  2. ATmega88 (Blinklicht)
    Von steep im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 11.07.2011, 13:08
  3. PortD als Eingang mit Pullup bei Atmega88 geht nicht!?
    Von Stomper im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 30.10.2008, 09:16
  4. Abschalten einer RC-Empfängers?
    Von krischan100 im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 15.07.2006, 09:34
  5. PS2 Steckerbelegung eines GPS Empfängers
    Von Amiwerewolf im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 5
    Letzter Beitrag: 03.07.2006, 18:13

Berechtigungen

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

Solar Speicher und Akkus Tests