bascom schieberegister

Gast #5673796
Lesenswert?
• ▲
▼
Hallo,
ich habe ein Problem dabei, Daten an den Ausgängen des Schieberegister 
anzulegen.

Wenn ich folgendes Beispiel befolge:
https://www.rahner-edu.de/mikrocontroller/themen-und-projekte/leds-und-schieberegister/

,klappt es ohne Probleme.
Hier musste ich nur die Pinouts ändern.

Wenn ich aber mein Programmiercode nehme:
1
$regfile = "m8def.dat"
2
$crystal = 1000000
3
$swstack = 32
4
$hwstack = 32
5
$framesize = 40
6
Config Portb.0 = Output
7
Config Portb.1 = Output
8
Config Portb.2 = Output
9

10
Daten Alias Portb.0
11
Takt Alias Portb.1
12
Strobe Alias Portb.2
13

14
Dim Array(8) As Byte
15
Dim I As Single
16
Array(1) = &B10000000
17
Array(2) = &B01000000
18
Array(3) = &B00100000
19
Array(4) = &B00010000
20
Array(5) = &B00001000
21
Array(6) = &B00000100
22
Array(7) = &B00000010
23
Array(8) = &B00000001
24
Dim A As Single
25

26
A = 0
27
Do
28
   A = A + 1
29
   Gosub Schiebe
30
   If A = 8 Then
31
      A = 0
32
   End If
33
Loop
34
End
35
Schiebe:
36
   Strobe = 0
37
      For I = 1 To 8 Step + 1
38
         Takt = 1
39
         Daten = Array(a) , I
40
         Waitms 10
41
         Takt = 0
42
      Next
43
   Strobe = 1
44
   Waitms 1000
45

46
Return
funktioniert es leider nicht.

Wenn ich doch Daten in das Schieberegister schieben möchte, dann muss 
ich zuerst strobe auf 0 setzen, so dass aktuell ja keine Daten an den 
Ausgängen ausgegeben wird.
Dann entweder eine 0 oder 1 an daten ausgeben u. mit einem takt = 1 takt 
= 0 es einen Schritt weiter schieben.
Habe ich 1 Byte in das Schieberegister geschrieben,  dann die Ausgänge 
mit strobe = 1 aktivieren.
Gast #5673912
Lesenswert?
• ▲
▼
Bascom kennt komfortable Befehle shiftout/in.

Steht in der Hilfe und in hunderten von Beispielen.
Fehler liegt meist in der korrekten Pegellage, oder in der SW.
Im Bascom gibt es auch fertige codebeispiele in der Hilfe.
Gast #5673928
Lesenswert?
• ▲
▼
Lothar M. schrieb:
> bascom schieberegister schrieb:
>> mein Programmiercode
>> Daten = Array(a) , I
> Was soll in dieser Zeile passieren?
> Welchen Wert soll "Daten" nach dieser "Komma-Operation" enthalten?

In "Daten" soll nacheinander der Inhalt des Arrays mit "I" als Index 
dafür eingelesen werden.

> Gibt es in Bascom überhaupt einen Komma-Operator?

Sieht ganz so aus, denn sonst hätte sich das Programm nicht kompilieren 
lassen und der TO hätte nicht feststellen können, daß es nicht wie 
gewollt funktioniert.

Merke: Erwecke nicht den Eindruck, helfen zu wollen, wenn es in 
Wahrheit nur darum geht, Leute für dumm zu verkaufen!
#5673973
Lesenswert?
• ▲
▼
Irgendwie ist das ganze Brotlose Kunst, solange kein Schaltbild 
vorliegt.

Ein falscher Pegel am Reset-Pin; eine falsche Pegelreihenfolge am 
Datenpin eventuell in Relation zum Takt; der "richtige" Pegel am OE 
Anschluss;-)
Das alles ist natürlich nicht aus dem Codeschnipsel zu ersehen.

Darüber hinaus habe ich Gerüchte vernommen, nach denen einige genau 
festgelegte Schritte während der Initialisierung vorgenommen werden 
müssen...
Ich zumindest, kann nicht feststellen, ob an Pin B1 auch xxx rumlungert.
Persönliche Seite #5673999
Lesenswert?
• ▲
▼
bascom schieberegister schrieb:
1
> For I = 1 To 8 Step + 1
2
>          Takt = 1
3
>          Daten = Array(a) , I
4
>          Waitms 10
5
>          Takt = 0
6
>       Next


Zuerst steigt die Taktflanke, dann werden die Daten angelegt, dann wird 
10 msec gewartet, und dann fällt die Taktflanke, um mehr oder weniger 
unmittelbar im nächsten Schleifendurchlauf wieder zu steigen.

Es gibt Schieberegister, die Daten mit der steigenden Taktflanke 
übernehmen; so ein Schieberegister würde hier die jeweils vorherigen 
Daten übernehmen. Es gibt Schieberegister, die die Daten mit der 
fallenden Taktflanke übernehmen (das würde dann funktionieren).

Das Konstrukt
1
>          Daten = Array(a) , I

lässt sich nicht auf die Schnelle in der Bascom-Dokumentation finden.

Bedeuten würde es, daß man mit dem ominösen Kommaoperator den Wert eines 
Bits aus einem Byte (oder einem anderen Datentyp) extrahieren könnte. So 
eine elementare Operation dürfte aber in der Dokumentation irgendwo 
beschrieben werden, nicht?
Gast #5674020
Lesenswert?
• ▲
▼
@m.n. Da muß auch der Eingang OE auf '1' gelegt werden...-> Das habe ich 
gemacht.

Jetzt funktioniert es...ja...es war anstelle von einem Komma ein Punkt
Daten = Array(a), I -> Daten = Array(a). I

$regfile = "m8def.dat"
$crystal = 1000000
$swstack = 32
$hwstack = 32
$framesize = 40
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output

Daten Alias Portb.0
Takt Alias Portb.1
Strobe Alias Portb.2

Dim Array(9) As Byte
Dim I As Single
Array(1) = &B10000000
Array(2) = &B01000000
Array(3) = &B00100000
Array(4) = &B00010000
Array(5) = &B00001000
Array(6) = &B00000100
Array(7) = &B00000010
Array(8) = &B00000001
Array(9) = &B00000000
Dim A As Byte

A = 0
Strobe = 0
Takt = 0
Daten = 0
Do

   Gosub Schiebe
   If A = 8 Then
      A = 0
   End If
Loop
End
Schiebe:
   Strobe = 0
      For I = 8 To 1 Step - 1
         Daten = Array(a). I
         Takt = 1

         Takt = 0
      Next
   Strobe = 1
   Waitms 1000
   A = A + 1
Return

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren