- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Ich brauche einen Tip für Bascom

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    01.12.2010
    Beiträge
    10

    Ich brauche einen Tip für Bascom

    Anzeige

    Praxistest und DIY Projekte
    Hallo!

    Nachdem mein kleines Werk nun funktioniert wie es soll habe ich mich mal wieder auf dünnes Eis begeben und mich mit Timer1 versucht.

    Erst hab ich mal eine Diode blinken lassen um zu sehen das auch alles richtig funktioniert. Tut es auch.

    Jetzt hab ich natürlich in der Sprungmarke Timer_irq
    meine eigenen Sachen getippelt und zwar Sachen wie ein Zähler und ne Variable auf 1 setzen.

    Lange Rede kurzer Sinn wie bekomme ich Bascom im Simulator dazu mir
    ZB. Den Zähler den ich nach der Sprungmarke zählen lasse anzuzeigen.
    Bzw. mit F8 diese Schritte durch zu klappern?
    Der Haken bei SIM Timers ist drin.

    Und wenn ich grad dabei bin.

    Ich habe gedacht das wenn ich folgende Zeilen im Programm drin stehen habe der µC nicht nur mit 1Mhz läuft...
    $regfile = "m48def.dat"
    $crystal = 8000000

    Oder hab ich da einen Denkfehler?


    Danke schon mal für Eure Hilfe...

    Grüße aus dem Süden

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009
    #1) Irgendwo sollte es eine Möglichkeit geben, eine Variable zu einem "Watch-Window" hinzuzufügen. Weiss jetzt nicht auswendig, wie das bei Bascom heisst. Aber da gabs glaub ich sogar 4 verschiedene Watch-Windows.

    #2) Die $Crystal-Angabe ändert an der Taktfrequenz des Controllers nichts. Die sagt dem Programm nur, wie schnell er läuft.
    D.h. diese Angabe muss mit dem wahren Takt übereinstimmen, ausser man will absichtlich Warteschleifen/etc. schneller/langsamer laufen lassen.
    In deinem Fall (1MHz wahr, 8MHz angegeben) werden Warteschleifen & Co. 8x langsamer laufen.
    Die Taktfrequenz wird über die Fusebits geändert. Hierbei aufpassen, da kann man sich schnell mal aus dem Controller aussperren.
    #ifndef MfG
    #define MfG

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    01.12.2010
    Beiträge
    10
    Hallo!

    An die Fusebits wage ich mich irgendwann mal dran. Das reicht noch wenn ich mir sicherer in dieser MAterie bin. Hab jetzt erst mal
    $Crystal = 1000000 rein genommen damit keine Missverständnisse mehr aufkommen.

    Also ich komme mit diesem Timer Zeugs nicht klar. Hinter mir blinkt eine Leuchtdiode seit 2 Stunden im Sekundentakt.
    Also die Funktion sollte gegeben sein..

    Folgendes habe ich im Prog drin...

    On Timer1 Timer_irq
    Const Timervorgabe = 65500 'dieser hohe Wert ist nur zu Testzwecken.'
    Enable Timer1
    Enable Interrupts
    Timer1 = Timervorgabe
    do
    If Fensterschalter = 1 And Tuerkontakt = 1 And Eingangrauchmelder = 0 Then
    Alarm = 1
    Else
    Alarm = 0
    End If
    If Eingangtaster = 1 Then
    Dummy = 1
    End If
    loop

    Timer_irq:
    Timer1 = Timervorgabe
    If Dummy = 1 And Eingangrauchmelder = 0 Then
    Portb.1 = 1
    Zaehler = Zaehler + 1
    End If
    If Zaehler = 25 Then 'auch dieser Wert ist nur zu Testzwecken'
    Dummy = 0
    Zaehler = 0
    Portb.1 = 0
    End If
    Return

    wenn ich nun die Variable Zaehler , Dummy und Timer1 beobachte stelle ich fest das sich nur Dummy auf 1 ändert Timer1 brav hochzählt aber die Variable Zaehler auf 0 stehen bleibt.
    Dummy hat den Wert 1 und Eingangrauchmelder 0


    Das Ganze ist recht Zeitunkritisch will sagen es kommt auf ne Minute nicht an grins' am Ende soll einfach ein Nachlauf von ca 30 Minuten rauskommen und dann Portb.1 abschalten.

    Mir kommt es aber vor als ob er den Timer Interrupt garnicht macht bzw einfach überspringt... So wie ich das sehe müsste er ja zu
    Timer_irq: springen und dort weiter werkeln...

    Wo liegt denn nun der Hase im Pfeffer?

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009
    Zeig das Programm mal komplett (alles, auch Variablendeklarationen), dann können andere auch mal simulieren.
    #ifndef MfG
    #define MfG

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

    zum simulator:wenn Du eine Interruptroutine deklariert hast,
    kann man nach anklicken des Reiters "Interrupts" dort den
    jeweiligen Interrupt per Mausklick auslösen.

    Aber wie immer der Hinweis auf die Bascom Hilfe. Ist dort beschrieben.

    MfG
    Rone

    Edit: Wie schon Jaecko angemerkt hat, immer alles reinstellen.
    Da fehlt die Timerinitialisierung, Variablendeklarationen,usw
    So ist das Ganze recht sinnfrei!

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Wo liegt denn nun der Hase im Pfeffer?
    Meistens bei der Tatsache, dass Controller IMMER das machen was man ihnen sagt, aber nicht immer das was sie sollen

    Folgendes fällt auf den ersten Blick auf:

    Der Timer läuft bei einem Wert von 65535 über. Wenn Du ihn in der ISR auf 65500 vorlädst, gibt es alle 35 Taktzyklen einen Timer1-Interrupt. Bei 1MHz wäre das alle 35µS, also knapp 30.000 Interrupts pro Sekunde. Ist das so gewollt? Wenn nicht, müsstest Du den Timer mit einem geeigneten Prescaler versehen (siehe Bascom-Hilfe...), und/oder den Preload-Wert verkleinern.

    Die Geschichte mit "If Zaehler = 25 then..." geschieht natürlich auch nur ein einziges mal, denn in der nächsten ISR wird Zaehler um 1 erhöht, ist also nicht mehr 25. Je nachdem was Du damit erreichen möchtest (das erschließt sich mir im Moment leider nicht ganz), müsstest Du entweder Zaehler auf 0 setzen, wenn er den Wert von 25 erreicht hat (d.h. in der IF...EndIf-Schleife), oder aber mit > 25 abfragen.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    Und bitte Programmzeilen in
    Code:
    xxxx
    einfügen!

    Gruß Richard

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    01.12.2010
    Beiträge
    10
    Hallo zusammen!


    Der Timer läuft bei einem Wert von 65535 über. Wenn Du ihn in der ISR auf 65500 vorlädst, gibt es alle 35 Taktzyklen einen Timer1-Interrupt. Bei 1MHz wäre das alle 35µS, also knapp 30.000 Interrupts pro Sekunde. Ist das so gewollt? Wenn nicht, müsstest Du den Timer mit einem geeigneten Prescaler versehen (siehe Bascom-Hilfe...), und/oder den Preload-Wert verkleinern.
    Das macht natürlich sehr wenig Sinn und ist rein zu Testzwecken gedacht gewesen. Um mit F8 durchs Programm zu springen und um nicht von 49911
    losklappern zu müssen habe ich den Timer als Vorgabewert auf diese 65500 gesetzt. Wie gesagt das ist NUR zum Testen mit F8 so gemacht.

    Die Geschichte mit "If Zaehler = 25 then..." geschieht natürlich auch nur ein einziges mal, denn in der nächsten ISR wird Zaehler um 1 erhöht, ist also nicht mehr 25.
    Auch dieser Wert 25 macht recht wenig Sinn der ist auch nur zu Testzwecken mit F8 so nieder gesetzt wenn ich den Fehler im System gefunden habe werden die 25 auf 1800 gesetzt das sollte dann so ca 30 Minuten entsprechen.

    Diese bedein Werte 65500 beim Timer und 25 beim Zähler habe ich nur benutzt um mit der F8 Funktion durchs Programm zu steppen und um zu sehen ob sich dabei etwas ändert.

    Aber mir schwant böses.. Kann es sein das selbst mit der Funktion F8 zu viele Interrupts ausgführt worden sind und somit bei jedem Sprung der Zähler gleich wieder auf 0 gesetzt wird? sodaß mir die Werte garnicht angezeigt werden?



    Code:
    $regfile = "m48def.dat"
    $crystal = 1000000
    
    Config Timer1 = Timer , Prescale = 64
    
    Config Portb.1 = Output
    Config Portd.0 = Output
    Config Portd.1 = Output
    Config Pind.2 = Input
    Config Pind.3 = Input       'taster'
    Config Pind.4 = Input
    Config Pind.5 = Input
    Config Pind.6 = Input
    Config Portd.7 = Output
    'Ports einrichten welcher Eingang und welcher Ausgang ist.'
    
    Versorgungfensterschalter Alias Portd.0
    Versorgungtuerkontakt Alias Portd.1
    Alarm Alias Portb.1
    Versorgungtaster Alias Portd.7
    Fensterschalter Alias Pind.4
    Tuerkontakt Alias Pind.5
    Eingangrauchmelder Alias Pind.6
    Eingangtaster Alias Pind.3
    
    
    Dim Dummy As Bit
    Dim Zaehler As Integer
    
    
    
    Versorgungfensterschalter = 1
    Versorgungtuerkontakt = 1
    Alarm = 0
    Versorgungtaster = 1
    
    
    
    'Hier gehts beim Timer Interupt weiter'
    On Timer1 Timer_irq
    
    'um 1 Sekunde zu erreichen reichen die ticks von 49911 bis 65535'
    Const Timervorgabe = 65500
    '49911
    
    
    'Hier werden die Timer aktiviert
    Enable Timer1
    Enable Interrupts
    Dummy = 0
    Timer1 = Timervorgabe
    
    'Hier ist die Programmhauptschleife
    Do
    
    If Fensterschalter = 1 And Tuerkontakt = 1 And Eingangrauchmelder = 0 Then
    Alarm = 1
    Else
    Alarm = 0
    End If
    If Eingangtaster = 1 Then
     Dummy = 1
    End If
     Loop
    End
    
    
    
    Timer_irq:
      Timer1 = Timervorgabe
    If Dummy = 1 Then
    Portb.1 = 1
     Zaehler = Zaehler + 1
     End If
       If Zaehler = 25 Then
       Dummy = 0
       Zaehler = 0
       Portb.1 = 0
          End If
    
       Return
    Ihr habt natürlich Recht war Blödsinn von mir nur Schnipsel zu posten.

    Ich hoffe ich hab mich nicht allzu schusselig angestellt But nobody is perfect.

    Danke schon mal für Eure Geduld und Hilfe...

    Grüße aus dem Süden

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

    Mit F8 kannst Du keinen Interrupt auslösen!

    Lies meinen Beitrag oberhalb und die Bascom Hilfe!

    MfG
    Rone

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.08.2004
    Ort
    Graz
    Beiträge
    342
    35 Taktzyklen für eine ISR sind definitiv zu wenig, normalerweise werden dabei 32 Register gepusht und nachher gepopt + 6 Takte für Rücksprungadresse auf den Stack, Sprung ausführen, ...
    Also nur damit eine leere ISR abgearbeitet wird vergehen schon mal doppelt soviele Takte wie überhaupt bis zum nächsten Interrupt zur Verfügung stehen.

    mfg

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad