- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 15

Thema: Empfängersignal mit ATtiny13A erkennen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.06.2017
    Beiträge
    23
    so nun habe ich den code mit verschiedenen Empfängern erfolglos getestet.

    Was ist falsch?

    Code:
    #define F_CPU 1200000UL     //Taktfrequenz CPU 1,2MHz
    #include <avr/io.h>				
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <stdio.h>
    
    //LED-Ports
    #define LED1 1
    #define LED2 2
    #define LED3 3
    #define LED4 4
    
    uint16_t C;     //Integer einfügen und Variable für Zählerstand festlegen
    
    int main(void)
    {
    	
    	DDRB = 0b00011110;      //Eingänge und Ausgänge definieren
    	PORTB = 0b00000000;     //Pullups setzen
    	
    	//Einstellungen für PCINT	
    	MCUCR = (1<<ISC00);      //Jede logische Änderung an INT0 erzeugt eine Interrupt-Anforderung
    	GIMSK = (1<<PCIE);         //PCINT aktivieren
    	PCMSK = (1<<PCINT0);     //PCINT0 Eingang wird genutzt
    	
    	//Einstellungen Timer / PWM
    	TCCR0A = ((1<<WGM00) | (1<<WGM01));     //FastPWM (Top=0xFF Update of OCRx at = TOP TOV Flag Set on = MAX)
    	TCCR0B = (1<<CS01);			//Prescaler clk/8
    
    	
    	sei();     //globale Interrupts aktivieren
    	
    	
    	while(1)
    		{
    
    		if (C < 80)
    			{
    				PORTB &= ~((1<<LED1) | (1<<LED2) | (1<<LED3) | (1<<LED4));
    				sei();
    			}
    		
    		
    		else if((C > 80) & (C < 190))
    			{
    				PORTB &= ~((1<<LED2) | (1<<LED4));
    				PORTB |= (1<<LED1);
    				PORTB &= ~(1<<LED3);
    				_delay_ms(500);
    				PORTB |= (1<<LED3);
    				PORTB &= ~(1<<LED1);
    				sei();
    				_delay_ms(500);
    			}
    		
    
    		else if (C > 190)
    		
    			{
    				PORTB |= ((1<<LED2) | (1<<LED4));
    				PORTB |= (1<<LED1);
    				PORTB &= ~(1<<LED3);
    				_delay_ms(500);
    				PORTB |= (1<<LED3);
    				PORTB &= ~(1<<LED1);
    				sei();
    				_delay_ms(500);
    			}
    
    
    		}
    			
    }
    
    ISR(PCINT0_vect)
    
    {
    	if(PINB & (1<<PB0))     //erkennung steigender Flanke
    	{
    		TCNT0 = 0;
    	}
    	else     //ansonsten
    	{	
    		C = TCNT0;     //Zählerstand auslesen und in variable schreiben
    		cli();
    	}
    }
    Habe schon mit den Einstellungen am Sender gespielt hab verschiedene Prescaler / Integer ausprobiert. Was kann ich noch machen?

    Gruß
    Lichti01

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von vohopri
    Registriert seit
    11.09.2004
    Ort
    südlich der Alpen
    Beiträge
    1.708
    Servus,

    du hast die PWM simuliert, und es hat funktioniert. Da würde ich das Simulierte Signal und das Signal vom RC Empfänger vergleichen. Entweder mit einem Oszilloskop, oder als ich das noch nicht hatte, ging das mit einem Freeware Softwareoszi für den PC sehr gut.

    IMHO ist es sinnlos, im Code herum zu rühren, wenn man nicht weiss, was die Hardware macht. Auf Dauer ist das fürchterlich ineffizient.

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.064
    Warum schreibst du PORTB = 0b00000000; ? Portb ist beim einschalten automatisch 0x00 (steht im DB).

    Warum konfigurierst du 2 Interrupts, das ist vermutlich auch der Fehler. Du konfigurierst einmal INT0 und PCINT0, INT0 ist PB1 und PCINT0 ist PB0. Du reagierst aber nur auf den PCINT, ich vermute das du den Empfänger auf PB1 (INT0) angeschlossen hast. Eigentlich sollte es aber Warnungen geben wenn du es kompilierst. Warum schaltest du eigentlich die Interruptfreigabe aus?

    MfG Hannes

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    okay ich werf fragen hinterher, wozu einen WaveForm Modus?
    Code:
    //Einstellungen Timer / PWM
        TCCR0A = ((1<<WGM00) | (1<<WGM01));     //FastPWM (Top=0xFF Update of OCRx at = TOP TOV Flag Set on = MAX)
        TCCR0B = (1<<CS01);            //Prescaler clk/8
    lass TCCR0A einfach auf initial Zustand! Normaler Zählmodus, kein PWM das ist nutzlos!

    1.2MHz / 8 = 150kHz -> 8bit = 265 counts -> 1/150kHz * 256 = 1.70666 mS
    sollte alos für den maximal möglichen 1.5mS Puls reichen

    du initialisierst den Timer OHNE clockselect, du lässt CS einfach komtplett weg! Damit steht dein Timer!

    in der ISR, bei steigender Flanke, startest du den timer indem du die CS01 setzt

    bei fallender Flanke stoppst du den timer, indem du die CS Bits weider auf 0 setzt, prüfst du zuerst das TIFR Register ob das Overflow Bit gesetzt ist, löschst es (eine 1 auf das bit schreiben, keine 0) und verwirfst die Messung (Die High Phase war offensichtlich länger als 1.7mS)
    wenn das OVF Flag nicht gesetzt ist schreibst du den TCNT wert auf und verarbeitest die gemessenen zeit und setzt TCNT wieder auf 0

    so sparst du sogar in den low phasen noch strom weil dein timer nciht die ganze zeit sinnlos mitrennt
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    04.06.2017
    Beiträge
    23
    HI

    Habe nun alles mit Hilfe eurer Antworten nochmal überarbeitet. Jetzt funktioniert es!
    SUPER! Danke für eure Hilfe

    Gruß
    Lichti01

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.064
    Was war der Fehler?

    MfG Hannes

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    04.06.2017
    Beiträge
    23
    HI

    Ich denke, dass der ausschlaggebende Punkt war, dass ich den Timer nicht gestartet habe.
    Außerdem habe ich den INT0 rausgenommen sowie den Timer auf initial Zustand gelassen.

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.064
    Der Timer war schon gestartet. Den hast du gestartet indem du CS00 und CS01 gesetzt hast. Ich vermute das sich das Programm ins Nirvana verabschiedet hat weil du den Int0 Interrupt konfiguriert hast, aber nicht in die ISR gesprungen bist.

    MfG Hannes

Ähnliche Themen

  1. ATTiny13A Schalter abfragen/entprellung mit Variablen
    Von Denn Is im Forum C - Programmierung (GCC u.a.)
    Antworten: 19
    Letzter Beitrag: 01.07.2014, 11:21
  2. Attiny13a RS232
    Von flecralf im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 09.10.2013, 18:27
  3. Empfängersignal auswerten. (Modellbauempfänger PWM )
    Von hunni im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 13
    Letzter Beitrag: 16.10.2008, 00:04
  4. gcc erkennen?
    Von bluebrother im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 09.11.2005, 12:10
  5. Empfängersignal digitalisieren
    Von srem im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 14.02.2005, 20:31

Stichworte

Berechtigungen

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

Solar Speicher und Akkus Tests