- 3D-Druck Einstieg und Tipps         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 30

Thema: Erneut Schieberegister

  1. #11
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2006
    Ort
    Dortmund
    Alter
    36
    Beiträge
    379
    Anzeige

    Praxistest und DIY Projekte
    Sooo ich bin jetzt endlich dazu gekommen mal ein bischen zu programmieren und jetzt gibts leider Probleme... Mein Programm läuft eindeutig auf dem Controller da die Kontroll LED im Sekundentakt blinkt aber leider wird an den Schieberegistern nichts ausgegeben...

    Vielleicht kann ja mal jemand drüber schaun:
    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    'Ports einstellen
    Config Portb.0 = Output                                     'SRData
    Config Portb.3 = Output                                     'PWM
    Config Portd.7 = Output                                     'SCK
    Config Portd.6 = Output                                     'RCK
    Config Portd.5 = Output                                     'Reset
    Config Portd.2 = Output                                     'LED
    Config Pinc.3 = Input                                       'Taster1
    Config Pinc.4 = Input                                       'Taster2
    Config Pinc.5 = Input                                       'Taster3
    
    'Alias definieren
    Rck Alias Portd.6
    Sck Alias Portd.7
    Datasr Alias Portb.0
    Resetsr Alias Portd.5
    Led Alias Portd.2
    Pwm Alias Portb.3
    Taster1 Alias Pinc.3
    Taster2 Alias Pinc.4
    Taster3 Alias Pinc.5
    
    'Portpegel setzen
    Rck = 0
    Sck = 0
    Datasr = 0
    Resetsr = 0
    Led = 0
    Pwm = 1
    Taster1 = 1
    Taster2 = 1
    Taster3 = 1
    
    'Timer konfigurieren
    Config Timer1 = Timer , Prescale = 256
    Enable Timer1
    On Timer1 Sekundentakt
    Enable Interrupts
    Timer1 = 34285
    
    'Config Timer2 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
    
    
    'Variablen definieren
    Dim Sekunden As Integer
    Dim Minuten As Byte
    Dim Stunden As Byte
    Sekunden = 0
    Minuten = 0
    Stunden = 12
    
    'Bitmuster erstellen und Array befüllen
    Dim Stundenarray(12) As Word
    Dim Minutenarray(12) As Byte
    Dim I As Byte
    Dim Stdpos As Byte
    Dim Minpos As Byte
    
    Minutenarray(1) = &B00000000                                'Voll
    Minutenarray(2) = &B10000001                                'Fünf nach
    Minutenarray(3) = &B10000010                                'Zehn nach
    Minutenarray(4) = &B00010001                                'Viertel nach
    Minutenarray(5) = &B00100110                                'Zehn vor Halb
    Minutenarray(6) = &B00100101                                'Fünf vor Halb
    Minutenarray(7) = &B00100000                                'Halb
    Minutenarray(8) = &B00101001                                'Fünf nach Halb
    Minutenarray(9) = &B00101010                                'Zehn nach Halb
    Minutenarray(10) = &B01010000                               'Viertel vor
    Minutenarray(11) = &B01000010                               'Zehn vor
    Minutenarray(12) = &B01000001                               'Fünf vor
    
    Stundenarray(1) = &B0000000100000000                        'Eins
    Stundenarray(2) = &B0000001000000000                        'Zwei
    Stundenarray(3) = &B0000010000000000                        'Drei
    Stundenarray(4) = &B0000100000000000                        'Vier
    Stundenarray(5) = &B0001000000000000                        'Fünf
    Stundenarray(6) = &B0010000000000000                        'Sechs
    Stundenarray(7) = &B0100000000000000                        'Sieben
    Stundenarray(8) = &B1000000000000000                        'Acht
    Stundenarray(9) = &B0000000000010000                        'Neun
    Stundenarray(10) = &B0000000000100000                       'Zehn
    Stundenarray(11) = &B0000000001000000                       'Elf
    Stundenarray(12) = &B0000000010000000                       'Zwölf
    
    
    
    'Hauptschleife
    Do
    
    'Arrayposition berechnen Bsp: Minuten = 3 ===> Arrayposition 1 muss ausgegeben werden
    Minpos = Minuten / 5
    Minpos = Minpos + 1
    
    
    'Überprüfen ob die Stunde + 1 ausgegeben werden muss. Bsp: 05:31 ===> Halb Sechs
    Stdpos = Stunden
    If Minuten >= 5 Then
    Stdpos = Stdpos + 1
    End If
    
    'Stundenarray an der Position "Stunden" in die Schieberegister takten
    For I = 1 To 16 Step 1
    Datasr = Stundenarray(Stunden).I
    Toggle Sck
    Toggle Sck
    Next A
    
    'Minutenarray an der Position "Minpos" in die Schieberegister takten
    For I = 1 To 8 Step 1
    Datasr = Minutenarray(Minpos).I
    Toggle Sck
    Toggle Sck
    Next A
    
    'Latch der Schieberegister auf Ausgänge schalten
    Toggle Rck
    Toggle Rck
    
    
    'In Idle Mode wechseln zum strom sparen und um unnötiges beschreiben der Schieberegister
    'zu vermeiden. Geweckt wird im Sekundentakt des Timers.
    POWER IDLE
    
    Loop
    End
    
    
    
    
    'Interrupt Routine für den Timer1. Läuft Sekündlich über.
    Sekundentakt:
    Timer1 = 34285
    Toggle Led
    
    If Sekunden < 59 Then
    Sekunden = Sekunden + 1
    Else
    Sekunden = 1
    Minuten = Minuten + 1
    End If
    
    If Minuten >= 59 Then
    Minuten = 0
    Stunden = Stunden + 1
    End If
    
    If Stunden > 12 Then
    Stunden = 1
    Minuten = 0
    End If
    
    
    
    Return

    Wo liegt mein Fehler? Falls Ihr mehr Infos braucht dann geb ich die natürlich so bald wie möglich raus. Danke schonmal!

    Edit: Hier schonmal der Schaltplan falls der auch von interesse ist:
    http://rapidshare.com/files/440502830/Qlocktwo.pdf

  2. #12
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    54
    Beiträge
    1.258
    Hallo Oze,

    For I = 1 To 8 Step 1
    Datasr = Minutenarray(Minpos).I
    Variablen zählt man von Null an, ein Byte von 0-7, ein Word von 0-15.
    Es muß also For I = 0 To 7 heißen.

    Toggle Sck
    Toggle Sck
    das ist auch gefährlich, besser du schreibst stattdessen:
    Sck = 0
    Sck = 1


    POWER IDLE
    kannst du ja erstmal weglassen bis der Rest läuft.

    Gruß, Michael

  3. #13
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2006
    Ort
    Dortmund
    Alter
    36
    Beiträge
    379
    Ah danke! Ich war mir nicht sicher ob die Bits von 0 oder 1 an gezählt werden in Bascom weil die Arrays ja z.b. von 1 an gezählt werden. Dachte das wär da analog. Ich werd mal testen obs daran liegt obwohl ich das ehr nicht denke. Ich würde ja so nur alles um ein Bit versetzt ausgeben was aber wenigstens zu irgendeiner ausgabe führen würde und nicht einfach zu nichts. Sowas wie eine Speicherzugriffsverletzung gibt es doch nicht auf Mikrocontrollern oder?
    Das Toggle SCK werd ich auch umschreiben und ebenfalls für RCK ändern. Power Idle werde ich auch mal rausnehmen.
    Ich berichte später obs was geholfen hat.
    Danke dir schonmal für deine Hilfe!

  4. #14
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    54
    Beiträge
    1.258
    Hallo Oze,

    in deinem Schaltplan sehe ich 3 Schieberegister von denen das letzte nur mit 4 Bit benutzt wird, insgesamt also 20 Bit.
    Deine Software schiebt aber 16 Bit für Stundenarray und nochmal 8 Bit für Minutenarray aus. Immer 4 Bit zuviel.
    Da dein Schaltplan nicht komplett ist, kann ich nur vermuten, daß das so nicht stimmt.
    Was ist denn an K1 links angeschlossen?

    Gruß, Michael

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Speicherzugriffsverletzung gibts ganz klar - wenn dir der Stack überläuft z.B.
    Das merkt man dann an sehr komischem Fehlverhalten und andauernden Resets, etc.
    Was er genau macht, wenn du Bit.9 von nem Byte änderst weiß ich nicht - ich vermute mal Bit.0 von der nächsten Variable ändern. Oder irgend etwas noch schlechteres

  6. #16
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2006
    Ort
    Dortmund
    Alter
    36
    Beiträge
    379
    Doch doch das ist so gewollt. Ich schiebe immer 4 führende Nullen in die Schieberegister die nicht genutzt werden um alle schieberegister komplett zu nutzen und mir somit in der Software das Reseten der Schieberegister zu ersparen. Den Speicher für die 4 zusätzlichen Nullen habe ich ja eh durch die Word Variabeln reserviert und verschwende somit auch keinen Platz.
    An K1 sind die einzelnen Wörter der Uhr angeschlossen. Momentan ist das jeweils eine LED zum testen. Später werden dann dort jeweils LED Arrays angeschlossen um die Wörter zu hinterleuchten.

    Ich habe die von dir vorgeschlagenen Änderungen jetzt umgesetzt und habe damit leider keinen Erfolg. Es wird nach wie vor nichts ausgegeben (also es leuchtet keine der 20 LED`s).
    Was mich auch noch stutzig macht: Ich habe die Platine jetzt mal ein bischen laufen lassen und die Status LED mal beobachtet. Dort sehe ich teilweise keinen sauberen Sekundentakt mehr. Ca nach 40 Sekunden bleibt die LED für 2 Sekunden an und teilweise auch mal für 2 Sekunden aus. Ich habe leider keinen Debugger so das ich nicht sehen kann ob an dieser Stelle zufällig ein Reset ausgelöst wird.

    Nochmal zum verständnis der Schieberegister: Ich muss doch einfach 24 Werte an den Dateneingang des ersten Schieberegisters takten und anschließend einen Flankenwechsel an RCK auslösen um die eingetakteten Werde auf die Ausgänge der Schieberegister zu schalten oder?

  7. #17
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2006
    Ort
    Dortmund
    Alter
    36
    Beiträge
    379
    @Stefan_z: Hälst du es für möglich das ich einen Stacküberlauf habe in meinem Programm? Ich habe den Stack nicht explizit festgelegt im Code und benutze somit die Bascom vorgaben (HW Stack: 32 Soft Stack = 8 und Frame = 24). Ist das zu wenig? Ich habe keinen Ahnung wie ich diese Werte korrekt vorberechnen kann.

  8. #18
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Also viel wirst du nicht brauchen, die werden bei vielen Sub-Sprüngen wichtig.
    Ich würde die Arrays durch Konstanten ersetzen, die ändern sich ja nicht, oder hab ichs übersehen? Damit sparst du schonmal gut RAM.

    Und Minpos = Minuten / 5 kann ja auch kein allzu genauer Wert sein - da wird die Bruchzahl ins byte geschrieben.

    Ich würde - wie bei allen Hardware-Sachen erstmal ne ganz doofe Routine schreiben, dir dir ein Muster ins SR taktet. Wenn das funktioniert, ist der Rest schnell gemacht.

  9. #19
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2006
    Ort
    Dortmund
    Alter
    36
    Beiträge
    379
    Also ich glaube ich hab den fehler: Ich halte den Reseteingang der Schieberegister auf 0. Der sollte aber auf 1 liegen was ich übersehen habe da er Low Aktiv ist genau wie der Reset vom AVR.

    Wo du aber grade sagst das Minpos = Minuten/5 nicht geht mach ich mir ernsthaft sorgen um meine Software. Normalerweise kenn ich das so, dass wenn man eine Integerzahl teilt und ein Bruch rauskommt die Nachkommastellen abgeschnitten werden. Also sowas wie 3/5 = 0 oder 7/5 = 1. Das nutze ich ja extra aus in meiner Software.

    Die Arrays konstant zu machen werde ich auch mal tun. Das schadet auf jedenfall nicht da diese nicht geändert werden.

    Ich berichte später ob mein Resetproblem sich gelöst hat.

  10. #20
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2006
    Ort
    Dortmund
    Alter
    36
    Beiträge
    379
    So ich habs getestet: Es lag tatsächlich an dem Reseteingang. Die Uhr lass ich jetzt mal durchlaufen und schaue ob das wirklich alles sauber durchschaltet so wie ich das möchte. Was mir noch ein bischen sorge macht ist der unsaubere Sekundentakt an der Status LED aber ich werde mal sehen wie genau die Uhr läuft. Ich hab momentan aber auch noch den internen Takt an und schalte dann mal auf das Quarz um wenns genauer werden soll.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen