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
intmain(void)
2
{
3
intcount=0;
4
intkontrollwert=0;
5
intzahl=0;
6
charbuffer_1[7];
7
charbuffer_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
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.
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
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.
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
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.
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
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