• 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 mit 7 Segmentanzeige

Pretender

Geocacher
Hallo,
ich habe mir eine Schaltung ausgedacht.
Wo ich ein Attiny13 nütze mit dem Wählprogramm drauf und dieses Funktioniert auch super.
Mit einen Attiny 2313 wollte ich eine 7Segmentanzeige ansteuern.
Vom Attiny13 bekommt der Attiny2313 ein LOW wenn dieser Port "aktiv" ist.
Beim Attiny 2313 geht dieses Signal auf die Eingänge PD0,PD1 und PD2 rein (also LOW ist aktiv).
Die Komplette Bank vom PortB ist als Ausgang gedacht auch hier ist der Port "aktiv" wenn er Low ist.
ich habe die 7 Segment Anzeige an folgenden Ports angeschlossen.
PB0=a
PB1=b
PB2=c
PB3=d
PB4=e
PB5=f
PB6=g
PB7=.

bei Eingang PD0 sollte FALSCH angezeigt werden (brauchen nicht verändert werden)
bei Eingang PD1 sollten die Ko's angezeigt werden (möglichst so daß auch ich die Ko's leicht ändern könnte)
bei Eingang PD2 sollte eine 0 blinken (braucht auch nicht veränderbar sein)

Also brauche ich den kompletten Zahlensatz von 0-9,E,n,F,A,L,C,H
Leider bin ich im programmieren eine Niete.
Könnte mir jemand hierbei helfen?
Gruß Pretender
 

Anhänge

  • Wählscheibe mit LED.T3001.pdf
    19,3 KB · Aufrufe: 214
OP
P

Pretender

Geocacher
bei Eingang PD1 sollten die Ko's angezeigt werden (möglichst so daß auch ich die Ko's leicht ändern könnte)
Beispiel: n_ 54.100_ E_ 22.333_C_100
Beispiel 2: 166°_150_C_100
da sind noch 3 Zeichen dazu gekommen _ , . , ° (a,b,f,g Segmete)
 

peter51d

Geocacher
Guten Morgen Pretender.

Wie viel Programmiererfahrung hast du den?
Reicht es, um das Wählscheibenprogramm so anzupassen, das es auf dem 2313 laufen würde?
Wen ja, würde ich mir den Tiny13 sparen und alles über den 2313 laufen lassen.
Anstatt einen Ausgang zu schalten, der die LED's schaltet, einfach in eine Sub springen, die dann die Ausgänge für die 7 Seg schaltet. Da du nach deinem Schaltplan ja einen ULN nutzen möchtest, braucht ja nicht gemultiplext zu werden. Somit wäre der zusätzliche Programmspeicher bedarf überschaubar.

Ich habe noch nicht mit dem 2313 gearbeitet und gerade auch kein Datenblatt greifbar. Wie sieht es dem mit dem Speicherplatz im verhältnis zum Tiny 13 aus?
 
OP
P

Pretender

Geocacher
Erfahrungen beim Programmieren keine.
Zumindestens nicht soviel um sowas zu schreiben.
Attiny 2313 hat
– 2K Bytes of In-System Self Programmable Flash
– 128 Bytes In-System Programmable EEPROM
_ 128 Bytes Internal SRAM
Gruß PRetender
 

peter51d

Geocacher
Von den Daten her, sollte es problemlos alles auf den 2313 passen.
Wenn ich etwas Zeit habe, probiere ich es mal aus. Kannaber keinen Hardwaretest machen,
Da ich weder 2313 noch Wälscheibentelefon zur Hand habe.

Wenn du mehr mit dem mc's machen möchtest, solltet du dich aber vielleicht mal
etwas mit der Programmierung befassen.

Welche Software und welchen Programmer nutzt du denn?
 
OP
P

Pretender

Geocacher
Ich habe sowohl AVR Studio und auch Bascom.
Den Programmer AVRISPMKII benütze ich mit dem Pollin Board und das Zusatzboard von Pollin habe ich auch.

Zumindestens laufen jetzt beide Programme mit den Programmer wieder, selbst damit hatte ich schon Probleme. Da ich ein Systemabsturz hatte. :kopfwand: :kopfwand: :kopfwand:
 

chrysophylax

Geomaster
Den 2803 kannst du dir sparen - der 2313 kann die einzelnen Segmente der Anzeige völlig problemlos bei dem von dir vorgewählten Strom mit seinen Portpins treiben.

chrysophylax.de
 

peter51d

Geocacher
Im Prinzip kann man den 2803 auch weg lassen, dann sollte man aber, um innerhalb der Spezifikationen zu bleiben, darauf achten, das der Strom der einzelnen Segmente 25mA nicht überschreitet.
Das sollte aber kein grosses Problem darstellen.
 

peter51d

Geocacher
Ich habe da mal zusammen gestrickt, allerdings ohne gewähr. Habe hier z.Z. keine Hardware zum testen.
Ich bin mir im Moment auch nicht sicher, ob die Zeichen do richtig sind, vielleicht habe ich mich da auch verhauen. Sollte aber kein Problem sein, das im Zweifelsfall anzupassen.
Braucht unter Bascom 49% Speicher vom 2313.

Kann man sicherlich eleganter lösen, da in den Anzeigesubs aber nichts anderes mehr passieren muss, habe ich mir einen Timer erspart und einfach mit Wait's gearbeitet.
Wie die Koordinaten geändert werden können, sollte ersichtlich sein.
Beim Starten gibt es hier allerdings keine blinkende Null, sondern ein leuchtendes "Minus", das beim wählen
mit halber Wählimpulsrate "blinkt".

Code:
$regfile = "attiny2313.dat"
$crystal = 8000000
$hwstack = 2
$swstack = 5



'Codeabfrage über Wählscheibentelefon


'Ein und Ausgänge konfigurieren

Config Portb = Output
Config Pind.0 = Input
Config Pind.1 = Input


'Alias Namen zuweisen

Nsi Alias Pind.1                                            'Impulsleitung vom Nummernschalter
Nsa Alias Pind.0                                            'Nummernschalterkontakt, für Wählscheibe dreht oder steht


'Interne pullups zuschalten
Portd.0 = 1
Portd.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

Portd.6 = 0

'Hauptprogrammschleife

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

'Abfrage des Nummernschalters
Do


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:

Toggle Portd.6
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:

If Nummer = Rufnummer Then                                  'zu wählende Nummer mit gewählter Nummer vergleichen
Goto Koordinaten                                            'wenn gleich dann Anzeige der Koordinaten
Else
Goto Falsch                                                 'wenn ungleich dann Anzeige "Falsch"
End If

End                                                         'end program

'Koordinaten Anzeige
Koordinaten:

Do
   Gosub Leer

   Waitms 500                                               'Anzeigedauer des Zeichens

   Gosub N

   waitms 500

   Gosub Eins

   Waitms 500

   Gosub Zwei

   waitms 500

   Gosub Grad

   waitms 500

   Gosub Drei

   waitms 500

   Gosub Vier

   waitms 500

   Gosub Dp

   waitms 500

   Gosub Fuenf

   Waitms 500

   Gosub Sechs

   Waitms 500

   Gosub Sieben

   waitms 500

   Gosub Leer

   waitms 500

   Gosub E

   waitms 500

   Gosub Acht

   waitms 500

   Gosub Neun

   waitms 500

   Gosub Null

   waitms 500

   Gosub Grad

   waitms 500

   Gosub Eins

   waitms 500

   Gosub Zwei

   waitms 500

   Gosub Dp

   waitms 500

   Gosub Drei

   waitms 500

   Gosub Vier

   waitms 500

   Gosub Fuenf

   Waitms 500

   Gosub Leer

   Waitms 500

Loop


'Falschanzeige
Falsch:

Do
   Gosub Leer

   Waitms 500

   Gosub F                                                  '

   Waitms 500

   Gosub A1

   Waitms 500

   Gosub L

   Waitms 500

   Gosub S

   Waitms 500

   Gosub C

   Waitms 500

   Gosub H

   Waitms 500

   Gosub Leer

   Waitms 500

Loop


Leer:

Portb = &B11111111

Dp:

Portb = &B11111110

Null:

Portb = &B00000011

Eins:

Portb = &B10011111

Zwei:

Portb = &B00100101

Drei:

Portb = &B00001101

Vier:

Portb = &B10011001

Fuenf:

Portb = &B01001001

Sechs:

Portb = &B01000001

Sieben:

Portb = &B00011011

Acht:

Portb = &B00000001

Neun:

Portb = &B00001001

A1:

Portb = &B00010001

C:

Portb = &B01100011

E:

Portb = &B01100001

F:

Portb = &B01110001

H:

Portb = &B10010001

L:

Portb = &B11100011

N:

Portb = &B11010101

S:

Portb = &B01001001

Grad:

Portb = &B00111001
 

Anhänge

  • Wählscheibe mit 7Seg.jpg
    Wählscheibe mit 7Seg.jpg
    43,1 KB · Aufrufe: 1.049

peter51d

Geocacher
UPPS, da ist mir im Zeichesatz wohl ein Fehler unterlaufen. Falschherum gezählt. :kopfwand:

So sollte es besser passen:
Code:
' Zeichensatz
Leer:

Portb = &B11111111

Dp:

Portb = &B01111111

Null:

Portb = &B11000000

Eins:

Portb = &B11111001

Zwei:

Portb = &B10100100

Drei:

Portb = &B10110000

Vier:

Portb = &B10011001

Fuenf:

Portb = &B10010010

Sechs:

Portb = &B10000010

Sieben:

Portb = &B11111000

Acht:

Portb = &B10000000

Neun:

Portb = &B10010000

A1:

Portb = &B10001000

C:

Portb = &B11000110

E:

Portb = &B10000110

F:

Portb = &B10001110

H:

Portb = &B10001001

L:

Portb = &B11000111

N:

Portb = &B10101011

S:

Portb = &B10010010

Grad:

Portb = &B10011100

Wrürde mich freuen, zu hören, ob es funkioniert.
 
OP
P

Pretender

Geocacher
Das ging ja wirklich schnell. Danke für die schnelle Antwort.
Ich werde es neu Aufbauen und dann bekommst du eine Rückantwort.

Gruß Christopher
 
OP
P

Pretender

Geocacher
Die Acht mit Punkt leuchtet ständig egal was ich wähle.
An einer Leuchtdioden fällt 11,3mA ab.
 

peter51d

Geocacher
Normaler weise höchstens die Geschwindigkeit. Die Einstellung in den Fuse byts sollte mit der Angabe im Code überein stimmen.
Ich schaue heute abend noch mal drauf.
 

peter51d

Geocacher
:kopfwand:
Da war ich gestern wohl nicht ganz bei der Sache oder es war schon zu spät.
Es muss natürlich PortB.6 und nicht PortD.6 getooglet werden.
Und im Zeichensatz fehlten die Returns.

Jetzt sollte es laufen.

Habe es gerade auf einen Mega8 probiert.
Da klappt es.

Hier noch der Code:

Code:
$regfile = "attiny2313.dat"
$crystal = 8000000
$hwstack = 2
$swstack = 5



'Codeabfrage über Wählscheibentelefon


'Ein und Ausgänge konfigurieren

Config Portb = Output
Config Pind.0 = Input
Config Pind.1 = Input


'Alias Namen zuweisen

Nsi Alias Pind.1                                            'Impulsleitung vom Nummernschalter
Nsa Alias Pind.0                                            'Nummernschalterkontakt, für Wählscheibe dreht oder steht


'Interne pullups zuschalten
Portd.0 = 1
Portd.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

Portb = &B10111111

'Hauptprogrammschleife

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

'Abfrage des Nummernschalters

Do


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:

Toggle Portb.6
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:

If Nummer = Rufnummer Then                                  'zu wählende Nummer mit gewählter Nummer vergleichen
Goto Koordinaten                                            'wenn gleich dann Anzeige der Koordinaten
Else
Goto Falsch                                                 'wenn ungleich dann Anzeige "Falsch"
End If

End                                                         'end program

'Koordinaten Anzeige

Koordinaten:

Do
   Gosub Leer

   Wait 1                                                   'Anzeigedauer des Zeichens

   Gosub N

   Wait 1

   Gosub Eins

   Wait 1

   Gosub Zwei

   Wait 1

   Gosub Grad

   Wait 1

   Gosub Drei

   Wait 1

   Gosub Vier

   Wait 1

   Gosub Dp

   Wait 1

   Gosub Fuenf

   Wait 1

   Gosub Sechs

   Wait 1

   Gosub Sieben

   Wait 1

   Gosub Leer

   Wait 1

   Gosub E

   Wait 1

   Gosub Acht

   Wait 1
   Gosub Neun

   Wait 1

   Gosub Null

   Wait 1

   Gosub Grad

   Wait 1

   Gosub Eins

   Wait 1

   Gosub Zwei

   Wait 1

   Gosub Dp

   Wait 1

   Gosub Drei

   Wait 1

   Gosub Vier

   Wait 1

   Gosub Fuenf

   Wait 1

   Gosub Leer

   Wait 1

Loop


'Falschanzeige
Falsch:

Do
   Gosub Leer

   Waitms 500

   Gosub F                                                  '

   Waitms 500

   Gosub A1

   Waitms 500

   Gosub L

   Waitms 500

   Gosub S

   Waitms 500

   Gosub C

   Waitms 500

   Gosub H

   Waitms 500

   Gosub Leer

   Waitms 500

Loop

' Zeichensatz
Leer:

Portb = &B11111111

Return

Dp:

Portb = &B01111111
return
Null:

Portb = &B11000000
      return
Eins:

Portb = &B11111001
return
Zwei:

Portb = &B10100100
return
Drei:

Portb = &B10110000
return
Vier:

Portb = &B10011001
return
Fuenf:

Portb = &B10010010
return
Sechs:

Portb = &B10000010
Return
Sieben:

Portb = &B11111000
return
Acht:

Portb = &B10000000
return
Neun:

Portb = &B10010000
return
A1:

Portb = &B10001000
return
C:

Portb = &B11000110
return
E:

Portb = &B10000110
return
F:

Portb = &B10001110
return
H:

Portb = &B10001001
return
L:

Portb = &B11000111
return
N:

Portb = &B10101011
return
S:

Portb = &B10010010
return
Grad:

Portb = &B10011100
return

Ich weiss nicht, wie der 2313 ab Werk eingestellt ist.
Bitte die Fuse auf 8mHz einstellen oder die Frequenz im Code anpassen.
 
OP
P

Pretender

Geocacher
Also im Moment Leuchtet immer nur das Segment B
:-(
Ich habe nur eine 10 stellige Nummer in den String für die zu wählenden Nummer eingegeben
 

Bussard

Geocacher
peter51d schrieb:
:Ich weiss nicht, wie der 2313 ab Werk eingestellt ist.
Bitte die Fuse auf 8mHz einstellen oder die Frequenz im Code anpassen.
Pretender schrieb:
Hier noch mal die Fuseeinstellung die er zur Zeit hat
Der Hersteller schreibt "Please consult the device specific datasheet in the Fuse Bits section under the Memory Programming chapter to see the default Fuse setting for your AVR part."
Bisher ware alle Attinys und Atmegas, die mir untergekommen sind, auf 1 MHz interner RC-Oszillator (8 MHz mit aktivem Teilerfaktor 8) ab Werk voreingestellt.
Es ist bei einem neuen Programm oder zum Testen vorteilhaft, es dabei zu belassen und mit "$crystal = 1000000" zu arbeiten und kann so einfach ausprobieren und Chips tauschen (Zeitschleifen, WAIT usw. passen dann auch, wenn man einen anderen Tiny oder Mega sockelt), ohne die Fuses anzufassen.
Das gilt für die meisten Fälle, außer man benötigt einen anderen Takt für z.B. serielle Kommunikation oder spezifische Bedingungen wie beim LED-only-Reaktivlicht.
Wenn alles läuft, dann einmalig im Programm und bei den Fusebits die endgültig benötigte Frequenz einstellen.

Gruß Bussard
 

peter51d

Geocacher
Für das Programm habe ich die Einstellungen aus dem Beispielprogramm von Bascom für den 2313 genommen.
Dort sind halt 8 MHz angegeben.
Darum auch
Ich weiss nicht, wie der 2313 ab Werk eingestellt ist.
Bitte die Fuse auf 8mHz einstellen oder die Frequenz im Code anpassen.

@ Pretender:
Ändere die Frequenz im Code bitte auf 1MHz.
Dein 2313 ist auf 1MHz gefust.
Siehe
Fusebit KLA987 (Frequenz auf 8MHz)
und
Fusebit C (Frequenz wird durch 8 geteilt)

Das ergibt dann eine Taktfrequenz von 1MHz.

Zum Testen würde ich dan auch die zu Wählenden Nummer noch auf zwei oder drei Stellen verkürzen.
(ist für das Programm egal, geht nur beim Probieren schnelle als wenn man immer 10 Ziffern wählen muss)
 
Oben