Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

Wählscheibentelefon, bräuchte da mal Hilfe

Basteleien analog und digital mit Strom und Spannung.

Moderator: radioscout

Benutzeravatar
peter51d
Geomaster
Beiträge: 394
Registriert: Do 8. Okt 2009, 12:09
Wohnort: 49661 Kellerhöhe

Wählscheibentelefon, bräuchte da mal Hilfe

Beitrag von peter51d » Sa 31. Dez 2011, 16:59

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".
Grüße aus dem Norden

peter51d

Werbung:
stonewood
Geowizard
Beiträge: 1062
Registriert: Mo 3. Apr 2006, 10:15
Kontaktdaten:

Re: Wählscheibentelefon, bräuchte da mal Hilfe

Beitrag von stonewood » Sa 31. Dez 2011, 17:16

peter51d hat geschrieben: 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.

Benutzeravatar
peter51d
Geomaster
Beiträge: 394
Registriert: Do 8. Okt 2009, 12:09
Wohnort: 49661 Kellerhöhe

Re: Wählscheibentelefon, bräuchte da mal Hilfe

Beitrag von peter51d » Sa 31. Dez 2011, 23:08

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:
Grüße aus dem Norden

peter51d

Benutzeravatar
peter51d
Geomaster
Beiträge: 394
Registriert: Do 8. Okt 2009, 12:09
Wohnort: 49661 Kellerhöhe

Re: Wählscheibentelefon, bräuchte da mal Hilfe

Beitrag von peter51d » So 1. Jan 2012, 11:37

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: Alles auswählen

$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
Grüße aus dem Norden

peter51d

Ranseiher
Geocacher
Beiträge: 20
Registriert: Do 29. Okt 2009, 22:07

Re: Wählscheibentelefon, bräuchte da mal Hilfe

Beitrag von Ranseiher » So 1. Jan 2012, 20:47

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: Alles auswählen

$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

Benutzeravatar
peter51d
Geomaster
Beiträge: 394
Registriert: Do 8. Okt 2009, 12:09
Wohnort: 49661 Kellerhöhe

Re: Wählscheibentelefon, bräuchte da mal Hilfe

Beitrag von peter51d » So 1. Jan 2012, 21:23

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.
Grüße aus dem Norden

peter51d

Benutzeravatar
peter51d
Geomaster
Beiträge: 394
Registriert: Do 8. Okt 2009, 12:09
Wohnort: 49661 Kellerhöhe

Re: Wählscheibentelefon, bräuchte da mal Hilfe

Beitrag von peter51d » So 1. Jan 2012, 22:08

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: Alles auswählen

$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
Grüße aus dem Norden

peter51d

Ranseiher
Geocacher
Beiträge: 20
Registriert: Do 29. Okt 2009, 22:07

Re: Wählscheibentelefon, bräuchte da mal Hilfe

Beitrag von Ranseiher » So 1. Jan 2012, 22:09

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
Dateianhänge
WäHLSCHEIBEN-TELEFON.rar
(875 Bytes) 53-mal heruntergeladen

Ranseiher
Geocacher
Beiträge: 20
Registriert: Do 29. Okt 2009, 22:07

Re: Wählscheibentelefon, bräuchte da mal Hilfe

Beitrag von Ranseiher » So 1. Jan 2012, 23:53

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

Lg
Ranseiher

offtopic: Warum kann ich meine Posts nicht editieren?

Benutzeravatar
upigors
Geowizard
Beiträge: 2350
Registriert: Mo 24. Sep 2007, 15:52
Wohnort: 39326 Hohenwarsleben
Kontaktdaten:

Re: Wählscheibentelefon, bräuchte da mal Hilfe

Beitrag von upigors » Di 3. Jan 2012, 07:14

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......
Bild..Bild

Antworten