- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 7 von 7

Thema: RN-Control Tastenabfrage => Rückgabewerte überlappen sich

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    07.12.2004
    Ort
    Leverkusen
    Alter
    44
    Beiträge
    95

    RN-Control Tastenabfrage => Rückgabewerte überlappen sich

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    ich habe den folgenden C-Code aus der Forumsuche zusammengebastelt.
    Klappt auch soweit. Ich compiliere es mit WinAVR, schicks mit Ponyprog hoch und
    schau es mit im Bascom Terminal an.
    Wenn ich allerdings jetzt eine der 5 Tasten drücke dann bekomme ich einen
    Rückgabewert der Tastenabfrage() Funktion die sich nicht genau auf eine
    bestimmte Taste beziehen lässt. Also zb Taste 1 zwischen 375 und 500 je nach
    dem wie lange ich die Taste drücke und zudem schwankend aber bei Taste 2 etc genauso bzw ähnlich.
    Nicht ganz genauso, einen kleinen Unterschied kann man sehen. Aber minimal.
    Ich nehm an das ganze lässt sich mit einem Prescaler lösen, zumindest wird
    das im Bascom Beispiel so gemacht. Nur hab ich keine Ahnung wie ich das
    machen soll. Bin noch Anfänger in C und den Microcontrollern.
    Die IF Abfragen in der Main Methode hab ich selbst geschrieben um eine
    sinnvolle Fallunterscheidung machen zu können. Leider mit o.g. Problem.

    Wäre super wenn mir jemand erklären könnte wie ich jetzt weiterkomme
    oder kurz meinen Code ergänzt so dass es klappt.

    Code:
    
    // AVR-Includes
    #include <avr/io.h>
    
    // Defines
    #define F_CPU 16000000    // Hier die Taktfrequenz in Hz eingeben
    #define UART_BAUD_RATE 9600    // Hier die gewnschte Baudrate
    #define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16L)-1)
    
    
    // Funktionen
    //  -=> UART initialisieren <=-
    void UART_init(void){ 
        UBRRL |= (uint8_t) UART_BAUD_SELECT;
       UCSRB = (1<<RXEN)|(1<<TXEN);
       UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    }
    
    //  -=> Byte Transmit <=-
    void UART_transmit(uint8_t c){
       while(!(UCSRA & (1<<UDRE)));
       UDR = c;
    }
    
    //  -=> String Transmit <=-
    void UART_transmit_string(uint8_t *string){
        while(!(UCSRA & (1<<UDRE)));
       while( *string){ UART_transmit (*string++); }
    }
    
    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 = (1<<ADEN) | (1<<ADPS2)| (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler hier: 128
    
    
    
       ADMUX = (0<<MUX4) |(0<<MUX3) |(1<<MUX2) | (1<<MUX1) | (1<<MUX0);
     
       ADMUX &= (0<<ADLAR);                     // Standard Ausrichtung
       ADMUX &= (0<<REFS1) & (0<<REFS0);             // Referenzspannung an AREF nutzen
    
       ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung
       while ( ADCSRA & (1<<ADSC) );     // auf Abschluss der Konvertierung warten
       
      
       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
             
          }
       ADCSRA &= ~(1<<ADEN);               // ADC deaktivieren (2)
       Tasteradc /= 4;                     // Summe durch vier teilen = arithm. Mittelwert
          
       return Tasteradc;
    }
    
    
    
    int main (void)
    {
    char c;
    unsigned int taste = 0;
    
    UART_init();  // UART-Init Funktion ausfhren
    
    UART_transmit_string("Hurra, es funktioniert!!!");
    
    while(1){
     
    while(taste == 0) {
    	taste = Tastenabfrage();
    }
    
    if((taste > 350)&&(taste<375)) {
    	UART_transmit_string("350 - 375 ");
    	taste = 0;
    }
    
    if((taste > 374)&&(taste<400)) {
    	UART_transmit_string("374 - 400 ");
    	taste = 0;
    }
    
    if((taste > 399)&&(taste<425)) {
    	UART_transmit_string("399 - 425 ");
    	taste = 0;
    }
    
    if((taste > 424)&&(taste<450)) {
    	UART_transmit_string("424 - 450 ");
    	taste = 0;
    }
    
    if((taste > 449)&&(taste<475)) {
    	UART_transmit_string("449 - 475 ");
    	taste = 0;
    }
    
    if((taste > 474)&&(taste<500)) {
    	UART_transmit_string("474 - 500 ");
    	taste = 0;
    }
    
    if((taste > 499)&&(taste<525)) {
    	UART_transmit_string("499 - 525 ");
    	taste = 0;
    }
    
    if((taste > 524)&&(taste<550)) {
    	UART_transmit_string("524 - 550 ");
    	taste = 0;
    }
    
    if((taste > 3000)&&(taste<4000)) {
    	UART_transmit_string("300 - 400 ");
    	taste = 0;
    }
    
    if((taste > 4000)&&(taste<5000)) {
    	UART_transmit_string("400 - 500");
    	taste = 0;
    }
    
    if((taste > 500)&&(taste<1000)) {
    	//UART_transmit_string("Nix gedruckt ");
    	taste = 0;
    }
    
    } 
    }
    Vielen Dank im voraus

    LG
    Thomas

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Wie sieht die Schaltung aus, es könnte auch ein Problem der Stromversorung sein, läuft noch etwas anderes parallel, wie sehen die Tasten aus, sind die Kontakte so gut das sie ihren Widerstand nicht ändern, es gibt also genug Fehlermöglichkeiten.
    Hubert

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Gerade gesehen, zum messen aktiviert man den Pull-Up nicht

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Ich habe versucht das mal nachzustellen, der UART funktioniert bei mir aber nicht, man müsste die Werte mal einzeln ausgeben um zu sehen welcher davonläuft.
    Ganz OK ist der Code auch nicht, was ist mit dem Wert 0-349 und 1000 bis 1023

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    07.12.2004
    Ort
    Leverkusen
    Alter
    44
    Beiträge
    95
    Hallo Hubert,

    also ich hab das RN-Control Board von
    www.robotikhardware.de bestellt. Das war auch schon fertig gelötet als es ankam.
    Mit dem Bascom Programm läuft es einwandfrei.

    Ich weiss der Code ist ja auch nur testweise geschrieben.
    Wenn der Rückgabewert mal unter 350 fällt dann stürzt der Controller ab.
    Wollt einfach erstmal
    eine vernünftige Fallunterscheidung hinbekommen und die dafür notwendigen
    Werte ermitteln. Aber die Werte sind halt nicht diskret, daher das Problem.
    Die Rückgabemengen der 5 Tasten überschneiden sich.
    Ich bekomme auch nicht nur einen Wert pro Tastendruck sondern eine
    dauerhafte Messung zurückgeliefert. Sprich wenn ich die Taste halte
    schreibt der weiterhin die Rückgabewerte (die sich manchmal bei der gleichen Taste um bis zu 100 unterscheiden) in den Terminal. Aber das
    ändert doch nichts daran dass die so schwanken ?!

    UART geht auf dem RN-Control super. Hab N81 und 9600 Baud eingestellt im Terminal.

    Ich werd gleich mal die Bereiche 0 - 349 und 1000 - 1023 hinzufügen.

    LG
    Thomas

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    18.07.2006
    Beiträge
    15
    Hallo Chattychan,

    hab den Code nur mal schnell überflogen. Wenn ich das richtig sehe willst du 5 Taster die jeweils eine bestimmte Spannung erzeugen(Spannungsteiler, Tastermatrix) über einen A/D-Wandler einlesen und die erzeugten Werte den jeweiligen Tastern zuordnen. Richtig?

    Da die erzeugten Werte so stark variieren ist irgendetwas Faul.

    1. So wie ich das gesehen habe ist der A/D-Wandler im
    Datenrichtungsregister nicht als Eingang deklariert. (Kann mich auch irren,
    hab den Code nur schnell überflogen)

    2. Könnte ein Massefehler sein. Hast du die Masse des
    Spannungsteilers/Tastermatrix mit der des Boards verbunden?

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    07.12.2004
    Ort
    Leverkusen
    Alter
    44
    Beiträge
    95
    Hallo,

    also Hardwaremässig müsste alles in Ordnung sein, da
    ich das Board fertig aufgebaut von www.robotikhardware.de
    geliefert bekommen habe und ausserdem eine derartige Fallunterscheidung
    in dem Bascom Beispielcode funktioniert. Quasi das Programm mit dem
    das RN-Control ausgeliefert wurde.

    LG
    Thomas

Berechtigungen

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

12V Akku bauen