-
...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
-
Nein. es hängt ein 16 Mhz dran. Spreizung der Timerergebnisse erhöhte sich aber, umso geringer die Frequenz war. ich weiß nicht wieso.
-
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.
-
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
-
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.