- Labornetzteil AliExpress         
Ergebnis 1 bis 5 von 5

Thema: RN-Control tastenabfrage in C

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    22.11.2003
    Beiträge
    214

    RN-Control tastenabfrage in C

    Anzeige

    Praxistest und DIY Projekte
    Hallo,
    nachdem nun mein LCD mit Peter Fleurys LCD libary läuft möchte ich gerne die Tasten des RN_Control an PINA7 abfragen und die Werte des ADC ausgeben. Die Ergebnisse sind aber unsinnig. Was ist falsch die Umwandlung oder die Bestimmung des Wertes?
    Code:
    unsigned int taste = 0;
    	char tastestr[5];
    for(;;)
      {
        while(taste == 0) {taste = Tastenabfrage();}
    	
    		Soundirq (500,2000);
    		lcd_clrscr();
    		itoa(taste,tastestr,5);
    		lcd_puts (tastestr);
    		Sleep (2000);
    		Sleep (2000);
    		taste = 0;
    		
      }
    und die Erhebung des Werts:
    Code:
    unsigned int Tastenabfrage (void)
    {
    	unsigned char i;
    	unsigned char Tasternr = 0;
    	unsigned int Tasteradc = 0;
    	PORTA |= (1<<PA7);    /* internen Pull-Up an PA7 aktivieren */
    /*  
    ADCSRA (ADC Control and Status Register )
    		Bit		    	
    						   7    6     5    4    3     2     1     0
    						ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0 ADCSRA
    		Read/Write   	 R/W  R/W   R/W  R/W  R/W   R/W   R/W   R/W
    		Initial Value  	   0    0     0    0    0     0     0     0
    	ADEN enabeld (aktiviert) die AD- Wandlung
    	
    	ADSC (ADC Start Conversion) Mit diesem Bit wird ein Messvorgang gestartet.
    	In der frei laufenden Betriebsart muss das Bit gesetzt werden, um die kontinuierliche
    	Messung zu aktivieren. Wenn das Bit nach dem Setzen des ADEN-Bits zum ersten Mal gesetzt
    	wird, führt der Controller zuerst eine zusätzliche Wandlung und erst dann die eigentliche
    	Wandlung aus. Diese zusätzliche Wandlung wird zu Initialisierungszwecken durchgeführt. 
        Das Bit bleibt nun so lange auf 1, bis die Umwandlung abgeschlossen ist,
    	im Initialisierungsfall entsprechend bis die zweite Umwandlung erfolgt ist und geht danach
    	auf 0. 
    	
    	ADFR (ADC Free Running Select)(ADATE: ADC Auto Trigger Enable) Mit diesem Bit wird die
    	Betriebsart eingestellt. Eine logische 1 aktiviert den frei laufenden Modus. Der ADC
    	misst nun ständig den ausgewählten Kanal und schreibt den gemessenen Wert in das 
    	ADC Data Register. 
    	
    	ADIE (ADC Interrupt Enable) Wenn dieses Bit gesetzt ist und ebenso das I-Bit
    	im Statusregister SREG, dann wird der ADC-Interrupt aktiviert. 
    	
    	ADPS2 bis ADPS0 Der Frequenzvorteiler kennt die Bits ADPS0 bis ADPS2
    	Dabei sollte die Frequenz für AD-Wandlung zwischen 50Hz und 200HZ liegen.
    	Um den richtigen Vorteiler zu bestimmen teilt man die Freuquenz des Quarzes durch die 
    	gewünschte AD-Wandler Frequenz und setzt die Bits ADPS0 bis ADPS2.
    */
    	ADCSRA = (1<<ADEN) | (1<<ADPS2)| (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler hier: 128 
    
    
    /*
    ADMUX ADC Multiplexer Select Register
    	Mit diesem Register wird der zu messende Kanal ausgewählt. Beim MEGA16/32 kann jeder
    	Pin von Port A als ADC-Eingang verwendet werden (=8 Kanäle). (PA 0 bis PA7 und ADC0 bis ADC7)
    	Das Register ist wie folgt aufgebaut:
    		Bit 			7 		6 		5 	4 	3 	2 		1	0
    						REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
    		Name 			- 		- 		- 	- 	- 	MUX2 MUX1 MUX0
    		R/W 			R 		R 		R 	R 	R 	 R/W R/W  R/W
    		Initialwert 	0 		0 		0 	0 	0 	 0 	  0 	0
    	REFS1 REFS0
    	Diese Bits stellen die Spannungsreferenz für die ADC ein. Wenn diese Bits
    	während der Umwandlung verändert werden, wird die Umwandlung nicht durchgeführt bis 
    	die Einstellung abgeschlossen ist (ADIF in ADCSRA is set).
    	Die Einstelungsmöglichkeiten für die internen Refernzspannungen sollten nicht benutzt
    	werden, wenn eine externe Refernzspannungen am AREF pin angelgt ist.
    		REFS1 REFS0 Voltage Reference Selection
    		0 		0 	AREF, Internal Vref turned off
    		0 		1 	AVCC with external capacitor at AREF pin
    		1		0 	Reserved
    		1 		1 	Internal 2.56V Voltage Reference with external capacitor at AREF pin
    	Bit 5 – ADLAR: ADC Left Adjust Result
    	Das ADLAR bit beeinflusst die Darstellung presentation des ADC Ergebnisser im 
    	ADC Datenregister.
    	Wenn 1 in das ADLAR geschrieben wird, wird das Ergebnis linksbündig eingetragen.
    	Ansonsten wird das Ergebnis rechtsbündig geschrieben.
    	Die Veränderung des ADLAR Bits beinflusst das ADC Data Register sofort, ohne auf die
    	laufende Umwandlung zu beachten.
    		ADLAR = 0
    			Bit   15   14   13   12   11   10    9    8
    				   –    –    –    –    –    – ADC9 ADC8 ADCH
    				ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0 ADCL
    		ADLAR = 1
    			Bit   15   14   13   12   11   10    9    8
    			ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADCH
    			ADC1 ADC0    –    –    –    –    –    – ADCL
    
    	Mux4..0
    	Die Werte dieser Bits selects which combination of analog inputs are connected to the
    	ADC. These bits also select the gain for the differential channels. See Table 84 for
    	details. If these bits are changed during a conversion, the change will not go in effect
    	until this conversion is complete (ADIF in ADCSRA is set).
    	
    	Die Bits MUX2...MUX0 werden für die einzelumwandlung Verwendet
        Mit diesem 3 Bits wird der zu messende Kanal bestimmt. Es wird einfach die entsprechende
    	Pinnummer des Ports eingeschrieben. Wenn das Register beschrieben wird, während dem eine
    	Umwandlung läuft, so wird zuerst die aktuelle Umwandlung auf dem bisherigen Kanal beendet.
    	Dies ist vor allem beim frei laufenden Betrieb zu berücksichtigen. 
    	Meine Empfehlung ist deswegen klar diese, dass der frei laufende Betrieb nur bei einem 
    	einzelnen zu verwendenden Analogeingang verwendet werden sollte, wenn man sich Probleme
    	bei der Umschalterei ersparen will. 
    	*/	
    	ADMUX = (0<<MUX4) |(0<<MUX3) |(1<<MUX2) | (1<<MUX1) | (1<<MUX0);
    	/* Kanal waehlen hier Kanal 7 als single conversion */
    	ADMUX &= (0<<ADLAR);							// Standard Ausrichtung
    	ADMUX &= (0<<REFS1) & (0<<REFS0); 				// Referenzspannung an AREF nutzen 
    	/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
        also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
    	ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
    	while ( ADCSRA & (1<<ADSC) );     // auf Abschluss der Konvertierung warten 
    	
    	/* Nun wird die eigentliche Messung durchgeführt */
    	/* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
    	for(i=0;i<4;i++)
    		{
    			ADCSRA |= (1<<ADSC);			// eine Wandlung "single conversion"
    			while ( ADCSRA & (1<<ADSC) );	// auf Abschluss der Konvertierung warten
    			Tasteradc += ADCW;				// Wandlungsergebnisse aufaddieren
    			/*
    			ADCL,ADCH ADC Data Register
    			Wenn eine Umwandlung abgeschlossen ist, befindet sich der gemessene Wert
    			in diesen beiden Registern. Von ADCH werden nur die beiden niederwertigsten
    			Bits verwendet. Es müssen immer beide Register ausgelesen werden und zwar immer
    			in der Reihenfolge: ADCL, ADCH. Der effektive Messwert ergibt sich dann zu:
    			x = ADCL;       // mit uint16_t x
    			x += (ADCH<<8); // in zwei Zeilen (LSB/MSB-Reihenfolge und C-Operatorprioritaet
    							   sichergestellt)
    			oder
    			x = ADCW; // je nach AVR auch x = ADC (siehe avr/ioxxx.h)
    			*/
    		}
    	ADCSRA &= ~(1<<ADEN);					// ADC deaktivieren (2)
    	Tasteradc /= 4;							// Summe durch vier teilen = arithm. Mittelwert
    		
    	return Tasteradc;
    }
    kann jemand helfen?
    Dnke
    Gruß
    Stefan

    PS die Komentare stammen aus einem Tutorial das ich zum lernen und anpssen verwendet habe....

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.04.2005
    Ort
    Minden
    Alter
    39
    Beiträge
    227
    Hi, also ohne das ich mir jetzt deinen Code angeguckt habe, ich hab bei meinem RN Control noch vom Analog Port nen 100k nach Masse gelegt.
    Da der Port nämlich in der Luft hängt wenn keine Taster gedrückt ist. Und ich dann immer "Mist" eingelesen habe... weiß nicht wie das bei dir ist!?
    gruß ceekay \/

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    22.11.2003
    Beiträge
    214
    Naja, unter Bascom hats funktioniert. Ich möchte aber gerne c lernen...
    Aber auch wenn ein Taster dauerhaft gedrückt ist kommt Unsinn raus....
    Gruß
    Stefan

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    22.11.2003
    Beiträge
    214
    Morgen
    ich war zu blöd.
    itoa (x,s,5) bedeutet, dass die Werte im Fünfersystem ausgegeben werden?
    Zumindest funktioniert es, wenn ich statt der 5 eine 10 setze - die Ergebnisse sind dann 3-stellig.
    Sorry.
    Kann mir den jemand sagen wo man eine Übersicht und Erklärung der mit dem GCC gelieferten funktionen wie itoa findet?
    Danke
    Gruß
    Stefan

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    18.07.2006
    Beiträge
    51
    Hatte das gleiche Problem. Ich hab das RN-Control laut Schaltplan nachgebaut und war ein wenig verzweifelt, warum ich die Tastenabfrage nicht vernüftig hinbekam. Mit einem zusätzlichen 100K Widerstand und einem extra Jumper klappts jetzt (Danke für den Tip)

    Gruß Falerion

Berechtigungen

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

12V Akku bauen