PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Mal wieder ein Anfänger der Hilfe braucht



fabscher
17.09.2013, 22:01
Hallo ich habe ein kleines Projekt das soweit auch gut funktioniert nur eine kleine Sache macht mir mächtig zu schaffen.

Ich habe ein LCD das je nach Ereignis (Betätigung eines Tasters oder öffnen einer Tür) den jeweiligen Text anzeigen soll. Das auslösen bei Tastendruck (Schließer) klappt prima. Leider sind jedoch als „Sensoren“ für die Türen Öffner verbaut sodass im Ruhezustand High und beim öffnen einer Tür Low am Mikrocontroller anliegt. Deshalb habe ich einfach die if Bedingung der Pinabfrage invertiert:


if (!(PINC & (1<<PINC1)))

Dies klappt auch soweit und es wird der entsprechende Text angezeigt.

Danach soll aber der Text auch noch solange angezeigt werden wie die Tür geöffnet ist:

while(!(PINC & (1<<PINC1)));

Und genau da hapert es der Mikrocontroller scheint die Schleife zu ignorieren und fängt einfach wieder am Anfang an.

Ich hoffe ich konnte mein Problem verständlich schildern und danke schonmal im vorraus für jede Hilfe.


hier der Schaltplan:
26409

Hier der vollständige C-Code:



#define F_CPU 1000000

#include <util/delay.h>
#include <avr/io.h>
#include <stdio.h>


// 1 2 3 4
//Variablendeklaration 12345678901234567890123456789012345678901234567890 123456789012345678901234567890
unsigned char lcd_text[];
unsigned char i = 0;

void lcd_initialisieren(void);
void lcd_text_ausgeben(unsigned char[]);
void text(unsigned char);
void befehl(unsigned char);

////////////////////////////////////////////////////////////////////////////////////////////////////////



void lcd_initialisieren(void)
{

_delay_ms (1000);
befehl(0b00111000);//8Bit, 2Zeilen, 5x7Dot
befehl(0b00001100);//Display ein, Cursor aus, blinken aus
befehl(0b00000001);//Display löschen
befehl(0b00000110);//Cursor auto ++
PORTB |= (1<<PB5);//Hintergrundbeleuchtung aus
}


void lcd_text_ausgeben(unsigned char lcd_text[])
{
i=0;
while(lcd_text[i]!=0)
{
if (i == 20) //Wenn Text länger als 20 Zeichen in 2. Zeile springen
{
befehl(0b11000000);
}
if (i == 40) //Wenn Text länger als 40 Zeichen in 3. Zeile springen
{
befehl(0b10010100);
}
if (i == 60) //Wenn Text länger als 60 Zeichen in 4. Zeile springen
{
befehl(0b11010100);
}
text(lcd_text[i]);

i++;
}

}

void text(unsigned char text)
{
PORTC |= (1<<PC5);
PORTC |= (1<<PC4);
_delay_ms (10);
PORTD = text;
PORTC &= ~(1<<PC5);
_delay_ms (10);
}


void befehl(unsigned char befehl)
{
PORTC |= (1<<PC5);
PORTC &= ~(1<<PC4);
_delay_ms (10);
PORTD = befehl;
PORTC &= ~(1<<PC5);
_delay_ms (10);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////


int main(void)

{
DDRB = 0b00100000; // PortB als Eingang
DDRC = 0b11110000; // PortC als Ausgang
DDRD = 0b11111111; // PortD als Ausgang



lcd_initialisieren(); //Initalisierungroutine aufrufen

while(1)
{
if (PINC & (1<<PINC3)|PINC & (1<<PINC2)) //wenn SOS- oder Infotaste gedrückt wird
{
PORTB &= ~(1<<PB5);//Hintergrundbeleuchtung an

befehl(0b00000001);//Display löschen

// 1 2 3 4
// 12345678901234567890123456789012345678901234567890 123456789012345678901234567890
lcd_text_ausgeben(" Bitte warten please wait ");
_delay_ms (5000);

befehl(0b00000001);//Display löschen

// 1 2 3 4
// 12345678901234567890123456789012345678901234567890 123456789012345678901234567890
lcd_text_ausgeben(" Bitte singen please speak");
_delay_ms (5000);
befehl(0b00000001);//Display löschen
PORTB |= (1<<PB5);//Hintergrundbeleuchtung aus

}


if (!(PINC & (1<<PINC0)))//Wenn Feuerlöschtür geöffnet wird

{
PORTB &= ~(1<<PB5);//Hinntergrundbeleuchtung an

befehl(0b00000001);//Display löschen

// 1 2 3 4
// 12345678901234567890123456789012345678901234567890 123456789012345678901234567890
lcd_text_ausgeben(" Bitte warten please wait ");
_delay_ms (5000);

befehl(0b00000001);//Display löschen

// 1 2 3 4
// 12345678901234567890123456789012345678901234567890 123456789012345678901234567890
lcd_text_ausgeben(" Bitte sprechen please speak");
_delay_ms (2000);

while(!(PINC & (1<<PINC0)));//warten solange Tür geöffnet ist
befehl(0b00000001);//Display löschen
PORTB |= (1<<PB5);//Hintergrundbeleuchtung aus

}
if (!(PINC & (1<<PINC1)))//wenn Defitür geöffnet wird

{
PORTB &= ~(1<<PB5);//Hintergrundbeleuchtung an

befehl(0b00000001);//Display löschen

// 1 2 3 4
// 12345678901234567890123456789012345678901234567890 123456789012345678901234567890
lcd_text_ausgeben(" Bitte warten please wait ");
_delay_ms (5000);

befehl(0b00000001);//Display löschen

// 1 2 3 4
// 12345678901234567890123456789012345678901234567890 123456789012345678901234567890
lcd_text_ausgeben(" Bitte sprechen please speak");
_delay_ms (2000);

while(!(PINC & (1<<PINC1)));//warten solange Tür geöffnet ist
befehl(0b00000001);//Display löschen
PORTB |= (1<<PB5);//Hintergrundbeleuchtung aus

}

}
return 0;
}

shedepe
17.09.2013, 23:05
Du solltest die Taster entweder Software oder Hardwareseitig entprellen. Sonst kann solches Verhalten auftreten.

Wsk8
18.09.2013, 01:02
Mal von der Entprellung abgesehen und dass sich Ritchie vermutlich im Grab umdrehen würde wenn er deinen Code sieht würde ich am besten so vorgehen:



while(1) {
if(taster1_pressed) {
var_t1 = true;
} else if(taster2_pressed) {
var_t2 = true
} else {
var_t1 = var_t2 = false;
}


if(var_t1) {
show_display(blabla);
} else if(var_t2) {
show_display(blubb);
}
}


mfg

sternst
18.09.2013, 09:03
Leider sind jedoch als „Sensoren“ für die Türen Öffner verbaut sodass im Ruhezustand High und beim öffnen einer Tür Low am Mikrocontroller anliegt.Und wie soll dieses Low zustande kommen?
Im Schaltplan sehe ich weder einen Pull-Down, noch ist der zweite Kontakt von S2 an Masse angeschlossen.

Klebwax
18.09.2013, 09:56
Und wie soll dieses Low zustande kommen?
Im Schaltplan sehe ich weder einen Pull-Down, noch ist der zweite Kontakt von S2 an Masse angeschlossen.

Oder noch weiter gefragt: gibt es einen vernünftigen Grund, die Taster nicht nach Masse schalten zu lassen (und möglicherweise die internen Pullups zu verwenden) und stattdessen Vcc auf langen Kabeln durch die Welt zu schleifen?

MfG Klebwax

Wsk8
18.09.2013, 14:04
Jetzt nochmal mit Schaltplan.


Leider sind jedoch als „Sensoren“ für die Türen Öffner verbaut sodass im Ruhezustand High und beim öffnen einer Tür Low am Mikrocontroller anliegt.
Wenn die Tür geschlossen ist, dann öffnet der "Sensor", deshalb heißt es ja Öffner. -> Es liegt High am Port an!
Wenn die Tür offen ist, dann schließt der. -> Es liegt Low an!


Und wie soll dieses Low zustande kommen?
Im Schaltplan sehe ich weder einen Pull-Down, noch ist der zweite Kontakt von S2 an Masse angeschlossen.
Pull-Down gibts bei Pin 25 + 26. Aber beim Rest fehlt wirklich einer.


Oder noch weiter gefragt: gibt es einen vernünftigen Grund, die Taster nicht nach Masse schalten zu lassen (und möglicherweise die internen Pullups zu verwenden) und stattdessen Vcc auf langen Kabeln durch die Welt zu schleifen?
Bei Tuts werden normal immer die 2 Varianten Active High und Active Low vorgestellt, habe ich habe noch nie gelesen, dass eine Explizit empfohlen wird. Ein Anfänger wird daher einfach immer irgendeine nehmen. Obwohl ich diese Variante wirklich ein bisschen komisch finde.

mfg

Peter(TOO)
18.09.2013, 17:39
Hallo,



Bei Tuts werden normal immer die 2 Varianten Active High und Active Low vorgestellt, habe ich habe noch nie gelesen, dass eine Explizit empfohlen wird. Ein Anfänger wird daher einfach immer irgendeine nehmen. Obwohl ich diese Variante wirklich ein bisschen komisch finde.


Theoretisch ist das auch erst einmal egal.

Anders sieht es dann in der Praxis aus. Hier können auch mal Störungen auftreten.
Bei einer Alarmanlage verschaltet man die Kontakte so, dass alle geschlossen sind, wen auch die Fenster zu sind. Dann wird bei einem Drahtbruch, der Alarm ausgelöst!

Bei Maschinen kann es vorkommen, dass ein Draht durchscheuert oder eingeklemmt wird, dann bekommt er meistens Massekontakt. Da sollte man eben besser nach Vcc schalten. Dann fällt das System bei einem Drahtbruch oder einem Masseschluss auf die sichere Seite.

Dazu gibt es Vorschriften und dicke Bücher, wie ein System ausgelegt werden muss, damit es auch Sicherheit bietet. Aber dabei muss schon der Entwickler darüber nachdenken!

MfG Peter(TOO)

fabscher
19.09.2013, 19:59
Du solltest die Taster entweder Software oder Hardwareseitig entprellen. Sonst kann solches Verhalten auftreten.

Damit hatte ich zwar keine Probleme, trotzdem habe ich nach der Abfrage mal eine Verzögerung von 10ms eingebaut das sollte reichen oder?



Mal von der Entprellung abgesehen und dass sich Ritchie vermutlich im Grab umdrehen würde wenn er deinen Code sieht würde ich am besten so vorgehen:



while(1) {
if(taster1_pressed) {
var_t1 = true;
} else if(taster2_pressed) {
var_t2 = true
} else {
var_t1 = var_t2 = false;
}


if(var_t1) {
show_display(blabla);
} else if(var_t2) {
show_display(blubb);
}
}


mfg

Danke für den Tipp und das Bsp!


Und wie soll dieses Low zustande kommen?
Im Schaltplan sehe ich weder einen Pull-Down, noch ist der zweite Kontakt von S2 an Masse angeschlossen.

Vielen, vielen Dank daran hat es gelegen. Ich hab ich da wohl leider vergessen. Spaßeshalber habe ich da mal die Spannung gemessen und tatsächlich lagen da bei offenem Kontakt noch ca 1 V an.




Oder noch weiter gefragt: gibt es einen vernünftigen Grund, die Taster nicht nach Masse schalten zu lassen (und möglicherweise die internen Pullups zu verwenden) und stattdessen Vcc auf langen Kabeln durch die Welt zu schleifen?

MfG Klebwax

Hätte man auch machen können aber da ich das System nur anpasse und nicht völlig neu konstruiere, habe ich es dabei belassen.


Hallo,



Theoretisch ist das auch erst einmal egal.

Anders sieht es dann in der Praxis aus. Hier können auch mal Störungen auftreten.
Bei einer Alarmanlage verschaltet man die Kontakte so, dass alle geschlossen sind, wen auch die Fenster zu sind. Dann wird bei einem Drahtbruch, der Alarm ausgelöst!

Bei Maschinen kann es vorkommen, dass ein Draht durchscheuert oder eingeklemmt wird, dann bekommt er meistens Massekontakt. Da sollte man eben besser nach Vcc schalten. Dann fällt das System bei einem Drahtbruch oder einem Masseschluss auf die sichere Seite.

Dazu gibt es Vorschriften und dicke Bücher, wie ein System ausgelegt werden muss, damit es auch Sicherheit bietet. Aber dabei muss schon der Entwickler darüber nachdenken!

MfG Peter(TOO)

Und genau ersteres ist hier der Fall ;)