www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom code probleme


Autor: Bastelui (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich Arbeite mir einem ATmega8. Dieser soll 2 Motoren mit PWM ansteuern. 
Dabei soll die Drehzahl mit Lichtschranken erfasst werden, mit einem 
Sollwert verglichen Werden und dementsprechen dann auch Nachgeregelt 
werden.

Für einen Motor habe ich das Bascom-Programm soweit fertig. Allerdings 
scheint es so, als ob sich der µC beim jedem Start den Stack voll 
schreibt und sich selbst resettet. Warum das so ist, habe ich noch nicht 
raus. Vielleicht kann sich ja mal jemand erbarmen und meinen Code 
anschauen?

Hier ist ersteinmal das, was ich im Terminal zu sehen bekomme:
The System is online!
Sollwerta = 500
Nor/Err Pwm1a#Istwert
E0#0
Th\<\n>E#<\n>Sollwerta = 500
E2#0
E3#0
Nor/Err Pwm1a#IstwertE4#0

E5#0
E6#0
E7#0
E8#0
E9#0

Der Wert hinter dem E erhöt sich dann noch weiter

Und hier ist mein Code:
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 4800

Dim Istwerta As Word : Istwerta = 0
'Dim Istwertb As Word : Istwertb = 0
Dim Sollwerta As Word : Sollwerta = 500
'Dim Sollwertb As Word : Sollwertb = 0
Dim Gueltig As Bit : Gueltig = 0
'Dim Gueltigb as Bit : Gueltigb = 0

On Int0 Sensora
On Int1 Sensorb
On Ovf0 Ovf0a
On Ovf2 Ovf2b

Config Int0 = Rising
Config Int1 = Rising
Config Portb = Output
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Config Timer0 = Timer , Prescale = 1024
Config Timer2 = Timer , Prescale = 64
Config Com1 = Dummy , Synchrone = 0 , Parity = Disabled , Stopbits = 1 , Databits = 8 , Clockpol = 1
'Config Serialout = Buffered , Size = 100
'Config Serialin = Buffered , Size = 50




Enable Interrupts


Print "The System is online!"
Waitms 300
Print "Sollwerta = " ; Sollwerta
waitms 300
Print "Nor/Err Pwm1a#Istwert"
Waitms 300

Enable Int0
'Enable Int1
Enable Ovf0
'Enable Ovf2

Do

Loop


Sensora:
      Disable Int0
      Disable Int1
      Disable Ovf1
      Disable Ovf2
      If Gueltig = 1 Then
        Istwerta = Istwerta + Timer0
        If Istwerta < Sollwerta Then
           Incr Pwm1a
        End If

        If Istwerta > Sollwerta Then
           Decr Pwm1a
        End If

        Print "N" ; Pwm1a ; ; "#" ; Istwerta
      Else
         Set Gueltig
      End If

      Istwerta = 0
      Timer0 = 0
      Enable Int0
      'Enable Int1
      Enable Ovf0
      'Enable Ovf2
Return



Ovf0a:
   Disable Int0
   Disable Int1
   Disable Ovf1
   Disable Ovf2
   Istwerta = Istwerta + 255
   If Istwerta > 1020 Then
      Istwerta = 0
      Reset Gueltig
      Print "E" ; Pwm1a ; "#" ; Istwerta
      Incr Pwm1a
   End If
   Enable Int0
   'Enable Int1
   Enable Ovf0
   'Enable Ovf2
Return

Ovf2b:
Return

Sensorb:
Return
End                                                         'end program

Vielen Dank für jede Hilfe im vorraus!

Lui

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was du da mit deinen Istwert Variablen veranstaltest, ist für mich so 
ziemlich undurchschaubar

Hier
        Istwerta = Istwerta + Timer0
erhöhst du ihn mit dem Timer Wert (wozu auch immer das gut sein soll)
Dann
       If Istwerta < Sollwerta Then
           Incr Pwm1a
        End If

        If Istwerta > Sollwerta Then
wird er abgefragt
um gleich darauf
      Istwerta = 0
wieder auf 0 gesetzt zu werden.

Ich würde mal sagen, dein Istwert wird die meiste Zeit 0 (oder +Timer0) 
sein, damit kleiner als der Sollwert und damit wird Pwm1a erhöht.

Räum den Code erst mal auf.
Überleg dir wie die Zusammenhänge sind
und hör auf, aufs Gratewohl Unmengen von Code reinzuhacken. Das geht 
nämlich meistens schief.

Autor: Pascal H. (pase-h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Korrigiert mich bitte, fals ich falsch liege:
Bei dir heißt es hier:
> Th\<\n>E#<\n>Sollwerta = 500
was ja bedeuten soll, dass der PWM-Sollwert 500 ist.
Doch wenn ich jetzt nicht falsch liege, dann definierst du ja mit PWM = 
8 eine 8bit PWM - Also max. 255.
> Config Timer1 = Pwm , Pwm = 8 ...
Wenn du jetzt schreibst : "Pwm = 10" dann müsste die Pwm als 10bit
(max. 1023) konfiguriert sein.
Probiers mal aus!

Mfg Pase

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.