Das Elektor-Forum schließt seine Pforten (siehe auch http://www.elektormagazine.de/forum). Ab Freitag, den 15. März, ist es nicht mehr möglich, sich im Forum einzuloggen. Alle Inhalte des Forums bleiben jedoch bis Ende März noch sichtbar. Am 01. April wird das Forum schließlich komplett geschlossen.

LB-4 Funktionen

Postby mitch » Thu Jun 24, 2010 12:00 am

Hallo ich habe folgendes Problem und zwar habe ich meine Funktionsammlung fertig gestellt und funktioniert auch so weit.
jetzt wollte ich mal was mit den Funktionen rum spielen und habe ein programm geschrieben welches den summer ein schaltet und und wenn ich den taster t1 gedrückt halte soll das piepen weg sein. das funktioniert auch so weit nur wenn ich den taster wieder los lasse dann passiert nach einer kurzen verzögerung folgendes: der Summer piepst in regelmäßigen ab abständen und irgendwann wieder dauerhaft. Kann es sein das wenn man diese LED funktion (led_daa) drin hat aber nicht aufruft das es was damit zu tuen haben kann. Die liegen ja auf dem selben Port.
Ich habe in der Musterlösung gesehen taste_2.c das dort die LED funktion auch wieder rausgenommen wurde.

hier noch mal der code

/********************************************************************************************/
/* */
/* TFH Georg Agricola, Bochum / Elektor-Verlag, Aachen */
/* */
/* Fernlehrgang-Programm: Leere C-Datei */
/* */
/* */
/* Autoren: P.G. / B.v.B. */
/* */
/* Zielsystem: TFH-Core ONE, Prozessor: AT89C51CC03 (Atmel) */
/* */
/* */
/* IDE/C-Compiler: uC/51 (Wickenhäuser) */
/* */
/* Letzte Änderung: 29.06.2007 */
/* */
/* Datei: leer.c */
/* */
/********************************************************************************************/

/*** Einbinden von Include-Dateien ***/
#include
#include
unsigned char bit sum @ 0x91;
unsigned char bit LED1 @ 0x92;
unsigned char bit LED2 @ 0x93;
unsigned char bit LED3 @ 0x94;
unsigned char bit LED4 @ 0x95;
/********************************************************************************************/
/***********Selbstgeschriebene Funktionen****************************************************/
/********************************************************************************************/

/******Serielle Schnittstelle Initialisieren************************************************/

void seri_init (void)
{SCON=0x52;
TMOD |=0x20;
TH1=0xfd;
TR1=1;
TI=1; }

/**********************Terminal Bildschirm löschen******************************************/
void clear_screen (void)
{
printf("\x1b\x48\x1b\x4a");
}
/**********************Cursor setzen*******************************************************/

void set_csr (char z, char s)
{
printf("\x1b\x59%c%c", (32+z), (32+s));
}
//**************************LED`s auf DAA*****************************************************/
void led_daa (unsigned char led_nr, unsigned char zustand)
{
if ((led_nr > 4) | (zustand > 1))
{
printf("Falsche Parameter LED Funktion!!");
while(1);
}
switch (led_nr) // Wenn Übergabeparameter korrekt waren,
{ // entsprechende LED in gewüschten Zustand bringen:
case 1 : if (zustand == 1) LED1 = 0; // Also bei 1 Ein- und
else LED1 = 1; // bei 0 Ausschalten!
break;
case 2 : if (zustand == 1) LED2 = 0;
else LED2 = 1;
break;
case 3 : if (zustand == 1) LED3 = 0;
else LED3 = 1;
break;
case 4 : if (zustand == 1) LED4 = 0;
else LED4 = 1;
break; }
}

/****************************Summer***************************************************************/
void sum_daa (unsigned char zustand)
{ if (zustand > 1)
{printf(" Falscher Parameter in Summer");
while(1);
}

if (zustand == 1) sum = 0;
else sum = 1;

}
/**********************************Ini ADwandler***********************************************/
void ad_ini (void)
{
ADCF = 0x0C; /// Knanal 6 und 7 sind Analoge Eingänge
ADCON = 0x20; /// ADwandler einschalten "ADEN (1)"
}

/**********************************Adwandler 8Bit**********************************************/
unsigned char mw_erf8(unsigned char kanal)
{
ADCON = (ADCON & 0xe8); // Kanalauswahl-Bit und Wandlungsende-Bit auf Null setzen!
ADCON = (ADCON | (0x08+kanal)); // Kanalauswahl und Start der einmaligen Wandlung!
while((ADCON & 0x10) == 0); // Warte bis A/D-Wandlung beendet ist!
return(ADDH); // Ergebnisregister auslesen und übergeben!
}


/*********************************ADwandler 10Bit**********************************************/
unsigned int mw_erf10(unsigned char kanal)
{
unsigned int erg; // Variable für 10-Bit Wandlungsergebnis
ADCON = (ADCON & 0xe8); // Kanalauswahl-Bit und Wandlungsende-Bit auf Null setzen!
ADCON = (ADCON | (0x08+kanal)); // Kanalauswahl und Start der einmaligen Wandlung!
while((ADCON & 0x10) == 0); // Warte bis A/D-Wandlung beendet ist!
erg = ((ADDH << 2) + (ADDL & 0x03)); // Ergebnisregister auslesen u. zusammenbauen!
return(erg);
}
/********************************************************************************************/
/*** Start des Hauptprogramms ***************************************************************/
/********************************************************************************************/

void main (void) // Start des Hauptprogramms
{
unsigned int messung1=0;
unsigned int messung2=0;
seri_init(); // Schnittstelle einstellen
ad_ini();
clear_screen(); //Bildschirm löschen
set_csr(1, 20);
printf("Das ist ein Testprogram des Adwandlers!");
set_csr(2,20);
printf("=======================================");


while(1)
{messung1 = mw_erf10(7);
set_csr(4,0);
printf("Der Adwert1 ist: %u ",messung1);
messung2 = mw_erf10(6);
set_csr(5,0);
printf("Der Adwert2 ist: %u ",messung2);

if (LED1 == 1) sum_daa(1); ///////LED1 ist hier T1
else sum_daa(0);

}


}

/********************************************************************************************/
/*** Ende des Hauptprogramms, d.h. Ende des gesamten Programms! *****************************/
/********************************************************************************************/
mitch
 
Posts: 6
Joined: Fri Jan 03, 2014 2:13 pm

Postby mitch » Thu Jun 24, 2010 12:00 am

irgendwie fehlt hier noch was!!



while(1)
{
messung1 = mw_erf10(7);
set_csr(4,0);
printf("Der Adwert1 ist: %u ",messung1);
messung2 = mw_erf10(6);
set_csr(5,0);
printf("Der Adwert2 ist: %u ",messung2);

if (LED1 == 1) sum_daa(1); ///////LED1 ist hier T1
else sum_daa(0);

}


}

/********************************************************************************************/
/*** Ende des Hauptprogramms, d.h. Ende des gesamten Programms! *****************************/
/********************************************************************************************/
mitch
 
Posts: 6
Joined: Fri Jan 03, 2014 2:13 pm

Postby tango_ » Sun Jun 27, 2010 12:00 am

Währe es nicht einfacher bei der led_daa funktion so etwas zu schreiben.


void led_daa (unsigned char led, unsigned char log)
{
switch (led)
case 1: P1_B3=log;
break;
case 2: P1_B4=log;
break;
case 3......usw.

}

So würde man sich die ständigen if - Anweisungen sparen.
Der einzige Nachteil. Man muss wieder mit 0 Einschalten und mit 1 Ausschalten wie gewohnt. Und man muss natürlich die include dateien einbinden sonst funktioniert ja P1_B3 ect nicht.
tango_
 
Posts: 13
Joined: Fri Jan 03, 2014 2:10 pm

Postby tango_ » Sun Jun 27, 2010 12:00 am

Beim Summer würde ich dann wie folgt vor gehen.

void sum_daa (unsigned char log)
{
P1_B2=log
}

Wenn man also einen Taster betätigt könnte das wie folgt aussehen.

while(1)
If Taster 1 - Then sum_daa(0)
If Taster 0 - Then sum_daa(1)

Man könnte es auch umgedreht machen, der Unterschied würde lediglich darin bestehen, dass der Summer bei gedrückter Taste ein oder ausgeschaltet ist.

Das der Summer bei betätigung wieder an zu summen beginnt könnte vieleicht an einem Kondensator liegen.

Benutz du denn das DAA oder ein eigenes ?
tango_
 
Posts: 13
Joined: Fri Jan 03, 2014 2:10 pm


Return to Mikrocontroller-Fernlehrgang (TFH)

Who is online

Users browsing this forum: No registered users and 1 guest