• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Wählscheibentelefon, bräuchte da mal Hilfe

peter51d

Geocacher
Das erste Telefon, ein Tel0164 mit 3x4 Tastatur läuft.
Ich bin vom Tiny 13 auf einen mega8 gegangen und habe mir ein Codeschloss Programm aus dem Netz umgestrickt.

Das nächste Projekt, ein Wählscheibentelefon 611-2 läuft im Prinzip auch. Hier ist ein Tiny13 verbaut.
Wird die richtige Nummer gewählt, erfolgt über ein Voicemodul die Ansage der Informationen.
Stimmt die Nummer nicht, wir ein "kein Anschluss unter dieser Nummer" Rufzeichen abgespielt.

Nun zu meinem Problem:
Ich kann maximal eine 4 Stellige Rufnummer auswerten.
Versuche ich eine längere Rufnummer zu programieren, bekomme ich einen "out of sram" Fehler.
den HWStack habe ich schon auf 10 runter gesetzt, damit es überhaubt klappt.

Jetzt suche ich hier Hilfe, für die Programmoptmierung, bzw auch für einen gänzlich anderen Ansatz für das Programm.

Ich würde gerne die Möglichkeit haben min 6, besser 8 Ziffern auszuwerten. Es soll aber zwingend der ATTiny13 verwendet werden.

Hier das aktuelle Programm:

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 10

'Codeabfrage über Wählscheibentelefon


'Ein und Ausgänge konfigurieren

Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output

'Alias Namen zuweisen
Falsch Alias Portb.2 'rufzeichen "kein Anschluss unter dieser Nummer"
Nsi Alias Pinb.1 'Impulsleitung vom Nummernschalter
Nsa Alias Pinb.0 'Nummernschalterkontakt, für Wählscheibe dreht oder steht
Ansage Alias Portb.3 'Ansage der Informationen
Bereit Alias Portb.4 'Wählbereitschaft anzeigen

'Interne pullups zuschalten
Portb.0 = 1
Portb.1 = 1

'Variablen zuweisen
Dim A As Byte 'Anzahl der Impulse pro Wahlvorgang
Dim Zahl1 As Byte 'erste gewählte Ziffer
Dim Zahl2 As Byte 'zeite gewählte ziffer
Dim Zahl3 As Byte 'dritte gewählte ziffer
Dim Zahl4 As Byte 'vierte gewählte Ziffer

'Alle Variablen auf Null setzen
A = 0
Zahl1 = 0
Zahl2 = 0
Zahl3 = 0
Zahl4 = 0

'Alle Ausgänge auf 1 setzen
Falsch = 1
Ansage = 1
Bereit = 1


'Hauptprogrammschleife

'Abfrage des Nummernschalters
Do
Bereit = 1 'Wählbereitschaft anzeige

Debounce Nsi , 1 , Impulse , Sub 'Impulsschalter entprellen und Sprunganweisung
Debounce Nsa , 1 , Auswerten , Sub 'Wählscheibe abgelaufen entprellen und Sprunganweisung
Loop

'Implse hochzählen
Impulse:

Bereit = 0
A = A + 1
Return

'Impulsanzahl auswerten und den zuweisen an welcher Stelle die Ziffer gewählt wurde
'Wenn letzte Ziffer gewählt, zur Codekontrolle springen
Auswerten:

If Zahl4 = 0 And Zahl3 <> 0 Then
Zahl4 = A
End If
If Zahl3 = 0 And Zahl2 <> 0 Then
Zahl3 = A
End If
If Zahl2 = 0 And Zahl1 <> 0 Then
Zahl2 = A
End If
If Zahl1 = 0 Then
Zahl1 = A
End If
If Zahl4 <> 0 Then
Gosub Kontrolle
End If
A = 0 'Var a für nächste Wahl zurücksetzen

Return

'konrollieren ob die gewählte Nummer richtig ist
Kontrolle:
Bereit = 0
If Zahl1 <> 3 Then 'Vergleiche erste gewählte Ziffer mit vorgegebener Ziffer
Falsch = 0 'wenn falsch dann Rufzeichen "kein Anschluss unter dieser Nummer"
End 'und Programm beenden
End If 'wenn richtig weiter
If Zahl2 <> 3 Then
Falsch = 0
End
End If
If Zahl3 <> 4 Then
Falsch = 0
End
End If
If Zahl4 <> 9 Then
Falsch = 0
End
End If

Ansage = 0 'wenn alle Ziffern stimmen, Ansage der Informationen

End

Ich danke euch schon mal im voraus für eure Hilfe und wünsch erst mal einen "Guten Rutsch".
 

stonewood

Geowizard
peter51d schrieb:
Nun zu meinem Problem:
Ich kann maximal eine 4 Stellige Rufnummer auswerten.
Versuche ich eine längere Rufnummer zu programieren, bekomme ich einen "out of sram" Fehler.
den HWStack habe ich schon auf 10 runter gesetzt, damit es überhaubt klappt.

Hallo,

5 Variablen, so viel Speicher kann das doch gar nicht brauchen ... braucht der 'debounce' so viel?

Aber zur Optimierung würde ich die Nummer als 'data' ins Flash packen und dann die Zahlen der Reihe nach auslesen. Dann wird die Nummer nur noch durch den flash-Speicher begrenzt. Irgendwo hab ich auch noch etwas Code dazu, muß ich aber noch suchen.
 
OP
peter51d

peter51d

Geocacher
So, habe noch ein wenig probiert.
Habe den HWstack auf 5 gesetzt.
Damit lassen sich jetzt bis zu 10stellige Codes auswerten.
Beim Dim der elften Zahl als Byte kommt wieder der sram Fehler
Das reicht mir.
Vielleicht ginge sogar noch mehr, wenn man den HWStack noch weiter runter setzt.
Das Programm läuft immer noch sauber durch.

Gibt es eigentlich irgend wo eine Erklärung der Stacks, die auch für eine Dau verständlich ist?
Da blicke ich noch nicht durch.

Jetzt erst noch mal einen "guten Rutsch" :party: :party2:
 
OP
peter51d

peter51d

Geocacher
Erst mal allen ein Frohes neues Jahr.

So, und hier noch mal der Überarbeitete Code mit etwas mehr Kommentar.
Ich bin nach wie vor an Programmoptimierung interessiert.
Bedingung ist aber das ein Tiny13 genutzt wird.
Zur Zeit werden 88% des Tiny's belegt.

Code:
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 5


'Codeabfrage über Wählscheibentelefon


'Ein und Ausgänge konfigurieren

Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output

'Alias Namen zuweisen
Falsch Alias Portb.2                                        'rufzeichen "kein Anschluss unter dieser Nummer"
Nsi Alias Pinb.1                                            'Impulsleitung vom Nummernschalter
Nsa Alias Pinb.0                                            'Nummernschalterkontakt, für Wählscheibe dreht oder steht
Ansage Alias Portb.3                                        'Ansage der Informationen
Bereit Alias Portb.4                                        'Wählbereitschaft anzeigen

'Interne pullups zuschalten
Portb.0 = 1
Portb.1 = 1

'Variablen zuweisen
Dim A As Byte                                               'Anzahl der Impulse pro Wahlvorgang
Dim Zahl1 As Byte                                           'erste gewählte Ziffer
Dim Zahl2 As Byte                                           'zeite gewählte ziffer
Dim Zahl3 As Byte                                           'dritte gewählte ziffer
Dim Zahl4 As Byte                                           'vierte gewählte Ziffer
Dim Zahl5 As Byte                                           'fünfte gewählte Ziffer
Dim Zahl6 As Byte                                           'sechste gewählte Ziffer
Dim Zahl7 As Byte                                           'siebte gewählte Ziffer
Dim Zahl8 As Byte                                           'achte gewählte Ziffer
Dim Zahl9 As Byte                                           'neunte gewählte Ziffer
Dim Zahl10 As Byte                                          'zehnte gewählte Ziffer


'Alle Variablen auf Null setzen
A = 0
Zahl1 = 0
Zahl2 = 0
Zahl3 = 0
Zahl4 = 0
Zahl5 = 0
Zahl6 = 0
Zahl7 = 0
Zahl8 = 0
Zahl9 = 0
Zahl10 = 0

'Alle Ausgänge auf 1 setzen
Falsch = 1
Ansage = 1
Bereit = 1


'Hauptprogrammschleife

'Abfrage des Nummernschalters
Do
 Bereit = 1                                                 'Wählbereitschaft anzeige

 Debounce Nsi , 1 , Impulse , Sub                           'Impulsschalter entprellen und Sprunganweisung
 Debounce Nsa , 1 , Auswerten , Sub                         'Wählscheibe abgelaufen entprellen und Sprunganweisung
Loop

'Implse hochzählen
Impulse:

 Bereit = 0
 A = A + 1
Return

'Impulsanzahl auswerten und den zuweisen an welcher Stelle die Ziffer gewählt wurde
'Wenn letzte Ziffer gewählt, zur Codekontrolle springen
Auswerten:
If Zahl10 = 0 And Zahl9 <> 0 Then
Zahl10 = A
End If
If Zahl9 = 0 And Zahl8 <> 0 Then
Zahl9 = A
End If
If Zahl8 = 0 And Zahl7 <> 0 Then
Zahl8 = A
End If
If Zahl7 = 0 And Zahl6 <> 0 Then
Zahl7 = A
End If
If Zahl6 = 0 And Zahl5 <> 0 Then
Zahl6 = A
End If
If Zahl5 = 0 And Zahl4 <> 0 Then
Zahl5 = A
End If
If Zahl4 = 0 And Zahl3 <> 0 Then
Zahl4 = A
End If
If Zahl3 = 0 And Zahl2 <> 0 Then
Zahl3 = A
End If
If Zahl2 = 0 And Zahl1 <> 0 Then
Zahl2 = A
End If
If Zahl1 = 0 Then
Zahl1 = A
End If
If Zahl10 <> 0 Then                                         ' hier kann die Anzahl der zu wählenden Ziffern festgelegt werden
                                                             'bei z.B. vier Ziffern muss hier Zahl10 durch Zahl4 ersetzt werden
                                                             'und so weiter
Goto Kontrolle                                              'Hier reicht ein GOTO, da nach dem verkleichen der Zahlen
                                                             'kein Rücksprung erforderlich ist.
End If
A = 0                                                       'Var a für nächste Wahl zurücksetzen

Return

'konrollieren ob die gewählte Nummer richtig ist
'Die Ziffern hinter dem <> sind die Ziffern der zu wählenden Nummer.
'Sie müssen entsprechend der gewünschten Nummer deklariert werden

'                            """"""ACHTUNG"""""

'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
'"Soll eine Null gewählt werden muss als Vergleichszahl eine 10 eingetragen werden, "
'"da der Nummernschalter für die "0" zehn Impulse liefert                           "
'""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

'Im Beispiel unten würde die zu wählende Rufnummer "0331316255" lauten
'Die Nummer ist nur beispielhaft und würde im öffentlichem Telefonnetz
'zu einer Wettervorhersage für Meck-Pom, Berlin, Brandenburg fühern.
Kontrolle:
Bereit = 0
If Zahl1 <> 10 Then                                         'Vergleiche erste gewählte Ziffer mit vorgegebener Ziffer
Falsch = 0                                                  'wenn falsch dann Rufzeichen "kein Anschluss unter dieser Nummer"
End                                                         'und Programm beenden
End If                                                      'wenn richtig weiter
If Zahl2 <> 3 Then
Falsch = 0
End
End If
If Zahl3 <> 3 Then
Falsch = 0
End
End If
If Zahl4 <> 1 Then
Falsch = 0
End
End If
If Zahl5 <> 3 Then
Falsch = 0
End
End If
If Zahl6 <> 1 Then
Falsch = 0
End
End If
If Zahl7 <> 6 Then
Falsch = 0
End
End If
If Zahl8 <> 2 Then
Falsch = 0
End
End If
If Zahl9 <> 5 Then
Falsch = 0
End
End If
If Zahl10 <> 5 Then
End
End If

Ansage = 0                                                  'wenn alle Ziffern stimmen, Ansage der Informationen

End                                                         'end program
 

Ranseiher

Geocacher
Nachdem ich gerade sowas mit einem Tastentelefon gemacht habe, passt das ja.
Ich habe die Nummer Erfassung und Kontrolle umgestrickt.
Nachdem ich keine Hardware zu testen habe, weiß ich nicht ob es funktioniert (bin Anfänger)
Beim Kompilieren gibt er zumindest keinen Fehler aus. Belegt wären 57%.

Zu Beginn habe ich da was ich nicht mehr an Variablen brauche auskommentiert.
Unten hab ich das was nicht benötigt wird gelöscht.

Code:
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 5


'Codeabfrage über Wählscheibentelefon


'Ein und Ausgänge konfigurieren

Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output

'Alias Namen zuweisen
Falsch Alias Portb.2                                        'rufzeichen "kein Anschluss unter dieser Nummer"
Nsi Alias Pinb.1                                            'Impulsleitung vom Nummernschalter
Nsa Alias Pinb.0                                            'Nummernschalterkontakt, für Wählscheibe dreht oder steht
Ansage Alias Portb.3                                        'Ansage der Informationen
Bereit Alias Portb.4                                        'Wählbereitschaft anzeigen

'Interne pullups zuschalten
Portb.0 = 1
Portb.1 = 1

'Variablen zuweisen
Dim A As Byte                                               'Anzahl der Impulse pro Wahlvorgang
Dim Nummer As String * 11                                   'Der String in dem die Nummer geschrieben wird
'Dim Zahl2 As Byte                                           'zeite gewählte ziffer
'Dim Zahl3 As Byte                                           'dritte gewählte ziffer
'Dim Zahl4 As Byte                                           'vierte gewählte Ziffer
'Dim Zahl5 As Byte                                           'fünfte gewählte Ziffer
'Dim Zahl6 As Byte                                           'sechste gewählte Ziffer
'Dim Zahl7 As Byte                                           'siebte gewählte Ziffer
'Dim Zahl8 As Byte                                           'achte gewählte Ziffer
'Dim Zahl9 As Byte                                           'neunte gewählte Ziffer
'Dim Zahl10 As Byte                                          'zehnte gewählte Ziffer


'Alle Variablen auf Null setzen
A = 0
'Zahl1 = 0
'Zahl2 = 0
'Zahl3 = 0
'Zahl4 = 0
'Zahl5 = 0
'Zahl6 = 0
'Zahl7 = 0
'Zahl8 = 0
'Zahl9 = 0
'Zahl10 = 0

'Alle Ausgänge auf 1 setzen
Falsch = 1
Ansage = 1
Bereit = 1


'Hauptprogrammschleife

'Abfrage des Nummernschalters
Do
Bereit = 1                                                 'Wählbereitschaft anzeige

Debounce Nsi , 1 , Impulse , Sub                           'Impulsschalter entprellen und Sprunganweisung
Debounce Nsa , 1 , Auswerten , Sub                         'Wählscheibe abgelaufen entprellen und Sprunganweisung
Loop

'Implse hochzählen
Impulse:

Bereit = 0
A = A + 1
Return

Auswerten:
Nummer = Nummer + Str(a)                                    'Die ermittelten Impulse der Rufnummer hinzufügen
If Len(nummer) = 11 Then                                    'Die Länge der Nummer ermitteln: falls 11 Stellen dann zur Kontrolle
Gosub Kontrolle
End If
A = 0
Return


Kontrolle:

If Nummer = "10331316255" Then
Ansage = 0
Else
Falsch = 0
End If
Nummer = ""

Return

lg
Ranseiher
 
OP
peter51d

peter51d

Geocacher
Mein erster Ansatz war es auch, einfach den Code des Tastentelefons um zu stricken.
Aber der Speicher des Tinys scheint zu klein für String' s zu sein.
Zumindest hat es bei mir nicht geklappt.

Dein Code sieht interresant aus, deutlich schlanker als mein Versuch.

Allerdings bekomme ich noch einen Sram Fehler in der String Zeile und ein Invalid Datatype Fehler in der Zeile "nummer=nummer+str(a)"

ich werde aber malein wenig mit deinem Code experimentieren, wenn ich darf.
 
OP
peter51d

peter51d

Geocacher
So, wenn ich den String auf 9 verkleinere, klappt es.
Ein paar kleine Änderungen habe ich aber noch gemacht.

1: Sytembedingt ist der NSA Kontakt beim Start des Tiny's offen. Dadurch geht es sofort in die Sub Auswerten. Hier habe ich noch eine Abfrage auf A=0 eingebaut. Diese verhindert das sofort eine "0" in den String geschrieben wird.

2: Im gleichen Zug habe ich noch eine Abfrage auf A=10 eingefügt. Wenn A=10 ist, wir eine "0" in den String geschrieben. Da durch muss dann in der Sub Kontrolle für die Null keine 10 mehr geschrieben werden.
Spart eine Stelle im String und macht es etwas übersichtlicher den Kontrollcode ein zu tragen.

3: Das gosub zur Sub "Kontrolle" in der Sub "Auswerten" habe ich gegen ein goto getauscht und das Programm am ende der Sub " Kontrolle" beendet. Wer sich "verwählt" hat, mus halt auflegen und neu wählen.

4: Vorne noch mit " Nummer="" " sicher gestellt, das nichts im String steht.


Hätte der Tiny jetzt noch etwas mehr Sram Speicher, könnte man die zu wählende Rufnummer noch schön in eine zweiten String legen und die Auswertung einfach über die Stringlänge aktivieren.

Ich denke, das Telefon ist Fertig dafür umgebaut und irgendwann mal eine Station in einem Multi zu werden.


Code:
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 5


'Codeabfrage über Wählscheibentelefon


'Ein und Ausgänge konfigurieren

Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output

'Alias Namen zuweisen
Falsch Alias Portb.2                                        'rufzeichen "kein Anschluss unter dieser Nummer"
Nsi Alias Pinb.1                                            'Impulsleitung vom Nummernschalter
Nsa Alias Pinb.0                                            'Nummernschalterkontakt, für Wählscheibe dreht oder steht
Ansage Alias Portb.3                                        'Ansage der Informationen
Bereit Alias Portb.4                                        'Wählbereitschaft anzeigen

'Interne pullups zuschalten
Portb.0 = 1
Portb.1 = 1

'Variablen zuweisen
Dim A As Byte                                               'Anzahl der Impulse pro Wahlvorgang
Dim Nummer As String * 9                                    'Der String in dem die Nummer geschrieben wird


'Alle Variablen auf Null setzen
A = 0
Nummer = ""

'Alle Ausgänge auf 1 setzen
Falsch = 1
Ansage = 1
Bereit = 1


'Hauptprogrammschleife

'Abfrage des Nummernschalters
Do
Bereit = 1                                                 'Wählbereitschaft anzeige

Debounce Nsi , 1 , Impulse , Sub                           'Impulsschalter entprellen und Sprunganweisung
Debounce Nsa , 1 , Auswerten , Sub                         'Wählscheibe abgelaufen entprellen und Sprunganweisung
Loop

'Implse hochzählen
Impulse:

Bereit = 0
A = A + 1
Return

Auswerten:
If A = 0 Then
Return
End If
If A = 10 Then
A = 0
End If
Nummer = Nummer + Str(a)                                    'Die ermittelten Impulse der Rufnummer hinzufügen
If Len(nummer) = 9 Then                                     'Die Länge der Nummer ermitteln: falls 11 Stellen dann zur Kontrolle
Goto Kontrolle
End If
A = 0
Return


Kontrolle:

If Nummer = "024681357" Then
Ansage = 0
Else
Falsch = 0
End If

End                                                         'end program
 

Ranseiher

Geocacher
Hi,
warum du die Fehlermeldung bekommst weiß ich nicht.
Ich habe ansonsten beim Compilieren alles auf Standard.

Experimentieren darfst du natürlich gerne.

Ich hänge mal meine Compilierte hex mit dran.
Kannst ja mal auf den Chip brennen und schauen was er macht.

lg
Ranseiher
 

Anhänge

  • WäHLSCHEIBEN-TELEFON.rar
    875 Bytes · Aufrufe: 73

Ranseiher

Geocacher
Ok dann passt es ja.
Unsere Posts haben sich überschnitten.

Lg
Ranseiher

offtopic: Warum kann ich meine Posts nicht editieren?
 

upigors

Geowizard
Morgens, mal ne Frage von mir der sich so ein Wählscheibentelefon noch nie angesehen hat:
verstehe ich das richtig das dort 2 Impulse ausgewertet werden, einer der das drehen der Scheibe "meldet" und einer der je nach gewählter Ziffer eine Anzahl von X Impulsen ausgibt?
Wie geschrieben, hab so ein Ding noch nie zerlegt oder mal genauer angesehen......
 
OP
peter51d

peter51d

Geocacher
Im Prinzip ja.
Im Nummernschalter (so heisst die Wählscheibenmechanik) gibt es zwei potentialfrei Kontakte.
Den NSI und den NSA.
Der NSA ist ein Schllesser, der betätigt wird, sobald der Nummernschalter aus der Ruhelage bewegt wird. Der NSI ist ein Öffner, der bei jedem Wählimpuls öffnet.
Die Impulslänge sollte im Idealfall bei 38/62ms liegen. Mehr infos findet man in Wikipedia unter Nummernschalter.
Ich hoffe, ich konnte schon mal etwas weiter helfen.
 

upigors

Geowizard
konntest Du, danke.
Wenn ich so ein Teil mal in die Finger bekomme weiß ich wenigstens schon etwas ;-)
Gruß Uwe
 
OP
peter51d

peter51d

Geocacher
Ich schaue immer mal auf Flohmärkten nach den Dingern.
Eigendlich suche ich ja noch ein W48 für mich zu Hause, ist halt Kult. Nur dafür wollen die immer noch richtig Taler haben. Die einfachen "611er" bekommt man oft schon für ein bis zwei €.
Das schöne ist halt, das die schnell und einfach zu demontieren sind. Mehr als einen Sschiltzschraubendreher größe 2 braucht es nicht. Und wenn man die Glocke raus nimmt, hat man richtig Platz.
 
OP
peter51d

peter51d

Geocacher
Ich habe noch mal etwas weiter probiert.

Das mit den Stack einstellungen ist mir immer noch nicht klar.
Vielleicht komme ich ja irgendwann noch mal dahinter.

Hier mal ein Code, basierend auf dem von Ranseiher.
Allerdings um einen zweiten String erweitert in dem die zu wählende Nummer abgelegt wird.
Das erleichtert die längen Auswertung. Möglich sind hier Nummern bis zu 10 Stellen.
Mehr habe ich nicht probiert.
Die zu wählende Nummer muss nur einmal am Anfang der Programms festgelegt werden.
Die Länge kann von ein bis zehn Ziffern betragen und wird in der Auswertung automatisch berücksichtigt.
Ich hoffe, dass er mit den Kommentaren verständlich ist.

Code:
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 2
$swstack = 5


'Codeabfrage über Wählscheibentelefon


'Ein und Ausgänge konfigurieren

Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output

'Alias Namen zuweisen
Falsch Alias Portb.2                                        'rufzeichen "kein Anschluss unter dieser Nummer"
Nsi Alias Pinb.1                                            'Impulsleitung vom Nummernschalter
Nsa Alias Pinb.0                                            'Nummernschalterkontakt, für Wählscheibe dreht oder steht
Ansage Alias Portb.3                                        'Ansage der Informationen
Bereit Alias Portb.4                                        'Wählbereitschaft anzeigen

'Interne pullups zuschalten
Portb.0 = 1
Portb.1 = 1

'Variablen zuweisen
Dim A As Byte                                               'Anzahl der Impulse pro Wahlvorgang
Dim Nummer As String * 10                                   'Der String in dem die gewählte Nummer geschrieben wird
                                                             ' !!genau so gross wie der String "Rufnummer"!!
Dim Rufnummer As String * 10                                'Der String in dem die zu wählende Nummer festgelegt wird
                                                             'die max länge ist hier auf 10 Nummern beschränkt


'Alle Variablen auf Null setzen
A = 0
Nummer = ""                                                 'Sicherstellen, das String leer

'Alle Ausgänge auf 1 setzen
Falsch = 1
Ansage = 1
Bereit = 1


'Hauptprogrammschleife

 Rufnummer = "7634528109"                                   'Hier die zu wählende Nummer eintragen

'Abfrage des Nummernschalters
Do
Bereit = 0                                                  'Wählbereitschaft anzeige

Debounce Nsi , 1 , Impulse , Sub                            'Impulsschalter entprellen und Sprunganweisung
Debounce Nsa , 1 , Auswerten , Sub                          'Wählscheibe abgelaufen entprellen und Sprunganweisung
Loop

'Implse hochzählen

Impulse:

Bereit = 0
A = A + 1
Return

Auswerten:
If A = 0 Then                                               'Verhindern, das beim Start schon etwas in den Sting "Nummer"geschrieben wird
Return
End If
If A = 10 Then                                              'beim wählen der Nummer 0 werden 10 Impulse erzeugt.
A = 0                                                       'hier durch wird im String eine "0" geschrieben
End If
Nummer = Nummer + Str(a)                                    'Die ermittelten Impulse der Rufnummer hinzufügen
If Len(nummer) = Len(rufnummer) Then                        'Länge der gewählten Nummer mit Länge der zu wählenden Nummer vergleichen
                                                            'durch den Längenvergleich der Strings, muss keine extra längen Angabe mehr gemacht werden
Goto Kontrolle                                              'wenn Länge gleich dann zur Kontrolle
End If
A = 0                                                       'Impulse für nächste Nummer löschen
Return


Kontrolle:
Bereit = 1
If Nummer = Rufnummer Then                                  'zu wählende Nummer mit gewählter Nummer vergleichen
Ansage = 0                                                  'wenn gleich dann Ansage
Else
Falsch = 0                                                  'wenn ungleich dann "kein Anschluss unter dieser Nummer"
End If

End                                                         'end program
 

stonewood

Geowizard
peter51d schrieb:
Das mit den Stack einstellungen ist mir immer noch nicht klar.
Vielleicht komme ich ja irgendwann noch mal dahinter.
http://www.rn-wissen.de/index.php/Bascom_Inside
http://halvar.at/elektronik/kleiner_bascom_avr_kurs/speicher_hwstack_swstack_frame/

heißt: Du mußt alle drei setzen, der rest ist frei für Variablen. Ansonsten übernimmt bascom übrigens die Daten aus dem 'CPU'-Reiter, die in der Regel nicht wirklich das sind was man will.
 

upigors

Geowizard
Hab heute ein steinalt-Wählscheibentelefon geschenkt bekommen. Die Kontakte bedürfen zwar etwas Pflege und die interne Verkabelung ist teilweise gebrochen aber das wird schon :D
Werde das mal in Gang bringen und dann den Code von Peter51d testen. mal schaun obs was wird.....
Danke auf jeden Fall für diesen Tread und die Beiträge
 

upigors

Geowizard
peter51d schrieb:
Ich habe noch mal etwas weiter probiert.
.....
Hier mal ein Code, basierend auf dem von Ranseiher.

.....

Ich hab bei Wikipedia folgendes gefunden:
Hierbei ist zu beachten, dass der nsi immer zwei zusätzliche Impulse, die so genannten Leerlaufimpulse erzeugt. Wird beispielsweise die Ziffer 5 gewählt, produziert der nsi 5 + 2 = 7 Impulse.

Hast Du diese zusätzlichen Impule in Deinem Code nicht berücksichtigt? Oder seh ich das nur im "Großen Gesammten" nicht?
Die Fuses hast Du auf Default belassen?
 
OP
peter51d

peter51d

Geocacher
Hallo upigos
Fuse auf def Standart.
Die zwei zusatz Impulse muss man nicht berücksichtigen. Dafür gibt es noch einen Schalter NSR(ich meine
das er so heisst), der diese zwei extra Impulse überbrückt. Der NSR ist in den Schaltbildern nicht gezeichnet, da es wohl irgendeine interne Mechanik im Nummernschalter ist. An den NSA Kontakten sollten nur so viele Impulse ausgegeben werden wie die Ziffer die gewählt wurde.
 

upigors

Geowizard
Danke für die Antwort, ich schau mir das noch mal an aber ich behaupte mein Telefon bzw. die Kontakte an der Wählscheibe haben diesen Schalter so nicht. Ich habe tatsächlich nur 2 Kontaktpaare,
einmal den Drehscheibenimpuls, also wenn die 1 oder höher gewählt wurde schliesst der
und eine Zweites welches dauerhaft geschlossen ist und beim zurückdrehen der Scheibe für Sekundenbruchteile öffnet.
Soweit ich das beurteilen kann gibt der 1:1 die Impule weiter und wenn ich richtig gezählt hab (beim langsamen zurückdrehen der Scheibe) dann tatsächlich 2 mehr. Ich werde einfach mal Deinen Code testen, vorerst nur mit einer Ziffer z.b. 5, wenn es dann bei 3 die "Ansage" startet ist es so wie ich denke....
schaun wir mal....
 

stonewood

Geowizard
upigors schrieb:
Hierbei ist zu beachten, dass der nsi immer zwei zusätzliche Impulse, die so genannten Leerlaufimpulse erzeugt. Wird beispielsweise die Ziffer 5 gewählt, produziert der nsi 5 + 2 = 7 Impulse.
Hast Du diese zusätzlichen Impule in Deinem Code nicht berücksichtigt? Oder seh ich das nur im "Großen Gesammten" nicht?
Die Fuses hast Du auf Default belassen?
nsr gibts bei 'neueren' Telefonen ('ab etwa Ende der 1970er-Jahre') nicht mehr, steht ein paar Absätze tiefer. Auch im Schaltbild ist davon nix zu sehen, nur nsi und nsa sind da noch drauf.
 
Oben