Forum: Mikrocontroller und Digitale Elektronik Posttelepohon mit Wählscheibe


von die2lustigen3 (Gast)


Lesenswert?

Moin Moin !

Ich hab hier ein wünderhübsches, altes Posttelephon (FeTAp 791 in 
orange), das ich gerne in meiner Wohnung nutzen möchte.
Dazu hab ich mir ein Gigaset A100 Schnurlostelephon gekauft und möchte 
die beiden Teile nun miteinander verheiraten.

Soweit so gut.
Mein Problem ist nun das korrekte auslesen der Wählscheibenimpulse (bin 
noch kein Profi mit Software).

Ich habe die Kontakte mit 74HC14 und der hier Entprellung Schaltung 
entprellt, und die Leitungen NSR und NSI einem Atmega32 zugeführt, der 
dann alles auf einem LCD-Display anzeigen soll ... so mal zum 
rumexperimentieren bis es klappt.
Ja, die Angezeigten Zahlen waren dann erstmal eher zufällig ...

Dann hab ich ein Zähler aus 4 D-FF aufgebaut um zu schauen was ob die 
Wählscheibe noch funktioniert. Tut sie.


Nach viel rumprobieren, bin ich mittlerweile der Meinung, mein Programm 
ist zu langsam. Ich glaube es dauert zu lange bis es in die Schleife 
reinkommt wo die impulse abgefragt werden.
Dafür spricht zb, daß falls ich die Wählscheibe ganz aufziehe, dann 
warte(ca 0,5s), dann loslasse, alles prima funktioniert.
Auch, daß die Zahlen 1-3 öfter falsch sind als der Rest, würde dafür 
sprechen ...


So, lange Rede kurzer Sinn, wie kann ich mein Programm schneller machen?
1
int main(void)
2
{
3
  int count=0;
4
  int kontrollwert=0;
5
  int zahl=0;  
6
  char buffer_1[7];
7
  char buffer_2[7];
8
9
  DDRA &= ~(1 << DDA0);              // PA0 als Eingang  enable Wählscheibe "NSR"
10
  DDRA &= ~(1 << DDA1);              // PA1 als Eingang  Wählimpulse "NSI" 
11
12
13
    lcd_init(LCD_DISP_ON);
14
    lcd_clrscr();
15
  lcd_puts("Test Waehlscheibe\n");
16
17
18
  while(1) 
19
  {                          
20
    if (PINA & (1 << PA0))            //wenn Wählscheibe an  (sonst nichts machen)
21
    {
22
      count=0;                //es wird gewählt, alles zurücksetzen
23
      zahl=0;
24
      kontrollwert=0;              //zählt die schleifendurchläufe während wählimpuls=high
25
      while(PINA & (1 << PA0))        //wärend des Wählens (wählscheibe an)
26
        {
27
        lcd_puts("Waelen ein.");
28
        if(PINA & (1 << PA1))        //falls wählimpuls=high
29
        count++;
30
31
        else
32
          {
33
          if(count>3)            //jetzt ist wählimpuls wieder low
34
            {
35
            kontrollwert=count;
36
            zahl++;
37
            count=0;
38
            }
39
          }
40
        }
41
    }
42
43
44
    lcd_clrscr();                //Ausgabe auf LCD
45
        lcd_puts("Test Waehlscheibe\n");
46
        lcd_puts("Zahl=");
47
        itoa( zahl , buffer_1, 10);
48
        lcd_puts(buffer_1);
49
        itoa( kontrollwert , buffer_2, 10);
50
        lcd_gotoxy(9,1);         
51
        lcd_puts("K=");
52
    lcd_puts(buffer_2);    
53
54
  
55
    sleep_ms(1000);                  //zeit zum ablesen
56
  }
57
58
}


Danke fürs lesen und für eventuelle Antworten
Gruß
die2lustigen3

von die2lustigen3 (Gast)


Lesenswert?

Sorry für meine etwas komische Ausdruckseweise und die Schreibfehler ...
Das nächste Posting sollte ich vielleicht nochmal durchlesen vor dem 
abschicken :(

Ich hoffe das hält euch nicht davon ab mir einen Tip zu geben, was ich 
verändern könnte.

von Sven S. (badphantom)


Lesenswert?

Es dürfte helfen, die Verarbeitung in einen Interrupt zu packen, um das 
"sleep_ms" zu umgehen.

von egberto (Gast)


Lesenswert?


von Tubie (Gast)


Lesenswert?

Warum denn umbauen?

Ich habe hier eins im grau an meiner Fritzbox 7050 hängen. Klappt sogar 
mit VoIP sehr gut. Macht vor allem viel her, wenn das Läutwerk einen 
einkommenden Anruf signalisiert. Klingt 1000x besser als diese Retro 
Klingeltöne in den Handys.

Hatten letztens 2 Kinder da, die wußten noch nichtmal, das man damit 
überhaupt Telefonieren kann ;)

Gruß,
Tubie

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Der Vorschlag von Sven ist gut. Trenne Einlesen und Ausgabe voneinander.

Das Einlesen per Pollen des Input-Pins kannst du sehr gut in einem 
Timer-Interrupt machen. Wie schnell kommen denn die Daten von der 
Wählscheibe? Ich schätze so 100ms/Impuls? Das vier- oder fünffach 
abgetastet, also ein 20-25ms Timer... das müsste gut gehen. Von dort 
wird der Zustand in einer globalen Datenstruktur (Flag 
warten/einlesen/gültig, Daten) gespeichert. Viel dazu kannst du in der 
Artikelsammlung bei Entprellung und [[AVR - Die genaue Sekunde / 
RTC]] lernen.

Das Ausgeben läuft im Nichtinterrupt (Userprogramm) und bedient sich 
aus der globalen Datenstruktur.

von die2lustigen3 (Gast)


Lesenswert?

Danke für eure schnelle Antworten!

100ms ist die gesamte Periodendauer eines Impulses.
http://de.wikipedia.org/w/index.php?title=Datei:Impusverhaeltnis01.JPEG&filetimestamp=20040503201805

Interrupts und Interruptpolling sagt mir von den Begriffen her etwas, 
aber so etwas programmiert hab ich noch nie ...
Werde mal die empfohlenen Tutorials lesen und schauen ob ich damit 
weiterkomme.

Sollte ich ab jetzt (wo die Timer ins spiel kommen) die externe Taktung 
(hab ein 8MHz quarz) verwenden?
Ich dachte mir ich könnte, wenn die Software fertig ist, einen kleinen 
Attiny in das Telephon einbauen und den mit einem langsamen Takt 
betreiben, damit der Akku nicht so schnell leer geht.
Außerdem brauch ich für einen schnell getakteten Atmel ja auch 5V, ist 
der Takt hingegen langsam komm ich mit ~3v hin. Der Akku vom Gigaset 
A100 ist ein 3,7v 300mA Typ, und es wäre natürlich fein, wenn ich nicht 
noch einen zweiten Akku kaufen + einbauen + immer mitladen müsste.


@Tubie: um ein altes Telephon zu verwenden ist der Aufwand den ich 
betreibe natürlich völlig übertrieben, aber ich möchte eben ein 
SCHNURLOSES altes telephon ... und außerdem war selbiges vom Flohmarkt 
und der stecker hinten abgezwickt ;)


Also, danke nochmals für die Tips!
Schaut mal wieder rein, ich werde, wenn es Neuigkeiten oder Probleme 
gibt, diese hier posten.
Vielleicht auch noch den fertigen code und Schaltplan (falls ich 
irgendwannfertig werde **g**), damit man das Projekt nachbauen kann, und 
es nicht mehr so viele kinder geben muss die nichtmehr wissen wie man 
eine wählscheibe bedient ;)

Gruß
die2lustigen3

von Stefan B. (stefan) Benutzerseite


Lesenswert?

100ms, da hatte ich ja nicht schlecht geschätzt ;-)

Pi*Daumen geht das auch mit den internen 1 Mhz oder sogar weniger. Alle 
20 ms einen Pin abzufragen ist "Peanuts".

In der nächsten Stufe kannst du ja noch einen Sleep-Mode einbauen - 
gewählt wird schliesslich nur selten.

Vielleicht magst du mal in den Artikel [[Pollin 
Funk-AVR-Evaluationsboard]] schauen. Dort wird das Timer-Programmieren 
schrittweise aufgebaut und beim Suppentimer geht es dann auch zum 
Sleep-Mode. Der erste Low-Pegel der Wählscheibe kann sogar den AVR aus 
dem Tiefschlaf holen!

Der grösste Energiefresser dürfte dann das LCD (hast du eins für 3,3V?) 
sein. Ich würde dazu tendieren, das LCD wegzulassen und für das Debuggen 
TTL-UART vorzusehen und dann dort mit einem Handy-Datenkabel 
dranzugehen.

von die2lustigen3 (Gast)


Lesenswert?

Das LCD ist nur zum beobachten ob mein Programm das macht was es soll.
Ich hab momentan alles auf meinem Steckbrettle aufgebaut, bis es gut 
funktioniert ...

Wenn das Gigaset A100 in das Wählscheibentelephon eingebaut wird, werde 
ich das Display vom Mobilteil des Gigaset A100 verwenden. Dort wird 
angezeigt welche Nummer man gewählt hat und ob der Funkkontakt zu 
Basisstation gut ist.
Das alles macht das Gigaset A100 schon von alleine und mehr Infos 
braucht man eh nicht (eher weniger).
Ich muss nur die Schnitstelle zwischen Wählscheibe, Gabel und den 
Tasten(0-9 und Abheben/Auflegen) des Mobilteils hinbekommen.
Der "FeTAp 791" hat noch eine einzelne Taste neben der Wählscheibe. 
Wofür die orginal war weiß ich nicht mehr ... ich war damals noch 
ziemlich jung ;)
Mal schauen ob ich sie verwende.




Gruß
die2lustigen3

von Joachim R. (bastelbaer)


Lesenswert?

Hi, schau mal unter 
http://www.sparkfun.com/commerce/tutorial_info.php?tutorials_id=51 oder 
unter 
http://www.elektor.de/jahrgang/2006/januar/nostalgie-telefon-als-handy.63916.lynkx?tab=4. 
Da ist alles was du brauchst. Da klappts auch ohne Interrupt. Ich kann 
dir das ganze auch als BASCOM-File schicken. Das Auslesen der 
Wählscheibe klappt mit dem System super.
Da brauchst du auch nicht zu pollen. Einfach den Eingang abfragen, kurz 
warten so 10-20ms um Prellen rauszubekommen und dann gehts weiter.

von die2lustigen3 (Gast)


Lesenswert?

Nabend!

Ich wollte nur mal kurz Bescheid geben, daß ich einen kleinen Schritt 
weiter bin ;)
Mein Fehler waren die "sleep_ms(1000)" ganz unten in meinem Code.
Wenn man wählt, der Controller aber gerade am warten ist, kann natürlich 
nix erkannt werden ... ja, ich muss noch viel lernen :)

Sobald es was Neues zu berichten gibt, melde ich mich wieder ...



gruß
die2lustigen3

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.