-
        

Ergebnis 1 bis 8 von 8

Thema: Mal wieder ein Anfänger der Hilfe braucht

  1. #1
    Neuer Benutzer
    Registriert seit
    26.03.2011
    Ort
    Meißen
    Alter
    26
    Beiträge
    2

    Mal wieder ein Anfänger der Hilfe braucht

    Anzeige

    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:

    Code:
    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:
    Code:
    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:
    Klicke auf die Grafik für eine größere Ansicht

Name:	plan.jpg
Hits:	13
Größe:	47,9 KB
ID:	26409

    Hier der vollständige C-Code:
    Code:
       
    #define F_CPU	1000000 
    
    #include <util/delay.h>
    #include <avr/io.h>
    #include <stdio.h>
    
    
    //						   1				   2				   3				   4				   
    //Variablendeklaration	   12345678901234567890123456789012345678901234567890123456789012345678901234567890
    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				   
    //					   12345678901234567890123456789012345678901234567890123456789012345678901234567890
    	lcd_text_ausgeben("                        Bitte warten        please wait       ");
    	_delay_ms (5000);
    	
    	befehl(0b00000001);//Display löschen
    
    //					   1				   2				   3				   4				   
    //					   12345678901234567890123456789012345678901234567890123456789012345678901234567890
    	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				   
    //					   12345678901234567890123456789012345678901234567890123456789012345678901234567890
    	lcd_text_ausgeben("                        Bitte warten        please wait       ");
    	_delay_ms (5000);
    	
    	befehl(0b00000001);//Display löschen
    
    //					   1				   2				   3				   4				   
    //					   12345678901234567890123456789012345678901234567890123456789012345678901234567890
    	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				   
    //					   12345678901234567890123456789012345678901234567890123456789012345678901234567890
    	lcd_text_ausgeben("                        Bitte warten        please wait       ");
    	_delay_ms (5000);
    	
    	befehl(0b00000001);//Display löschen
    
    //					   1				   2				   3				   4				   
    //					   12345678901234567890123456789012345678901234567890123456789012345678901234567890
    	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;
    }

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266
    Du solltest die Taster entweder Software oder Hardwareseitig entprellen. Sonst kann solches Verhalten auftreten.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    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:

    Code:
    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

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von fabscher Beitrag anzeigen
    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.
    MfG
    Stefan

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.03.2011
    Beiträge
    1.400
    Zitat Zitat von sternst Beitrag anzeigen
    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
    Strom fließt auch durch krumme Drähte !

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    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
    Geändert von Wsk8 (18.09.2013 um 14:10 Uhr)

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo,

    Zitat Zitat von Wsk8 Beitrag anzeigen
    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)

  8. #8
    Neuer Benutzer
    Registriert seit
    26.03.2011
    Ort
    Meißen
    Alter
    26
    Beiträge
    2
    Zitat Zitat von shedepe Beitrag anzeigen
    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?


    Zitat Zitat von Wsk8 Beitrag anzeigen
    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:

    Code:
    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!

    Zitat Zitat von sternst Beitrag anzeigen
    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.



    Zitat Zitat von Klebwax Beitrag anzeigen
    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.

    Zitat Zitat von Peter(TOO) Beitrag anzeigen
    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

Ähnliche Themen

  1. Anfänger bittet mal wieder um Hilfe!
    Von Kregary im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 19
    Letzter Beitrag: 16.01.2010, 15:39
  2. mal wieder ein IR- Problem
    Von Kerubim im Forum Asuro
    Antworten: 1
    Letzter Beitrag: 01.09.2008, 22:52
  3. Mal wieder ein Displaysproblem
    Von Bääääär im Forum Elektronik
    Antworten: 11
    Letzter Beitrag: 17.02.2008, 16:33
  4. mal wieder ein Anfänger
    Von megagad im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 1
    Letzter Beitrag: 16.08.2004, 19:00
  5. Ein Anfänger braucht Hilfe
    Von [IN]Crusher im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 3
    Letzter Beitrag: 10.08.2004, 13:59

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •