www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Posttelepohon mit Wählscheibe


Autor: die2lustigen3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
int main(void)
{
  int count=0;
  int kontrollwert=0;
  int zahl=0;  
  char buffer_1[7];
  char buffer_2[7];

  DDRA &= ~(1 << DDA0);              // PA0 als Eingang  enable Wählscheibe "NSR"
  DDRA &= ~(1 << DDA1);              // PA1 als Eingang  Wählimpulse "NSI" 


    lcd_init(LCD_DISP_ON);
    lcd_clrscr();
  lcd_puts("Test Waehlscheibe\n");


  while(1) 
  {                          
    if (PINA & (1 << PA0))            //wenn Wählscheibe an  (sonst nichts machen)
    {
      count=0;                //es wird gewählt, alles zurücksetzen
      zahl=0;
      kontrollwert=0;              //zählt die schleifendurchläufe während wählimpuls=high
      while(PINA & (1 << PA0))        //wärend des Wählens (wählscheibe an)
        {
        lcd_puts("Waelen ein.");
        if(PINA & (1 << PA1))        //falls wählimpuls=high
        count++;

        else
          {
          if(count>3)            //jetzt ist wählimpuls wieder low
            {
            kontrollwert=count;
            zahl++;
            count=0;
            }
          }
        }
    }


    lcd_clrscr();                //Ausgabe auf LCD
        lcd_puts("Test Waehlscheibe\n");
        lcd_puts("Zahl=");
        itoa( zahl , buffer_1, 10);
        lcd_puts(buffer_1);
        itoa( kontrollwert , buffer_2, 10);
        lcd_gotoxy(9,1);         
        lcd_puts("K=");
    lcd_puts(buffer_2);    

  
    sleep_ms(1000);                  //zeit zum ablesen
  }

}


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

Autor: die2lustigen3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven S. (badphantom)
Datum:

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

Autor: egberto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Tubie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: die2lustigen3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure schnelle Antworten!

100ms ist die gesamte Periodendauer eines Impulses.
http://de.wikipedia.org/w/index.php?title=Datei:Im...

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: die2lustigen3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joachim R. (bastelbaer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, schau mal unter 
http://www.sparkfun.com/commerce/tutorial_info.php... oder 
unter 
http://www.elektor.de/jahrgang/2006/januar/nostalg.... 
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.

Autor: die2lustigen3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.