Sirene programmieren

Postby subzero » Sat Jan 16, 2010 12:00 am

Hi,

ich habe im 4 Semester mit dem Infineon C167 eine Sirene mal programmiert gehabt (code ist angehängt) nun wollte ich das gleiche mal mit dem 8051er ausprobieren aber irgendwo happerts noch das ist mein code in jfe:



/*** Einbinden von Include-Dateien ***/
#include // Standard Ein-/Ausgabefunktionen
#include // CC03er-Grundregister
#include // Festlegung der IR-Vektoradressen
#include "_fkt_CC03ER_Funktionen_H.h"


#define DIFF 1
#define FMIN 54016 //240,48 Hz
#define FMAX 62826 //1020,4 Hz

unsigned int wert,reload; // Zählerstand der Impulsbreite als Int.-Zahl
unsigned char richtung=1;

IRQ_VECTOR(sirene, TIMER2); // Zuordnung der Interrupt timer 2


/********************************************************************************************/
/*** Start des Hauptprogramms ***************************************************************/
/********************************************************************************************/

void main (void) // Start des Hauptprogramms
{

seri_int(); // Schnittstelle initialisieren

summer=1; //summer anfangstwert 0V
T2MOD=0x01; // Mode-Reg. setzen lehbrief 4 s.22 arbeitet als auf- /abwärts zähler
T2CON=0x08; //EXEN2=1 und CP/RL2=0 für autoreload
// Zählregister auf FMIN setzen
TL2 = 0;
TH2 = 211; //240,38 Hz (ausgerechnet mit RCAP=65536- fq/(4*fout) fout=240,38 Hz

wert = (256*TH2) + TL2; // Zählerstand auf 54016 setzen

RCAP2L=0; // Reloadwerte nach überlauf von timer 2
RCAP2H=211;
reload= (256*RCAP2H) + RCAP2L;

TR2=1; // Timer/Counter 2 starten


ET2 = 1; // Interupt des Timer/Counter T2 des CC03ers freigeben!
EA = 1; // Alle Interrupts freigeben!

while(1) // Endlosschleife
{
if(TF2) // Trat ein Überlaufinterrupt auf dann
{
summer = 0; // Summer toggeln bei jedem Überlauf
_wait_ms(250);
break;
}
}
}

void sirene(void) interrupt //timer 2 überlauf
{
TF2=0; // TF2 softwaremäßig zurücksetzen,
if(richtung) //wenn richtung=1 frequenz erhöhen
{
reload+=DIFF; //54016+1....
}
else
{
reload-=DIFF;
}

if(reload>=FMAX) //wenn nach dem erhöhen die maximale frequenz erreicht wurde
{
richtung=0; //dann richtungswechsel d.h. frequenz erniedrigen
}
else if(reload<=FMIN) //wenn nach dem erniedrigen aber die minimale frequenz erreicht wurde dann wieder richtungswechsel
{ //so wechselt die frequenz ständig zwischen 2 Grenzwerten
richtung=1;
}
}

wenn man beide quellcodes vergleicht merkt man das ich versucht habe es ähnlich wie beim C167 damals aufzubauen kann jemand erkennen warum es nicht klappt beim programm ausführen geht der summer an und bleibt es auch immer mitderselben tonhöhe bzw frequenz beim C167 damals klang es nach starten des programms eben wie eine sirene der ton ging rauf und runter

PS: ich möchte noch was hinzufügen beim quellcode für den C167 werden 2 timer benutzt T2 und 3 wobei T2 als "RELOADER" fungiert und der überaluf von Timer 3 das interrupt auslöst, aber wenn ich mich nicht irre gibt es sowas beim 8051er nicht oder? das ein timer ausschließlich als "reloader" fungiert

und noch etwas wie kann man den Timern eigentlich sagen ob sie rauf oder runterzählen sollen? beim C167 ging das über die TXCON wie man im quellcode sieht.
Attachments
sirene-c167.txt
(1.77 KiB) Downloaded 16 times
subzero
 
Posts: 134
Joined: Fri Jan 03, 2014 2:13 pm

Postby subzero » Sat Jan 16, 2010 12:00 am

ich denke die wichtigste zeile ist das hier:

while(1) // Endlosschleife
{
if(TF2) // Trat ein Überlaufinterrupt auf dann
{
summer = 0; // Summer toggeln bei jedem Überlauf
_wait_ms(250);
break;
}
}

wie krieg ich den summer dazu bei JEDEM ÜBER-/UNTERLAUF zu toggeln? wenn das überhaupt beim 8051 er geht
subzero
 
Posts: 134
Joined: Fri Jan 03, 2014 2:13 pm

Postby subzero » Sun Jan 17, 2010 12:00 am

ok eine interessante entdeckung als ich mir im datasheet von C167 Infineon das T3OTL angeschaut hab:

Timer T3 has an output toggle latch (T3OTL) which changes its state on each timer overflow/
underflow
. The state of this latch may be output on pin T3OUT e.g. for time out
monitoring of external hardware components, or may be used internally to clock timers
T2 and T4 for measuring long time periods with high resolution

als ich dann nochmal im T2CON register nachgesehen hab ist mir das hier ins auge gefallen

EXF2: Timer 2 External Flag wechselt seinen jeweiligen zustand beim auftreten eines Timer 2 Interrupts also von 0 auf 1 oder von 1 auf 0
kann per software auf anfangszustand gesetzt werden.

daraufhin habe ich den code so verändert:
while(1) // Endlosschleife
{

summer = EXF2; // Summer toggeln bei jedem Überlauf

}
als ich das in meinem code gändert habe kamen schon ähnliche geräusche wie bei einer sirene raus aber erstens es kommt zu schnell und zu leise ich weiß noch wie beim C167 der ton richtig schön in die länge gezogen wurde es klang wie eine polizeisirene
eine zeitverzögerung brachte leider auch nix da piepst der summer nur also an aus an aus das ist aber keine sirene.
subzero
 
Posts: 134
Joined: Fri Jan 03, 2014 2:13 pm

Postby bvb » Sun Jan 17, 2010 12:00 am

Hallo subzero,
Du hast hier ein grundsätzliches Problem: den Piezo-Summer kannst Du nur ein oder aus schalten, es ist ein "selbst-summender Summer", d.h. er hat den Tongenerator schon eingebaut und dieser wird nur ein- oder ausgeschaltet.
Du kansst also beim Summer gar nicht die Frequenz verändern, sondern ihn nur lang oder kurz ein- bzw. ausschalten.
Wenn du "richtige Töne" erzeugen willst, mußt Du an einem Port-Pin ein Rechtecksignal variabler Frequenz ausgeben, verstärken und auf einen Lautsprecher geben.
Wie das geht, haben wir im Lehrbrief 7 bei unserer Music-Box beschrieben: hier kannst Du sogar ganze Lieder abspielen und eine Sirene sollte auch kein Problem darstellen.
Schau Dir unsere Muster-Lösung dazu einmal an.

Viele Grüße

Bernd
bvb
 
Posts: 190
Joined: Fri Jan 03, 2014 1:53 pm

Postby subzero » Sun Jan 17, 2010 12:00 am

Hallo Bernd,

vielen dank für die antwort ich hab den 2 Lehrgang schon seit Weihnachten bestellt aber noch ist nichts angekommen ^^ ich hoffe es kommt noch diesen monat

sobald ich den 7 Lehrbrief durchhabe werde das mit der sirene nochmal probieren und hier rein posten
subzero
 
Posts: 134
Joined: Fri Jan 03, 2014 2:13 pm

Postby subzero » Sat Feb 06, 2010 12:00 am

ok nach durcharbeiten des lehrbriefs 7 komme ich zu dem schluss das ich weder mit dem summer auf dem board des ersten lehrgangs noch mit dem summer auf der analog tastatur eine siren erzeugen kann. wie bernd bereits erklärt hat kann man diese nur ein und ausschalten. jedoch könnte das ganze noch klappen mit dieser music box den da kann ich genau das machen was ich dazu brauche mit den frequenzen rumspielen und ausgeben leider warte ich noch auf antwort hier im forum wo ich einen NF-verstärker herbekomme den ich an das board anschließen kann damit ich was höre. sobald ich das ding habe versuche ich nochmal eine sirene zu programmieren und poste es hier rein

PS: im lehrbrief 7 war dauernd die rede der s.g. kojak sirene jedoch gab es dafür nie den code in den .rar files nur so als info
subzero
 
Posts: 134
Joined: Fri Jan 03, 2014 2:13 pm

Postby bvb » Sun Feb 07, 2010 12:00 am

Hallo subzero,
als NF-Verstärker kannst Du eigentlich jedes kleine Verstärker-Modul benutzen, z.B. einen entsprechenden Elektronik-Bausatz, den es bei vielen Elektronik-Versendern gibt oder ein bereits fertig aufgebautes Modul.
Da hier im Forum die Nachfrage nach solch einem Verstärker noch nicht vorhanden war, haben wir auch noch keine Schaltung veröffentlicht.
Das können wir aber gerne im Laufe der nächsten Wochen machen, als kleine Anregung.
Wo hast Du übrigens im Lehrbrief 7 etwas von einer Kojak-Sirene gelesen ?

Gruß

Bernd
bvb
 
Posts: 190
Joined: Fri Jan 03, 2014 1:53 pm

Postby subzero » Mon Feb 08, 2010 12:00 am

Hallo Bernd das wäre toll, das mit der "kojak sirene" stand auf
-seite 63- unten "Programmierung einer durchdringenden "EInsatz in Manhatten-Kojak Sirene" durch geeignete Ansteurerung des Summers.
subzero
 
Posts: 134
Joined: Fri Jan 03, 2014 2:13 pm

Postby bvb » Mon Feb 08, 2010 12:00 am

Hallo subzero,
Du kannst den Summer natürlich unterschiedlich lange ein- und ausschalten und so eine "Sirene" erzeugen. Du kannst eben nur nicht den Ton, die Tonhöhe, ändern.
Im Programm ppi_demo.c findest Du dazu ein Beispiel.

Viele Grüße
Bernd
bvb
 
Posts: 190
Joined: Fri Jan 03, 2014 1:53 pm

Postby subzero » Sat Mar 06, 2010 12:00 am

Hi,

ich habe jetzt alle Teile die ich benötige , aber ein kleines Problem wegen den Anschlüssen will nix kaputt machen deshalb frage ich lieber nochmal. Der Verstärker (siehe bild) braucht zwischen
4,5 - 12 V. Ich dachte zuerst an das mitgelieferte Netzteil vom ersten Lehrgang aber den brauche ich schon für das board außerdem will ich den TFH-DAA One benutzen und einen von den 2 potis um die Lautstärke zu regeln. Ich wollte also das erste board benutzen und den VCC und GND für den Verstärker an die Pins vom X1 Pfostenstecker anlöten aber ich hab grad schwierigkeiten sie auf dem layout zu finden und nächste frage geht das so überhaupt?

Den + Anschluss des mini Lautsprechers wollte ich an das 4 kabel vom verstärker anschliessen (siehe bild rot markiert). Und den - Anschluss vom Lautsprecher an das mittlere Kabel vom Verstärker.

Aber wo schließe ich jetzt meine Signalquelle an die aus der BNC buchse rauskommt und wie muss ich z.B. das Poti 7 anschliessen.
Attachments
verst-rker.png
DSC01980.JPG
DSC01976.JPG
subzero
 
Posts: 134
Joined: Fri Jan 03, 2014 2:13 pm

Next

Return to Mikrocontroller-Fernlehrgang (TFH)

Who is online

Users browsing this forum: No registered users and 1 guest